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 diff --git a/CHANGELOG.md b/CHANGELOG.md index bc724225..273a2868 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,10 @@ +# 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 +* 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/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/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 f6ad7ee1..d82b72a2 100644 --- a/docs/modules/ROOT/pages/known-issues.adoc +++ b/docs/modules/ROOT/pages/known-issues.adoc @@ -18,22 +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". - -This leads to problems within EclipseStore and can cause issues with discovering beans (https://github.com/spring-projects/spring-boot/issues/41011[Example 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); - } -} ----- +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]. + +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. + +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]. 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-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..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 @@ -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; @@ -28,10 +29,11 @@ public class ComplexConfiguration extends EclipseStoreClientConfiguration @Autowired public ComplexConfiguration( final EclipseStoreProperties defaultEclipseStoreProperties, - final EmbeddedStorageFoundationFactory defaultEclipseStoreProvider + final EmbeddedStorageFoundationFactory defaultEclipseStoreProvider, + final ClassLoaderProvider classLoaderProvider ) { - super(defaultEclipseStoreProperties, defaultEclipseStoreProvider); + super(defaultEclipseStoreProperties, defaultEclipseStoreProvider, classLoaderProvider); } /** @@ -45,7 +47,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.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 b8d317c6..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 @@ -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,15 @@ @EnableEclipseStoreRepositories public class PersistenceInvoiceConfiguration extends EclipseStoreClientConfiguration { - public static final String STORAGE_PATH = "storage-invoice"; @Autowired protected PersistenceInvoiceConfiguration( final EclipseStoreProperties defaultEclipseStoreProperties, - final EmbeddedStorageFoundationFactory defaultEclipseStoreProvider) + final EmbeddedStorageFoundationFactory defaultEclipseStoreProvider, + final ClassLoaderProvider classLoaderProvider) { - super(defaultEclipseStoreProperties, defaultEclipseStoreProvider); + super(defaultEclipseStoreProperties, defaultEclipseStoreProvider, classLoaderProvider); } /** @@ -45,6 +46,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(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/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-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/pom.xml b/spring-data-eclipse-store/pom.xml index a8fe9d16..8e427942 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 @@ -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,37 @@ + + + jakarta.validation + jakarta.validation-api + + + org.hibernate.validator + hibernate-validator + ${hibernate-validator.version} + + + org.hibernate.orm + hibernate-core + ${hibernate-core.version} + + + antlr4-runtime + org.antlr + + + + + jakarta.el + jakarta.el-api + ${jakarta.el-api.version} + + + org.glassfish.expressly + expressly + ${expressly.version} + com.googlecode.cqengine @@ -288,7 +323,7 @@ org.apache.maven.plugins maven-javadoc-plugin - 3.10.0 + 3.10.1 attach-javadocs 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..c25c1213 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,9 @@ private void createRepositoryForType( storageInstance, storageInstance, new SupportedChecker.Implementation(), - storageInstance + storageInstance, + this.configuration.getValidator(), + 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 f64aedd7..7ec64a3d 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,14 +15,24 @@ */ package software.xdev.spring.data.eclipse.store.repository.config; +import org.eclipse.serializer.reflect.ClassLoaderProvider; +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.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; 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.context.event.ContextClosedEvent; +import org.springframework.context.event.EventListener; import org.springframework.transaction.PlatformTransactionManager; import org.springframework.transaction.TransactionManager; @@ -51,18 +61,37 @@ }) public abstract class EclipseStoreClientConfiguration implements EclipseStoreStorageFoundationProvider { - private final EclipseStoreProperties defaultEclipseStoreProperties; - private final EmbeddedStorageFoundationFactory defaultEclipseStoreProvider; + private static final Logger LOG = LoggerFactory.getLogger(EclipseStoreClientConfiguration.class); + + protected final EclipseStoreProperties defaultEclipseStoreProperties; + protected final EmbeddedStorageFoundationFactory defaultEclipseStoreProvider; + protected final ClassLoaderProvider classLoaderProvider; + + protected EclipseStoreStorage storageInstance; + protected EclipseStoreTransactionManager transactionManager; - private EclipseStoreStorage storageInstance; - private 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, - final EmbeddedStorageFoundationFactory defaultEclipseStoreProvider) + final EmbeddedStorageFoundationFactory defaultEclipseStoreProvider, + final ClassLoaderProvider classLoaderProvider) { this.defaultEclipseStoreProperties = defaultEclipseStoreProperties; + this.classLoaderProvider = classLoaderProvider; this.defaultEclipseStoreProperties.setAutoStart(false); this.defaultEclipseStoreProvider = defaultEclipseStoreProvider; } @@ -77,6 +106,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()}. @@ -99,10 +133,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() @@ -113,4 +146,67 @@ public EclipseStoreTransactionManager getTransactionManagerInstance() } return this.transactionManager; } + + 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? + 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; + } + + /** + * 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(); + } + } + + @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..6e28a249 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,9 @@ private WorkingCopier createWorkingCopier( storage, storage, new SupportedChecker.Implementation(), - storage + storage, + this.validator, + storage.getClassLoaderProvider() ); } 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..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 @@ -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; @@ -23,6 +25,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 +40,16 @@ 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 Validator validator, + final ClassLoaderProvider currentClassLoaderProvider + ) { this.actualCopier = new EclipseSerializerRegisteringCopier( supportedChecker, @@ -51,17 +58,21 @@ protected AbstractRegisteringCopier( this.createPersistenceManager( this.createSerializerFoundation(), objectSwizzling, - copier - ) + copier, + currentClassLoaderProvider + ), + validator ); } 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/EclipseSerializerRegisteringCopier.java b/spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/support/copier/registering/EclipseSerializerRegisteringCopier.java index 9d7f7469..295ecb13 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,14 @@ 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.Validator; import org.eclipse.serializer.persistence.binary.types.Binary; import org.eclipse.serializer.persistence.binary.types.BinaryStorer; @@ -45,15 +51,19 @@ 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, 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<>(); } @@ -116,7 +126,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); @@ -138,10 +148,7 @@ private T copy(final T source, final PersistenceManager persistenceM { return; } - if(copiedObject != null && !this.supportedChecker.isSupported(copiedObject.getClass())) - { - throw new DataTypeNotSupportedException(copiedObject.getClass()); - } + this.validate(copiedObject); summarizer.incrementCopiedObjectsCount(); if(DataTypeUtil.isPrimitiveType(copiedObject.getClass())) { @@ -167,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/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..2fd41417 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,7 +15,10 @@ */ package software.xdev.spring.data.eclipse.store.repository.support.copier.registering; +import jakarta.validation.Validator; + 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 +35,18 @@ public RegisteringStorageToWorkingCopyCopier( final WorkingCopyRegistry registry, final SupportedChecker supportedChecker, final ObjectSwizzling objectSwizzling, - final WorkingCopier copier) + final WorkingCopier copier, + final Validator validator, + final ClassLoaderProvider currentClassLoaderProvider + ) { super( supportedChecker, registry::register, objectSwizzling, - copier + copier, + validator, + 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..171003f9 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,7 +15,10 @@ */ package software.xdev.spring.data.eclipse.store.repository.support.copier.registering; +import jakarta.validation.Validator; + 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 +36,18 @@ public RegisteringWorkingCopyToStorageCopier( final WorkingCopyRegistry registry, final SupportedChecker supportedChecker, final ObjectSwizzling objectSwizzling, - final WorkingCopier copier) + final WorkingCopier copier, + final Validator validator, + final ClassLoaderProvider currentClassLoaderProvider + ) { super( supportedChecker, registry::invertRegister, objectSwizzling, - copier + copier, + validator, + 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..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 @@ -28,8 +28,11 @@ 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.eclipse.serializer.reflect.ClassLoaderProvider; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -72,15 +75,29 @@ public RecursiveWorkingCopier( final VersionManagerProvider versionManagerProvider, final PersistableChecker persistableChecker, final SupportedChecker supportedChecker, - final ObjectSwizzling objectSwizzling + final ObjectSwizzling objectSwizzling, + final Validator validator, + final ClassLoaderProvider currentClassLoaderProvider ) { this.domainClass = domainClass; this.registry = registry; this.workingCopyToStorageCopier = - new RegisteringWorkingCopyToStorageCopier(registry, supportedChecker, objectSwizzling, this); + new RegisteringWorkingCopyToStorageCopier( + registry, + supportedChecker, + objectSwizzling, + this, + validator, + currentClassLoaderProvider); this.storageToWorkingCopyCopier = - new RegisteringStorageToWorkingCopyCopier(registry, supportedChecker, objectSwizzling, this); + new RegisteringStorageToWorkingCopyCopier( + registry, + supportedChecker, + objectSwizzling, + this, + validator, + 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/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..5578cea9 --- /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 assertFalseWithTrue() + { + final ConstraintDaoObject constraintDaoObject = new ConstraintDaoObject(); + constraintDaoObject.setAlwaysFalse(true); + Assertions.assertThrows( + ConstraintViolationException.class, + () -> this.repository.save(constraintDaoObject) + ); + } + + @Test + void assertFalseWithFalse() + { + 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..af341d85 --- /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,40 @@ +/* + * 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.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; +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, + final ClassLoaderProvider classLoaderProvider) + { + super(defaultEclipseStoreProperties, defaultEclipseStoreProvider, classLoaderProvider); + } +} 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..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 @@ -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..5939e115 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,9 @@ import java.util.List; import java.util.stream.IntStream; +import org.eclipse.serializer.reflect.ClassLoaderProvider; +import jakarta.validation.Validation; + import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; @@ -40,7 +43,11 @@ void testCopyManyCopiesSingle() new WorkingCopyRegistry(), new SupportedChecker.Implementation(), o -> null, - new DummyWorkingCopier())) + new DummyWorkingCopier(), + Validation.buildDefaultValidatorFactory().getValidator(), + ClassLoaderProvider.System() + ) + ) { final List originalObjects = IntStream.range(0, 1_000).mapToObj( i -> new DummyData("Data" + i, i) @@ -60,7 +67,11 @@ void testCopyAgainSameObject() new WorkingCopyRegistry(), new SupportedChecker.Implementation(), o -> null, - new DummyWorkingCopier())) + new DummyWorkingCopier(), + Validation.buildDefaultValidatorFactory().getValidator(), + ClassLoaderProvider.System() + ) + ) { final DummyData originalObject = new DummyData("Test", 1); @@ -79,7 +90,11 @@ void testCopyAgainTheCopy() new WorkingCopyRegistry(), new SupportedChecker.Implementation(), o -> null, - new DummyWorkingCopier())) + new DummyWorkingCopier(), + Validation.buildDefaultValidatorFactory().getValidator(), + ClassLoaderProvider.System() + ) + ) { final DummyData originalObject = new DummyData("Test", 1); @@ -100,7 +115,11 @@ void testCopyManyCopiesBulk() new WorkingCopyRegistry(), new SupportedChecker.Implementation(), o -> null, - new DummyWorkingCopier())) + new DummyWorkingCopier(), + Validation.buildDefaultValidatorFactory().getValidator(), + ClassLoaderProvider.System() + ) + ) { final List originalObjects = IntStream.range(0, 100_000).mapToObj( i -> new DummyData("Data" + i, i) @@ -120,7 +139,11 @@ void testCopyEmpty() new WorkingCopyRegistry(), new SupportedChecker.Implementation(), o -> null, - new DummyWorkingCopier())) + new DummyWorkingCopier(), + Validation.buildDefaultValidatorFactory().getValidator(), + ClassLoaderProvider.System() + ) + ) { Assertions.assertThrows(NullPointerException.class, () -> copier.copy(null)); }