From c0330dd690196d61ae8d2f0617b933b400d5303d Mon Sep 17 00:00:00 2001 From: XDEV Renovate Bot Date: Sat, 28 Sep 2024 02:32:00 +0000 Subject: [PATCH 01/19] Update dependency org.apache.maven.plugins:maven-gpg-plugin to v3.2.7 --- template-placeholder/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/template-placeholder/pom.xml b/template-placeholder/pom.xml index 5d5a7057..4ca51ad4 100644 --- a/template-placeholder/pom.xml +++ b/template-placeholder/pom.xml @@ -199,7 +199,7 @@ org.apache.maven.plugins maven-gpg-plugin - 3.2.6 + 3.2.7 sign-artifacts From 40edee3f6942a2d0498d8b1ea7c5f2a2de509539 Mon Sep 17 00:00:00 2001 From: XDEV Renovate Bot Date: Mon, 30 Sep 2024 02:38:20 +0000 Subject: [PATCH 02/19] Update dependency com.puppycrawl.tools:checkstyle to v10.18.2 --- pom.xml | 2 +- template-placeholder/pom.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 91a9617a..035f4751 100644 --- a/pom.xml +++ b/pom.xml @@ -45,7 +45,7 @@ com.puppycrawl.tools checkstyle - 10.18.1 + 10.18.2 diff --git a/template-placeholder/pom.xml b/template-placeholder/pom.xml index 5d5a7057..571ef918 100644 --- a/template-placeholder/pom.xml +++ b/template-placeholder/pom.xml @@ -247,7 +247,7 @@ com.puppycrawl.tools checkstyle - 10.18.1 + 10.18.2 From 2ce9319db9fdcdb5b987ea325f45d5089477e75c Mon Sep 17 00:00:00 2001 From: XDEV Renovate Bot Date: Wed, 2 Oct 2024 02:33:50 +0000 Subject: [PATCH 03/19] Update dependency org.apache.maven.plugins:maven-javadoc-plugin to v3.10.1 --- template-placeholder/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/template-placeholder/pom.xml b/template-placeholder/pom.xml index 5d5a7057..c08df719 100644 --- a/template-placeholder/pom.xml +++ b/template-placeholder/pom.xml @@ -143,7 +143,7 @@ org.apache.maven.plugins maven-javadoc-plugin - 3.10.0 + 3.10.1 attach-javadocs From 19677120b4d32e04a41b3d19089c9431afadd2b2 Mon Sep 17 00:00:00 2001 From: XDEV Renovate Bot Date: Wed, 9 Oct 2024 02:32:36 +0000 Subject: [PATCH 04/19] Update lycheeverse/lychee-action action to v2 --- .github/workflows/broken-links.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/broken-links.yml b/.github/workflows/broken-links.yml index 96af7986..c17c3978 100644 --- a/.github/workflows/broken-links.yml +++ b/.github/workflows/broken-links.yml @@ -18,7 +18,7 @@ jobs: - name: Link Checker id: lychee - uses: lycheeverse/lychee-action@v1 + uses: lycheeverse/lychee-action@v2 - name: Find already existing issue id: find-issue From 506ecb3260475d4041f15b31be8e84a1f48e6f61 Mon Sep 17 00:00:00 2001 From: AB Date: Thu, 10 Oct 2024 13:53:40 +0200 Subject: [PATCH 05/19] Make fields overrideable --- .../config/EclipseStoreClientConfiguration.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/config/EclipseStoreClientConfiguration.java b/spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/config/EclipseStoreClientConfiguration.java index f64aedd7..6355a0b7 100644 --- a/spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/config/EclipseStoreClientConfiguration.java +++ b/spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/config/EclipseStoreClientConfiguration.java @@ -51,11 +51,11 @@ }) public abstract class EclipseStoreClientConfiguration implements EclipseStoreStorageFoundationProvider { - private final EclipseStoreProperties defaultEclipseStoreProperties; - private final EmbeddedStorageFoundationFactory defaultEclipseStoreProvider; + protected final EclipseStoreProperties defaultEclipseStoreProperties; + protected final EmbeddedStorageFoundationFactory defaultEclipseStoreProvider; - private EclipseStoreStorage storageInstance; - private EclipseStoreTransactionManager transactionManager; + protected EclipseStoreStorage storageInstance; + protected EclipseStoreTransactionManager transactionManager; @Autowired protected EclipseStoreClientConfiguration( From c347c07f1462b37a5b7b02401758ca9e08dbbdd3 Mon Sep 17 00:00:00 2001 From: AB Date: Thu, 10 Oct 2024 13:54:49 +0200 Subject: [PATCH 06/19] Fix sonar problems --- .../repository/config/EclipseStoreClientConfiguration.java | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/config/EclipseStoreClientConfiguration.java b/spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/config/EclipseStoreClientConfiguration.java index 6355a0b7..e6e92f21 100644 --- a/spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/config/EclipseStoreClientConfiguration.java +++ b/spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/config/EclipseStoreClientConfiguration.java @@ -99,10 +99,9 @@ public EclipseStoreStorage getStorageInstance() public PlatformTransactionManager transactionManager( final ObjectProvider transactionManagerCustomizers) { - final EclipseStoreTransactionManager transactionManager = this.getTransactionManagerInstance(); - transactionManagerCustomizers.ifAvailable((customizers) -> - customizers.customize((TransactionManager)transactionManager)); - return transactionManager; + final EclipseStoreTransactionManager tm = this.getTransactionManagerInstance(); + transactionManagerCustomizers.ifAvailable(customizers -> customizers.customize((TransactionManager)tm)); + return tm; } public EclipseStoreTransactionManager getTransactionManagerInstance() From 1af5523d566c73f2f855bdc6772f4526c1fcb27e Mon Sep 17 00:00:00 2001 From: AB Date: Thu, 10 Oct 2024 15:10:04 +0200 Subject: [PATCH 07/19] Add support for shuting down the storage during application shutdown --- CHANGELOG.md | 6 ++ .../EclipseStoreClientConfiguration.java | 70 +++++++++++++++++++ 2 files changed, 76 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index bc724225..14d3b3e0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,9 @@ +# 2.3.0 + +* Add support for shuting down the storage during application shutdown + * By default only enabled when Spring DevTools are active + * This should fix "StorageExceptionInitialization: Active storage for ... already exists" errors during DevTools restart + # 2.2.2 * Fixed NPE in EclipseSerializerRegisteringCopier diff --git a/spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/config/EclipseStoreClientConfiguration.java b/spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/config/EclipseStoreClientConfiguration.java index e6e92f21..16ade615 100644 --- a/spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/config/EclipseStoreClientConfiguration.java +++ b/spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/config/EclipseStoreClientConfiguration.java @@ -20,9 +20,12 @@ import org.eclipse.store.storage.embedded.types.EmbeddedStorageFoundation; import org.springframework.beans.factory.ObjectProvider; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.autoconfigure.transaction.TransactionManagerCustomizers; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; +import org.springframework.context.event.ContextClosedEvent; +import org.springframework.context.event.EventListener; import org.springframework.transaction.PlatformTransactionManager; import org.springframework.transaction.TransactionManager; @@ -112,4 +115,71 @@ public EclipseStoreTransactionManager getTransactionManagerInstance() } return this.transactionManager; } + + // region On context closed shutdown storage + + @Value("${spring-data-eclipse-store.context-close-shutdown-storage.enabled:true}") + protected boolean contextCloseShutdownStorageEnabled; + + @Value("${spring-data-eclipse-store.context-close-shutdown-storage.only-when-dev-tools:true}") + protected boolean contextCloseShutdownStorageOnlyWhenDevTools; + + /** + * Upstream value from Spring Boot DevTools. + * + * @see org.springframework.boot.devtools.autoconfigure.DevToolsProperties.Restart + */ + @Value("${spring.devtools.restart.enabled:true}") + protected boolean springDevtoolsRestartEnabled; + + protected boolean shouldShutdownStorageOnContextClosed() + { + // Did the user disable support for this? + if(!this.contextCloseShutdownStorageEnabled) + { + return false; + } + + // Always or only for DevTools? + if(!this.contextCloseShutdownStorageOnlyWhenDevTools) + { + return true; + } + + // Spring DevTools loaded? + try + { + Class.forName("org.springframework.boot.devtools.autoconfigure.DevToolsProperties"); + } + catch(final ClassNotFoundException e) + { + return false; + } + + // Spring Boot DevTools Restart enabled? + return this.springDevtoolsRestartEnabled; + } + + /** + * Invoked when the application is "shut down" - or parts of it during a DevTools restart. + *

+ * Shuts down the storage when it's present and {@link #shouldShutdownStorageOnContextClosed()} is + * true + *

+ * + *

+ * This is required for the DevTools restart as it otherwise crashes with StorageExceptionInitialization: + * Active storage for ... already exists + *

+ */ + @EventListener + public void shutdownStorageOnContextClosed(final ContextClosedEvent event) + { + if(this.storageInstance != null && this.shouldShutdownStorageOnContextClosed()) + { + this.storageInstance.stop(); + } + } + + // endregion } From c4204412f2c5bfeb66780dd9b2719edb36273b7f Mon Sep 17 00:00:00 2001 From: AB Date: Thu, 10 Oct 2024 15:10:31 +0200 Subject: [PATCH 08/19] Bump version due to minor change --- pom.xml | 2 +- spring-data-eclipse-store-benchmark/pom.xml | 4 ++-- spring-data-eclipse-store-demo/pom.xml | 4 ++-- spring-data-eclipse-store-jpa/pom.xml | 4 ++-- spring-data-eclipse-store/pom.xml | 2 +- 5 files changed, 8 insertions(+), 8 deletions(-) diff --git a/pom.xml b/pom.xml index c55ec34a..17170c7c 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ software.xdev spring-data-eclipse-store-root - 2.2.3-SNAPSHOT + 2.3.0-SNAPSHOT pom diff --git a/spring-data-eclipse-store-benchmark/pom.xml b/spring-data-eclipse-store-benchmark/pom.xml index d6347d2a..ad1347bc 100644 --- a/spring-data-eclipse-store-benchmark/pom.xml +++ b/spring-data-eclipse-store-benchmark/pom.xml @@ -5,11 +5,11 @@ software.xdev spring-data-eclipse-store-root - 2.2.3-SNAPSHOT + 2.3.0-SNAPSHOT spring-data-eclipse-store-benchmark - 2.2.3-SNAPSHOT + 2.3.0-SNAPSHOT jar 2023 diff --git a/spring-data-eclipse-store-demo/pom.xml b/spring-data-eclipse-store-demo/pom.xml index 4cd0fb01..f4b5f154 100644 --- a/spring-data-eclipse-store-demo/pom.xml +++ b/spring-data-eclipse-store-demo/pom.xml @@ -7,11 +7,11 @@ software.xdev spring-data-eclipse-store-root - 2.2.3-SNAPSHOT + 2.3.0-SNAPSHOT spring-data-eclipse-store-demo - 2.2.3-SNAPSHOT + 2.3.0-SNAPSHOT jar diff --git a/spring-data-eclipse-store-jpa/pom.xml b/spring-data-eclipse-store-jpa/pom.xml index 9a0bf48c..23e82960 100644 --- a/spring-data-eclipse-store-jpa/pom.xml +++ b/spring-data-eclipse-store-jpa/pom.xml @@ -7,11 +7,11 @@ software.xdev spring-data-eclipse-store-root - 2.2.3-SNAPSHOT + 2.3.0-SNAPSHOT spring-data-eclipse-store-jpa - 2.2.3-SNAPSHOT + 2.3.0-SNAPSHOT jar 2023 diff --git a/spring-data-eclipse-store/pom.xml b/spring-data-eclipse-store/pom.xml index a8fe9d16..fe6a5069 100644 --- a/spring-data-eclipse-store/pom.xml +++ b/spring-data-eclipse-store/pom.xml @@ -6,7 +6,7 @@ software.xdev spring-data-eclipse-store - 2.2.3-SNAPSHOT + 2.3.0-SNAPSHOT jar spring-data-eclipse-store From 254289d84ed69cf5ebfb337480b3b85ed6d86c6c Mon Sep 17 00:00:00 2001 From: AB Date: Fri, 11 Oct 2024 13:25:49 +0200 Subject: [PATCH 09/19] Add log message --- .../config/EclipseStoreClientConfiguration.java | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/config/EclipseStoreClientConfiguration.java b/spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/config/EclipseStoreClientConfiguration.java index 16ade615..f967e663 100644 --- a/spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/config/EclipseStoreClientConfiguration.java +++ b/spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/config/EclipseStoreClientConfiguration.java @@ -18,6 +18,8 @@ import org.eclipse.store.integrations.spring.boot.types.configuration.EclipseStoreProperties; import org.eclipse.store.integrations.spring.boot.types.factories.EmbeddedStorageFoundationFactory; import org.eclipse.store.storage.embedded.types.EmbeddedStorageFoundation; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.factory.ObjectProvider; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; @@ -54,6 +56,8 @@ }) public abstract class EclipseStoreClientConfiguration implements EclipseStoreStorageFoundationProvider { + private static final Logger LOG = LoggerFactory.getLogger(EclipseStoreClientConfiguration.class); + protected final EclipseStoreProperties defaultEclipseStoreProperties; protected final EmbeddedStorageFoundationFactory defaultEclipseStoreProvider; @@ -157,7 +161,15 @@ protected boolean shouldShutdownStorageOnContextClosed() } // Spring Boot DevTools Restart enabled? - return this.springDevtoolsRestartEnabled; + final boolean enabled = this.springDevtoolsRestartEnabled; + if(enabled) + { + LOG.warn("Will shut down storage because Spring Boot DevTools Restarting is active. " + + "This may cause some unexpected behavior. " + + "For more information have a look at " + + "https://spring-eclipsestore.xdev.software/known-issues.html#_spring_developer_tools"); + } + return enabled; } /** From 8ec5869b51df6de18eea79bf4e8785d725f8ea10 Mon Sep 17 00:00:00 2001 From: JohannesRabauer Date: Mon, 14 Oct 2024 07:31:16 +0200 Subject: [PATCH 10/19] Update known-issues.adoc --- docs/modules/ROOT/pages/known-issues.adoc | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/modules/ROOT/pages/known-issues.adoc b/docs/modules/ROOT/pages/known-issues.adoc index f6ad7ee1..e87b1be7 100644 --- a/docs/modules/ROOT/pages/known-issues.adoc +++ b/docs/modules/ROOT/pages/known-issues.adoc @@ -22,6 +22,7 @@ We created https://github.com/xdev-software/spring-data-eclipse-store/issues/33[ Using https://docs.spring.io/spring-boot/reference/using/devtools.html[Spring Developer Tools] (`spring-boot-devtools`) can lead to serious issues in your project. That is manly due to the https://docs.spring.io/spring-boot/reference/using/devtools.html#using.devtools.livereload[LiveReload feature] and the usage of a "Restart Classloader". +It derives from the https://docs.eclipsestore.io/manual/misc/integrations/spring-boot.html#_spring_dev_tools[issue with EclipseStore]. This leads to problems within EclipseStore and can cause issues with discovering beans (https://github.com/spring-projects/spring-boot/issues/41011[Example Issue]). From 2a8c20c9f529a3bf119a59946688b92743356d38 Mon Sep 17 00:00:00 2001 From: JohannesRabauer Date: Mon, 14 Oct 2024 08:52:20 +0200 Subject: [PATCH 11/19] Small refactor --- docs/antora.yml | 6 ++-- .../EclipseStoreClientConfiguration.java | 32 ++++++++----------- 2 files changed, 17 insertions(+), 21 deletions(-) diff --git a/docs/antora.yml b/docs/antora.yml index 0a7532f4..0688c304 100644 --- a/docs/antora.yml +++ b/docs/antora.yml @@ -1,14 +1,14 @@ name: ROOT title: Spring-Data-Eclipse-Store version: master -display_version: '2.2.2' +display_version: '2.3.0' start_page: index.adoc nav: - modules/ROOT/nav.adoc asciidoc: attributes: product-name: 'Spring-Data-Eclipse-Store' - display-version: '2.2.2' - maven-version: '2.2.2' + display-version: '2.3.0' + maven-version: '2.3.0' page-editable: false page-out-of-support: false diff --git a/spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/config/EclipseStoreClientConfiguration.java b/spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/config/EclipseStoreClientConfiguration.java index f967e663..826d248c 100644 --- a/spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/config/EclipseStoreClientConfiguration.java +++ b/spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/config/EclipseStoreClientConfiguration.java @@ -64,6 +64,20 @@ public abstract class EclipseStoreClientConfiguration implements EclipseStoreSto protected EclipseStoreStorage storageInstance; protected EclipseStoreTransactionManager transactionManager; + @Value("${spring-data-eclipse-store.context-close-shutdown-storage.enabled:true}") + protected boolean contextCloseShutdownStorageEnabled; + + @Value("${spring-data-eclipse-store.context-close-shutdown-storage.only-when-dev-tools:true}") + protected boolean contextCloseShutdownStorageOnlyWhenDevTools; + + /** + * Upstream value from Spring Boot DevTools. + * + * @see org.springframework.boot.devtools.autoconfigure.DevToolsProperties.Restart + */ + @Value("${spring.devtools.restart.enabled:true}") + protected boolean springDevtoolsRestartEnabled; + @Autowired protected EclipseStoreClientConfiguration( final EclipseStoreProperties defaultEclipseStoreProperties, @@ -120,22 +134,6 @@ public EclipseStoreTransactionManager getTransactionManagerInstance() return this.transactionManager; } - // region On context closed shutdown storage - - @Value("${spring-data-eclipse-store.context-close-shutdown-storage.enabled:true}") - protected boolean contextCloseShutdownStorageEnabled; - - @Value("${spring-data-eclipse-store.context-close-shutdown-storage.only-when-dev-tools:true}") - protected boolean contextCloseShutdownStorageOnlyWhenDevTools; - - /** - * Upstream value from Spring Boot DevTools. - * - * @see org.springframework.boot.devtools.autoconfigure.DevToolsProperties.Restart - */ - @Value("${spring.devtools.restart.enabled:true}") - protected boolean springDevtoolsRestartEnabled; - protected boolean shouldShutdownStorageOnContextClosed() { // Did the user disable support for this? @@ -192,6 +190,4 @@ public void shutdownStorageOnContextClosed(final ContextClosedEvent event) this.storageInstance.stop(); } } - - // endregion } From 52c3de8d796ea3720513998cc3e861cb4b3cb1ba Mon Sep 17 00:00:00 2001 From: JohannesRabauer Date: Mon, 14 Oct 2024 09:00:20 +0200 Subject: [PATCH 12/19] Added documentation --- docs/modules/ROOT/pages/configuration.adoc | 21 +++++++++++++++++++++ docs/modules/ROOT/pages/known-issues.adoc | 21 ++++++--------------- 2 files changed, 27 insertions(+), 15 deletions(-) diff --git a/docs/modules/ROOT/pages/configuration.adoc b/docs/modules/ROOT/pages/configuration.adoc index 834feca3..db20c99c 100644 --- a/docs/modules/ROOT/pages/configuration.adoc +++ b/docs/modules/ROOT/pages/configuration.adoc @@ -28,3 +28,24 @@ public class DemoConfiguration extends EclipseStoreClientConfiguration The method ``createEmbeddedStorageFoundation`` could return a much more complicated ``EmbeddedStorageFoundation`` as described here in the https://docs.eclipsestore.io/manual/storage/configuration/index.html[EclipseStore documentation about configuration and foundations]. This also enables you to use multiple EclipseStore-Storages in one project. See the https://github.com/xdev-software/spring-data-eclipse-store/tree/develop/spring-data-eclipse-store-demo/src/main/java/software/xdev/spring/data/eclipse/store/demo/dual/storage[Dual storages demo]. + +== Properties + +In general properties from EclipseStore can be used. +See https://docs.eclipsestore.io/manual/storage/configuration/properties.html[EclipseStore - Properties]. + +Here the {product-name}-Properties are displayed (all must be prefixed with ``spring-data-eclipse-store``): + +[cols="1,1"] +|=== +|https://github.com/xdev-software/spring-data-eclipse-store/tree/develop/spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/config/EclipseStoreClientConfiguration.java[context-close-shutdown-storage.enabled] [[context-close-shutdown-storage]] +| If enabled, the application listens to the ``ContextClosedEvent`` and shuts the storage down if the restart of the spring-dev-tools is enabled (see xref:known-issues.adoc#spring-dev-tools[Known issues] and https://docs.spring.io/spring-boot/api/java/org/springframework/boot/devtools/autoconfigure/DevToolsProperties.Restart.html[DevToolProperties]) + +Default: ``true`` + +|https://github.com/xdev-software/spring-data-eclipse-store/tree/develop/spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/config/EclipseStoreClientConfiguration.java[context-close-shutdown-storage.only-when-dev-tools] +|If this and ``context-close-shutdown-storage.enabled`` are true, the application listens to the ``ContextClosedEvent`` and shuts the storage down **only if** the spring-dev-tools are present in the ClassLoader (see xref:known-issues.adoc#spring-dev-tools[Known issues]) + +Default: ``true`` + + diff --git a/docs/modules/ROOT/pages/known-issues.adoc b/docs/modules/ROOT/pages/known-issues.adoc index e87b1be7..d82b72a2 100644 --- a/docs/modules/ROOT/pages/known-issues.adoc +++ b/docs/modules/ROOT/pages/known-issues.adoc @@ -18,23 +18,14 @@ This helps you keep your data up to date regardless of the current version. We created https://github.com/xdev-software/spring-data-eclipse-store/issues/33[an issue] for that but right now we *do not support XDEVs MicroMigration*. -== Spring Developer Tools +== Spring Developer Tools [[spring-dev-tools]] Using https://docs.spring.io/spring-boot/reference/using/devtools.html[Spring Developer Tools] (`spring-boot-devtools`) can lead to serious issues in your project. -That is manly due to the https://docs.spring.io/spring-boot/reference/using/devtools.html#using.devtools.livereload[LiveReload feature] and the usage of a "Restart Classloader". +That is manly due to the https://docs.spring.io/spring-boot/reference/using/devtools.html#using.devtools.livereload[LiveReload feature] and the usage of a "Restart ClassLoader". It derives from the https://docs.eclipsestore.io/manual/misc/integrations/spring-boot.html#_spring_dev_tools[issue with EclipseStore]. -This leads to problems within EclipseStore and can cause issues with discovering beans (https://github.com/spring-projects/spring-boot/issues/41011[Example Issue]). +To mitigate this issue, {product-name} listens to the closing of the Spring-Context and shuts down the storage. +This **should** handle most problems with the ClassLoader. +Restarting the storage leads to a reloading of all entities and may take some time, yet circumvents the Restart ClassLoader Issue. -If you must use the Spring Developer Tools, make sure to https://docs.spring.io/spring-boot/reference/using/devtools.html#using.devtools.restart.disable[disable restart]. - -[source,java,title="Example how to disable restart"] ----- -@SpringBootApplication -public class MyApplication { - public static void main(String[] args) { - System.setProperty("spring.devtools.restart.enabled", "false"); - SpringApplication.run(MyApplication.class, args); - } -} ----- +The behavior can be configured through xref:configuration.adoc#context-close-shutdown-storage[Properties] and is implemented in the https://github.com/xdev-software/spring-data-eclipse-store/tree/develop/spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/config/EclipseStoreClientConfiguration.java[EclipseStoreClientConfiguration.java]. From bb98ddf9ad4765fd05813218b5064df069c319e3 Mon Sep 17 00:00:00 2001 From: JohannesRabauer Date: Mon, 14 Oct 2024 15:00:18 +0200 Subject: [PATCH 13/19] Fixed faulty behavior if classloader is not set for EclipseStore --- .../store/demo/complex/ComplexConfiguration.java | 13 +++++++++++-- .../invoice/PersistenceInvoiceConfiguration.java | 14 +++++++++++--- .../EclipseSerializerRegisteringCopier.java | 2 +- 3 files changed, 23 insertions(+), 6 deletions(-) diff --git a/spring-data-eclipse-store-demo/src/main/java/software/xdev/spring/data/eclipse/store/demo/complex/ComplexConfiguration.java b/spring-data-eclipse-store-demo/src/main/java/software/xdev/spring/data/eclipse/store/demo/complex/ComplexConfiguration.java index 0b18d0cc..67514049 100644 --- a/spring-data-eclipse-store-demo/src/main/java/software/xdev/spring/data/eclipse/store/demo/complex/ComplexConfiguration.java +++ b/spring-data-eclipse-store-demo/src/main/java/software/xdev/spring/data/eclipse/store/demo/complex/ComplexConfiguration.java @@ -2,6 +2,7 @@ import java.nio.file.Path; +import org.eclipse.serializer.reflect.ClassLoaderProvider; import org.eclipse.store.integrations.spring.boot.types.configuration.EclipseStoreProperties; import org.eclipse.store.integrations.spring.boot.types.factories.EmbeddedStorageFoundationFactory; import org.eclipse.store.storage.embedded.types.EmbeddedStorage; @@ -25,13 +26,17 @@ public class ComplexConfiguration extends EclipseStoreClientConfiguration public static final String STORAGE_PATH = "storage-complex"; + private final ClassLoaderProvider classLoaderProvider; + @Autowired public ComplexConfiguration( final EclipseStoreProperties defaultEclipseStoreProperties, - final EmbeddedStorageFoundationFactory defaultEclipseStoreProvider + final EmbeddedStorageFoundationFactory defaultEclipseStoreProvider, + final ClassLoaderProvider classLoaderProvider ) { super(defaultEclipseStoreProperties, defaultEclipseStoreProvider); + this.classLoaderProvider = classLoaderProvider; } /** @@ -45,7 +50,11 @@ public ComplexConfiguration( @Override public EmbeddedStorageFoundation createEmbeddedStorageFoundation() { - return EmbeddedStorage.Foundation(Storage.Configuration(Storage.FileProvider(Path.of(STORAGE_PATH)))); + final EmbeddedStorageFoundation storageFoundation = + EmbeddedStorage.Foundation(Storage.Configuration(Storage.FileProvider(Path.of(STORAGE_PATH)))); + // This is only needed, if a different ClassLoader is used (e.g. when using spring-dev-tools) + storageFoundation.getConnectionFoundation().setClassLoaderProvider(this.classLoaderProvider); + return storageFoundation; } /** diff --git a/spring-data-eclipse-store-demo/src/main/java/software/xdev/spring/data/eclipse/store/demo/dual/storage/invoice/PersistenceInvoiceConfiguration.java b/spring-data-eclipse-store-demo/src/main/java/software/xdev/spring/data/eclipse/store/demo/dual/storage/invoice/PersistenceInvoiceConfiguration.java index b8d317c6..22c8cf84 100644 --- a/spring-data-eclipse-store-demo/src/main/java/software/xdev/spring/data/eclipse/store/demo/dual/storage/invoice/PersistenceInvoiceConfiguration.java +++ b/spring-data-eclipse-store-demo/src/main/java/software/xdev/spring/data/eclipse/store/demo/dual/storage/invoice/PersistenceInvoiceConfiguration.java @@ -2,6 +2,7 @@ import java.nio.file.Path; +import org.eclipse.serializer.reflect.ClassLoaderProvider; import org.eclipse.store.integrations.spring.boot.types.configuration.EclipseStoreProperties; import org.eclipse.store.integrations.spring.boot.types.factories.EmbeddedStorageFoundationFactory; import org.eclipse.store.storage.embedded.types.EmbeddedStorage; @@ -23,15 +24,18 @@ @EnableEclipseStoreRepositories public class PersistenceInvoiceConfiguration extends EclipseStoreClientConfiguration { - public static final String STORAGE_PATH = "storage-invoice"; + private final ClassLoaderProvider classLoaderProvider; + @Autowired protected PersistenceInvoiceConfiguration( final EclipseStoreProperties defaultEclipseStoreProperties, - final EmbeddedStorageFoundationFactory defaultEclipseStoreProvider) + final EmbeddedStorageFoundationFactory defaultEclipseStoreProvider, + final ClassLoaderProvider classLoaderProvider) { super(defaultEclipseStoreProperties, defaultEclipseStoreProvider); + this.classLoaderProvider = classLoaderProvider; } /** @@ -45,6 +49,10 @@ protected PersistenceInvoiceConfiguration( @Override public EmbeddedStorageFoundation createEmbeddedStorageFoundation() { - return EmbeddedStorage.Foundation(Storage.Configuration(Storage.FileProvider(Path.of(STORAGE_PATH)))); + final EmbeddedStorageFoundation storageFoundation = + EmbeddedStorage.Foundation(Storage.Configuration(Storage.FileProvider(Path.of(STORAGE_PATH)))); + // This is only needed, if a different ClassLoader is used (e.g. when using spring-dev-tools) + storageFoundation.getConnectionFoundation().setClassLoaderProvider(this.classLoaderProvider); + return storageFoundation; } } diff --git a/spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/support/copier/registering/EclipseSerializerRegisteringCopier.java b/spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/support/copier/registering/EclipseSerializerRegisteringCopier.java index 9d7f7469..076396ce 100644 --- a/spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/support/copier/registering/EclipseSerializerRegisteringCopier.java +++ b/spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/support/copier/registering/EclipseSerializerRegisteringCopier.java @@ -116,7 +116,7 @@ private T copy(final T source, final PersistenceManager persistenceM { persistenceManager.objectRegistry().truncateAll(); final BinaryStorer.Default storer = (BinaryStorer.Default)persistenceManager.createStorer(); - // Loader erstellen + // Create Loader final PersistenceLoader loader = persistenceManager.createLoader(); storer.store(source); From 7f4c97171d8a351e1ac97c1287ef6e57c4492234 Mon Sep 17 00:00:00 2001 From: JohannesRabauer Date: Mon, 14 Oct 2024 15:32:59 +0200 Subject: [PATCH 14/19] Added the ClassLoaderProvider to the RegisteringCopier to react to ClassLoader changes --- .../demo/complex/ComplexConfiguration.java | 7 ++----- .../PersistenceInvoiceConfiguration.java | 7 ++----- .../person/PersistencePersonConfiguration.java | 6 ++++-- .../jpa/integration/TestConfiguration.java | 6 ++++-- .../importer/EclipseStoreDataImporter.java | 3 ++- .../store/repository/EclipseStoreStorage.java | 8 ++++++++ ...DefaultEclipseStoreClientConfiguration.java | 6 ++++-- ...EclipseStoreClientConfigurationFactory.java | 9 +++++++-- .../EclipseStoreClientConfiguration.java | 11 ++++++++++- .../support/EclipseStoreRepositoryFactory.java | 3 ++- .../registering/AbstractRegisteringCopier.java | 13 ++++++++++--- .../RegisteringStorageToWorkingCopyCopier.java | 7 +++++-- .../RegisteringWorkingCopyToStorageCopier.java | 7 +++++-- .../copier/working/RecursiveWorkingCopier.java | 18 +++++++++++++++--- .../store/integration/TestConfiguration.java | 6 ++++-- .../deletion/DeletionTestConfiguration.java | 6 ++++-- ...uplicatedRepositoriesTestConfiguration.java | 6 ++++-- .../isolated/tests/id/IdTestConfiguration.java | 6 ++++-- .../immutables/ImmutableTestConfiguration.java | 6 ++++-- .../keywords/KeywordsTestConfiguration.java | 6 ++++-- .../tests/lazy/LazyTestConfiguration.java | 6 ++++-- .../migration/MigrationTestConfiguration.java | 6 ++++-- .../QueryByExampleTestConfiguration.java | 6 ++++-- .../by/string/QueryTestConfiguration.java | 6 ++++-- .../query/hsql/HsqlTestConfiguration.java | 6 ++++-- .../types/SpecialTypesTestConfiguration.java | 6 ++++-- .../TransactionsTestConfiguration.java | 6 ++++-- .../version/VersionTestConfiguration.java | 6 ++++-- .../shared/SharedTestConfiguration.java | 6 ++++-- ...isteringStorageToWorkingCopyCopierTest.java | 16 +++++++++++----- 30 files changed, 151 insertions(+), 66 deletions(-) diff --git a/spring-data-eclipse-store-demo/src/main/java/software/xdev/spring/data/eclipse/store/demo/complex/ComplexConfiguration.java b/spring-data-eclipse-store-demo/src/main/java/software/xdev/spring/data/eclipse/store/demo/complex/ComplexConfiguration.java index 67514049..254cc5ad 100644 --- a/spring-data-eclipse-store-demo/src/main/java/software/xdev/spring/data/eclipse/store/demo/complex/ComplexConfiguration.java +++ b/spring-data-eclipse-store-demo/src/main/java/software/xdev/spring/data/eclipse/store/demo/complex/ComplexConfiguration.java @@ -26,8 +26,6 @@ public class ComplexConfiguration extends EclipseStoreClientConfiguration public static final String STORAGE_PATH = "storage-complex"; - private final ClassLoaderProvider classLoaderProvider; - @Autowired public ComplexConfiguration( final EclipseStoreProperties defaultEclipseStoreProperties, @@ -35,8 +33,7 @@ public ComplexConfiguration( final ClassLoaderProvider classLoaderProvider ) { - super(defaultEclipseStoreProperties, defaultEclipseStoreProvider); - this.classLoaderProvider = classLoaderProvider; + super(defaultEclipseStoreProperties, defaultEclipseStoreProvider, classLoaderProvider); } /** @@ -53,7 +50,7 @@ public EmbeddedStorageFoundation createEmbeddedStorageFoundation() final EmbeddedStorageFoundation storageFoundation = EmbeddedStorage.Foundation(Storage.Configuration(Storage.FileProvider(Path.of(STORAGE_PATH)))); // This is only needed, if a different ClassLoader is used (e.g. when using spring-dev-tools) - storageFoundation.getConnectionFoundation().setClassLoaderProvider(this.classLoaderProvider); + storageFoundation.getConnectionFoundation().setClassLoaderProvider(this.getClassLoaderProvider()); return storageFoundation; } diff --git a/spring-data-eclipse-store-demo/src/main/java/software/xdev/spring/data/eclipse/store/demo/dual/storage/invoice/PersistenceInvoiceConfiguration.java b/spring-data-eclipse-store-demo/src/main/java/software/xdev/spring/data/eclipse/store/demo/dual/storage/invoice/PersistenceInvoiceConfiguration.java index 22c8cf84..2a279a17 100644 --- a/spring-data-eclipse-store-demo/src/main/java/software/xdev/spring/data/eclipse/store/demo/dual/storage/invoice/PersistenceInvoiceConfiguration.java +++ b/spring-data-eclipse-store-demo/src/main/java/software/xdev/spring/data/eclipse/store/demo/dual/storage/invoice/PersistenceInvoiceConfiguration.java @@ -26,16 +26,13 @@ public class PersistenceInvoiceConfiguration extends EclipseStoreClientConfigura { public static final String STORAGE_PATH = "storage-invoice"; - private final ClassLoaderProvider classLoaderProvider; - @Autowired protected PersistenceInvoiceConfiguration( final EclipseStoreProperties defaultEclipseStoreProperties, final EmbeddedStorageFoundationFactory defaultEclipseStoreProvider, final ClassLoaderProvider classLoaderProvider) { - super(defaultEclipseStoreProperties, defaultEclipseStoreProvider); - this.classLoaderProvider = classLoaderProvider; + super(defaultEclipseStoreProperties, defaultEclipseStoreProvider, classLoaderProvider); } /** @@ -52,7 +49,7 @@ public EmbeddedStorageFoundation createEmbeddedStorageFoundation() final EmbeddedStorageFoundation storageFoundation = EmbeddedStorage.Foundation(Storage.Configuration(Storage.FileProvider(Path.of(STORAGE_PATH)))); // This is only needed, if a different ClassLoader is used (e.g. when using spring-dev-tools) - storageFoundation.getConnectionFoundation().setClassLoaderProvider(this.classLoaderProvider); + storageFoundation.getConnectionFoundation().setClassLoaderProvider(getClassLoaderProvider()); return storageFoundation; } } diff --git a/spring-data-eclipse-store-demo/src/main/java/software/xdev/spring/data/eclipse/store/demo/dual/storage/person/PersistencePersonConfiguration.java b/spring-data-eclipse-store-demo/src/main/java/software/xdev/spring/data/eclipse/store/demo/dual/storage/person/PersistencePersonConfiguration.java index 1b9b1144..ab19bb33 100644 --- a/spring-data-eclipse-store-demo/src/main/java/software/xdev/spring/data/eclipse/store/demo/dual/storage/person/PersistencePersonConfiguration.java +++ b/spring-data-eclipse-store-demo/src/main/java/software/xdev/spring/data/eclipse/store/demo/dual/storage/person/PersistencePersonConfiguration.java @@ -1,5 +1,6 @@ package software.xdev.spring.data.eclipse.store.demo.dual.storage.person; +import org.eclipse.serializer.reflect.ClassLoaderProvider; import org.eclipse.store.integrations.spring.boot.types.configuration.ConfigurationPair; import org.eclipse.store.integrations.spring.boot.types.configuration.EclipseStoreProperties; import org.eclipse.store.integrations.spring.boot.types.factories.EmbeddedStorageFoundationFactory; @@ -31,9 +32,10 @@ public class PersistencePersonConfiguration extends EclipseStoreClientConfigurat public PersistencePersonConfiguration( final EclipseStoreProperties defaultEclipseStoreProperties, final EmbeddedStorageFoundationFactory defaultEclipseStoreProvider, - final EclipseStoreProperties properties) + final EclipseStoreProperties properties, + final ClassLoaderProvider classLoaderProvider) { - super(defaultEclipseStoreProperties, defaultEclipseStoreProvider); + super(defaultEclipseStoreProperties, defaultEclipseStoreProvider, classLoaderProvider); this.foundation = defaultEclipseStoreProvider; this.properties = properties; } diff --git a/spring-data-eclipse-store-jpa/src/test/java/software/xdev/spring/data/eclipse/store/jpa/integration/TestConfiguration.java b/spring-data-eclipse-store-jpa/src/test/java/software/xdev/spring/data/eclipse/store/jpa/integration/TestConfiguration.java index 9f540e4f..728d7187 100644 --- a/spring-data-eclipse-store-jpa/src/test/java/software/xdev/spring/data/eclipse/store/jpa/integration/TestConfiguration.java +++ b/spring-data-eclipse-store-jpa/src/test/java/software/xdev/spring/data/eclipse/store/jpa/integration/TestConfiguration.java @@ -17,6 +17,7 @@ import java.nio.file.Path; +import org.eclipse.serializer.reflect.ClassLoaderProvider; import org.eclipse.store.integrations.spring.boot.types.configuration.EclipseStoreProperties; import org.eclipse.store.integrations.spring.boot.types.factories.EmbeddedStorageFoundationFactory; import org.springframework.beans.factory.DisposableBean; @@ -45,9 +46,10 @@ public class TestConfiguration extends EclipseStoreClientConfiguration implement @Autowired protected TestConfiguration( final EclipseStoreProperties defaultEclipseStoreProperties, - final EmbeddedStorageFoundationFactory defaultEclipseStoreProvider) + final EmbeddedStorageFoundationFactory defaultEclipseStoreProvider, + final ClassLoaderProvider classLoaderProvider) { - super(defaultEclipseStoreProperties, defaultEclipseStoreProvider); + super(defaultEclipseStoreProperties, defaultEclipseStoreProvider, classLoaderProvider); } @EventListener diff --git a/spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/importer/EclipseStoreDataImporter.java b/spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/importer/EclipseStoreDataImporter.java index ffc73864..c9b63a34 100644 --- a/spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/importer/EclipseStoreDataImporter.java +++ b/spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/importer/EclipseStoreDataImporter.java @@ -265,7 +265,8 @@ private void createRepositoryForType( storageInstance, storageInstance, new SupportedChecker.Implementation(), - storageInstance + storageInstance, + this.configuration.getClassLoaderProvider() ), domainClass, new EclipseStoreTransactionManager(), diff --git a/spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/EclipseStoreStorage.java b/spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/EclipseStoreStorage.java index 26b5e399..ff4f51c7 100644 --- a/spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/EclipseStoreStorage.java +++ b/spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/EclipseStoreStorage.java @@ -25,6 +25,7 @@ import org.eclipse.serializer.persistence.binary.jdk17.java.util.BinaryHandlerImmutableCollectionsSet12; import org.eclipse.serializer.persistence.types.Storer; import org.eclipse.serializer.reference.ObjectSwizzling; +import org.eclipse.serializer.reflect.ClassLoaderProvider; import org.eclipse.store.storage.embedded.types.EmbeddedStorageFoundation; import org.eclipse.store.storage.embedded.types.EmbeddedStorageManager; import org.eclipse.store.storage.types.StorageManager; @@ -69,6 +70,7 @@ public class EclipseStoreStorage */ private final Map, VersionManager> versionManagers = new ConcurrentHashMap<>(); private final EclipseStoreStorageFoundationProvider foundationProvider; + private final ClassLoaderProvider classLoaderProvider; private EntitySetCollector entitySetCollector; private PersistableChecker persistenceChecker; private EmbeddedStorageManager storageManager; @@ -81,6 +83,7 @@ public class EclipseStoreStorage public EclipseStoreStorage(final EclipseStoreClientConfiguration storeConfiguration) { this.foundationProvider = storeConfiguration; + this.classLoaderProvider = storeConfiguration.getClassLoaderProvider(); } private StorageManager getInstanceOfStorageManager() @@ -94,6 +97,11 @@ public WorkingCopyRegistry getRegistry() return this.registry; } + public ClassLoaderProvider getClassLoaderProvider() + { + return this.classLoaderProvider; + } + private synchronized void ensureEntitiesInRoot() { if(this.storageManager == null) diff --git a/spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/config/DefaultEclipseStoreClientConfiguration.java b/spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/config/DefaultEclipseStoreClientConfiguration.java index cc9ba0a9..c462e0a5 100644 --- a/spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/config/DefaultEclipseStoreClientConfiguration.java +++ b/spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/config/DefaultEclipseStoreClientConfiguration.java @@ -15,6 +15,7 @@ */ package software.xdev.spring.data.eclipse.store.repository.config; +import org.eclipse.serializer.reflect.ClassLoaderProvider; import org.eclipse.store.integrations.spring.boot.types.configuration.EclipseStoreProperties; import org.eclipse.store.integrations.spring.boot.types.factories.EmbeddedStorageFoundationFactory; import org.springframework.context.annotation.Configuration; @@ -29,8 +30,9 @@ public class DefaultEclipseStoreClientConfiguration extends EclipseStoreClientCo { protected DefaultEclipseStoreClientConfiguration( final EclipseStoreProperties defaultEclipseStoreProperties, - final EmbeddedStorageFoundationFactory defaultEclipseStoreProvider) + final EmbeddedStorageFoundationFactory defaultEclipseStoreProvider, + final ClassLoaderProvider classLoaderProvider) { - super(defaultEclipseStoreProperties, defaultEclipseStoreProvider); + super(defaultEclipseStoreProperties, defaultEclipseStoreProvider, classLoaderProvider); } } diff --git a/spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/config/DefaultEclipseStoreClientConfigurationFactory.java b/spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/config/DefaultEclipseStoreClientConfigurationFactory.java index 3f2395e9..b1ae4cb6 100644 --- a/spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/config/DefaultEclipseStoreClientConfigurationFactory.java +++ b/spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/config/DefaultEclipseStoreClientConfigurationFactory.java @@ -15,6 +15,7 @@ */ package software.xdev.spring.data.eclipse.store.repository.config; +import org.eclipse.serializer.reflect.ClassLoaderProvider; import org.eclipse.store.integrations.spring.boot.types.configuration.EclipseStoreProperties; import org.eclipse.store.integrations.spring.boot.types.factories.EmbeddedStorageFoundationFactory; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; @@ -29,8 +30,12 @@ public class DefaultEclipseStoreClientConfigurationFactory @ConditionalOnMissingBean(EclipseStoreClientConfiguration.class) public DefaultEclipseStoreClientConfiguration getEclipseStoreClientConfiguration( final EclipseStoreProperties defaultEclipseStoreProperties, - final EmbeddedStorageFoundationFactory defaultEclipseStoreProvider) + final EmbeddedStorageFoundationFactory defaultEclipseStoreProvider, + final ClassLoaderProvider classLoaderProvider) { - return new DefaultEclipseStoreClientConfiguration(defaultEclipseStoreProperties, defaultEclipseStoreProvider); + return new DefaultEclipseStoreClientConfiguration( + defaultEclipseStoreProperties, + defaultEclipseStoreProvider, + classLoaderProvider); } } diff --git a/spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/config/EclipseStoreClientConfiguration.java b/spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/config/EclipseStoreClientConfiguration.java index 826d248c..5feea415 100644 --- a/spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/config/EclipseStoreClientConfiguration.java +++ b/spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/config/EclipseStoreClientConfiguration.java @@ -15,6 +15,7 @@ */ package software.xdev.spring.data.eclipse.store.repository.config; +import org.eclipse.serializer.reflect.ClassLoaderProvider; import org.eclipse.store.integrations.spring.boot.types.configuration.EclipseStoreProperties; import org.eclipse.store.integrations.spring.boot.types.factories.EmbeddedStorageFoundationFactory; import org.eclipse.store.storage.embedded.types.EmbeddedStorageFoundation; @@ -60,6 +61,7 @@ public abstract class EclipseStoreClientConfiguration implements EclipseStoreSto protected final EclipseStoreProperties defaultEclipseStoreProperties; protected final EmbeddedStorageFoundationFactory defaultEclipseStoreProvider; + protected final ClassLoaderProvider classLoaderProvider; protected EclipseStoreStorage storageInstance; protected EclipseStoreTransactionManager transactionManager; @@ -81,9 +83,11 @@ public abstract class EclipseStoreClientConfiguration implements EclipseStoreSto @Autowired protected EclipseStoreClientConfiguration( final EclipseStoreProperties defaultEclipseStoreProperties, - final EmbeddedStorageFoundationFactory defaultEclipseStoreProvider) + final EmbeddedStorageFoundationFactory defaultEclipseStoreProvider, + final ClassLoaderProvider classLoaderProvider) { this.defaultEclipseStoreProperties = defaultEclipseStoreProperties; + this.classLoaderProvider = classLoaderProvider; this.defaultEclipseStoreProperties.setAutoStart(false); this.defaultEclipseStoreProvider = defaultEclipseStoreProvider; } @@ -98,6 +102,11 @@ public EmbeddedStorageFoundationFactory getStoreProvider() return this.defaultEclipseStoreProvider; } + public ClassLoaderProvider getClassLoaderProvider() + { + return classLoaderProvider; + } + /** * Creates a {@link EmbeddedStorageFoundation} out of the two other provided functions {@link #getStoreProvider()} * and {@link #getEclipseStoreProperties()}. diff --git a/spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/support/EclipseStoreRepositoryFactory.java b/spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/support/EclipseStoreRepositoryFactory.java index 864c347d..a5fb3090 100644 --- a/spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/support/EclipseStoreRepositoryFactory.java +++ b/spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/support/EclipseStoreRepositoryFactory.java @@ -82,7 +82,8 @@ private WorkingCopier createWorkingCopier( storage, storage, new SupportedChecker.Implementation(), - storage + storage, + storage.getClassLoaderProvider() ); } diff --git a/spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/support/copier/registering/AbstractRegisteringCopier.java b/spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/support/copier/registering/AbstractRegisteringCopier.java index 14edda1d..7de0f882 100644 --- a/spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/support/copier/registering/AbstractRegisteringCopier.java +++ b/spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/support/copier/registering/AbstractRegisteringCopier.java @@ -23,6 +23,7 @@ import org.eclipse.serializer.persistence.types.PersistenceManager; import org.eclipse.serializer.reference.ObjectSwizzling; import org.eclipse.serializer.reference.Reference; +import org.eclipse.serializer.reflect.ClassLoaderProvider; import org.eclipse.serializer.util.X; import software.xdev.spring.data.eclipse.store.repository.SupportedChecker; @@ -37,12 +38,15 @@ public abstract class AbstractRegisteringCopier implements RegisteringObjectCopier { private final EclipseSerializerRegisteringCopier actualCopier; + private ClassLoader currentClassLoader; protected AbstractRegisteringCopier( final SupportedChecker supportedChecker, final RegisteringWorkingCopyAndOriginal register, final ObjectSwizzling objectSwizzling, - final WorkingCopier copier) + final WorkingCopier copier, + final ClassLoaderProvider currentClassLoaderProvider + ) { this.actualCopier = new EclipseSerializerRegisteringCopier( supportedChecker, @@ -51,7 +55,8 @@ protected AbstractRegisteringCopier( this.createPersistenceManager( this.createSerializerFoundation(), objectSwizzling, - copier + copier, + currentClassLoaderProvider ) ); } @@ -59,9 +64,11 @@ protected AbstractRegisteringCopier( private PersistenceManager createPersistenceManager( final SerializerFoundation serializerFoundation, final ObjectSwizzling objectSwizzling, - final WorkingCopier copier) + final WorkingCopier copier, + final ClassLoaderProvider currentClassLoaderProvider) { return serializerFoundation + .setClassLoaderProvider(currentClassLoaderProvider) .registerCustomTypeHandler(BinaryHandlerImmutableCollectionsSet12.New()) .registerCustomTypeHandler(BinaryHandlerImmutableCollectionsList12.New()) .registerCustomTypeHandlers(new SpringDataEclipseStoreLazyBinaryHandler(objectSwizzling, copier)) diff --git a/spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/support/copier/registering/RegisteringStorageToWorkingCopyCopier.java b/spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/support/copier/registering/RegisteringStorageToWorkingCopyCopier.java index df11886e..45a66b71 100644 --- a/spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/support/copier/registering/RegisteringStorageToWorkingCopyCopier.java +++ b/spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/support/copier/registering/RegisteringStorageToWorkingCopyCopier.java @@ -16,6 +16,7 @@ package software.xdev.spring.data.eclipse.store.repository.support.copier.registering; import org.eclipse.serializer.reference.ObjectSwizzling; +import org.eclipse.serializer.reflect.ClassLoaderProvider; import software.xdev.spring.data.eclipse.store.repository.SupportedChecker; import software.xdev.spring.data.eclipse.store.repository.WorkingCopyRegistry; @@ -32,13 +33,15 @@ public RegisteringStorageToWorkingCopyCopier( final WorkingCopyRegistry registry, final SupportedChecker supportedChecker, final ObjectSwizzling objectSwizzling, - final WorkingCopier copier) + final WorkingCopier copier, + final ClassLoaderProvider currentClassLoaderProvider) { super( supportedChecker, registry::register, objectSwizzling, - copier + copier, + currentClassLoaderProvider ); } } diff --git a/spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/support/copier/registering/RegisteringWorkingCopyToStorageCopier.java b/spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/support/copier/registering/RegisteringWorkingCopyToStorageCopier.java index 9fdc45f7..c5a4bd5d 100644 --- a/spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/support/copier/registering/RegisteringWorkingCopyToStorageCopier.java +++ b/spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/support/copier/registering/RegisteringWorkingCopyToStorageCopier.java @@ -16,6 +16,7 @@ package software.xdev.spring.data.eclipse.store.repository.support.copier.registering; import org.eclipse.serializer.reference.ObjectSwizzling; +import org.eclipse.serializer.reflect.ClassLoaderProvider; import software.xdev.spring.data.eclipse.store.repository.SupportedChecker; import software.xdev.spring.data.eclipse.store.repository.WorkingCopyRegistry; @@ -33,13 +34,15 @@ public RegisteringWorkingCopyToStorageCopier( final WorkingCopyRegistry registry, final SupportedChecker supportedChecker, final ObjectSwizzling objectSwizzling, - final WorkingCopier copier) + final WorkingCopier copier, + final ClassLoaderProvider currentClassLoaderProvider) { super( supportedChecker, registry::invertRegister, objectSwizzling, - copier + copier, + currentClassLoaderProvider ); } } diff --git a/spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/support/copier/working/RecursiveWorkingCopier.java b/spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/support/copier/working/RecursiveWorkingCopier.java index 25ac94af..fcdfa45c 100644 --- a/spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/support/copier/working/RecursiveWorkingCopier.java +++ b/spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/support/copier/working/RecursiveWorkingCopier.java @@ -30,6 +30,7 @@ import org.eclipse.serializer.reference.Lazy; import org.eclipse.serializer.reference.ObjectSwizzling; +import org.eclipse.serializer.reflect.ClassLoaderProvider; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -72,15 +73,26 @@ public RecursiveWorkingCopier( final VersionManagerProvider versionManagerProvider, final PersistableChecker persistableChecker, final SupportedChecker supportedChecker, - final ObjectSwizzling objectSwizzling + final ObjectSwizzling objectSwizzling, + final ClassLoaderProvider currentClassLoaderProvider ) { this.domainClass = domainClass; this.registry = registry; this.workingCopyToStorageCopier = - new RegisteringWorkingCopyToStorageCopier(registry, supportedChecker, objectSwizzling, this); + new RegisteringWorkingCopyToStorageCopier( + registry, + supportedChecker, + objectSwizzling, + this, + currentClassLoaderProvider); this.storageToWorkingCopyCopier = - new RegisteringStorageToWorkingCopyCopier(registry, supportedChecker, objectSwizzling, this); + new RegisteringStorageToWorkingCopyCopier( + registry, + supportedChecker, + objectSwizzling, + this, + currentClassLoaderProvider); this.idManagerProvider = idManagerProvider; this.versionManagerProvider = versionManagerProvider; this.persistableChecker = persistableChecker; diff --git a/spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/TestConfiguration.java b/spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/TestConfiguration.java index 345358eb..04420126 100644 --- a/spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/TestConfiguration.java +++ b/spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/TestConfiguration.java @@ -20,6 +20,7 @@ import java.io.IOException; import java.nio.file.Path; +import org.eclipse.serializer.reflect.ClassLoaderProvider; import org.eclipse.store.integrations.spring.boot.types.configuration.EclipseStoreProperties; import org.eclipse.store.integrations.spring.boot.types.factories.EmbeddedStorageFoundationFactory; import org.eclipse.store.storage.embedded.types.EmbeddedStorageFoundation; @@ -43,9 +44,10 @@ public class TestConfiguration extends EclipseStoreClientConfiguration @Autowired protected TestConfiguration( final EclipseStoreProperties defaultEclipseStoreProperties, - final EmbeddedStorageFoundationFactory defaultEclipseStoreProvider) + final EmbeddedStorageFoundationFactory defaultEclipseStoreProvider, + final ClassLoaderProvider classLoaderProvider) { - super(defaultEclipseStoreProperties, defaultEclipseStoreProvider); + super(defaultEclipseStoreProperties, defaultEclipseStoreProvider, classLoaderProvider); } @Override diff --git a/spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/deletion/DeletionTestConfiguration.java b/spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/deletion/DeletionTestConfiguration.java index 58116149..836b9aeb 100644 --- a/spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/deletion/DeletionTestConfiguration.java +++ b/spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/deletion/DeletionTestConfiguration.java @@ -15,6 +15,7 @@ */ package software.xdev.spring.data.eclipse.store.integration.isolated.tests.deletion; +import org.eclipse.serializer.reflect.ClassLoaderProvider; import org.eclipse.store.integrations.spring.boot.types.configuration.EclipseStoreProperties; import org.eclipse.store.integrations.spring.boot.types.factories.EmbeddedStorageFoundationFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -32,8 +33,9 @@ public class DeletionTestConfiguration extends TestConfiguration @Autowired protected DeletionTestConfiguration( final EclipseStoreProperties defaultEclipseStoreProperties, - final EmbeddedStorageFoundationFactory defaultEclipseStoreProvider) + final EmbeddedStorageFoundationFactory defaultEclipseStoreProvider, + final ClassLoaderProvider classLoaderProvider) { - super(defaultEclipseStoreProperties, defaultEclipseStoreProvider); + super(defaultEclipseStoreProperties, defaultEclipseStoreProvider, classLoaderProvider); } } diff --git a/spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/duplicated/repositories/DuplicatedRepositoriesTestConfiguration.java b/spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/duplicated/repositories/DuplicatedRepositoriesTestConfiguration.java index 6d72ca98..32da71df 100644 --- a/spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/duplicated/repositories/DuplicatedRepositoriesTestConfiguration.java +++ b/spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/duplicated/repositories/DuplicatedRepositoriesTestConfiguration.java @@ -15,6 +15,7 @@ */ package software.xdev.spring.data.eclipse.store.integration.isolated.tests.duplicated.repositories; +import org.eclipse.serializer.reflect.ClassLoaderProvider; import org.eclipse.store.integrations.spring.boot.types.configuration.EclipseStoreProperties; import org.eclipse.store.integrations.spring.boot.types.factories.EmbeddedStorageFoundationFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -32,8 +33,9 @@ public class DuplicatedRepositoriesTestConfiguration extends TestConfiguration @Autowired protected DuplicatedRepositoriesTestConfiguration( final EclipseStoreProperties defaultEclipseStoreProperties, - final EmbeddedStorageFoundationFactory defaultEclipseStoreProvider) + final EmbeddedStorageFoundationFactory defaultEclipseStoreProvider, + final ClassLoaderProvider classLoaderProvider) { - super(defaultEclipseStoreProperties, defaultEclipseStoreProvider); + super(defaultEclipseStoreProperties, defaultEclipseStoreProvider, classLoaderProvider); } } diff --git a/spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/id/IdTestConfiguration.java b/spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/id/IdTestConfiguration.java index b70d680c..d5efc1f5 100644 --- a/spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/id/IdTestConfiguration.java +++ b/spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/id/IdTestConfiguration.java @@ -15,6 +15,7 @@ */ package software.xdev.spring.data.eclipse.store.integration.isolated.tests.id; +import org.eclipse.serializer.reflect.ClassLoaderProvider; import org.eclipse.store.integrations.spring.boot.types.configuration.EclipseStoreProperties; import org.eclipse.store.integrations.spring.boot.types.factories.EmbeddedStorageFoundationFactory; import org.springframework.beans.factory.ObjectProvider; @@ -35,9 +36,10 @@ public class IdTestConfiguration extends TestConfiguration @Autowired protected IdTestConfiguration( final EclipseStoreProperties defaultEclipseStoreProperties, - final EmbeddedStorageFoundationFactory defaultEclipseStoreProvider) + final EmbeddedStorageFoundationFactory defaultEclipseStoreProvider, + final ClassLoaderProvider classLoaderProvider) { - super(defaultEclipseStoreProperties, defaultEclipseStoreProvider); + super(defaultEclipseStoreProperties, defaultEclipseStoreProvider, classLoaderProvider); } @Bean diff --git a/spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/immutables/ImmutableTestConfiguration.java b/spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/immutables/ImmutableTestConfiguration.java index 9831fc44..d7ff4c52 100644 --- a/spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/immutables/ImmutableTestConfiguration.java +++ b/spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/immutables/ImmutableTestConfiguration.java @@ -15,6 +15,7 @@ */ package software.xdev.spring.data.eclipse.store.integration.isolated.tests.immutables; +import org.eclipse.serializer.reflect.ClassLoaderProvider; import org.eclipse.store.integrations.spring.boot.types.configuration.EclipseStoreProperties; import org.eclipse.store.integrations.spring.boot.types.factories.EmbeddedStorageFoundationFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -32,8 +33,9 @@ public class ImmutableTestConfiguration extends TestConfiguration @Autowired protected ImmutableTestConfiguration( final EclipseStoreProperties defaultEclipseStoreProperties, - final EmbeddedStorageFoundationFactory defaultEclipseStoreProvider) + final EmbeddedStorageFoundationFactory defaultEclipseStoreProvider, + final ClassLoaderProvider classLoaderProvider) { - super(defaultEclipseStoreProperties, defaultEclipseStoreProvider); + super(defaultEclipseStoreProperties, defaultEclipseStoreProvider, classLoaderProvider); } } diff --git a/spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/keywords/KeywordsTestConfiguration.java b/spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/keywords/KeywordsTestConfiguration.java index 0258bf74..97764353 100644 --- a/spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/keywords/KeywordsTestConfiguration.java +++ b/spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/keywords/KeywordsTestConfiguration.java @@ -15,6 +15,7 @@ */ package software.xdev.spring.data.eclipse.store.integration.isolated.tests.keywords; +import org.eclipse.serializer.reflect.ClassLoaderProvider; import org.eclipse.store.integrations.spring.boot.types.configuration.EclipseStoreProperties; import org.eclipse.store.integrations.spring.boot.types.factories.EmbeddedStorageFoundationFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -31,8 +32,9 @@ public class KeywordsTestConfiguration extends TestConfiguration @Autowired protected KeywordsTestConfiguration( final EclipseStoreProperties defaultEclipseStoreProperties, - final EmbeddedStorageFoundationFactory defaultEclipseStoreProvider) + final EmbeddedStorageFoundationFactory defaultEclipseStoreProvider, + final ClassLoaderProvider classLoaderProvider) { - super(defaultEclipseStoreProperties, defaultEclipseStoreProvider); + super(defaultEclipseStoreProperties, defaultEclipseStoreProvider, classLoaderProvider); } } diff --git a/spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/lazy/LazyTestConfiguration.java b/spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/lazy/LazyTestConfiguration.java index 81b80d6c..beaf67ef 100644 --- a/spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/lazy/LazyTestConfiguration.java +++ b/spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/lazy/LazyTestConfiguration.java @@ -15,6 +15,7 @@ */ package software.xdev.spring.data.eclipse.store.integration.isolated.tests.lazy; +import org.eclipse.serializer.reflect.ClassLoaderProvider; import org.eclipse.store.integrations.spring.boot.types.configuration.EclipseStoreProperties; import org.eclipse.store.integrations.spring.boot.types.factories.EmbeddedStorageFoundationFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -32,8 +33,9 @@ public class LazyTestConfiguration extends TestConfiguration @Autowired protected LazyTestConfiguration( final EclipseStoreProperties defaultEclipseStoreProperties, - final EmbeddedStorageFoundationFactory defaultEclipseStoreProvider) + final EmbeddedStorageFoundationFactory defaultEclipseStoreProvider, + final ClassLoaderProvider classLoaderProvider) { - super(defaultEclipseStoreProperties, defaultEclipseStoreProvider); + super(defaultEclipseStoreProperties, defaultEclipseStoreProvider, classLoaderProvider); } } diff --git a/spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/migration/MigrationTestConfiguration.java b/spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/migration/MigrationTestConfiguration.java index d95988e6..700fefb0 100644 --- a/spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/migration/MigrationTestConfiguration.java +++ b/spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/migration/MigrationTestConfiguration.java @@ -15,6 +15,7 @@ */ package software.xdev.spring.data.eclipse.store.integration.isolated.tests.migration; +import org.eclipse.serializer.reflect.ClassLoaderProvider; import org.eclipse.store.integrations.spring.boot.types.configuration.EclipseStoreProperties; import org.eclipse.store.integrations.spring.boot.types.factories.EmbeddedStorageFoundationFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -31,8 +32,9 @@ public class MigrationTestConfiguration extends TestConfiguration @Autowired protected MigrationTestConfiguration( final EclipseStoreProperties defaultEclipseStoreProperties, - final EmbeddedStorageFoundationFactory defaultEclipseStoreProvider) + final EmbeddedStorageFoundationFactory defaultEclipseStoreProvider, + final ClassLoaderProvider classLoaderProvider) { - super(defaultEclipseStoreProperties, defaultEclipseStoreProvider); + super(defaultEclipseStoreProperties, defaultEclipseStoreProvider, classLoaderProvider); } } diff --git a/spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/query/by/example/QueryByExampleTestConfiguration.java b/spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/query/by/example/QueryByExampleTestConfiguration.java index d3b9dd13..65790a99 100644 --- a/spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/query/by/example/QueryByExampleTestConfiguration.java +++ b/spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/query/by/example/QueryByExampleTestConfiguration.java @@ -15,6 +15,7 @@ */ package software.xdev.spring.data.eclipse.store.integration.isolated.tests.query.by.example; +import org.eclipse.serializer.reflect.ClassLoaderProvider; import org.eclipse.store.integrations.spring.boot.types.configuration.EclipseStoreProperties; import org.eclipse.store.integrations.spring.boot.types.factories.EmbeddedStorageFoundationFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -31,8 +32,9 @@ public class QueryByExampleTestConfiguration extends TestConfiguration @Autowired protected QueryByExampleTestConfiguration( final EclipseStoreProperties defaultEclipseStoreProperties, - final EmbeddedStorageFoundationFactory defaultEclipseStoreProvider) + final EmbeddedStorageFoundationFactory defaultEclipseStoreProvider, + final ClassLoaderProvider classLoaderProvider) { - super(defaultEclipseStoreProperties, defaultEclipseStoreProvider); + super(defaultEclipseStoreProperties, defaultEclipseStoreProvider, classLoaderProvider); } } diff --git a/spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/query/by/string/QueryTestConfiguration.java b/spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/query/by/string/QueryTestConfiguration.java index bab32f2e..5830bc22 100644 --- a/spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/query/by/string/QueryTestConfiguration.java +++ b/spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/query/by/string/QueryTestConfiguration.java @@ -15,6 +15,7 @@ */ package software.xdev.spring.data.eclipse.store.integration.isolated.tests.query.by.string; +import org.eclipse.serializer.reflect.ClassLoaderProvider; import org.eclipse.store.integrations.spring.boot.types.configuration.EclipseStoreProperties; import org.eclipse.store.integrations.spring.boot.types.factories.EmbeddedStorageFoundationFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -31,8 +32,9 @@ public class QueryTestConfiguration extends TestConfiguration @Autowired protected QueryTestConfiguration( final EclipseStoreProperties defaultEclipseStoreProperties, - final EmbeddedStorageFoundationFactory defaultEclipseStoreProvider) + final EmbeddedStorageFoundationFactory defaultEclipseStoreProvider, + final ClassLoaderProvider classLoaderProvider) { - super(defaultEclipseStoreProperties, defaultEclipseStoreProvider); + super(defaultEclipseStoreProperties, defaultEclipseStoreProvider, classLoaderProvider); } } diff --git a/spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/query/hsql/HsqlTestConfiguration.java b/spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/query/hsql/HsqlTestConfiguration.java index cfd5d871..5e2978f8 100644 --- a/spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/query/hsql/HsqlTestConfiguration.java +++ b/spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/query/hsql/HsqlTestConfiguration.java @@ -15,6 +15,7 @@ */ package software.xdev.spring.data.eclipse.store.integration.isolated.tests.query.hsql; +import org.eclipse.serializer.reflect.ClassLoaderProvider; import org.eclipse.store.integrations.spring.boot.types.configuration.EclipseStoreProperties; import org.eclipse.store.integrations.spring.boot.types.factories.EmbeddedStorageFoundationFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -31,8 +32,9 @@ public class HsqlTestConfiguration extends TestConfiguration @Autowired protected HsqlTestConfiguration( final EclipseStoreProperties defaultEclipseStoreProperties, - final EmbeddedStorageFoundationFactory defaultEclipseStoreProvider) + final EmbeddedStorageFoundationFactory defaultEclipseStoreProvider, + final ClassLoaderProvider classLoaderProvider) { - super(defaultEclipseStoreProperties, defaultEclipseStoreProvider); + super(defaultEclipseStoreProperties, defaultEclipseStoreProvider, classLoaderProvider); } } diff --git a/spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/special/types/SpecialTypesTestConfiguration.java b/spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/special/types/SpecialTypesTestConfiguration.java index 3ad7c392..47c1cf26 100644 --- a/spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/special/types/SpecialTypesTestConfiguration.java +++ b/spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/special/types/SpecialTypesTestConfiguration.java @@ -15,6 +15,7 @@ */ package software.xdev.spring.data.eclipse.store.integration.isolated.tests.special.types; +import org.eclipse.serializer.reflect.ClassLoaderProvider; import org.eclipse.store.integrations.spring.boot.types.configuration.EclipseStoreProperties; import org.eclipse.store.integrations.spring.boot.types.factories.EmbeddedStorageFoundationFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -31,8 +32,9 @@ public class SpecialTypesTestConfiguration extends TestConfiguration @Autowired protected SpecialTypesTestConfiguration( final EclipseStoreProperties defaultEclipseStoreProperties, - final EmbeddedStorageFoundationFactory defaultEclipseStoreProvider) + final EmbeddedStorageFoundationFactory defaultEclipseStoreProvider, + final ClassLoaderProvider classLoaderProvider) { - super(defaultEclipseStoreProperties, defaultEclipseStoreProvider); + super(defaultEclipseStoreProperties, defaultEclipseStoreProvider,classLoaderProvider); } } diff --git a/spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/transactions/TransactionsTestConfiguration.java b/spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/transactions/TransactionsTestConfiguration.java index f8d396a2..e5eb10e7 100644 --- a/spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/transactions/TransactionsTestConfiguration.java +++ b/spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/transactions/TransactionsTestConfiguration.java @@ -15,6 +15,7 @@ */ package software.xdev.spring.data.eclipse.store.integration.isolated.tests.transactions; +import org.eclipse.serializer.reflect.ClassLoaderProvider; import org.eclipse.store.integrations.spring.boot.types.configuration.EclipseStoreProperties; import org.eclipse.store.integrations.spring.boot.types.factories.EmbeddedStorageFoundationFactory; import org.springframework.beans.factory.ObjectProvider; @@ -35,9 +36,10 @@ public class TransactionsTestConfiguration extends TestConfiguration @Autowired protected TransactionsTestConfiguration( final EclipseStoreProperties defaultEclipseStoreProperties, - final EmbeddedStorageFoundationFactory defaultEclipseStoreProvider) + final EmbeddedStorageFoundationFactory defaultEclipseStoreProvider, + final ClassLoaderProvider classLoaderProvider) { - super(defaultEclipseStoreProperties, defaultEclipseStoreProvider); + super(defaultEclipseStoreProperties, defaultEclipseStoreProvider, classLoaderProvider); } @Bean diff --git a/spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/version/VersionTestConfiguration.java b/spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/version/VersionTestConfiguration.java index ce27ef4c..6f3109fc 100644 --- a/spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/version/VersionTestConfiguration.java +++ b/spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/version/VersionTestConfiguration.java @@ -15,6 +15,7 @@ */ package software.xdev.spring.data.eclipse.store.integration.isolated.tests.version; +import org.eclipse.serializer.reflect.ClassLoaderProvider; import org.eclipse.store.integrations.spring.boot.types.configuration.EclipseStoreProperties; import org.eclipse.store.integrations.spring.boot.types.factories.EmbeddedStorageFoundationFactory; import org.springframework.beans.factory.ObjectProvider; @@ -35,9 +36,10 @@ public class VersionTestConfiguration extends TestConfiguration @Autowired protected VersionTestConfiguration( final EclipseStoreProperties defaultEclipseStoreProperties, - final EmbeddedStorageFoundationFactory defaultEclipseStoreProvider) + final EmbeddedStorageFoundationFactory defaultEclipseStoreProvider, + final ClassLoaderProvider classLoaderProvider) { - super(defaultEclipseStoreProperties, defaultEclipseStoreProvider); + super(defaultEclipseStoreProperties, defaultEclipseStoreProvider, classLoaderProvider); } @Bean diff --git a/spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/shared/SharedTestConfiguration.java b/spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/shared/SharedTestConfiguration.java index a54fba2a..5d561ebf 100644 --- a/spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/shared/SharedTestConfiguration.java +++ b/spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/shared/SharedTestConfiguration.java @@ -15,6 +15,7 @@ */ package software.xdev.spring.data.eclipse.store.integration.shared; +import org.eclipse.serializer.reflect.ClassLoaderProvider; import org.eclipse.store.integrations.spring.boot.types.configuration.EclipseStoreProperties; import org.eclipse.store.integrations.spring.boot.types.factories.EmbeddedStorageFoundationFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -31,8 +32,9 @@ public class SharedTestConfiguration extends TestConfiguration @Autowired protected SharedTestConfiguration( final EclipseStoreProperties defaultEclipseStoreProperties, - final EmbeddedStorageFoundationFactory defaultEclipseStoreProvider) + final EmbeddedStorageFoundationFactory defaultEclipseStoreProvider, + final ClassLoaderProvider classLoaderProvider) { - super(defaultEclipseStoreProperties, defaultEclipseStoreProvider); + super(defaultEclipseStoreProperties, defaultEclipseStoreProvider, classLoaderProvider); } } diff --git a/spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/repository/support/copier/registering/RegisteringStorageToWorkingCopyCopierTest.java b/spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/repository/support/copier/registering/RegisteringStorageToWorkingCopyCopierTest.java index 2c54b385..49d93c37 100644 --- a/spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/repository/support/copier/registering/RegisteringStorageToWorkingCopyCopierTest.java +++ b/spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/repository/support/copier/registering/RegisteringStorageToWorkingCopyCopierTest.java @@ -18,6 +18,7 @@ import java.util.List; import java.util.stream.IntStream; +import org.eclipse.serializer.reflect.ClassLoaderProvider; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; @@ -40,7 +41,8 @@ void testCopyManyCopiesSingle() new WorkingCopyRegistry(), new SupportedChecker.Implementation(), o -> null, - new DummyWorkingCopier())) + new DummyWorkingCopier(), + ClassLoaderProvider.System())) { final List originalObjects = IntStream.range(0, 1_000).mapToObj( i -> new DummyData("Data" + i, i) @@ -60,7 +62,8 @@ void testCopyAgainSameObject() new WorkingCopyRegistry(), new SupportedChecker.Implementation(), o -> null, - new DummyWorkingCopier())) + new DummyWorkingCopier(), + ClassLoaderProvider.System())) { final DummyData originalObject = new DummyData("Test", 1); @@ -79,7 +82,8 @@ void testCopyAgainTheCopy() new WorkingCopyRegistry(), new SupportedChecker.Implementation(), o -> null, - new DummyWorkingCopier())) + new DummyWorkingCopier(), + ClassLoaderProvider.System())) { final DummyData originalObject = new DummyData("Test", 1); @@ -100,7 +104,8 @@ void testCopyManyCopiesBulk() new WorkingCopyRegistry(), new SupportedChecker.Implementation(), o -> null, - new DummyWorkingCopier())) + new DummyWorkingCopier(), + ClassLoaderProvider.System())) { final List originalObjects = IntStream.range(0, 100_000).mapToObj( i -> new DummyData("Data" + i, i) @@ -120,7 +125,8 @@ void testCopyEmpty() new WorkingCopyRegistry(), new SupportedChecker.Implementation(), o -> null, - new DummyWorkingCopier())) + new DummyWorkingCopier(), + ClassLoaderProvider.System())) { Assertions.assertThrows(NullPointerException.class, () -> copier.copy(null)); } From c5971f469b83e8d4707877f5fe16a04d8372d297 Mon Sep 17 00:00:00 2001 From: JohannesRabauer Date: Mon, 14 Oct 2024 15:40:37 +0200 Subject: [PATCH 15/19] Update SpecialTypesTestConfiguration.java --- .../tests/special/types/SpecialTypesTestConfiguration.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/special/types/SpecialTypesTestConfiguration.java b/spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/special/types/SpecialTypesTestConfiguration.java index 47c1cf26..4a29b5e0 100644 --- a/spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/special/types/SpecialTypesTestConfiguration.java +++ b/spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/special/types/SpecialTypesTestConfiguration.java @@ -35,6 +35,6 @@ protected SpecialTypesTestConfiguration( final EmbeddedStorageFoundationFactory defaultEclipseStoreProvider, final ClassLoaderProvider classLoaderProvider) { - super(defaultEclipseStoreProperties, defaultEclipseStoreProvider,classLoaderProvider); + super(defaultEclipseStoreProperties, defaultEclipseStoreProvider, classLoaderProvider); } } From c5bb33a2c232c0cad5deb18fd6af7a2b4965c87a Mon Sep 17 00:00:00 2001 From: JohannesRabauer Date: Tue, 15 Oct 2024 10:27:58 +0200 Subject: [PATCH 16/19] Added basic Constraints-support --- CHANGELOG.md | 4 + spring-data-eclipse-store/pom.xml | 29 ++ .../EclipseSerializerRegisteringCopier.java | 32 +- .../constraints/ConstraintDaoObject.java | 373 ++++++++++++++++++ .../constraints/ConstraintsRepository.java | 23 ++ .../tests/constraints/ConstraintsTest.java | 60 +++ .../ConstraintsTestConfiguration.java | 38 ++ 7 files changed, 557 insertions(+), 2 deletions(-) create mode 100644 spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/constraints/ConstraintDaoObject.java create mode 100644 spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/constraints/ConstraintsRepository.java create mode 100644 spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/constraints/ConstraintsTest.java create mode 100644 spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/constraints/ConstraintsTestConfiguration.java diff --git a/CHANGELOG.md b/CHANGELOG.md index bc724225..2189be06 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,7 @@ +# 2.3.0 + +* Added [Jakarta Bean Validation Constraints](https://jakarta.ee/learn/docs/jakartaee-tutorial/current/beanvalidation/bean-validation/bean-validation.html#_using_jakarta_bean_validation_constraints) with Hibernate validator for entities. + # 2.2.2 * Fixed NPE in EclipseSerializerRegisteringCopier diff --git a/spring-data-eclipse-store/pom.xml b/spring-data-eclipse-store/pom.xml index 27e87cad..9086cf41 100644 --- a/spring-data-eclipse-store/pom.xml +++ b/spring-data-eclipse-store/pom.xml @@ -54,6 +54,10 @@ 3.3.4 1.4.0 1.4.0 + 8.0.1.Final + 6.0.1 + 6.0.0-M1 + 6.6.1.Final @@ -164,6 +168,31 @@ + + + jakarta.validation + jakarta.validation-api + + + org.hibernate.validator + hibernate-validator + ${hibernate-validator.version} + + + org.hibernate.orm + hibernate-core + ${hibernate-core.version} + + + jakarta.el + jakarta.el-api + ${jakarta.el-api.version} + + + org.glassfish.expressly + expressly + ${expressly.version} + com.googlecode.cqengine diff --git a/spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/support/copier/registering/EclipseSerializerRegisteringCopier.java b/spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/support/copier/registering/EclipseSerializerRegisteringCopier.java index 9d7f7469..53dba1cf 100644 --- a/spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/support/copier/registering/EclipseSerializerRegisteringCopier.java +++ b/spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/support/copier/registering/EclipseSerializerRegisteringCopier.java @@ -18,8 +18,16 @@ import java.util.HashMap; import java.util.Map; import java.util.Queue; +import java.util.Set; import java.util.concurrent.ConcurrentLinkedQueue; import java.util.function.Supplier; +import java.util.stream.Collectors; + +import jakarta.validation.ConstraintViolation; +import jakarta.validation.ConstraintViolationException; +import jakarta.validation.Validation; +import jakarta.validation.Validator; +import jakarta.validation.ValidatorFactory; import org.eclipse.serializer.persistence.binary.types.Binary; import org.eclipse.serializer.persistence.binary.types.BinaryStorer; @@ -45,6 +53,7 @@ public class EclipseSerializerRegisteringCopier implements AutoCloseable private final Supplier> persistenceManagerSupplier; private final SupportedChecker supportedChecker; private final RegisteringWorkingCopyAndOriginal register; + private final Validator validator; public EclipseSerializerRegisteringCopier( final SupportedChecker supportedChecker, @@ -55,6 +64,9 @@ public EclipseSerializerRegisteringCopier( this.register = register; this.persistenceManagerSupplier = persistenceManagerSupplier; this.persistenceManagers = new ConcurrentLinkedQueue<>(); + + final ValidatorFactory validatorFactory = Validation.buildDefaultValidatorFactory(); + this.validator = validatorFactory.getValidator(); } private PersistenceManager ensurePersistenceManager() @@ -138,9 +150,25 @@ private T copy(final T source, final PersistenceManager persistenceM { return; } - if(copiedObject != null && !this.supportedChecker.isSupported(copiedObject.getClass())) + if(copiedObject != null) { - throw new DataTypeNotSupportedException(copiedObject.getClass()); + if(!this.supportedChecker.isSupported(copiedObject.getClass())) + { + throw new DataTypeNotSupportedException(copiedObject.getClass()); + } + final Set> violations = this.validator.validate(copiedObject); + if(!violations.isEmpty()) + { + final String violationsAsMessage = violations.stream() + .map(cv -> cv == null ? "null" : cv.getPropertyPath() + ": " + cv.getMessage()) + .collect(Collectors.joining(", ")); + + throw new ConstraintViolationException( + "Error validating " + copiedObject.getClass().getName() + ":" + System.lineSeparator() + + violationsAsMessage, + violations + ); + } } summarizer.incrementCopiedObjectsCount(); if(DataTypeUtil.isPrimitiveType(copiedObject.getClass())) diff --git a/spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/constraints/ConstraintDaoObject.java b/spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/constraints/ConstraintDaoObject.java new file mode 100644 index 00000000..7d113e96 --- /dev/null +++ b/spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/constraints/ConstraintDaoObject.java @@ -0,0 +1,373 @@ +/* + * Copyright © 2024 XDEV Software (https://xdev.software) + * + * 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. + */ +package software.xdev.spring.data.eclipse.store.integration.isolated.tests.constraints; + +import java.math.BigDecimal; +import java.time.Instant; +import java.time.temporal.ChronoUnit; +import java.util.Date; + +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.validation.constraints.AssertFalse; +import jakarta.validation.constraints.AssertTrue; +import jakarta.validation.constraints.DecimalMax; +import jakarta.validation.constraints.DecimalMin; +import jakarta.validation.constraints.Digits; +import jakarta.validation.constraints.Email; +import jakarta.validation.constraints.Future; +import jakarta.validation.constraints.FutureOrPresent; +import jakarta.validation.constraints.Max; +import jakarta.validation.constraints.Min; +import jakarta.validation.constraints.Negative; +import jakarta.validation.constraints.NegativeOrZero; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotEmpty; +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Null; +import jakarta.validation.constraints.Past; +import jakarta.validation.constraints.PastOrPresent; +import jakarta.validation.constraints.Pattern; +import jakarta.validation.constraints.Positive; +import jakarta.validation.constraints.PositiveOrZero; +import jakarta.validation.constraints.Size; + + +public class ConstraintDaoObject +{ + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + private int id; + + @AssertFalse + boolean isAlwaysFalse; + + @AssertTrue + boolean isAlwaysTrue; + + @Digits(integer = 6, fraction = 2) + BigDecimal price; + + @DecimalMin("5.00") + BigDecimal discountMin5; + + @DecimalMax("30.00") + BigDecimal discountMax20; + + @Email + String emailField; + + @Future + Date futureField; + + @FutureOrPresent + Date futureOrPresentField; + + @Max(10) + int quantityMax10; + + @Min(5) + int quantityMin5; + + @Negative + int negativeField; + + @NegativeOrZero + int negativeOrZeroField; + + @NotBlank + String messageNotBlank; + + @NotEmpty + String messageNotEmpty; + + @NotNull + String username; + + @Null + String unusedString; + + @Past + Date pastField; + + @PastOrPresent + Date pastOrPresentField; + + @Pattern(regexp = "\\(\\d{3}\\)\\d{3}-\\d{4}") + String phoneNumber; + + @Positive + BigDecimal area; + + @PositiveOrZero + int positiveOrZeroField; + + @Size(min = 2, max = 240) + String messageMin2AndMax240; + + public ConstraintDaoObject() + { + this.isAlwaysFalse = false; + this.isAlwaysTrue = true; + this.price = BigDecimal.valueOf(123456.78); + this.discountMin5 = BigDecimal.valueOf(5); + this.discountMax20 = BigDecimal.valueOf(20); + this.emailField = "some@email.com"; + this.futureField = Date.from(Instant.now().plus(1, ChronoUnit.DAYS)); + this.futureOrPresentField = Date.from(Instant.now().plus(1, ChronoUnit.DAYS)); + this.quantityMax10 = 10; + this.quantityMin5 = 5; + this.negativeField = -1; + this.negativeOrZeroField = 0; + this.messageNotBlank = "some message"; + this.messageNotEmpty = "some message"; + this.username = ""; + this.pastField = Date.from(Instant.now().minus(1, ChronoUnit.DAYS)); + this.pastOrPresentField = Date.from(Instant.now().minus(1, ChronoUnit.DAYS)); + this.phoneNumber = "(123)456-7890"; + this.area = BigDecimal.valueOf(1); + this.positiveOrZeroField = 1; + this.messageMin2AndMax240 = ".."; + } + + @AssertFalse + public boolean isAlwaysFalse() + { + return this.isAlwaysFalse; + } + + public void setAlwaysFalse(@AssertFalse final boolean alwaysFalse) + { + this.isAlwaysFalse = alwaysFalse; + } + + @AssertTrue + public boolean isAlwaysTrue() + { + return this.isAlwaysTrue; + } + + public void setAlwaysTrue(@AssertTrue final boolean alwaysTrue) + { + this.isAlwaysTrue = alwaysTrue; + } + + public @Digits(integer = 6, fraction = 2) BigDecimal getPrice() + { + return this.price; + } + + public void setPrice(final @Digits(integer = 6, fraction = 2) BigDecimal price) + { + this.price = price; + } + + public @DecimalMin("5.00") BigDecimal getDiscountMin5() + { + return this.discountMin5; + } + + public void setDiscountMin5(final @DecimalMin("5.00") BigDecimal discountMin5) + { + this.discountMin5 = discountMin5; + } + + public @DecimalMax("30.00") BigDecimal getDiscountMax20() + { + return this.discountMax20; + } + + public void setDiscountMax20(final @DecimalMax("30.00") BigDecimal discountMax20) + { + this.discountMax20 = discountMax20; + } + + public @Email String getEmailField() + { + return this.emailField; + } + + public void setEmailField(final @Email String emailField) + { + this.emailField = emailField; + } + + public @Future Date getFutureField() + { + return this.futureField; + } + + public void setFutureField(final @Future Date futureField) + { + this.futureField = futureField; + } + + public @FutureOrPresent Date getFutureOrPresentField() + { + return this.futureOrPresentField; + } + + public void setFutureOrPresentField(final @FutureOrPresent Date futureOrPresentField) + { + this.futureOrPresentField = futureOrPresentField; + } + + @Max(10) + public int getQuantityMax10() + { + return this.quantityMax10; + } + + public void setQuantityMax10(@Max(10) final int quantityMax10) + { + this.quantityMax10 = quantityMax10; + } + + @Min(5) + public int getQuantityMin5() + { + return this.quantityMin5; + } + + public void setQuantityMin5(@Min(5) final int quantityMin5) + { + this.quantityMin5 = quantityMin5; + } + + @Negative + public int getNegativeField() + { + return this.negativeField; + } + + public void setNegativeField(@Negative final int negativeField) + { + this.negativeField = negativeField; + } + + @NegativeOrZero + public int getNegativeOrZeroField() + { + return this.negativeOrZeroField; + } + + public void setNegativeOrZeroField(@NegativeOrZero final int negativeOrZeroField) + { + this.negativeOrZeroField = negativeOrZeroField; + } + + public @NotBlank String getMessageNotBlank() + { + return this.messageNotBlank; + } + + public void setMessageNotBlank(final @NotBlank String messageNotBlank) + { + this.messageNotBlank = messageNotBlank; + } + + public @NotEmpty String getMessageNotEmpty() + { + return this.messageNotEmpty; + } + + public void setMessageNotEmpty(final @NotEmpty String messageNotEmpty) + { + this.messageNotEmpty = messageNotEmpty; + } + + public @NotNull String getUsername() + { + return this.username; + } + + public void setUsername(final @NotNull String username) + { + this.username = username; + } + + public @Null String getUnusedString() + { + return this.unusedString; + } + + public void setUnusedString(final @Null String unusedString) + { + this.unusedString = unusedString; + } + + public @Past Date getPastField() + { + return this.pastField; + } + + public void setPastField(final @Past Date pastField) + { + this.pastField = pastField; + } + + public @PastOrPresent Date getPastOrPresentField() + { + return this.pastOrPresentField; + } + + public void setPastOrPresentField(final @PastOrPresent Date pastOrPresentField) + { + this.pastOrPresentField = pastOrPresentField; + } + + public @Pattern(regexp = "\\(\\d{3}\\)\\d{3}-\\d{4}") String getPhoneNumber() + { + return this.phoneNumber; + } + + public void setPhoneNumber(final @Pattern(regexp = "\\(\\d{3}\\)\\d{3}-\\d{4}") String phoneNumber) + { + this.phoneNumber = phoneNumber; + } + + public @Positive BigDecimal getArea() + { + return this.area; + } + + public void setArea(final @Positive BigDecimal area) + { + this.area = area; + } + + @PositiveOrZero + public int getPositiveOrZeroField() + { + return this.positiveOrZeroField; + } + + public void setPositiveOrZeroField(@PositiveOrZero final int positiveOrZeroField) + { + this.positiveOrZeroField = positiveOrZeroField; + } + + public @Size(min = 2, max = 240) String getMessageMin2AndMax240() + { + return this.messageMin2AndMax240; + } + + public void setMessageMin2AndMax240(final @Size(min = 2, max = 240) String messageMin2AndMax240) + { + this.messageMin2AndMax240 = messageMin2AndMax240; + } +} diff --git a/spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/constraints/ConstraintsRepository.java b/spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/constraints/ConstraintsRepository.java new file mode 100644 index 00000000..b646c3d9 --- /dev/null +++ b/spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/constraints/ConstraintsRepository.java @@ -0,0 +1,23 @@ +/* + * Copyright © 2024 XDEV Software (https://xdev.software) + * + * 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. + */ +package software.xdev.spring.data.eclipse.store.integration.isolated.tests.constraints; + +import org.springframework.data.repository.CrudRepository; + + +public interface ConstraintsRepository extends CrudRepository +{ +} diff --git a/spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/constraints/ConstraintsTest.java b/spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/constraints/ConstraintsTest.java new file mode 100644 index 00000000..46d6d533 --- /dev/null +++ b/spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/constraints/ConstraintsTest.java @@ -0,0 +1,60 @@ +/* + * Copyright © 2024 XDEV Software (https://xdev.software) + * + * 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. + */ +package software.xdev.spring.data.eclipse.store.integration.isolated.tests.constraints; + +import jakarta.validation.ConstraintViolationException; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.test.context.ContextConfiguration; + +import software.xdev.spring.data.eclipse.store.integration.isolated.IsolatedTestAnnotations; + + +/** + * These tests should show that all or most of the following constraints are available in this library: Jakarta Bean Validation Constraints + */ +@IsolatedTestAnnotations +@ContextConfiguration(classes = {ConstraintsTestConfiguration.class}) +class ConstraintsTest +{ + @Autowired + private ConstraintsTestConfiguration configuration; + @Autowired + private ConstraintsRepository repository; + + @Test + void assertFalse_True() + { + final ConstraintDaoObject constraintDaoObject = new ConstraintDaoObject(); + constraintDaoObject.setAlwaysFalse(true); + Assertions.assertThrows( + ConstraintViolationException.class, + () -> this.repository.save(constraintDaoObject) + ); + } + + @Test + void assertFalse_False() + { + final ConstraintDaoObject constraintDaoObject = new ConstraintDaoObject(); + constraintDaoObject.setAlwaysFalse(false); + Assertions.assertDoesNotThrow(() -> this.repository.save(constraintDaoObject)); + } +} diff --git a/spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/constraints/ConstraintsTestConfiguration.java b/spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/constraints/ConstraintsTestConfiguration.java new file mode 100644 index 00000000..8b690d6b --- /dev/null +++ b/spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/constraints/ConstraintsTestConfiguration.java @@ -0,0 +1,38 @@ +/* + * Copyright © 2024 XDEV Software (https://xdev.software) + * + * 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. + */ +package software.xdev.spring.data.eclipse.store.integration.isolated.tests.constraints; + +import org.eclipse.store.integrations.spring.boot.types.configuration.EclipseStoreProperties; +import org.eclipse.store.integrations.spring.boot.types.factories.EmbeddedStorageFoundationFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Configuration; + +import software.xdev.spring.data.eclipse.store.integration.TestConfiguration; +import software.xdev.spring.data.eclipse.store.repository.config.EnableEclipseStoreRepositories; + + +@Configuration +@EnableEclipseStoreRepositories +public class ConstraintsTestConfiguration extends TestConfiguration +{ + @Autowired + protected ConstraintsTestConfiguration( + final EclipseStoreProperties defaultEclipseStoreProperties, + final EmbeddedStorageFoundationFactory defaultEclipseStoreProvider) + { + super(defaultEclipseStoreProperties, defaultEclipseStoreProvider); + } +} From 54f11e47af758fda7c8fbb70a77f619a10590ec9 Mon Sep 17 00:00:00 2001 From: JohannesRabauer Date: Tue, 15 Oct 2024 11:27:58 +0200 Subject: [PATCH 17/19] Constraints now work with supplied validator --- spring-data-eclipse-store/pom.xml | 6 ++++++ .../importer/EclipseStoreDataImporter.java | 5 +++-- .../config/EclipseStoreClientConfiguration.java | 10 ++++++++++ .../support/EclipseStoreRepositoryFactory.java | 9 +++++++-- .../EclipseStoreRepositoryFactoryBean.java | 3 ++- .../registering/AbstractRegisteringCopier.java | 8 ++++++-- .../EclipseSerializerRegisteringCopier.java | 8 ++++---- .../RegisteringStorageToWorkingCopyCopier.java | 8 ++++++-- .../RegisteringWorkingCopyToStorageCopier.java | 8 ++++++-- .../copier/working/RecursiveWorkingCopier.java | 9 ++++++--- ...gisteringStorageToWorkingCopyCopierTest.java | 17 ++++++++++++----- 11 files changed, 68 insertions(+), 23 deletions(-) diff --git a/spring-data-eclipse-store/pom.xml b/spring-data-eclipse-store/pom.xml index 9086cf41..f91e23c2 100644 --- a/spring-data-eclipse-store/pom.xml +++ b/spring-data-eclipse-store/pom.xml @@ -182,6 +182,12 @@ org.hibernate.orm hibernate-core ${hibernate-core.version} + + + antlr4-runtime + org.antlr + + jakarta.el diff --git a/spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/importer/EclipseStoreDataImporter.java b/spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/importer/EclipseStoreDataImporter.java index ffc73864..c6450b83 100644 --- a/spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/importer/EclipseStoreDataImporter.java +++ b/spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/importer/EclipseStoreDataImporter.java @@ -51,7 +51,7 @@ public EclipseStoreDataImporter(final EclipseStoreClientConfiguration configurat { this.configuration = configuration; } - + /** * Imports entities from all given {@link EntityManagerFactory}s that are available into the EclipseStore storage. *

@@ -265,7 +265,8 @@ private void createRepositoryForType( storageInstance, storageInstance, new SupportedChecker.Implementation(), - storageInstance + storageInstance, + this.configuration.getValidator() ), domainClass, new EclipseStoreTransactionManager(), diff --git a/spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/config/EclipseStoreClientConfiguration.java b/spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/config/EclipseStoreClientConfiguration.java index f64aedd7..fec8375b 100644 --- a/spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/config/EclipseStoreClientConfiguration.java +++ b/spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/config/EclipseStoreClientConfiguration.java @@ -15,12 +15,16 @@ */ package software.xdev.spring.data.eclipse.store.repository.config; +import jakarta.validation.Validation; +import jakarta.validation.Validator; + import org.eclipse.store.integrations.spring.boot.types.configuration.EclipseStoreProperties; import org.eclipse.store.integrations.spring.boot.types.factories.EmbeddedStorageFoundationFactory; import org.eclipse.store.storage.embedded.types.EmbeddedStorageFoundation; import org.springframework.beans.factory.ObjectProvider; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.transaction.TransactionManagerCustomizers; +import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; import org.springframework.transaction.PlatformTransactionManager; @@ -113,4 +117,10 @@ public EclipseStoreTransactionManager getTransactionManagerInstance() } return this.transactionManager; } + + @Bean + public Validator getValidator() + { + return Validation.buildDefaultValidatorFactory().getValidator(); + } } diff --git a/spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/support/EclipseStoreRepositoryFactory.java b/spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/support/EclipseStoreRepositoryFactory.java index 864c347d..0b6a43da 100644 --- a/spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/support/EclipseStoreRepositoryFactory.java +++ b/spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/support/EclipseStoreRepositoryFactory.java @@ -18,6 +18,7 @@ import java.util.Optional; import jakarta.annotation.Nonnull; +import jakarta.validation.Validator; import org.springframework.data.mapping.model.BasicPersistentEntity; import org.springframework.data.repository.core.EntityInformation; @@ -46,13 +47,16 @@ public class EclipseStoreRepositoryFactory extends RepositoryFactorySupport { private final EclipseStoreStorage storage; private final PlatformTransactionManager transactionManager; + private final Validator validator; public EclipseStoreRepositoryFactory( final EclipseStoreStorage storage, - final PlatformTransactionManager transactionManager) + final PlatformTransactionManager transactionManager, + final Validator validator) { this.storage = storage; this.transactionManager = transactionManager; + this.validator = validator; } @Override @@ -82,7 +86,8 @@ private WorkingCopier createWorkingCopier( storage, storage, new SupportedChecker.Implementation(), - storage + storage, + this.validator ); } diff --git a/spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/support/EclipseStoreRepositoryFactoryBean.java b/spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/support/EclipseStoreRepositoryFactoryBean.java index e8a11842..441d0378 100644 --- a/spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/support/EclipseStoreRepositoryFactoryBean.java +++ b/spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/support/EclipseStoreRepositoryFactoryBean.java @@ -81,7 +81,8 @@ protected RepositoryFactorySupport createRepositoryFactory() final EclipseStoreClientConfiguration ensuredConfiguration = this.ensureConfiguration(); return new EclipseStoreRepositoryFactory( ensuredConfiguration.getStorageInstance(), - ensuredConfiguration.getTransactionManagerInstance() + ensuredConfiguration.getTransactionManagerInstance(), + ensuredConfiguration.getValidator() ); } diff --git a/spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/support/copier/registering/AbstractRegisteringCopier.java b/spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/support/copier/registering/AbstractRegisteringCopier.java index 14edda1d..f058126f 100644 --- a/spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/support/copier/registering/AbstractRegisteringCopier.java +++ b/spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/support/copier/registering/AbstractRegisteringCopier.java @@ -15,6 +15,8 @@ */ package software.xdev.spring.data.eclipse.store.repository.support.copier.registering; +import jakarta.validation.Validator; + import org.eclipse.serializer.Serializer; import org.eclipse.serializer.SerializerFoundation; import org.eclipse.serializer.persistence.binary.jdk17.java.util.BinaryHandlerImmutableCollectionsList12; @@ -42,7 +44,8 @@ protected AbstractRegisteringCopier( final SupportedChecker supportedChecker, final RegisteringWorkingCopyAndOriginal register, final ObjectSwizzling objectSwizzling, - final WorkingCopier copier) + final WorkingCopier copier, + final Validator validator) { this.actualCopier = new EclipseSerializerRegisteringCopier( supportedChecker, @@ -52,7 +55,8 @@ protected AbstractRegisteringCopier( this.createSerializerFoundation(), objectSwizzling, copier - ) + ), + validator ); } diff --git a/spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/support/copier/registering/EclipseSerializerRegisteringCopier.java b/spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/support/copier/registering/EclipseSerializerRegisteringCopier.java index 53dba1cf..01a70026 100644 --- a/spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/support/copier/registering/EclipseSerializerRegisteringCopier.java +++ b/spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/support/copier/registering/EclipseSerializerRegisteringCopier.java @@ -58,15 +58,15 @@ public class EclipseSerializerRegisteringCopier implements AutoCloseable public EclipseSerializerRegisteringCopier( final SupportedChecker supportedChecker, final RegisteringWorkingCopyAndOriginal register, - final Supplier> persistenceManagerSupplier) + final Supplier> persistenceManagerSupplier, + final Validator validator + ) { this.supportedChecker = supportedChecker; this.register = register; this.persistenceManagerSupplier = persistenceManagerSupplier; + this.validator = validator; this.persistenceManagers = new ConcurrentLinkedQueue<>(); - - final ValidatorFactory validatorFactory = Validation.buildDefaultValidatorFactory(); - this.validator = validatorFactory.getValidator(); } private PersistenceManager ensurePersistenceManager() diff --git a/spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/support/copier/registering/RegisteringStorageToWorkingCopyCopier.java b/spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/support/copier/registering/RegisteringStorageToWorkingCopyCopier.java index df11886e..d2e8eefa 100644 --- a/spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/support/copier/registering/RegisteringStorageToWorkingCopyCopier.java +++ b/spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/support/copier/registering/RegisteringStorageToWorkingCopyCopier.java @@ -15,6 +15,8 @@ */ package software.xdev.spring.data.eclipse.store.repository.support.copier.registering; +import jakarta.validation.Validator; + import org.eclipse.serializer.reference.ObjectSwizzling; import software.xdev.spring.data.eclipse.store.repository.SupportedChecker; @@ -32,13 +34,15 @@ public RegisteringStorageToWorkingCopyCopier( final WorkingCopyRegistry registry, final SupportedChecker supportedChecker, final ObjectSwizzling objectSwizzling, - final WorkingCopier copier) + final WorkingCopier copier, + final Validator validator) { super( supportedChecker, registry::register, objectSwizzling, - copier + copier, + validator ); } } diff --git a/spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/support/copier/registering/RegisteringWorkingCopyToStorageCopier.java b/spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/support/copier/registering/RegisteringWorkingCopyToStorageCopier.java index 9fdc45f7..4681571c 100644 --- a/spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/support/copier/registering/RegisteringWorkingCopyToStorageCopier.java +++ b/spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/support/copier/registering/RegisteringWorkingCopyToStorageCopier.java @@ -15,6 +15,8 @@ */ package software.xdev.spring.data.eclipse.store.repository.support.copier.registering; +import jakarta.validation.Validator; + import org.eclipse.serializer.reference.ObjectSwizzling; import software.xdev.spring.data.eclipse.store.repository.SupportedChecker; @@ -33,13 +35,15 @@ public RegisteringWorkingCopyToStorageCopier( final WorkingCopyRegistry registry, final SupportedChecker supportedChecker, final ObjectSwizzling objectSwizzling, - final WorkingCopier copier) + final WorkingCopier copier, + final Validator validator) { super( supportedChecker, registry::invertRegister, objectSwizzling, - copier + copier, + validator ); } } diff --git a/spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/support/copier/working/RecursiveWorkingCopier.java b/spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/support/copier/working/RecursiveWorkingCopier.java index 25ac94af..2e63214d 100644 --- a/spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/support/copier/working/RecursiveWorkingCopier.java +++ b/spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/support/copier/working/RecursiveWorkingCopier.java @@ -28,6 +28,8 @@ import java.util.TreeMap; import java.util.TreeSet; +import jakarta.validation.Validator; + import org.eclipse.serializer.reference.Lazy; import org.eclipse.serializer.reference.ObjectSwizzling; import org.slf4j.Logger; @@ -72,15 +74,16 @@ public RecursiveWorkingCopier( final VersionManagerProvider versionManagerProvider, final PersistableChecker persistableChecker, final SupportedChecker supportedChecker, - final ObjectSwizzling objectSwizzling + final ObjectSwizzling objectSwizzling, + final Validator validator ) { this.domainClass = domainClass; this.registry = registry; this.workingCopyToStorageCopier = - new RegisteringWorkingCopyToStorageCopier(registry, supportedChecker, objectSwizzling, this); + new RegisteringWorkingCopyToStorageCopier(registry, supportedChecker, objectSwizzling, this, validator); this.storageToWorkingCopyCopier = - new RegisteringStorageToWorkingCopyCopier(registry, supportedChecker, objectSwizzling, this); + new RegisteringStorageToWorkingCopyCopier(registry, supportedChecker, objectSwizzling, this, validator); this.idManagerProvider = idManagerProvider; this.versionManagerProvider = versionManagerProvider; this.persistableChecker = persistableChecker; diff --git a/spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/repository/support/copier/registering/RegisteringStorageToWorkingCopyCopierTest.java b/spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/repository/support/copier/registering/RegisteringStorageToWorkingCopyCopierTest.java index 2c54b385..71096465 100644 --- a/spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/repository/support/copier/registering/RegisteringStorageToWorkingCopyCopierTest.java +++ b/spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/repository/support/copier/registering/RegisteringStorageToWorkingCopyCopierTest.java @@ -18,6 +18,8 @@ import java.util.List; import java.util.stream.IntStream; +import jakarta.validation.Validation; + import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; @@ -40,7 +42,8 @@ void testCopyManyCopiesSingle() new WorkingCopyRegistry(), new SupportedChecker.Implementation(), o -> null, - new DummyWorkingCopier())) + new DummyWorkingCopier(), + Validation.buildDefaultValidatorFactory().getValidator())) { final List originalObjects = IntStream.range(0, 1_000).mapToObj( i -> new DummyData("Data" + i, i) @@ -60,7 +63,8 @@ void testCopyAgainSameObject() new WorkingCopyRegistry(), new SupportedChecker.Implementation(), o -> null, - new DummyWorkingCopier())) + new DummyWorkingCopier(), + Validation.buildDefaultValidatorFactory().getValidator())) { final DummyData originalObject = new DummyData("Test", 1); @@ -79,7 +83,8 @@ void testCopyAgainTheCopy() new WorkingCopyRegistry(), new SupportedChecker.Implementation(), o -> null, - new DummyWorkingCopier())) + new DummyWorkingCopier(), + Validation.buildDefaultValidatorFactory().getValidator())) { final DummyData originalObject = new DummyData("Test", 1); @@ -100,7 +105,8 @@ void testCopyManyCopiesBulk() new WorkingCopyRegistry(), new SupportedChecker.Implementation(), o -> null, - new DummyWorkingCopier())) + new DummyWorkingCopier(), + Validation.buildDefaultValidatorFactory().getValidator())) { final List originalObjects = IntStream.range(0, 100_000).mapToObj( i -> new DummyData("Data" + i, i) @@ -120,7 +126,8 @@ void testCopyEmpty() new WorkingCopyRegistry(), new SupportedChecker.Implementation(), o -> null, - new DummyWorkingCopier())) + new DummyWorkingCopier(), + Validation.buildDefaultValidatorFactory().getValidator())) { Assertions.assertThrows(NullPointerException.class, () -> copier.copy(null)); } From 9a3c56bcb46c5d9baedf78fd5e325ac18e75c4c6 Mon Sep 17 00:00:00 2001 From: JohannesRabauer Date: Tue, 15 Oct 2024 11:38:19 +0200 Subject: [PATCH 18/19] Fixed Checkstyle and PMD --- .../EclipseSerializerRegisteringCopier.java | 47 ++++++++++--------- .../tests/constraints/ConstraintsTest.java | 4 +- 2 files changed, 27 insertions(+), 24 deletions(-) diff --git a/spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/support/copier/registering/EclipseSerializerRegisteringCopier.java b/spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/support/copier/registering/EclipseSerializerRegisteringCopier.java index 01a70026..e0d24b0f 100644 --- a/spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/support/copier/registering/EclipseSerializerRegisteringCopier.java +++ b/spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/support/copier/registering/EclipseSerializerRegisteringCopier.java @@ -25,9 +25,7 @@ import jakarta.validation.ConstraintViolation; import jakarta.validation.ConstraintViolationException; -import jakarta.validation.Validation; import jakarta.validation.Validator; -import jakarta.validation.ValidatorFactory; import org.eclipse.serializer.persistence.binary.types.Binary; import org.eclipse.serializer.persistence.binary.types.BinaryStorer; @@ -150,26 +148,7 @@ private T copy(final T source, final PersistenceManager persistenceM { return; } - if(copiedObject != null) - { - if(!this.supportedChecker.isSupported(copiedObject.getClass())) - { - throw new DataTypeNotSupportedException(copiedObject.getClass()); - } - final Set> violations = this.validator.validate(copiedObject); - if(!violations.isEmpty()) - { - final String violationsAsMessage = violations.stream() - .map(cv -> cv == null ? "null" : cv.getPropertyPath() + ": " + cv.getMessage()) - .collect(Collectors.joining(", ")); - - throw new ConstraintViolationException( - "Error validating " + copiedObject.getClass().getName() + ":" + System.lineSeparator() - + violationsAsMessage, - violations - ); - } - } + this.validate(copiedObject); summarizer.incrementCopiedObjectsCount(); if(DataTypeUtil.isPrimitiveType(copiedObject.getClass())) { @@ -195,6 +174,30 @@ private T copy(final T source, final PersistenceManager persistenceM return returnValue; } + private void validate(final Object copiedObject) + { + if(copiedObject != null) + { + if(!this.supportedChecker.isSupported(copiedObject.getClass())) + { + throw new DataTypeNotSupportedException(copiedObject.getClass()); + } + final Set> violations = this.validator.validate(copiedObject); + if(!violations.isEmpty()) + { + final String violationsAsMessage = violations.stream() + .map(cv -> cv == null ? "null" : cv.getPropertyPath() + ": " + cv.getMessage()) + .collect(Collectors.joining(", ")); + + throw new ConstraintViolationException( + "Error validating " + copiedObject.getClass().getName() + ":" + System.lineSeparator() + + violationsAsMessage, + violations + ); + } + } + } + private static class Summarizer { private long copiedObjectsCount; diff --git a/spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/constraints/ConstraintsTest.java b/spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/constraints/ConstraintsTest.java index 46d6d533..5578cea9 100644 --- a/spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/constraints/ConstraintsTest.java +++ b/spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/constraints/ConstraintsTest.java @@ -40,7 +40,7 @@ class ConstraintsTest private ConstraintsRepository repository; @Test - void assertFalse_True() + void assertFalseWithTrue() { final ConstraintDaoObject constraintDaoObject = new ConstraintDaoObject(); constraintDaoObject.setAlwaysFalse(true); @@ -51,7 +51,7 @@ void assertFalse_True() } @Test - void assertFalse_False() + void assertFalseWithFalse() { final ConstraintDaoObject constraintDaoObject = new ConstraintDaoObject(); constraintDaoObject.setAlwaysFalse(false); From 7802037cc91101402508e8b8e39a2d608d38c091 Mon Sep 17 00:00:00 2001 From: JohannesRabauer Date: Wed, 16 Oct 2024 10:14:16 +0200 Subject: [PATCH 19/19] Merge fix --- .../copier/registering/AbstractRegisteringCopier.java | 3 +-- .../support/copier/working/RecursiveWorkingCopier.java | 5 ++--- .../tests/constraints/ConstraintsTestConfiguration.java | 6 ++++-- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/support/copier/registering/AbstractRegisteringCopier.java b/spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/support/copier/registering/AbstractRegisteringCopier.java index 2c4ef226..f438085f 100644 --- a/spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/support/copier/registering/AbstractRegisteringCopier.java +++ b/spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/support/copier/registering/AbstractRegisteringCopier.java @@ -59,8 +59,7 @@ protected AbstractRegisteringCopier( this.createSerializerFoundation(), objectSwizzling, copier, - currentClassLoaderProvider, - copier + currentClassLoaderProvider ), validator ); diff --git a/spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/support/copier/working/RecursiveWorkingCopier.java b/spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/support/copier/working/RecursiveWorkingCopier.java index 31a4765e..defcda9d 100644 --- a/spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/support/copier/working/RecursiveWorkingCopier.java +++ b/spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/support/copier/working/RecursiveWorkingCopier.java @@ -88,6 +88,7 @@ public RecursiveWorkingCopier( supportedChecker, objectSwizzling, this, + validator, currentClassLoaderProvider); this.storageToWorkingCopyCopier = new RegisteringStorageToWorkingCopyCopier( @@ -95,10 +96,8 @@ public RecursiveWorkingCopier( supportedChecker, objectSwizzling, this, + validator, currentClassLoaderProvider); - new RegisteringWorkingCopyToStorageCopier(registry, supportedChecker, objectSwizzling, this, validator); - this.storageToWorkingCopyCopier = - new RegisteringStorageToWorkingCopyCopier(registry, supportedChecker, objectSwizzling, this, validator); this.idManagerProvider = idManagerProvider; this.versionManagerProvider = versionManagerProvider; this.persistableChecker = persistableChecker; diff --git a/spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/constraints/ConstraintsTestConfiguration.java b/spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/constraints/ConstraintsTestConfiguration.java index 8b690d6b..af341d85 100644 --- a/spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/constraints/ConstraintsTestConfiguration.java +++ b/spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/constraints/ConstraintsTestConfiguration.java @@ -15,6 +15,7 @@ */ package software.xdev.spring.data.eclipse.store.integration.isolated.tests.constraints; +import org.eclipse.serializer.reflect.ClassLoaderProvider; import org.eclipse.store.integrations.spring.boot.types.configuration.EclipseStoreProperties; import org.eclipse.store.integrations.spring.boot.types.factories.EmbeddedStorageFoundationFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -31,8 +32,9 @@ public class ConstraintsTestConfiguration extends TestConfiguration @Autowired protected ConstraintsTestConfiguration( final EclipseStoreProperties defaultEclipseStoreProperties, - final EmbeddedStorageFoundationFactory defaultEclipseStoreProvider) + final EmbeddedStorageFoundationFactory defaultEclipseStoreProvider, + final ClassLoaderProvider classLoaderProvider) { - super(defaultEclipseStoreProperties, defaultEclipseStoreProvider); + super(defaultEclipseStoreProperties, defaultEclipseStoreProvider, classLoaderProvider); } }