diff --git a/.gitignore b/.gitignore
index 53dc944..653e866 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,23 +1,5 @@
-node_modules
target
.vscode
.settings
.project
-.classpath
-webpack.generated.js
-package-lock.json
-package.json
-webpack.config.js
-/error-screenshots
-drivers
-tsconfig.json
-.idea
-types.d.ts
-/frontend/generated
-/frontend/index.html
-vite.generated.ts
-vite.config.ts
-/src/main/dev-bundle
-/src/main/bundles
-/src/main/frontend/generated
-/src/main/frontend/index.html
\ No newline at end of file
+.classpath
\ No newline at end of file
diff --git a/base/.gitignore b/base/.gitignore
new file mode 100644
index 0000000..53dc944
--- /dev/null
+++ b/base/.gitignore
@@ -0,0 +1,23 @@
+node_modules
+target
+.vscode
+.settings
+.project
+.classpath
+webpack.generated.js
+package-lock.json
+package.json
+webpack.config.js
+/error-screenshots
+drivers
+tsconfig.json
+.idea
+types.d.ts
+/frontend/generated
+/frontend/index.html
+vite.generated.ts
+vite.config.ts
+/src/main/dev-bundle
+/src/main/bundles
+/src/main/frontend/generated
+/src/main/frontend/index.html
\ No newline at end of file
diff --git a/base/pom.xml b/base/pom.xml
new file mode 100644
index 0000000..d7fd2a8
--- /dev/null
+++ b/base/pom.xml
@@ -0,0 +1,330 @@
+
+
+
+ 4.0.0
+
+ com.flowingcode.vaadin.addons.demo
+ commons-demo
+ 5.3.0-SNAPSHOT
+
+ Commons Demo
+ Common classes for add-ons demo
+ https://www.flowingcode.com/en/open-source/
+
+
+
+ flowingcode
+ Flowing Code
+ https://www.flowingcode.com
+
+
+
+
+ UTF-8
+ 17
+ 17
+ 24.3.13
+ 11.0.26
+
+
+
+Flowing Code
+https://www.flowingcode.com
+
+ 2020
+
+
+ Apache 2
+ http://www.apache.org/licenses/LICENSE-2.0.txt
+ repo
+
+
+
+
+ https://github.com/FlowingCode/CommonsDemo
+ scm:git:git://github.com/FlowingCode/CommonsDemo.git
+ scm:git:ssh://git@github.com:/FlowingCode/CommonsDemo.git
+ master
+
+
+
+
+ central
+ https://repo.maven.apache.org/maven2
+
+ false
+
+
+
+
+
+
+
+ com.vaadin
+ vaadin-bom
+ ${vaadin.version}
+ pom
+ import
+
+
+
+
+
+
+ com.vaadin
+ vaadin-core
+ true
+
+
+
+ org.projectlombok
+ lombok
+ 1.18.34
+ provided
+
+
+
+ jakarta.servlet
+ jakarta.servlet-api
+ 6.0.0
+ provided
+
+
+
+ com.flowingcode.vaadin.addons
+ enhanced-tabs-addon
+ 1.2.0
+
+
+
+ com.flowingcode.vaadin
+ json-migration-helper
+ 0.9.2
+
+
+
+ junit
+ junit
+ 4.11
+ test
+
+
+
+ org.slf4j
+ slf4j-simple
+ test
+
+
+
+ com.vaadin
+ vaadin-testbench
+ test
+
+
+ org.webjars.bowergithub.polymer
+ polymer
+
+
+
+
+
+ io.github.bonigarcia
+ webdrivermanager
+ 6.3.2
+ test
+
+
+ net.java.dev.jna
+ jna
+
+
+
+
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-release-plugin
+ 3.0.1
+
+ release
+
+
+
+ org.apache.maven.plugins
+ maven-deploy-plugin
+ 2.8.2
+
+
+ org.apache.maven.plugins
+ maven-surefire-plugin
+ 2.22.1
+
+ false
+
+
+
+ org.codehaus.mojo
+ license-maven-plugin
+ 1.14
+
+ apache_v2
+ false
+
+ **/AppShellConfiguratorImpl.class
+ **/main/resources/META-INF/resources/frontend/prism.js
+ **/main/resources/META-INF/resources/frontend/prism.css
+ **/test/resources/**
+ **/main/dev-bundle/**
+
+
+
+
+ org.eclipse.jetty
+ jetty-maven-plugin
+ ${jetty.version}
+
+ 3
+
+ true
+
+ jar
+
+
+
+ src/main/resources/META-INF/resources
+ src/test/resources/META-INF/resources
+
+
+
+
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-jar-plugin
+ 3.1.2
+
+
+
+ META-INF/VAADIN/config/flow-build-info.json
+
+
+
+
+ com.vaadin
+ vaadin-maven-plugin
+ ${vaadin.version}
+
+
+
+ prepare-frontend
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-source-plugin
+ 3.0.1
+
+
+ attach-sources
+ package
+
+ jar-no-fork
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-javadoc-plugin
+ 3.11.1
+
+
+ attach-javadocs
+ package
+
+ jar
+
+
+
+
+ true
+ none
+ true
+
+ https://javadoc.io/doc/com.vaadin/vaadin-platform-javadoc/${vaadin.version}
+
+
+
+
+
+
+
+
+ gpg
+
+
+ env.MAVEN_GPG_PASSPHRASE
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-gpg-plugin
+ 3.2.7
+
+
+ sign-artifacts
+ verify
+
+ sign
+
+
+
+
+
+
+
+
+
+ release
+
+
+
+ org.sonatype.central
+ central-publishing-maven-plugin
+ 0.8.0
+ true
+
+
+
+
+
+
+ v25
+
+ 21
+ 21
+ 25.0.0
+
+
+
+ com.vaadin
+ vaadin-dev
+ true
+
+
+
+
+
+
+
diff --git a/src/main/java/com/flowingcode/vaadin/addons/DevSourceRequestHandler.java b/base/src/main/java/com/flowingcode/vaadin/addons/DevSourceRequestHandler.java
similarity index 100%
rename from src/main/java/com/flowingcode/vaadin/addons/DevSourceRequestHandler.java
rename to base/src/main/java/com/flowingcode/vaadin/addons/DevSourceRequestHandler.java
diff --git a/src/main/java/com/flowingcode/vaadin/addons/DevSourceRequestHandlerInitializer.java b/base/src/main/java/com/flowingcode/vaadin/addons/DevSourceRequestHandlerInitializer.java
similarity index 100%
rename from src/main/java/com/flowingcode/vaadin/addons/DevSourceRequestHandlerInitializer.java
rename to base/src/main/java/com/flowingcode/vaadin/addons/DevSourceRequestHandlerInitializer.java
diff --git a/src/main/java/com/flowingcode/vaadin/addons/GithubBranch.java b/base/src/main/java/com/flowingcode/vaadin/addons/GithubBranch.java
similarity index 100%
rename from src/main/java/com/flowingcode/vaadin/addons/GithubBranch.java
rename to base/src/main/java/com/flowingcode/vaadin/addons/GithubBranch.java
diff --git a/src/main/java/com/flowingcode/vaadin/addons/GithubLink.java b/base/src/main/java/com/flowingcode/vaadin/addons/GithubLink.java
similarity index 100%
rename from src/main/java/com/flowingcode/vaadin/addons/GithubLink.java
rename to base/src/main/java/com/flowingcode/vaadin/addons/GithubLink.java
diff --git a/src/main/java/com/flowingcode/vaadin/addons/demo/ColorScheme.java b/base/src/main/java/com/flowingcode/vaadin/addons/demo/ColorScheme.java
similarity index 100%
rename from src/main/java/com/flowingcode/vaadin/addons/demo/ColorScheme.java
rename to base/src/main/java/com/flowingcode/vaadin/addons/demo/ColorScheme.java
diff --git a/src/main/java/com/flowingcode/vaadin/addons/demo/DefaultSourceUrlResolver.java b/base/src/main/java/com/flowingcode/vaadin/addons/demo/DefaultSourceUrlResolver.java
similarity index 100%
rename from src/main/java/com/flowingcode/vaadin/addons/demo/DefaultSourceUrlResolver.java
rename to base/src/main/java/com/flowingcode/vaadin/addons/demo/DefaultSourceUrlResolver.java
diff --git a/src/main/java/com/flowingcode/vaadin/addons/demo/DemoHelper.java b/base/src/main/java/com/flowingcode/vaadin/addons/demo/DemoHelper.java
similarity index 100%
rename from src/main/java/com/flowingcode/vaadin/addons/demo/DemoHelper.java
rename to base/src/main/java/com/flowingcode/vaadin/addons/demo/DemoHelper.java
diff --git a/src/main/java/com/flowingcode/vaadin/addons/demo/DemoHelperRenderer.java b/base/src/main/java/com/flowingcode/vaadin/addons/demo/DemoHelperRenderer.java
similarity index 100%
rename from src/main/java/com/flowingcode/vaadin/addons/demo/DemoHelperRenderer.java
rename to base/src/main/java/com/flowingcode/vaadin/addons/demo/DemoHelperRenderer.java
diff --git a/src/main/java/com/flowingcode/vaadin/addons/demo/DemoHelperViewer.java b/base/src/main/java/com/flowingcode/vaadin/addons/demo/DemoHelperViewer.java
similarity index 100%
rename from src/main/java/com/flowingcode/vaadin/addons/demo/DemoHelperViewer.java
rename to base/src/main/java/com/flowingcode/vaadin/addons/demo/DemoHelperViewer.java
diff --git a/src/main/java/com/flowingcode/vaadin/addons/demo/DemoSource.java b/base/src/main/java/com/flowingcode/vaadin/addons/demo/DemoSource.java
similarity index 100%
rename from src/main/java/com/flowingcode/vaadin/addons/demo/DemoSource.java
rename to base/src/main/java/com/flowingcode/vaadin/addons/demo/DemoSource.java
diff --git a/src/main/java/com/flowingcode/vaadin/addons/demo/DemoSourceConditionHelper.java b/base/src/main/java/com/flowingcode/vaadin/addons/demo/DemoSourceConditionHelper.java
similarity index 100%
rename from src/main/java/com/flowingcode/vaadin/addons/demo/DemoSourceConditionHelper.java
rename to base/src/main/java/com/flowingcode/vaadin/addons/demo/DemoSourceConditionHelper.java
diff --git a/src/main/java/com/flowingcode/vaadin/addons/demo/DemoSources.java b/base/src/main/java/com/flowingcode/vaadin/addons/demo/DemoSources.java
similarity index 100%
rename from src/main/java/com/flowingcode/vaadin/addons/demo/DemoSources.java
rename to base/src/main/java/com/flowingcode/vaadin/addons/demo/DemoSources.java
diff --git a/src/main/java/com/flowingcode/vaadin/addons/demo/DialogDemoHelperViewer.java b/base/src/main/java/com/flowingcode/vaadin/addons/demo/DialogDemoHelperViewer.java
similarity index 100%
rename from src/main/java/com/flowingcode/vaadin/addons/demo/DialogDemoHelperViewer.java
rename to base/src/main/java/com/flowingcode/vaadin/addons/demo/DialogDemoHelperViewer.java
diff --git a/src/main/java/com/flowingcode/vaadin/addons/demo/DynamicTheme.java b/base/src/main/java/com/flowingcode/vaadin/addons/demo/DynamicTheme.java
similarity index 100%
rename from src/main/java/com/flowingcode/vaadin/addons/demo/DynamicTheme.java
rename to base/src/main/java/com/flowingcode/vaadin/addons/demo/DynamicTheme.java
diff --git a/src/main/java/com/flowingcode/vaadin/addons/demo/DynamicThemeInitializer.java b/base/src/main/java/com/flowingcode/vaadin/addons/demo/DynamicThemeInitializer.java
similarity index 100%
rename from src/main/java/com/flowingcode/vaadin/addons/demo/DynamicThemeInitializer.java
rename to base/src/main/java/com/flowingcode/vaadin/addons/demo/DynamicThemeInitializer.java
diff --git a/src/main/java/com/flowingcode/vaadin/addons/demo/EnhancedRouteTabs.java b/base/src/main/java/com/flowingcode/vaadin/addons/demo/EnhancedRouteTabs.java
similarity index 100%
rename from src/main/java/com/flowingcode/vaadin/addons/demo/EnhancedRouteTabs.java
rename to base/src/main/java/com/flowingcode/vaadin/addons/demo/EnhancedRouteTabs.java
diff --git a/src/main/java/com/flowingcode/vaadin/addons/demo/MultiSourceCodeViewer.java b/base/src/main/java/com/flowingcode/vaadin/addons/demo/MultiSourceCodeViewer.java
similarity index 100%
rename from src/main/java/com/flowingcode/vaadin/addons/demo/MultiSourceCodeViewer.java
rename to base/src/main/java/com/flowingcode/vaadin/addons/demo/MultiSourceCodeViewer.java
diff --git a/src/main/java/com/flowingcode/vaadin/addons/demo/SourceCodeTab.java b/base/src/main/java/com/flowingcode/vaadin/addons/demo/SourceCodeTab.java
similarity index 100%
rename from src/main/java/com/flowingcode/vaadin/addons/demo/SourceCodeTab.java
rename to base/src/main/java/com/flowingcode/vaadin/addons/demo/SourceCodeTab.java
diff --git a/src/main/java/com/flowingcode/vaadin/addons/demo/SourceCodeViewer.java b/base/src/main/java/com/flowingcode/vaadin/addons/demo/SourceCodeViewer.java
similarity index 100%
rename from src/main/java/com/flowingcode/vaadin/addons/demo/SourceCodeViewer.java
rename to base/src/main/java/com/flowingcode/vaadin/addons/demo/SourceCodeViewer.java
diff --git a/src/main/java/com/flowingcode/vaadin/addons/demo/SourcePosition.java b/base/src/main/java/com/flowingcode/vaadin/addons/demo/SourcePosition.java
similarity index 100%
rename from src/main/java/com/flowingcode/vaadin/addons/demo/SourcePosition.java
rename to base/src/main/java/com/flowingcode/vaadin/addons/demo/SourcePosition.java
diff --git a/src/main/java/com/flowingcode/vaadin/addons/demo/SourceUrlResolver.java b/base/src/main/java/com/flowingcode/vaadin/addons/demo/SourceUrlResolver.java
similarity index 100%
rename from src/main/java/com/flowingcode/vaadin/addons/demo/SourceUrlResolver.java
rename to base/src/main/java/com/flowingcode/vaadin/addons/demo/SourceUrlResolver.java
diff --git a/src/main/java/com/flowingcode/vaadin/addons/demo/SplitLayoutDemo.java b/base/src/main/java/com/flowingcode/vaadin/addons/demo/SplitLayoutDemo.java
similarity index 100%
rename from src/main/java/com/flowingcode/vaadin/addons/demo/SplitLayoutDemo.java
rename to base/src/main/java/com/flowingcode/vaadin/addons/demo/SplitLayoutDemo.java
diff --git a/src/main/java/com/flowingcode/vaadin/addons/demo/TabbedDemo.java b/base/src/main/java/com/flowingcode/vaadin/addons/demo/TabbedDemo.java
similarity index 100%
rename from src/main/java/com/flowingcode/vaadin/addons/demo/TabbedDemo.java
rename to base/src/main/java/com/flowingcode/vaadin/addons/demo/TabbedDemo.java
diff --git a/src/main/java/com/flowingcode/vaadin/addons/demo/TabbedDemoSourceEvent.java b/base/src/main/java/com/flowingcode/vaadin/addons/demo/TabbedDemoSourceEvent.java
similarity index 100%
rename from src/main/java/com/flowingcode/vaadin/addons/demo/TabbedDemoSourceEvent.java
rename to base/src/main/java/com/flowingcode/vaadin/addons/demo/TabbedDemoSourceEvent.java
diff --git a/src/main/java/com/flowingcode/vaadin/addons/demo/ThemeChangeEvent.java b/base/src/main/java/com/flowingcode/vaadin/addons/demo/ThemeChangeEvent.java
similarity index 100%
rename from src/main/java/com/flowingcode/vaadin/addons/demo/ThemeChangeEvent.java
rename to base/src/main/java/com/flowingcode/vaadin/addons/demo/ThemeChangeEvent.java
diff --git a/src/main/java/com/flowingcode/vaadin/addons/demo/ThemeChangeObserver.java b/base/src/main/java/com/flowingcode/vaadin/addons/demo/ThemeChangeObserver.java
similarity index 100%
rename from src/main/java/com/flowingcode/vaadin/addons/demo/ThemeChangeObserver.java
rename to base/src/main/java/com/flowingcode/vaadin/addons/demo/ThemeChangeObserver.java
diff --git a/src/main/java/com/flowingcode/vaadin/addons/demo/VaadinVersion.java b/base/src/main/java/com/flowingcode/vaadin/addons/demo/VaadinVersion.java
similarity index 100%
rename from src/main/java/com/flowingcode/vaadin/addons/demo/VaadinVersion.java
rename to base/src/main/java/com/flowingcode/vaadin/addons/demo/VaadinVersion.java
diff --git a/src/main/resources/META-INF/VAADIN/package.properties b/base/src/main/resources/META-INF/VAADIN/package.properties
similarity index 100%
rename from src/main/resources/META-INF/VAADIN/package.properties
rename to base/src/main/resources/META-INF/VAADIN/package.properties
diff --git a/src/main/resources/META-INF/resources/frontend/code-viewer.ts b/base/src/main/resources/META-INF/resources/frontend/code-viewer.ts
similarity index 100%
rename from src/main/resources/META-INF/resources/frontend/code-viewer.ts
rename to base/src/main/resources/META-INF/resources/frontend/code-viewer.ts
diff --git a/src/main/resources/META-INF/resources/frontend/prism.js b/base/src/main/resources/META-INF/resources/frontend/prism.js
similarity index 100%
rename from src/main/resources/META-INF/resources/frontend/prism.js
rename to base/src/main/resources/META-INF/resources/frontend/prism.js
diff --git a/src/main/resources/META-INF/resources/frontend/styles/commons-demo/shared-styles.css b/base/src/main/resources/META-INF/resources/frontend/styles/commons-demo/shared-styles.css
similarity index 100%
rename from src/main/resources/META-INF/resources/frontend/styles/commons-demo/shared-styles.css
rename to base/src/main/resources/META-INF/resources/frontend/styles/commons-demo/shared-styles.css
diff --git a/src/main/resources/META-INF/resources/frontend/styles/commons-demo/vaadin-select-overlay.css b/base/src/main/resources/META-INF/resources/frontend/styles/commons-demo/vaadin-select-overlay.css
similarity index 100%
rename from src/main/resources/META-INF/resources/frontend/styles/commons-demo/vaadin-select-overlay.css
rename to base/src/main/resources/META-INF/resources/frontend/styles/commons-demo/vaadin-select-overlay.css
diff --git a/src/main/resources/META-INF/services/com.vaadin.flow.server.VaadinServiceInitListener b/base/src/main/resources/META-INF/services/com.vaadin.flow.server.VaadinServiceInitListener
similarity index 100%
rename from src/main/resources/META-INF/services/com.vaadin.flow.server.VaadinServiceInitListener
rename to base/src/main/resources/META-INF/services/com.vaadin.flow.server.VaadinServiceInitListener
diff --git a/src/test/java/com/flowingcode/vaadin/addons/demo/AdHocDemo.java b/base/src/test/java/com/flowingcode/vaadin/addons/demo/AdHocDemo.java
similarity index 100%
rename from src/test/java/com/flowingcode/vaadin/addons/demo/AdHocDemo.java
rename to base/src/test/java/com/flowingcode/vaadin/addons/demo/AdHocDemo.java
diff --git a/src/test/java/com/flowingcode/vaadin/addons/demo/AdHocSource.java b/base/src/test/java/com/flowingcode/vaadin/addons/demo/AdHocSource.java
similarity index 100%
rename from src/test/java/com/flowingcode/vaadin/addons/demo/AdHocSource.java
rename to base/src/test/java/com/flowingcode/vaadin/addons/demo/AdHocSource.java
diff --git a/src/test/java/com/flowingcode/vaadin/addons/demo/AdditionalSources.java b/base/src/test/java/com/flowingcode/vaadin/addons/demo/AdditionalSources.java
similarity index 100%
rename from src/test/java/com/flowingcode/vaadin/addons/demo/AdditionalSources.java
rename to base/src/test/java/com/flowingcode/vaadin/addons/demo/AdditionalSources.java
diff --git a/src/test/java/com/flowingcode/vaadin/addons/demo/AppShellConfiguratorImpl.java b/base/src/test/java/com/flowingcode/vaadin/addons/demo/AppShellConfiguratorImpl.java
similarity index 100%
rename from src/test/java/com/flowingcode/vaadin/addons/demo/AppShellConfiguratorImpl.java
rename to base/src/test/java/com/flowingcode/vaadin/addons/demo/AppShellConfiguratorImpl.java
diff --git a/src/test/java/com/flowingcode/vaadin/addons/demo/Demo.java b/base/src/test/java/com/flowingcode/vaadin/addons/demo/Demo.java
similarity index 100%
rename from src/test/java/com/flowingcode/vaadin/addons/demo/Demo.java
rename to base/src/test/java/com/flowingcode/vaadin/addons/demo/Demo.java
diff --git a/src/test/java/com/flowingcode/vaadin/addons/demo/MultiSourceDemo.java b/base/src/test/java/com/flowingcode/vaadin/addons/demo/MultiSourceDemo.java
similarity index 100%
rename from src/test/java/com/flowingcode/vaadin/addons/demo/MultiSourceDemo.java
rename to base/src/test/java/com/flowingcode/vaadin/addons/demo/MultiSourceDemo.java
diff --git a/src/test/java/com/flowingcode/vaadin/addons/demo/SampleDemo.java b/base/src/test/java/com/flowingcode/vaadin/addons/demo/SampleDemo.java
similarity index 100%
rename from src/test/java/com/flowingcode/vaadin/addons/demo/SampleDemo.java
rename to base/src/test/java/com/flowingcode/vaadin/addons/demo/SampleDemo.java
diff --git a/src/test/java/com/flowingcode/vaadin/addons/demo/SampleDemoDefault.java b/base/src/test/java/com/flowingcode/vaadin/addons/demo/SampleDemoDefault.java
similarity index 100%
rename from src/test/java/com/flowingcode/vaadin/addons/demo/SampleDemoDefault.java
rename to base/src/test/java/com/flowingcode/vaadin/addons/demo/SampleDemoDefault.java
diff --git a/src/test/java/com/flowingcode/vaadin/addons/demo/SampleDemoHelperRenderer.java b/base/src/test/java/com/flowingcode/vaadin/addons/demo/SampleDemoHelperRenderer.java
similarity index 100%
rename from src/test/java/com/flowingcode/vaadin/addons/demo/SampleDemoHelperRenderer.java
rename to base/src/test/java/com/flowingcode/vaadin/addons/demo/SampleDemoHelperRenderer.java
diff --git a/src/test/java/com/flowingcode/vaadin/addons/demo/SampleDemoHighlight.java b/base/src/test/java/com/flowingcode/vaadin/addons/demo/SampleDemoHighlight.java
similarity index 100%
rename from src/test/java/com/flowingcode/vaadin/addons/demo/SampleDemoHighlight.java
rename to base/src/test/java/com/flowingcode/vaadin/addons/demo/SampleDemoHighlight.java
diff --git a/src/test/java/com/flowingcode/vaadin/addons/demo/SourcePositionDemo.java b/base/src/test/java/com/flowingcode/vaadin/addons/demo/SourcePositionDemo.java
similarity index 100%
rename from src/test/java/com/flowingcode/vaadin/addons/demo/SourcePositionDemo.java
rename to base/src/test/java/com/flowingcode/vaadin/addons/demo/SourcePositionDemo.java
diff --git a/src/test/java/com/flowingcode/vaadin/addons/demo/it/AbstractSourceCodeViewerIT.java b/base/src/test/java/com/flowingcode/vaadin/addons/demo/it/AbstractSourceCodeViewerIT.java
similarity index 100%
rename from src/test/java/com/flowingcode/vaadin/addons/demo/it/AbstractSourceCodeViewerIT.java
rename to base/src/test/java/com/flowingcode/vaadin/addons/demo/it/AbstractSourceCodeViewerIT.java
diff --git a/src/test/java/com/flowingcode/vaadin/addons/demo/it/AbstractViewTest.java b/base/src/test/java/com/flowingcode/vaadin/addons/demo/it/AbstractViewTest.java
similarity index 100%
rename from src/test/java/com/flowingcode/vaadin/addons/demo/it/AbstractViewTest.java
rename to base/src/test/java/com/flowingcode/vaadin/addons/demo/it/AbstractViewTest.java
diff --git a/src/test/java/com/flowingcode/vaadin/addons/demo/it/ConditionalSourceCodeViewerIT.java b/base/src/test/java/com/flowingcode/vaadin/addons/demo/it/ConditionalSourceCodeViewerIT.java
similarity index 100%
rename from src/test/java/com/flowingcode/vaadin/addons/demo/it/ConditionalSourceCodeViewerIT.java
rename to base/src/test/java/com/flowingcode/vaadin/addons/demo/it/ConditionalSourceCodeViewerIT.java
diff --git a/src/test/java/com/flowingcode/vaadin/addons/demo/it/SourceCodeViewerElement.java b/base/src/test/java/com/flowingcode/vaadin/addons/demo/it/SourceCodeViewerElement.java
similarity index 100%
rename from src/test/java/com/flowingcode/vaadin/addons/demo/it/SourceCodeViewerElement.java
rename to base/src/test/java/com/flowingcode/vaadin/addons/demo/it/SourceCodeViewerElement.java
diff --git a/src/test/java/com/flowingcode/vaadin/addons/demo/it/SourceCodeViewerIT.java b/base/src/test/java/com/flowingcode/vaadin/addons/demo/it/SourceCodeViewerIT.java
similarity index 100%
rename from src/test/java/com/flowingcode/vaadin/addons/demo/it/SourceCodeViewerIT.java
rename to base/src/test/java/com/flowingcode/vaadin/addons/demo/it/SourceCodeViewerIT.java
diff --git a/src/test/java/com/flowingcode/vaadin/addons/demo/it/SourceCodeViewerView.java b/base/src/test/java/com/flowingcode/vaadin/addons/demo/it/SourceCodeViewerView.java
similarity index 100%
rename from src/test/java/com/flowingcode/vaadin/addons/demo/it/SourceCodeViewerView.java
rename to base/src/test/java/com/flowingcode/vaadin/addons/demo/it/SourceCodeViewerView.java
diff --git a/src/test/java/com/flowingcode/vaadin/addons/demo/it/TabbedDemoView.java b/base/src/test/java/com/flowingcode/vaadin/addons/demo/it/TabbedDemoView.java
similarity index 100%
rename from src/test/java/com/flowingcode/vaadin/addons/demo/it/TabbedDemoView.java
rename to base/src/test/java/com/flowingcode/vaadin/addons/demo/it/TabbedDemoView.java
diff --git a/src/test/java/com/flowingcode/vaadin/addons/demo/it/TabbedDemoViewIT.java b/base/src/test/java/com/flowingcode/vaadin/addons/demo/it/TabbedDemoViewIT.java
similarity index 100%
rename from src/test/java/com/flowingcode/vaadin/addons/demo/it/TabbedDemoViewIT.java
rename to base/src/test/java/com/flowingcode/vaadin/addons/demo/it/TabbedDemoViewIT.java
diff --git a/src/test/resources/META-INF/resources/frontend/condition-false.css b/base/src/test/resources/META-INF/resources/frontend/condition-false.css
similarity index 100%
rename from src/test/resources/META-INF/resources/frontend/condition-false.css
rename to base/src/test/resources/META-INF/resources/frontend/condition-false.css
diff --git a/src/test/resources/META-INF/resources/frontend/condition-true.css b/base/src/test/resources/META-INF/resources/frontend/condition-true.css
similarity index 100%
rename from src/test/resources/META-INF/resources/frontend/condition-true.css
rename to base/src/test/resources/META-INF/resources/frontend/condition-true.css
diff --git a/src/test/resources/META-INF/resources/frontend/highlight-demo.css b/base/src/test/resources/META-INF/resources/frontend/highlight-demo.css
similarity index 100%
rename from src/test/resources/META-INF/resources/frontend/highlight-demo.css
rename to base/src/test/resources/META-INF/resources/frontend/highlight-demo.css
diff --git a/src/test/resources/META-INF/resources/frontend/multi-source-demo.css b/base/src/test/resources/META-INF/resources/frontend/multi-source-demo.css
similarity index 100%
rename from src/test/resources/META-INF/resources/frontend/multi-source-demo.css
rename to base/src/test/resources/META-INF/resources/frontend/multi-source-demo.css
diff --git a/src/test/resources/com/flowingcode/vaadin/addons/demo/it/AnnotationCleanup.java b/base/src/test/resources/com/flowingcode/vaadin/addons/demo/it/AnnotationCleanup.java
similarity index 100%
rename from src/test/resources/com/flowingcode/vaadin/addons/demo/it/AnnotationCleanup.java
rename to base/src/test/resources/com/flowingcode/vaadin/addons/demo/it/AnnotationCleanup.java
diff --git a/src/test/resources/com/flowingcode/vaadin/addons/demo/it/AnnotationCleanup.txt b/base/src/test/resources/com/flowingcode/vaadin/addons/demo/it/AnnotationCleanup.txt
similarity index 100%
rename from src/test/resources/com/flowingcode/vaadin/addons/demo/it/AnnotationCleanup.txt
rename to base/src/test/resources/com/flowingcode/vaadin/addons/demo/it/AnnotationCleanup.txt
diff --git a/src/test/resources/com/flowingcode/vaadin/addons/demo/it/CleanupOverride.java b/base/src/test/resources/com/flowingcode/vaadin/addons/demo/it/CleanupOverride.java
similarity index 100%
rename from src/test/resources/com/flowingcode/vaadin/addons/demo/it/CleanupOverride.java
rename to base/src/test/resources/com/flowingcode/vaadin/addons/demo/it/CleanupOverride.java
diff --git a/src/test/resources/com/flowingcode/vaadin/addons/demo/it/CleanupOverride.txt b/base/src/test/resources/com/flowingcode/vaadin/addons/demo/it/CleanupOverride.txt
similarity index 100%
rename from src/test/resources/com/flowingcode/vaadin/addons/demo/it/CleanupOverride.txt
rename to base/src/test/resources/com/flowingcode/vaadin/addons/demo/it/CleanupOverride.txt
diff --git a/src/test/resources/com/flowingcode/vaadin/addons/demo/it/ConditionElif.java b/base/src/test/resources/com/flowingcode/vaadin/addons/demo/it/ConditionElif.java
similarity index 100%
rename from src/test/resources/com/flowingcode/vaadin/addons/demo/it/ConditionElif.java
rename to base/src/test/resources/com/flowingcode/vaadin/addons/demo/it/ConditionElif.java
diff --git a/src/test/resources/com/flowingcode/vaadin/addons/demo/it/ConditionElif.txt b/base/src/test/resources/com/flowingcode/vaadin/addons/demo/it/ConditionElif.txt
similarity index 100%
rename from src/test/resources/com/flowingcode/vaadin/addons/demo/it/ConditionElif.txt
rename to base/src/test/resources/com/flowingcode/vaadin/addons/demo/it/ConditionElif.txt
diff --git a/src/test/resources/com/flowingcode/vaadin/addons/demo/it/ConditionElse.java b/base/src/test/resources/com/flowingcode/vaadin/addons/demo/it/ConditionElse.java
similarity index 100%
rename from src/test/resources/com/flowingcode/vaadin/addons/demo/it/ConditionElse.java
rename to base/src/test/resources/com/flowingcode/vaadin/addons/demo/it/ConditionElse.java
diff --git a/src/test/resources/com/flowingcode/vaadin/addons/demo/it/ConditionElse.txt b/base/src/test/resources/com/flowingcode/vaadin/addons/demo/it/ConditionElse.txt
similarity index 100%
rename from src/test/resources/com/flowingcode/vaadin/addons/demo/it/ConditionElse.txt
rename to base/src/test/resources/com/flowingcode/vaadin/addons/demo/it/ConditionElse.txt
diff --git a/src/test/resources/com/flowingcode/vaadin/addons/demo/it/ConditionEq.java b/base/src/test/resources/com/flowingcode/vaadin/addons/demo/it/ConditionEq.java
similarity index 100%
rename from src/test/resources/com/flowingcode/vaadin/addons/demo/it/ConditionEq.java
rename to base/src/test/resources/com/flowingcode/vaadin/addons/demo/it/ConditionEq.java
diff --git a/src/test/resources/com/flowingcode/vaadin/addons/demo/it/ConditionEq.txt b/base/src/test/resources/com/flowingcode/vaadin/addons/demo/it/ConditionEq.txt
similarity index 100%
rename from src/test/resources/com/flowingcode/vaadin/addons/demo/it/ConditionEq.txt
rename to base/src/test/resources/com/flowingcode/vaadin/addons/demo/it/ConditionEq.txt
diff --git a/src/test/resources/com/flowingcode/vaadin/addons/demo/it/ConditionGe.java b/base/src/test/resources/com/flowingcode/vaadin/addons/demo/it/ConditionGe.java
similarity index 100%
rename from src/test/resources/com/flowingcode/vaadin/addons/demo/it/ConditionGe.java
rename to base/src/test/resources/com/flowingcode/vaadin/addons/demo/it/ConditionGe.java
diff --git a/src/test/resources/com/flowingcode/vaadin/addons/demo/it/ConditionGe.txt b/base/src/test/resources/com/flowingcode/vaadin/addons/demo/it/ConditionGe.txt
similarity index 100%
rename from src/test/resources/com/flowingcode/vaadin/addons/demo/it/ConditionGe.txt
rename to base/src/test/resources/com/flowingcode/vaadin/addons/demo/it/ConditionGe.txt
diff --git a/src/test/resources/com/flowingcode/vaadin/addons/demo/it/ConditionGt.java b/base/src/test/resources/com/flowingcode/vaadin/addons/demo/it/ConditionGt.java
similarity index 100%
rename from src/test/resources/com/flowingcode/vaadin/addons/demo/it/ConditionGt.java
rename to base/src/test/resources/com/flowingcode/vaadin/addons/demo/it/ConditionGt.java
diff --git a/src/test/resources/com/flowingcode/vaadin/addons/demo/it/ConditionGt.txt b/base/src/test/resources/com/flowingcode/vaadin/addons/demo/it/ConditionGt.txt
similarity index 100%
rename from src/test/resources/com/flowingcode/vaadin/addons/demo/it/ConditionGt.txt
rename to base/src/test/resources/com/flowingcode/vaadin/addons/demo/it/ConditionGt.txt
diff --git a/src/test/resources/com/flowingcode/vaadin/addons/demo/it/ConditionLe.java b/base/src/test/resources/com/flowingcode/vaadin/addons/demo/it/ConditionLe.java
similarity index 100%
rename from src/test/resources/com/flowingcode/vaadin/addons/demo/it/ConditionLe.java
rename to base/src/test/resources/com/flowingcode/vaadin/addons/demo/it/ConditionLe.java
diff --git a/src/test/resources/com/flowingcode/vaadin/addons/demo/it/ConditionLe.txt b/base/src/test/resources/com/flowingcode/vaadin/addons/demo/it/ConditionLe.txt
similarity index 100%
rename from src/test/resources/com/flowingcode/vaadin/addons/demo/it/ConditionLe.txt
rename to base/src/test/resources/com/flowingcode/vaadin/addons/demo/it/ConditionLe.txt
diff --git a/src/test/resources/com/flowingcode/vaadin/addons/demo/it/ConditionLt.java b/base/src/test/resources/com/flowingcode/vaadin/addons/demo/it/ConditionLt.java
similarity index 100%
rename from src/test/resources/com/flowingcode/vaadin/addons/demo/it/ConditionLt.java
rename to base/src/test/resources/com/flowingcode/vaadin/addons/demo/it/ConditionLt.java
diff --git a/src/test/resources/com/flowingcode/vaadin/addons/demo/it/ConditionLt.txt b/base/src/test/resources/com/flowingcode/vaadin/addons/demo/it/ConditionLt.txt
similarity index 100%
rename from src/test/resources/com/flowingcode/vaadin/addons/demo/it/ConditionLt.txt
rename to base/src/test/resources/com/flowingcode/vaadin/addons/demo/it/ConditionLt.txt
diff --git a/src/test/resources/com/flowingcode/vaadin/addons/demo/it/ConditionNe.java b/base/src/test/resources/com/flowingcode/vaadin/addons/demo/it/ConditionNe.java
similarity index 100%
rename from src/test/resources/com/flowingcode/vaadin/addons/demo/it/ConditionNe.java
rename to base/src/test/resources/com/flowingcode/vaadin/addons/demo/it/ConditionNe.java
diff --git a/src/test/resources/com/flowingcode/vaadin/addons/demo/it/ConditionNe.txt b/base/src/test/resources/com/flowingcode/vaadin/addons/demo/it/ConditionNe.txt
similarity index 100%
rename from src/test/resources/com/flowingcode/vaadin/addons/demo/it/ConditionNe.txt
rename to base/src/test/resources/com/flowingcode/vaadin/addons/demo/it/ConditionNe.txt
diff --git a/src/test/resources/com/flowingcode/vaadin/addons/demo/it/ConditionNested.java b/base/src/test/resources/com/flowingcode/vaadin/addons/demo/it/ConditionNested.java
similarity index 100%
rename from src/test/resources/com/flowingcode/vaadin/addons/demo/it/ConditionNested.java
rename to base/src/test/resources/com/flowingcode/vaadin/addons/demo/it/ConditionNested.java
diff --git a/src/test/resources/com/flowingcode/vaadin/addons/demo/it/ConditionNested.txt b/base/src/test/resources/com/flowingcode/vaadin/addons/demo/it/ConditionNested.txt
similarity index 100%
rename from src/test/resources/com/flowingcode/vaadin/addons/demo/it/ConditionNested.txt
rename to base/src/test/resources/com/flowingcode/vaadin/addons/demo/it/ConditionNested.txt
diff --git a/src/test/resources/com/flowingcode/vaadin/addons/demo/it/ConditionUnknownVariable.java b/base/src/test/resources/com/flowingcode/vaadin/addons/demo/it/ConditionUnknownVariable.java
similarity index 100%
rename from src/test/resources/com/flowingcode/vaadin/addons/demo/it/ConditionUnknownVariable.java
rename to base/src/test/resources/com/flowingcode/vaadin/addons/demo/it/ConditionUnknownVariable.java
diff --git a/src/test/resources/com/flowingcode/vaadin/addons/demo/it/ConditionUnknownVariable.txt b/base/src/test/resources/com/flowingcode/vaadin/addons/demo/it/ConditionUnknownVariable.txt
similarity index 100%
rename from src/test/resources/com/flowingcode/vaadin/addons/demo/it/ConditionUnknownVariable.txt
rename to base/src/test/resources/com/flowingcode/vaadin/addons/demo/it/ConditionUnknownVariable.txt
diff --git a/src/test/resources/com/flowingcode/vaadin/addons/demo/it/HideSource.java b/base/src/test/resources/com/flowingcode/vaadin/addons/demo/it/HideSource.java
similarity index 100%
rename from src/test/resources/com/flowingcode/vaadin/addons/demo/it/HideSource.java
rename to base/src/test/resources/com/flowingcode/vaadin/addons/demo/it/HideSource.java
diff --git a/src/test/resources/com/flowingcode/vaadin/addons/demo/it/HideSource.txt b/base/src/test/resources/com/flowingcode/vaadin/addons/demo/it/HideSource.txt
similarity index 100%
rename from src/test/resources/com/flowingcode/vaadin/addons/demo/it/HideSource.txt
rename to base/src/test/resources/com/flowingcode/vaadin/addons/demo/it/HideSource.txt
diff --git a/src/test/resources/com/flowingcode/vaadin/addons/demo/it/LicenseCleanup.java b/base/src/test/resources/com/flowingcode/vaadin/addons/demo/it/LicenseCleanup.java
similarity index 100%
rename from src/test/resources/com/flowingcode/vaadin/addons/demo/it/LicenseCleanup.java
rename to base/src/test/resources/com/flowingcode/vaadin/addons/demo/it/LicenseCleanup.java
diff --git a/src/test/resources/com/flowingcode/vaadin/addons/demo/it/LicenseCleanup.txt b/base/src/test/resources/com/flowingcode/vaadin/addons/demo/it/LicenseCleanup.txt
similarity index 100%
rename from src/test/resources/com/flowingcode/vaadin/addons/demo/it/LicenseCleanup.txt
rename to base/src/test/resources/com/flowingcode/vaadin/addons/demo/it/LicenseCleanup.txt
diff --git a/src/test/resources/com/flowingcode/vaadin/addons/demo/it/PackageCleanup.java b/base/src/test/resources/com/flowingcode/vaadin/addons/demo/it/PackageCleanup.java
similarity index 100%
rename from src/test/resources/com/flowingcode/vaadin/addons/demo/it/PackageCleanup.java
rename to base/src/test/resources/com/flowingcode/vaadin/addons/demo/it/PackageCleanup.java
diff --git a/src/test/resources/com/flowingcode/vaadin/addons/demo/it/PackageCleanup.txt b/base/src/test/resources/com/flowingcode/vaadin/addons/demo/it/PackageCleanup.txt
similarity index 100%
rename from src/test/resources/com/flowingcode/vaadin/addons/demo/it/PackageCleanup.txt
rename to base/src/test/resources/com/flowingcode/vaadin/addons/demo/it/PackageCleanup.txt
diff --git a/src/test/resources/com/flowingcode/vaadin/addons/demo/it/ShowSource.java b/base/src/test/resources/com/flowingcode/vaadin/addons/demo/it/ShowSource.java
similarity index 100%
rename from src/test/resources/com/flowingcode/vaadin/addons/demo/it/ShowSource.java
rename to base/src/test/resources/com/flowingcode/vaadin/addons/demo/it/ShowSource.java
diff --git a/src/test/resources/com/flowingcode/vaadin/addons/demo/it/ShowSource.txt b/base/src/test/resources/com/flowingcode/vaadin/addons/demo/it/ShowSource.txt
similarity index 100%
rename from src/test/resources/com/flowingcode/vaadin/addons/demo/it/ShowSource.txt
rename to base/src/test/resources/com/flowingcode/vaadin/addons/demo/it/ShowSource.txt
diff --git a/src/test/resources/com/flowingcode/vaadin/addons/demo/it/SimpleSource.java b/base/src/test/resources/com/flowingcode/vaadin/addons/demo/it/SimpleSource.java
similarity index 100%
rename from src/test/resources/com/flowingcode/vaadin/addons/demo/it/SimpleSource.java
rename to base/src/test/resources/com/flowingcode/vaadin/addons/demo/it/SimpleSource.java
diff --git a/src/test/resources/com/flowingcode/vaadin/addons/demo/it/SimpleSource.txt b/base/src/test/resources/com/flowingcode/vaadin/addons/demo/it/SimpleSource.txt
similarity index 100%
rename from src/test/resources/com/flowingcode/vaadin/addons/demo/it/SimpleSource.txt
rename to base/src/test/resources/com/flowingcode/vaadin/addons/demo/it/SimpleSource.txt
diff --git a/pom.xml b/pom.xml
index d7fd2a8..86294b3 100644
--- a/pom.xml
+++ b/pom.xml
@@ -1,330 +1,30 @@
-
4.0.0
com.flowingcode.vaadin.addons.demo
- commons-demo
+ commons-demo-aggregator
5.3.0-SNAPSHOT
-
- Commons Demo
- Common classes for add-ons demo
- https://www.flowingcode.com/en/open-source/
-
-
-
- flowingcode
- Flowing Code
- https://www.flowingcode.com
-
-
-
-
- UTF-8
- 17
- 17
- 24.3.13
- 11.0.26
-
-
-
-Flowing Code
-https://www.flowingcode.com
-
- 2020
-
-
- Apache 2
- http://www.apache.org/licenses/LICENSE-2.0.txt
- repo
-
-
+ pom
-
- https://github.com/FlowingCode/CommonsDemo
- scm:git:git://github.com/FlowingCode/CommonsDemo.git
- scm:git:ssh://git@github.com:/FlowingCode/CommonsDemo.git
- master
-
-
-
-
- central
- https://repo.maven.apache.org/maven2
-
- false
-
-
-
-
-
-
-
- com.vaadin
- vaadin-bom
- ${vaadin.version}
- pom
- import
-
-
-
-
-
-
- com.vaadin
- vaadin-core
- true
-
-
-
- org.projectlombok
- lombok
- 1.18.34
- provided
-
-
-
- jakarta.servlet
- jakarta.servlet-api
- 6.0.0
- provided
-
-
-
- com.flowingcode.vaadin.addons
- enhanced-tabs-addon
- 1.2.0
-
-
-
- com.flowingcode.vaadin
- json-migration-helper
- 0.9.2
-
-
-
- junit
- junit
- 4.11
- test
-
-
-
- org.slf4j
- slf4j-simple
- test
-
-
-
- com.vaadin
- vaadin-testbench
- test
-
-
- org.webjars.bowergithub.polymer
- polymer
-
-
-
-
-
- io.github.bonigarcia
- webdrivermanager
- 6.3.2
- test
-
-
- net.java.dev.jna
- jna
-
-
-
-
+ Commons Demo Aggregator
-
-
-
- org.apache.maven.plugins
- maven-release-plugin
- 3.0.1
-
- release
-
-
-
- org.apache.maven.plugins
- maven-deploy-plugin
- 2.8.2
-
-
- org.apache.maven.plugins
- maven-surefire-plugin
- 2.22.1
-
- false
-
-
-
- org.codehaus.mojo
- license-maven-plugin
- 1.14
-
- apache_v2
- false
-
- **/AppShellConfiguratorImpl.class
- **/main/resources/META-INF/resources/frontend/prism.js
- **/main/resources/META-INF/resources/frontend/prism.css
- **/test/resources/**
- **/main/dev-bundle/**
-
-
-
-
- org.eclipse.jetty
- jetty-maven-plugin
- ${jetty.version}
-
- 3
-
- true
-
- jar
-
-
-
- src/main/resources/META-INF/resources
- src/test/resources/META-INF/resources
-
-
-
-
-
-
-
-
- org.apache.maven.plugins
- maven-jar-plugin
- 3.1.2
-
-
-
- META-INF/VAADIN/config/flow-build-info.json
-
-
-
-
- com.vaadin
- vaadin-maven-plugin
- ${vaadin.version}
-
-
-
- prepare-frontend
-
-
-
-
-
- org.apache.maven.plugins
- maven-source-plugin
- 3.0.1
-
-
- attach-sources
- package
-
- jar-no-fork
-
-
-
-
-
- org.apache.maven.plugins
- maven-javadoc-plugin
- 3.11.1
-
-
- attach-javadocs
- package
-
- jar
-
-
-
-
- true
- none
- true
-
- https://javadoc.io/doc/com.vaadin/vaadin-platform-javadoc/${vaadin.version}
-
-
-
+
+ org.apache.maven.plugins
+ maven-deploy-plugin
+ 2.8.2
+
+ true
+
+
-
-
- gpg
-
-
- env.MAVEN_GPG_PASSPHRASE
-
-
-
-
-
- org.apache.maven.plugins
- maven-gpg-plugin
- 3.2.7
-
-
- sign-artifacts
- verify
-
- sign
-
-
-
-
-
-
-
-
-
- release
-
-
-
- org.sonatype.central
- central-publishing-maven-plugin
- 0.8.0
- true
-
-
-
-
-
-
- v25
-
- 21
- 21
- 25.0.0
-
-
-
- com.vaadin
- vaadin-dev
- true
-
-
-
-
-
+
+ base
+ processor
+
diff --git a/processor/pom.xml b/processor/pom.xml
new file mode 100644
index 0000000..bc370d8
--- /dev/null
+++ b/processor/pom.xml
@@ -0,0 +1,176 @@
+
+
+
+ 4.0.0
+
+ com.flowingcode.vaadin.addons.demo
+ commons-demo-processor
+ 5.3.0-SNAPSHOT
+
+ Commons Demo Processor
+ Annotation processor for Commons Demo: copies @DemoSource-referenced files into the class output
+ https://www.flowingcode.com/en/open-source/
+
+
+
+ flowingcode
+ Flowing Code
+ https://www.flowingcode.com
+
+
+
+
+ UTF-8
+ 17
+ 17
+ 5.3.0-SNAPSHOT
+
+
+
+ Flowing Code
+ https://www.flowingcode.com
+
+ 2020
+
+
+ Apache 2
+ http://www.apache.org/licenses/LICENSE-2.0.txt
+ repo
+
+
+
+
+ https://github.com/FlowingCode/CommonsDemo
+ scm:git:git://github.com/FlowingCode/CommonsDemo.git
+ scm:git:ssh://git@github.com:/FlowingCode/CommonsDemo.git
+ master
+
+
+
+
+ com.flowingcode.vaadin.addons.demo
+ commons-demo
+ ${commons-demo.version}
+ provided
+
+
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-release-plugin
+ 3.0.1
+
+ release
+
+
+
+ org.apache.maven.plugins
+ maven-deploy-plugin
+ 2.8.2
+
+
+ org.codehaus.mojo
+ license-maven-plugin
+ 1.14
+
+ apache_v2
+ false
+
+
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+ 3.13.0
+
+
+ -proc:none
+
+
+
+
+ org.apache.maven.plugins
+ maven-source-plugin
+ 3.0.1
+
+
+ attach-sources
+ package
+
+ jar-no-fork
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-javadoc-plugin
+ 3.11.1
+
+
+ attach-javadocs
+ package
+
+ jar
+
+
+
+
+ true
+ none
+ false
+
+
+
+
+
+
+
+ gpg
+
+
+ env.MAVEN_GPG_PASSPHRASE
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-gpg-plugin
+ 3.2.7
+
+
+ sign-artifacts
+ verify
+
+ sign
+
+
+
+
+
+
+
+
+
+ release
+
+
+
+ org.sonatype.central
+ central-publishing-maven-plugin
+ 0.8.0
+ true
+
+
+
+
+
+
+
diff --git a/processor/src/main/java/com/flowingcode/vaadin/addons/demo/DemoSourceProcessor.java b/processor/src/main/java/com/flowingcode/vaadin/addons/demo/DemoSourceProcessor.java
new file mode 100644
index 0000000..bb65ca7
--- /dev/null
+++ b/processor/src/main/java/com/flowingcode/vaadin/addons/demo/DemoSourceProcessor.java
@@ -0,0 +1,261 @@
+/*-
+ * #%L
+ * Commons Demo
+ * %%
+ * Copyright (C) 2020 - 2026 Flowing Code
+ * %%
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * #L%
+ */
+package com.flowingcode.vaadin.addons.demo;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.util.ArrayList;
+import java.util.LinkedHashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import javax.annotation.processing.AbstractProcessor;
+import javax.annotation.processing.RoundEnvironment;
+import javax.annotation.processing.SupportedAnnotationTypes;
+import javax.lang.model.SourceVersion;
+import javax.lang.model.element.AnnotationMirror;
+import javax.lang.model.element.AnnotationValue;
+import javax.lang.model.element.Element;
+import javax.lang.model.element.ExecutableElement;
+import javax.lang.model.element.TypeElement;
+import javax.lang.model.type.TypeMirror;
+import javax.tools.Diagnostic;
+import javax.tools.FileObject;
+import javax.tools.StandardLocation;
+
+/**
+ * Annotation processor that scans sources annotated with {@link DemoSource} and copies the
+ * referenced source files into the class output (JAR).
+ *
+ *
This processor is intended to run as part of a Maven build, where
+ * {@link StandardLocation#SOURCE_PATH} is configured automatically by
+ * {@code maven-compiler-plugin}. When building inside an IDE, source files are served through
+ * other mechanisms (e.g. {@code DevSourceRequestHandler}) that bypass the processor output, so
+ * {@code SOURCE_PATH} may not be available. If {@link javax.tools.Filer#getResource} fails, the
+ * processor logs a warning and skips the affected file rather than failing the build.
+ *
+ * @author Javier Godoy / Flowing Code
+ */
+@SupportedAnnotationTypes({
+ "com.flowingcode.vaadin.addons.demo.DemoSource",
+ "com.flowingcode.vaadin.addons.demo.DemoSources"
+})
+public class DemoSourceProcessor extends AbstractProcessor {
+
+ @Override
+ public SourceVersion getSupportedSourceVersion() {
+ return SourceVersion.latestSupported();
+ }
+
+ private final Set collectedPaths = new LinkedHashSet<>();
+
+ @Override
+ public boolean process(Set extends TypeElement> annotations, RoundEnvironment roundEnv) {
+ if (roundEnv.processingOver()) {
+ if (!collectedPaths.isEmpty()) {
+ writeResource();
+ }
+ return false;
+ }
+
+ TypeElement demoSourceType =
+ processingEnv
+ .getElementUtils()
+ .getTypeElement("com.flowingcode.vaadin.addons.demo.DemoSource");
+ TypeElement demoSourcesType =
+ processingEnv
+ .getElementUtils()
+ .getTypeElement("com.flowingcode.vaadin.addons.demo.DemoSources");
+
+ Set processed = new LinkedHashSet<>();
+ processed.addAll(roundEnv.getElementsAnnotatedWith(demoSourceType));
+ processed.addAll(roundEnv.getElementsAnnotatedWith(demoSourcesType));
+
+ for (Element element : processed) {
+ if (!(element instanceof TypeElement)) {
+ continue;
+ }
+ TypeElement annotatedClass = (TypeElement) element;
+ for (AnnotationMirror am :
+ getDemoSourceAnnotations(element, demoSourceType, demoSourcesType)) {
+ String path = resolvePath(annotatedClass, am, demoSourceType);
+ if (path != null) {
+ collectedPaths.add(path);
+ }
+ }
+ }
+
+ return false;
+ }
+
+ private List getDemoSourceAnnotations(
+ Element element, TypeElement demoSourceType, TypeElement demoSourcesType) {
+ List result = new ArrayList<>();
+ TypeMirror demoSourceMirror = demoSourceType.asType();
+ TypeMirror demoSourcesMirror = demoSourcesType.asType();
+
+ for (AnnotationMirror am : element.getAnnotationMirrors()) {
+ if (processingEnv.getTypeUtils().isSameType(am.getAnnotationType(), demoSourceMirror)) {
+ result.add(am);
+ } else if (processingEnv
+ .getTypeUtils()
+ .isSameType(am.getAnnotationType(), demoSourcesMirror)) {
+ // unwrap the @DemoSources container
+ AnnotationValue containerValue = getAnnotationValue(am, "value");
+ if (containerValue != null) {
+ @SuppressWarnings("unchecked")
+ List extends AnnotationValue> list =
+ (List extends AnnotationValue>) containerValue.getValue();
+ for (AnnotationValue av : list) {
+ result.add((AnnotationMirror) av.getValue());
+ }
+ }
+ }
+ }
+ return result;
+ }
+
+ private String resolvePath(
+ TypeElement annotatedClass, AnnotationMirror annotation, TypeElement demoSourceType) {
+ Map extends ExecutableElement, ? extends AnnotationValue> values =
+ processingEnv.getElementUtils().getElementValuesWithDefaults(annotation);
+
+ String value = getStringValue(values, "value");
+ TypeMirror clazzMirror = getTypeValue(values, "clazz");
+
+ boolean hasValue = !DemoSource.DEFAULT_VALUE.equals(value);
+ boolean hasClazz =
+ !processingEnv.getTypeUtils().isSameType(clazzMirror, demoSourceType.asType());
+
+ if (hasValue && hasClazz) {
+ processingEnv
+ .getMessager()
+ .printMessage(
+ Diagnostic.Kind.ERROR,
+ "Cannot specify both 'value' and 'clazz' in @DemoSource.",
+ annotatedClass,
+ annotation);
+ return null;
+ }
+
+ if (hasValue) {
+ return value;
+ } else {
+ TypeElement typeElement;
+ if (hasClazz) {
+ Element clazzElement = processingEnv.getTypeUtils().asElement(clazzMirror);
+ if (!(clazzElement instanceof TypeElement)) {
+ processingEnv
+ .getMessager()
+ .printMessage(
+ Diagnostic.Kind.ERROR,
+ "The 'clazz' element of @DemoSource must be a declared type.",
+ annotatedClass,
+ annotation);
+ return null;
+ }
+ typeElement = (TypeElement) clazzElement;
+ } else {
+ // annotation.clazz() == DemoSource.class (sentinel default)
+ typeElement = annotatedClass;
+ }
+ // Walk up to the top-level type so that inner classes resolve to Outer.java
+ while (typeElement.getEnclosingElement() instanceof TypeElement) {
+ typeElement = (TypeElement) typeElement.getEnclosingElement();
+ }
+ String className = typeElement.getQualifiedName().toString().replace('.', '/');
+ return "src/test/java/" + className + ".java";
+ }
+ }
+
+ private static String getStringValue(
+ Map extends ExecutableElement, ? extends AnnotationValue> values, String name) {
+ return (String) getRawValue(values, name);
+ }
+
+ private static TypeMirror getTypeValue(
+ Map extends ExecutableElement, ? extends AnnotationValue> values, String name) {
+ return (TypeMirror) getRawValue(values, name);
+ }
+
+ private static Object getRawValue(
+ Map extends ExecutableElement, ? extends AnnotationValue> values, String name) {
+ for (Map.Entry extends ExecutableElement, ? extends AnnotationValue> entry :
+ values.entrySet()) {
+ if (entry.getKey().getSimpleName().contentEquals(name)) {
+ return entry.getValue().getValue();
+ }
+ }
+ return null;
+ }
+
+ private AnnotationValue getAnnotationValue(AnnotationMirror annotation, String name) {
+ for (Map.Entry extends ExecutableElement, ? extends AnnotationValue> entry :
+ processingEnv.getElementUtils().getElementValuesWithDefaults(annotation).entrySet()) {
+ if (entry.getKey().getSimpleName().contentEquals(name)) {
+ return entry.getValue();
+ }
+ }
+ return null;
+ }
+
+ private static final String[] SOURCE_ROOTS = {"src/test/java/", "src/main/java/"};
+
+ private void writeResource() {
+ int count = collectedPaths.size();
+ if (count > 0) {
+ processingEnv
+ .getMessager()
+ .printMessage(
+ Diagnostic.Kind.NOTE,
+ "Copying " + count + " demo-source " + (count == 1 ? "file" : "files") + " to class output");
+ }
+ for (String sourcePath : collectedPaths) {
+ try {
+ FileObject source = openSourceFile(sourcePath);
+ FileObject resource =
+ processingEnv
+ .getFiler()
+ .createResource(StandardLocation.CLASS_OUTPUT, "", sourcePath);
+ try (OutputStream out = resource.openOutputStream();
+ InputStream in = source.openInputStream()) {
+ in.transferTo(out);
+ }
+ } catch (IOException | IllegalArgumentException e) {
+ processingEnv
+ .getMessager()
+ .printMessage(
+ Diagnostic.Kind.WARNING, "Failed to copy " + sourcePath + ": " + e.getMessage());
+ }
+ }
+ }
+
+ private FileObject openSourceFile(String path) throws IOException {
+ for (String root : SOURCE_ROOTS) {
+ if (path.startsWith(root)) {
+ return processingEnv
+ .getFiler()
+ .getResource(StandardLocation.SOURCE_PATH, "", path.substring(root.length()));
+ }
+ }
+ return processingEnv.getFiler().getResource(StandardLocation.SOURCE_PATH, "", path);
+ }
+}
diff --git a/processor/src/main/resources/META-INF/services/javax.annotation.processing.Processor b/processor/src/main/resources/META-INF/services/javax.annotation.processing.Processor
new file mode 100644
index 0000000..feb9b86
--- /dev/null
+++ b/processor/src/main/resources/META-INF/services/javax.annotation.processing.Processor
@@ -0,0 +1 @@
+com.flowingcode.vaadin.addons.demo.DemoSourceProcessor