From 105d452ff8d65ced9a981a00dfb6ad8332dfcfd2 Mon Sep 17 00:00:00 2001 From: XDEV Renovate Bot Date: Fri, 13 Dec 2024 02:41:05 +0000 Subject: [PATCH 01/20] Update dependency com.puppycrawl.tools:checkstyle to v10.21.0 --- pom.xml | 2 +- template-placeholder/pom.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index eede2610..eac619a1 100644 --- a/pom.xml +++ b/pom.xml @@ -45,7 +45,7 @@ com.puppycrawl.tools checkstyle - 10.20.2 + 10.21.0 diff --git a/template-placeholder/pom.xml b/template-placeholder/pom.xml index abbbb534..75f0b852 100644 --- a/template-placeholder/pom.xml +++ b/template-placeholder/pom.xml @@ -247,7 +247,7 @@ com.puppycrawl.tools checkstyle - 10.20.2 + 10.21.0 From 73b158a40c742e4ff95de2770f2c5f298c96324c Mon Sep 17 00:00:00 2001 From: AB Date: Mon, 16 Dec 2024 09:06:51 +0100 Subject: [PATCH 02/20] Update to latest checkstyle version --- .idea/checkstyle-idea.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.idea/checkstyle-idea.xml b/.idea/checkstyle-idea.xml index 5f35e018..b52c3e2f 100644 --- a/.idea/checkstyle-idea.xml +++ b/.idea/checkstyle-idea.xml @@ -1,7 +1,7 @@ - 10.20.1 + 10.21.0 JavaOnlyWithTests true true From 3f14ad2f3cd2ea83dfe67ef5d9185782028dfb07 Mon Sep 17 00:00:00 2001 From: XDEV Renovate Bot Date: Fri, 20 Dec 2024 02:33:16 +0000 Subject: [PATCH 03/20] Update org.springframework.boot.version to v3.4.1 --- pom.xml | 2 +- spring-data-eclipse-store/pom.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 7763b999..908481b2 100644 --- a/pom.xml +++ b/pom.xml @@ -22,7 +22,7 @@ UTF-8 - 3.4.0 + 3.4.1 2.1.0 2.1.0 2.1.0 diff --git a/spring-data-eclipse-store/pom.xml b/spring-data-eclipse-store/pom.xml index 98717c69..4bd7d1ca 100644 --- a/spring-data-eclipse-store/pom.xml +++ b/spring-data-eclipse-store/pom.xml @@ -51,7 +51,7 @@ UTF-8 - 3.4.0 + 3.4.1 2.1.0 2.1.0 8.0.2.Final From 4f1cc86f5d74314145a5f2b41731568534dbf0a6 Mon Sep 17 00:00:00 2001 From: JohannesRabauer Date: Fri, 20 Dec 2024 07:45:02 +0100 Subject: [PATCH 04/20] Updated docs --- CHANGELOG.md | 4 ++++ README.md | 3 ++- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d61a3f87..18e17ae2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,7 @@ +# 2.4.2 + +* Updated org.springframework.boot.version to v3.4.1 + # 2.4.1 * Updated EclipseStore to v2.1.0 diff --git a/README.md b/README.md index 3dd6a3b9..4ea3e2a8 100644 --- a/README.md +++ b/README.md @@ -58,7 +58,8 @@ instructions** are in the documentation](https://xdev-software.github.io/spring- | ``2.0.0-2.1.0`` | ``17`` | ``3.3.2`` | ``1.4.0`` | | ``2.2.0-2.3.1`` | ``17`` | ``3.3.4`` | ``1.4.0`` | | ``2.4.0`` | ``17`` | ``3.4.0`` | ``2.0.0`` | -| ``>= 2.4.1`` | ``17`` | ``3.4.0`` | ``2.1.0`` | +| ``2.4.1`` | ``17`` | ``3.4.0`` | ``2.1.0`` | +| ``>= 2.4.2`` | ``17`` | ``3.4.1`` | ``2.1.0`` | ## Demo From 6ba4ba37a27090edf9bdb1c4bdad844dbd6f450b Mon Sep 17 00:00:00 2001 From: JohannesRabauer Date: Fri, 20 Dec 2024 10:00:05 +0100 Subject: [PATCH 05/20] Added more contraint tests --- .../constraints/ConstraintDaoObject.java | 20 +- .../tests/constraints/ConstraintsTest.java | 438 +++++++++++++++++- 2 files changed, 441 insertions(+), 17 deletions(-) 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 index 7d113e96..54c18e35 100644 --- 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 @@ -65,7 +65,7 @@ public class ConstraintDaoObject @DecimalMin("5.00") BigDecimal discountMin5; - @DecimalMax("30.00") + @DecimalMax("20.00") BigDecimal discountMax20; @Email @@ -116,8 +116,8 @@ public class ConstraintDaoObject @PositiveOrZero int positiveOrZeroField; - @Size(min = 2, max = 240) - String messageMin2AndMax240; + @Size(min = 2, max = 10) + String messageMin2AndMax10; public ConstraintDaoObject() { @@ -141,7 +141,7 @@ public ConstraintDaoObject() this.phoneNumber = "(123)456-7890"; this.area = BigDecimal.valueOf(1); this.positiveOrZeroField = 1; - this.messageMin2AndMax240 = ".."; + this.messageMin2AndMax10 = ".."; } @AssertFalse @@ -186,12 +186,12 @@ public void setDiscountMin5(final @DecimalMin("5.00") BigDecimal discountMin5) this.discountMin5 = discountMin5; } - public @DecimalMax("30.00") BigDecimal getDiscountMax20() + public @DecimalMax("20.00") BigDecimal getDiscountMax20() { return this.discountMax20; } - public void setDiscountMax20(final @DecimalMax("30.00") BigDecimal discountMax20) + public void setDiscountMax20(final @DecimalMax("20.00") BigDecimal discountMax20) { this.discountMax20 = discountMax20; } @@ -361,13 +361,13 @@ public void setPositiveOrZeroField(@PositiveOrZero final int positiveOrZeroField this.positiveOrZeroField = positiveOrZeroField; } - public @Size(min = 2, max = 240) String getMessageMin2AndMax240() + public @Size(min = 2, max = 10) String getMessageMin2AndMax10() { - return this.messageMin2AndMax240; + return this.messageMin2AndMax10; } - public void setMessageMin2AndMax240(final @Size(min = 2, max = 240) String messageMin2AndMax240) + public void setMessageMin2AndMax10(final @Size(min = 2, max = 10) String messageMin2AndMax10) { - this.messageMin2AndMax240 = messageMin2AndMax240; + this.messageMin2AndMax10 = messageMin2AndMax10; } } 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 5578cea9..ea8016a1 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 @@ -15,11 +15,20 @@ */ package software.xdev.spring.data.eclipse.store.integration.isolated.tests.constraints; +import static org.springframework.test.annotation.DirtiesContext.ClassMode.BEFORE_CLASS; + +import java.math.BigDecimal; +import java.time.Instant; +import java.time.temporal.ChronoUnit; +import java.util.Date; +import java.util.function.Consumer; + 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.annotation.DirtiesContext; import org.springframework.test.context.ContextConfiguration; import software.xdev.spring.data.eclipse.store.integration.isolated.IsolatedTestAnnotations; @@ -32,6 +41,8 @@ */ @IsolatedTestAnnotations @ContextConfiguration(classes = {ConstraintsTestConfiguration.class}) +@SuppressWarnings("checkstyle:MethodName") +@DirtiesContext(classMode = BEFORE_CLASS) class ConstraintsTest { @Autowired @@ -42,19 +53,432 @@ class ConstraintsTest @Test void assertFalseWithTrue() { - final ConstraintDaoObject constraintDaoObject = new ConstraintDaoObject(); - constraintDaoObject.setAlwaysFalse(true); - Assertions.assertThrows( - ConstraintViolationException.class, - () -> this.repository.save(constraintDaoObject) - ); + this.assertConstraintViolationChange(o -> o.setAlwaysFalse(true)); } @Test void assertFalseWithFalse() + { + this.assertGoodChange(o -> o.setAlwaysFalse(false)); + } + + @Test + void assertTrueWithTrue() + { + this.assertGoodChange(o -> o.setAlwaysTrue(true)); + } + + @Test + void assertTrueWithFalse() + { + this.assertConstraintViolationChange(o -> o.setAlwaysTrue(false)); + } + + @Test + void assertDigitsGood() + { + this.assertGoodChange(o -> o.setPrice(BigDecimal.valueOf(123456.78))); + } + + @Test + void assertDigitsTooMuchInteger() + { + this.assertConstraintViolationChange(o -> o.setPrice(BigDecimal.valueOf(1234567))); + } + + @Test + void assertDigitsTooMuchFraction() + { + this.assertConstraintViolationChange(o -> o.setPrice(BigDecimal.valueOf(0.123))); + } + + @Test + void assertDecimalMinGoodExact() + { + this.assertGoodChange(o -> o.setDiscountMin5(BigDecimal.valueOf(5))); + } + + @Test + void assertDecimalMinGoodGreater() + { + this.assertGoodChange(o -> o.setDiscountMin5(BigDecimal.valueOf(6))); + } + + @Test + void assertDecimalMinBadSmaller() + { + this.assertConstraintViolationChange(o -> o.setDiscountMin5(BigDecimal.valueOf(4))); + } + + @Test + void assertDecimalMinBadNegative() + { + this.assertConstraintViolationChange(o -> o.setDiscountMin5(BigDecimal.valueOf(-1))); + } + + @Test + void assertDecimalMaxGoodExact() + { + this.assertGoodChange(o -> o.setDiscountMax20(BigDecimal.valueOf(20))); + } + + @Test + void assertDecimalMaxGoodSmaller() + { + this.assertGoodChange(o -> o.setDiscountMax20(BigDecimal.ONE)); + } + + @Test + void assertDecimalMaxGoodZero() + { + this.assertGoodChange(o -> o.setDiscountMax20(BigDecimal.ZERO)); + } + + @Test + void assertDecimalMaxBadBigger() + { + this.assertConstraintViolationChange(o -> o.setDiscountMax20(BigDecimal.valueOf(21))); + } + + @Test + void assertDecimalMaxBadBiggest() + { + this.assertConstraintViolationChange(o -> o.setDiscountMax20(BigDecimal.valueOf(Double.MAX_VALUE))); + } + + @Test + void assertDecimalMaxGoodNegative() + { + this.assertGoodChange(o -> o.setDiscountMax20(BigDecimal.valueOf(-1))); + } + + @Test + void assertEmailGood() + { + this.assertGoodChange(o -> o.setEmailField("a@b.c")); + } + + @Test + void assertEmailBad_MissingAt() + { + this.assertConstraintViolationChange(o -> o.setEmailField("a.b")); + } + + @Test + void assertEmailGood_MissingDot() + { + this.assertGoodChange(o -> o.setEmailField("a@b")); + } + + @Test + void assertEmailBad_NoPrefixBeforeAt() + { + this.assertConstraintViolationChange(o -> o.setEmailField("@b.c")); + } + + @Test + void assertEmailGood_Empty() + { + this.assertGoodChange(o -> o.setEmailField("")); + } + + @Test + void assertEmailGood_Null() + { + this.assertGoodChange(o -> o.setEmailField(null)); + } + + @Test + void assertFutureFieldGood() + { + this.assertGoodChange(o -> o.setFutureField(Date.from(Instant.now().plus(1, ChronoUnit.DAYS)))); + } + + @Test + void assertFutureFieldBad_Now() + { + this.assertConstraintViolationChange(o -> o.setFutureField(Date.from(Instant.now()))); + } + + @Test + void assertFutureFieldBad_Yesterday() + { + this.assertConstraintViolationChange(o -> o.setFutureField(Date.from(Instant.now().minus(1, ChronoUnit.DAYS)))); + } + + @Test + void assertFutureOrPresentFieldGood() + { + this.assertGoodChange(o -> o.setFutureOrPresentField(Date.from(Instant.now().plus(1, ChronoUnit.DAYS)))); + } + + @Test + void assertFutureOrPresentFieldBad_Yesterday() + { + this.assertConstraintViolationChange(o -> o.setFutureOrPresentField(Date.from(Instant.now() + .minus(1, ChronoUnit.DAYS)))); + } + + @Test + void assertPastFieldBad() + { + this.assertConstraintViolationChange(o -> o.setPastField(Date.from(Instant.now().plus(1, ChronoUnit.DAYS)))); + } + + @Test + void assertPastFieldGood_Now() + { + this.assertGoodChange(o -> o.setPastField(Date.from(Instant.now()))); + } + + @Test + void assertPastFieldGood_Yesterday() + { + this.assertGoodChange(o -> o.setPastField(Date.from(Instant.now().minus(1, ChronoUnit.DAYS)))); + } + + @Test + void assertPastOrPresentFieldBad() + { + this.assertConstraintViolationChange(o -> o.setPastOrPresentField(Date.from(Instant.now() + .plus(1, ChronoUnit.DAYS)))); + } + + @Test + void assertPastOrPresentFieldGood_Now() + { + this.assertGoodChange(o -> o.setPastOrPresentField(Date.from(Instant.now()))); + } + + @Test + void assertPastOrPresentFieldGood_Yesterday() + { + this.assertGoodChange(o -> o.setPastOrPresentField(Date.from(Instant.now().minus(1, ChronoUnit.DAYS)))); + } + + @Test + void assertMaxGood() + { + this.assertGoodChange(o -> o.setQuantityMax10(10)); + } + + @Test + void assertMaxBad() + { + this.assertConstraintViolationChange(o -> o.setQuantityMax10(11)); + } + + @Test + void assertMinGood() + { + this.assertGoodChange(o -> o.setQuantityMin5(5)); + } + + @Test + void assertMinBad() + { + this.assertConstraintViolationChange(o -> o.setQuantityMin5(3)); + } + + @Test + void assertNegativeFieldGood() + { + this.assertGoodChange(o -> o.setNegativeField(-1)); + } + + @Test + void assertNegativeFieldBad() + { + this.assertConstraintViolationChange(o -> o.setNegativeField(1)); + } + + @Test + void assertNegativeFieldBad_Zero() + { + this.assertConstraintViolationChange(o -> o.setNegativeField(0)); + } + + @Test + void assertNegativeOrZeroFieldGood_Zero() + { + this.assertGoodChange(o -> o.setNegativeOrZeroField(0)); + } + + @Test + void assertNegativeOrZeroFieldGood() + { + this.assertGoodChange(o -> o.setNegativeOrZeroField(-1)); + } + + @Test + void assertNegativeOrZeroFieldBad() + { + this.assertConstraintViolationChange(o -> o.setNegativeOrZeroField(1)); + } + + @Test + void assertNotBlankGood() + { + this.assertGoodChange(o -> o.setMessageNotBlank("a")); + } + + @Test + void assertNotBlankBad_Null() + { + this.assertConstraintViolationChange(o -> o.setMessageNotBlank(null)); + } + + @Test + void assertNotBlankBad_Empty() + { + this.assertConstraintViolationChange(o -> o.setMessageNotBlank("")); + } + + @Test + void assertNotBlankBad_Space() + { + this.assertConstraintViolationChange(o -> o.setMessageNotBlank(" ")); + } + + @Test + void assertNotEmptyGood() + { + this.assertGoodChange(o -> o.setMessageNotEmpty("a")); + } + + @Test + void assertNotEmptyBad_Null() + { + this.assertConstraintViolationChange(o -> o.setMessageNotEmpty(null)); + } + + @Test + void assertNotEmptyBad_Empty() + { + this.assertConstraintViolationChange(o -> o.setMessageNotEmpty("")); + } + + @Test + void assertNotEmptyGood_Space() + { + this.assertGoodChange(o -> o.setUsername(" ")); + } + + @Test + void assertNotNullGood() + { + this.assertGoodChange(o -> o.setUsername("a")); + } + + @Test + void assertNotNullBad_Null() + { + this.assertConstraintViolationChange(o -> o.setUsername(null)); + } + + @Test + void assertNotNullGood_Empty() + { + this.assertGoodChange(o -> o.setUsername("")); + } + + @Test + void assertNotNullGood_Space() + { + this.assertGoodChange(o -> o.setUsername(" ")); + } + + @Test + void assertPatternGood() + { + this.assertGoodChange(o -> o.setPhoneNumber("(123)456-7890")); + } + + @Test + void assertPatternBad() + { + this.assertConstraintViolationChange(o -> o.setPhoneNumber("456-7890")); + } + + @Test + void assertPositiveGood() + { + this.assertGoodChange(o -> o.setArea(BigDecimal.ONE)); + } + + @Test + void assertPositiveBad() + { + this.assertConstraintViolationChange(o -> o.setArea(BigDecimal.valueOf(-1))); + } + + @Test + void assertPositiveBad_Zero() + { + this.assertConstraintViolationChange(o -> o.setArea(BigDecimal.ZERO)); + } + + @Test + void assertPositiveOrZeroGood() + { + this.assertGoodChange(o -> o.setPositiveOrZeroField(1)); + } + + @Test + void assertPositiveOrZeroBad() + { + this.assertConstraintViolationChange(o -> o.setPositiveOrZeroField(-1)); + } + + @Test + void assertPositiveOrZeroGood_Zero() + { + this.assertGoodChange(o -> o.setPositiveOrZeroField(0)); + } + + @Test + void assertStringMinAndMaxGood() + { + this.assertGoodChange(o -> o.setMessageMin2AndMax10("123")); + } + + @Test + void assertStringMinAndMaxBad_TooSmall() + { + this.assertConstraintViolationChange(o -> o.setMessageMin2AndMax10("1")); + } + + @Test + void assertStringMinAndMaxBad_TooBig() + { + this.assertConstraintViolationChange(o -> o.setMessageMin2AndMax10("1234567890-")); + } + + /// ////-------------Help Functions -------------////////////// + private void assertGoodChange(final Consumer change) { final ConstraintDaoObject constraintDaoObject = new ConstraintDaoObject(); - constraintDaoObject.setAlwaysFalse(false); + change.accept(constraintDaoObject); + this.assertGoodSave(constraintDaoObject); + } + + private void assertGoodSave(final ConstraintDaoObject constraintDaoObject) + { Assertions.assertDoesNotThrow(() -> this.repository.save(constraintDaoObject)); } + + private void assertConstraintViolationChange(final Consumer change) + { + final ConstraintDaoObject constraintDaoObject = new ConstraintDaoObject(); + change.accept(constraintDaoObject); + this.assertConstraintViolationSave(constraintDaoObject); + } + + private void assertConstraintViolationSave(final ConstraintDaoObject constraintDaoObject) + { + Assertions.assertThrows( + ConstraintViolationException.class, + () -> this.repository.save(constraintDaoObject) + ); + } } From 6499afdf911250a7aa8f0823a499c5edb2bce474 Mon Sep 17 00:00:00 2001 From: JohannesRabauer Date: Fri, 20 Dec 2024 11:03:06 +0100 Subject: [PATCH 06/20] Added documentation for validation-constraints --- CHANGELOG.md | 1 - docs/modules/ROOT/nav.adoc | 1 + .../modules/ROOT/pages/features/features.adoc | 1 + .../features/validation-constraints.adoc | 19 +++++++++++++++++++ 4 files changed, 21 insertions(+), 1 deletion(-) create mode 100644 docs/modules/ROOT/pages/features/validation-constraints.adoc diff --git a/CHANGELOG.md b/CHANGELOG.md index 18e17ae2..480cfdd0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -17,7 +17,6 @@ * Auto-Fix problems with adding ids to entities with existing data store. -~~~~ # 2.3.0 * Add support for shutting down the storage during application shutdown diff --git a/docs/modules/ROOT/nav.adoc b/docs/modules/ROOT/nav.adoc index ae44098a..c056d12a 100644 --- a/docs/modules/ROOT/nav.adoc +++ b/docs/modules/ROOT/nav.adoc @@ -9,5 +9,6 @@ ** xref:features/transactions.adoc[Transactions] ** xref:features/versions.adoc[Versions] ** xref:features/rest-api.adoc[REST Interface] +** xref:features/validation-constraints.adoc[Validation Constraints] * xref:migration.adoc[Migration from JPA] * xref:known-issues.adoc[Known issues] diff --git a/docs/modules/ROOT/pages/features/features.adoc b/docs/modules/ROOT/pages/features/features.adoc index de38b497..0692dfe8 100644 --- a/docs/modules/ROOT/pages/features/features.adoc +++ b/docs/modules/ROOT/pages/features/features.adoc @@ -6,3 +6,4 @@ * xref:features/transactions.adoc[Transactions] * xref:features/versions.adoc[Versions] * xref:features/rest-api.adoc[REST Interface] +* xref:features/validation-constraints.adoc[Validation Constraints] diff --git a/docs/modules/ROOT/pages/features/validation-constraints.adoc b/docs/modules/ROOT/pages/features/validation-constraints.adoc new file mode 100644 index 00000000..3dabb23c --- /dev/null +++ b/docs/modules/ROOT/pages/features/validation-constraints.adoc @@ -0,0 +1,19 @@ += Validation Constraints + +By using the https://jakarta.ee/learn/docs/jakartaee-tutorial/current/beanvalidation/bean-validation/bean-validation.html[Jakarta Bean Validation Constraints] developers with {product-name} can easily limit the allowed input of entities. +Here is a full list of supported validations: https://jakarta.ee/learn/docs/jakartaee-tutorial/current/beanvalidation/bean-validation/bean-validation.html#_using_jakarta_bean_validation_constraints[https://jakarta.ee/learn] + +[source,java,title="https://github.com/xdev-software/spring-data-eclipse-store/blob/develop/spring-data-eclipse-store-demo/src/main/java/software/xdev/spring/data/eclipse/store/demo/complex/model/Person.java[Example from complex demo]"] +---- +package software.xdev.spring.data.eclipse.store.demo.complex.model; + +import jakarta.validation.constraints.NotBlank; + +public class Person extends BaseEntity +{ + @NotBlank + private String firstName; + //... +---- + +The ``jakarta.validation.Validator`` is provided by 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``] and can be changed in the project-specific configuration. From 78a67944f65997039c4334ad6be6894d7e5433a0 Mon Sep 17 00:00:00 2001 From: JohannesRabauer Date: Fri, 20 Dec 2024 11:03:14 +0100 Subject: [PATCH 07/20] Refactoring --- .../data/eclipse/store/demo/complex/model/Person.java | 4 ++++ .../repository/config/EclipseStoreClientConfiguration.java | 6 +++++- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/spring-data-eclipse-store-demo/src/main/java/software/xdev/spring/data/eclipse/store/demo/complex/model/Person.java b/spring-data-eclipse-store-demo/src/main/java/software/xdev/spring/data/eclipse/store/demo/complex/model/Person.java index b1eb515e..b0ede23d 100644 --- a/spring-data-eclipse-store-demo/src/main/java/software/xdev/spring/data/eclipse/store/demo/complex/model/Person.java +++ b/spring-data-eclipse-store-demo/src/main/java/software/xdev/spring/data/eclipse/store/demo/complex/model/Person.java @@ -15,8 +15,12 @@ */ package software.xdev.spring.data.eclipse.store.demo.complex.model; +import jakarta.validation.constraints.NotBlank; + + public class Person extends BaseEntity { + @NotBlank private String firstName; private String lastName; 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 b75a22b4..c00eeb11 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 @@ -17,6 +17,7 @@ import jakarta.validation.Validation; import jakarta.validation.Validator; +import jakarta.validation.ValidatorFactory; import org.eclipse.serializer.reflect.ClassLoaderProvider; import org.eclipse.store.integrations.spring.boot.types.configuration.EclipseStoreProperties; @@ -206,6 +207,9 @@ public void shutdownStorageOnContextClosed(final ContextClosedEvent event) @Bean public Validator getValidator() { - return Validation.buildDefaultValidatorFactory().getValidator(); + try(ValidatorFactory factory = Validation.buildDefaultValidatorFactory()) + { + return factory.getValidator(); + } } } From f16525dd175b7c474a4e3d22c15c0e2c2224971a Mon Sep 17 00:00:00 2001 From: JohannesRabauer Date: Fri, 20 Dec 2024 15:42:30 +0100 Subject: [PATCH 08/20] First try with implementing DataMigrator --- .../repository/EclipseStoreMigrator.java | 15 +++++- .../store/repository/EclipseStoreStorage.java | 14 +++++- .../data/eclipse/store/repository/Root.java | 4 +- ...efaultEclipseStoreClientConfiguration.java | 9 +++- ...clipseStoreClientConfigurationFactory.java | 10 +++- .../EclipseStoreClientConfiguration.java | 40 +++++++++++++++- .../store/repository/root/EntityData.java | 4 +- .../store/repository/root/RootDataV2.java | 4 +- .../store/repository/root/VersionedRoot.java | 10 +++- .../root/data/version/DataMigrater.java | 19 ++++++++ .../data/version/DataMigrationScript.java | 14 ++++++ .../root/data/version/DataVersion.java | 42 +++++++++++++++++ .../store/integration/TestConfiguration.java | 15 +++++- .../DataMigrationOwnMigratorTest.java | 40 ++++++++++++++++ ...MigrationOwnMigratorTestConfiguration.java | 46 +++++++++++++++++++ .../own/migrator/PersistedEntity.java | 13 ++++++ .../migrator/PersistedEntityRepository.java | 23 ++++++++++ .../migration/own/migrator/v1_0_0_Init.java | 28 +++++++++++ 18 files changed, 332 insertions(+), 18 deletions(-) create mode 100644 spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/root/data/version/DataMigrater.java create mode 100644 spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/root/data/version/DataMigrationScript.java create mode 100644 spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/root/data/version/DataVersion.java create mode 100644 spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/data/migration/own/migrator/DataMigrationOwnMigratorTest.java create mode 100644 spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/data/migration/own/migrator/DataMigrationOwnMigratorTestConfiguration.java create mode 100644 spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/data/migration/own/migrator/PersistedEntity.java create mode 100644 spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/data/migration/own/migrator/PersistedEntityRepository.java create mode 100644 spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/data/migration/own/migrator/v1_0_0_Init.java diff --git a/spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/EclipseStoreMigrator.java b/spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/EclipseStoreMigrator.java index 695f0504..06e9705b 100644 --- a/spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/EclipseStoreMigrator.java +++ b/spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/EclipseStoreMigrator.java @@ -21,9 +21,11 @@ import software.xdev.micromigration.eclipsestore.MigrationManager; import software.xdev.micromigration.migrater.ExplicitMigrater; +import software.xdev.micromigration.migrater.MicroMigrater; import software.xdev.micromigration.scripts.VersionAgnosticMigrationScript; import software.xdev.micromigration.version.MigrationVersion; import software.xdev.spring.data.eclipse.store.repository.root.VersionedRoot; +import software.xdev.spring.data.eclipse.store.repository.root.data.version.DataVersion; import software.xdev.spring.data.eclipse.store.repository.root.update.scripts.v2_0_0_InitializeVersioning; import software.xdev.spring.data.eclipse.store.repository.root.update.scripts.v2_4_0_InitializeLazy; @@ -40,12 +42,23 @@ private EclipseStoreMigrator() { } - public static void migrate(final VersionedRoot versionedRoot, final EmbeddedStorageManager storageManager) + public static void migrateStructure(final VersionedRoot versionedRoot, final EmbeddedStorageManager storageManager) { final ExplicitMigrater migrater = new ExplicitMigrater(SCRIPTS); new MigrationManager(versionedRoot, migrater, storageManager).migrate(versionedRoot); } + public static void migrateData( + final DataVersion versionedData, + final MicroMigrater migrater, + final EmbeddedStorageManager storageManager) + { + if(migrater != null) + { + new MigrationManager(versionedData, migrater, storageManager).migrate(versionedData); + } + } + public static MigrationVersion getLatestVersion() { final ExplicitMigrater migrater = new ExplicitMigrater(SCRIPTS); 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 c772fabb..e8850781 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 @@ -20,6 +20,7 @@ import java.util.HashMap; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; +import java.util.function.Supplier; import org.eclipse.serializer.persistence.binary.jdk17.java.util.BinaryHandlerImmutableCollectionsList12; import org.eclipse.serializer.persistence.binary.jdk17.java.util.BinaryHandlerImmutableCollectionsSet12; @@ -32,6 +33,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import software.xdev.micromigration.migrater.MicroMigrater; import software.xdev.spring.data.eclipse.store.core.EntityListProvider; import software.xdev.spring.data.eclipse.store.core.EntityProvider; import software.xdev.spring.data.eclipse.store.exceptions.AlreadyRegisteredException; @@ -40,6 +42,7 @@ import software.xdev.spring.data.eclipse.store.repository.config.EclipseStoreStorageFoundationProvider; import software.xdev.spring.data.eclipse.store.repository.interfaces.EclipseStoreRepository; import software.xdev.spring.data.eclipse.store.repository.root.VersionedRoot; +import software.xdev.spring.data.eclipse.store.repository.root.data.version.DataVersion; import software.xdev.spring.data.eclipse.store.repository.root.v2_4.EntityData; import software.xdev.spring.data.eclipse.store.repository.support.SimpleEclipseStoreRepository; import software.xdev.spring.data.eclipse.store.repository.support.concurrency.ReadWriteLock; @@ -77,6 +80,7 @@ public class EclipseStoreStorage private final Map, VersionManager> versionManagers = new ConcurrentHashMap<>(); private final EclipseStoreStorageFoundationProvider foundationProvider; private final ClassLoaderProvider classLoaderProvider; + private final Supplier dataMigraterProvider; private EntitySetCollector entitySetCollector; private PersistableChecker persistenceChecker; private EmbeddedStorageManager storageManager; @@ -90,9 +94,10 @@ public EclipseStoreStorage(final EclipseStoreClientConfiguration storeConfigurat { this.foundationProvider = storeConfiguration; this.classLoaderProvider = storeConfiguration.getClassLoaderProvider(); + this.dataMigraterProvider = storeConfiguration::getDataMigrator; } - public StorageManager getInstanceOfStorageManager() + public EmbeddedStorageManager getInstanceOfStorageManager() { this.ensureEntitiesInRoot(); return this.storageManager; @@ -120,7 +125,7 @@ private synchronized void ensureEntitiesInRoot() this.root.getCurrentRootData().getEntityTypesCount(), this.root.getCurrentRootData().getEntityCount() ); - EclipseStoreMigrator.migrate(this.root, this.storageManager); + EclipseStoreMigrator.migrateStructure(this.root, this.storageManager); } } @@ -492,6 +497,11 @@ public Object getObject(final long objectId) return this.storageManager.getObject(objectId); } + public DataVersion getDataVersion() + { + return this.getRoot().getDataVersion(); + } + @Override public ReadWriteLock getReadWriteLock() { diff --git a/spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/Root.java b/spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/Root.java index 43d9991a..07626b18 100644 --- a/spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/Root.java +++ b/spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/Root.java @@ -22,8 +22,8 @@ /** - * This is the root object for all versions <2.0.0 and is used for upgrading to the new root. - * @deprecated should not be initialised any more. Version for <2.0.0 + * This is the root object for all versions {@literal <}2.0.0 and is used for upgrading to the new root. + * @deprecated should not be initialised any more. Version for {@literal <}2.0.0 */ @Deprecated(forRemoval = false, since = "2.0.0") public class Root 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 c462e0a5..a3fa5ae3 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,11 +15,15 @@ */ package software.xdev.spring.data.eclipse.store.repository.config; +import java.util.Optional; + 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; +import software.xdev.micromigration.migrater.MicroMigrater; + /** * Provides the Default implementation of an {@link EclipseStoreClientConfiguration}. The class can't be final because @@ -31,8 +35,9 @@ public class DefaultEclipseStoreClientConfiguration extends EclipseStoreClientCo protected DefaultEclipseStoreClientConfiguration( final EclipseStoreProperties defaultEclipseStoreProperties, final EmbeddedStorageFoundationFactory defaultEclipseStoreProvider, - final ClassLoaderProvider classLoaderProvider) + final ClassLoaderProvider classLoaderProvider, + final Optional possibleMigrater) { - super(defaultEclipseStoreProperties, defaultEclipseStoreProvider, classLoaderProvider); + super(defaultEclipseStoreProperties, defaultEclipseStoreProvider, classLoaderProvider, possibleMigrater); } } 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 b1ae4cb6..0c828684 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,8 @@ */ package software.xdev.spring.data.eclipse.store.repository.config; +import java.util.Optional; + 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; @@ -22,6 +24,8 @@ import org.springframework.context.annotation.Bean; import org.springframework.stereotype.Component; +import software.xdev.micromigration.migrater.MicroMigrater; + @Component public class DefaultEclipseStoreClientConfigurationFactory @@ -31,11 +35,13 @@ public class DefaultEclipseStoreClientConfigurationFactory public DefaultEclipseStoreClientConfiguration getEclipseStoreClientConfiguration( final EclipseStoreProperties defaultEclipseStoreProperties, final EmbeddedStorageFoundationFactory defaultEclipseStoreProvider, - final ClassLoaderProvider classLoaderProvider) + final ClassLoaderProvider classLoaderProvider, + final Optional possibleMigrater) { return new DefaultEclipseStoreClientConfiguration( defaultEclipseStoreProperties, defaultEclipseStoreProvider, - classLoaderProvider); + classLoaderProvider, + possibleMigrater); } } 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 c00eeb11..63f2ad6e 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,9 @@ */ package software.xdev.spring.data.eclipse.store.repository.config; +import java.util.Optional; + +import jakarta.annotation.PostConstruct; import jakarta.validation.Validation; import jakarta.validation.Validator; import jakarta.validation.ValidatorFactory; @@ -23,6 +26,7 @@ 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.eclipse.store.storage.embedded.types.EmbeddedStorageManager; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.ObjectProvider; @@ -36,6 +40,8 @@ import org.springframework.context.event.EventListener; import org.springframework.transaction.PlatformTransactionManager; +import software.xdev.micromigration.migrater.MicroMigrater; +import software.xdev.spring.data.eclipse.store.repository.EclipseStoreMigrator; import software.xdev.spring.data.eclipse.store.repository.EclipseStoreStorage; import software.xdev.spring.data.eclipse.store.transactions.EclipseStoreTransactionManager; @@ -76,6 +82,8 @@ public abstract class EclipseStoreClientConfiguration implements EclipseStoreSto @Value("${spring-data-eclipse-store.context-close-shutdown-storage.only-when-dev-tools:true}") protected boolean contextCloseShutdownStorageOnlyWhenDevTools; + protected Optional possibleMigrater; + /** * Upstream value from Spring Boot DevTools. * @@ -84,16 +92,19 @@ public abstract class EclipseStoreClientConfiguration implements EclipseStoreSto @Value("${spring.devtools.restart.enabled:true}") protected boolean springDevtoolsRestartEnabled; + @SuppressWarnings("OptionalUsedAsFieldOrParameterType") @Autowired protected EclipseStoreClientConfiguration( final EclipseStoreProperties defaultEclipseStoreProperties, final EmbeddedStorageFoundationFactory defaultEclipseStoreProvider, - final ClassLoaderProvider classLoaderProvider) + final ClassLoaderProvider classLoaderProvider, + final Optional possibleMigrater) { this.defaultEclipseStoreProperties = defaultEclipseStoreProperties; this.classLoaderProvider = classLoaderProvider; this.defaultEclipseStoreProperties.setAutoStart(false); this.defaultEclipseStoreProvider = defaultEclipseStoreProvider; + this.possibleMigrater = possibleMigrater; } public EclipseStoreProperties getEclipseStoreProperties() @@ -207,9 +218,34 @@ public void shutdownStorageOnContextClosed(final ContextClosedEvent event) @Bean public Validator getValidator() { - try(ValidatorFactory factory = Validation.buildDefaultValidatorFactory()) + try(final ValidatorFactory factory = Validation.buildDefaultValidatorFactory()) { return factory.getValidator(); } } + + @PostConstruct + public void migrateDataOnPostConstruct() + { + // "Why don't you migrate the data wherever you call EclipseStoreMigrator.migrateStructure?" - + // Because in order to be able to access repositories in DataMigrationScripts, we can't have + // the migration-method block the start of the storage. That would lead to a deadlock and we don't + // want that. + final EmbeddedStorageManager instanceOfStorageManager = + this.getStorageInstance().getInstanceOfStorageManager(); + EclipseStoreMigrator.migrateData( + this.getStorageInstance().getRoot().getDataVersion(), + this.getDataMigrator(), + instanceOfStorageManager + ); + } + + public MicroMigrater getDataMigrator() + { + if(this.possibleMigrater != null && this.possibleMigrater.isPresent()) + { + return this.possibleMigrater.get(); + } + return null; + } } diff --git a/spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/root/EntityData.java b/spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/root/EntityData.java index 1ed25d39..cc30bac3 100644 --- a/spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/root/EntityData.java +++ b/spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/root/EntityData.java @@ -24,8 +24,8 @@ /** - * This is a object for all versions <2.4.0 and is used for upgrading to the new root. - * @deprecated should not be initialised anymore. Version for <2.4.0 + * This is a object for all versions {@literal <}2.4.0 and is used for upgrading to the new root. + * @deprecated should not be initialised anymore. Version for {@literal <}2.4.0 * * @param type of entity to store * @param type of id of the entity to store. Can be {@link Void} if no ID is used. diff --git a/spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/root/RootDataV2.java b/spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/root/RootDataV2.java index 56e9e4e1..fe5d4c4f 100644 --- a/spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/root/RootDataV2.java +++ b/spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/root/RootDataV2.java @@ -21,8 +21,8 @@ /** - * This is a object for all versions <2.4.0 and is used for upgrading to the new root. - * @deprecated should not be initialised anymore. Version for <2.4.0 + * This is a object for all versions {@literal <}2.4.0 and is used for upgrading to the new root. + * @deprecated should not be initialised anymore. Version for {@literal <}2.4.0 */ @Deprecated(forRemoval = false, since = "2.4.0") @SuppressWarnings({"java:S119", "unchecked"}) diff --git a/spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/root/VersionedRoot.java b/spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/root/VersionedRoot.java index 5df1f28c..8679d7c3 100644 --- a/spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/root/VersionedRoot.java +++ b/spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/root/VersionedRoot.java @@ -19,6 +19,7 @@ import software.xdev.micromigration.version.Versioned; import software.xdev.spring.data.eclipse.store.repository.EclipseStoreMigrator; import software.xdev.spring.data.eclipse.store.repository.Root; +import software.xdev.spring.data.eclipse.store.repository.root.data.version.DataVersion; import software.xdev.spring.data.eclipse.store.repository.root.v2_4.RootDataV2_4; @@ -27,6 +28,8 @@ public class VersionedRoot implements Versioned { private MigrationVersion version; + private DataVersion dataVersion; + private Root rootDataV1; private RootDataV2 rootDataV2; @@ -40,7 +43,7 @@ public VersionedRoot() } /** - * @param rootDataV1 is only filled if this is a old version <2.0.0 and needs upgrading + * @param rootDataV1 is only filled if this is a old version {@literal <}2.0.0 and needs upgrading */ public VersionedRoot(final Root rootDataV1) { @@ -104,4 +107,9 @@ public MigrationVersion getVersion() { return this.version; } + + public DataVersion getDataVersion() + { + return this.dataVersion; + } } diff --git a/spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/root/data/version/DataMigrater.java b/spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/root/data/version/DataMigrater.java new file mode 100644 index 00000000..14d7c376 --- /dev/null +++ b/spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/root/data/version/DataMigrater.java @@ -0,0 +1,19 @@ +package software.xdev.spring.data.eclipse.store.repository.root.data.version; + +import java.util.List; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import software.xdev.micromigration.migrater.ExplicitMigrater; +import software.xdev.micromigration.migrater.VersionAlreadyRegisteredException; + + +@Component +public class DataMigrater extends ExplicitMigrater +{ + public DataMigrater(@Autowired final List scripts) throws VersionAlreadyRegisteredException + { + super(scripts.toArray(DataMigrationScript[]::new)); + } +} diff --git a/spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/root/data/version/DataMigrationScript.java b/spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/root/data/version/DataMigrationScript.java new file mode 100644 index 00000000..6ea412f7 --- /dev/null +++ b/spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/root/data/version/DataMigrationScript.java @@ -0,0 +1,14 @@ +package software.xdev.spring.data.eclipse.store.repository.root.data.version; + +import org.springframework.stereotype.Component; + +import software.xdev.micromigration.eclipsestore.MigrationEmbeddedStorageManager; +import software.xdev.micromigration.scripts.ReflectiveVersionMigrationScript; +import software.xdev.spring.data.eclipse.store.repository.root.VersionedRoot; + + +@Component +public abstract class DataMigrationScript + extends ReflectiveVersionMigrationScript +{ +} diff --git a/spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/root/data/version/DataVersion.java b/spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/root/data/version/DataVersion.java new file mode 100644 index 00000000..db03b15a --- /dev/null +++ b/spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/root/data/version/DataVersion.java @@ -0,0 +1,42 @@ +package software.xdev.spring.data.eclipse.store.repository.root.data.version; + +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; + +import software.xdev.micromigration.notification.ScriptExecutionNotificationWithoutScriptReference; +import software.xdev.micromigration.version.MigrationVersion; +import software.xdev.micromigration.version.Versioned; +import software.xdev.micromigration.version.VersionedAndKeeperOfHistory; + + +public class DataVersion implements Versioned, VersionedAndKeeperOfHistory +{ + private MigrationVersion currentVersion; + private final List migrationHistory = new ArrayList<>(); + + @Override + public void addExecutedScript(final ScriptExecutionNotificationWithoutScriptReference executedScriptInformation) + { + this.migrationHistory.add(Objects.requireNonNull(executedScriptInformation)); + } + + @Override + public List getMigrationHistory() + { + return this.migrationHistory; + } + + @Override + public void setVersion(final MigrationVersion version) + { + Objects.requireNonNull(version); + this.currentVersion = version; + } + + @Override + public MigrationVersion getVersion() + { + return this.currentVersion; + } +} 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 04420126..6d499de5 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 @@ -19,6 +19,7 @@ import java.io.IOException; import java.nio.file.Path; +import java.util.Optional; import org.eclipse.serializer.reflect.ClassLoaderProvider; import org.eclipse.store.integrations.spring.boot.types.configuration.EclipseStoreProperties; @@ -32,6 +33,7 @@ import org.springframework.context.event.EventListener; import org.springframework.util.FileSystemUtils; +import software.xdev.micromigration.migrater.MicroMigrater; import software.xdev.spring.data.eclipse.store.helper.StorageDirectoryNameProvider; import software.xdev.spring.data.eclipse.store.repository.config.EclipseStoreClientConfiguration; @@ -41,13 +43,22 @@ public class TestConfiguration extends EclipseStoreClientConfiguration { private final String storageDirectory = StorageDirectoryNameProvider.getNewStorageDirectoryPath(); - @Autowired protected TestConfiguration( final EclipseStoreProperties defaultEclipseStoreProperties, final EmbeddedStorageFoundationFactory defaultEclipseStoreProvider, final ClassLoaderProvider classLoaderProvider) { - super(defaultEclipseStoreProperties, defaultEclipseStoreProvider, classLoaderProvider); + this(defaultEclipseStoreProperties, defaultEclipseStoreProvider, classLoaderProvider, Optional.empty()); + } + + @Autowired + protected TestConfiguration( + final EclipseStoreProperties defaultEclipseStoreProperties, + final EmbeddedStorageFoundationFactory defaultEclipseStoreProvider, + final ClassLoaderProvider classLoaderProvider, + final Optional possibleMigrater) + { + super(defaultEclipseStoreProperties, defaultEclipseStoreProvider, classLoaderProvider, possibleMigrater); } @Override diff --git a/spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/data/migration/own/migrator/DataMigrationOwnMigratorTest.java b/spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/data/migration/own/migrator/DataMigrationOwnMigratorTest.java new file mode 100644 index 00000000..110bf5a9 --- /dev/null +++ b/spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/data/migration/own/migrator/DataMigrationOwnMigratorTest.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.data.migration.own.migrator; + +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; + + +@IsolatedTestAnnotations +@ContextConfiguration(classes = {DataMigrationOwnMigratorTestConfiguration.class}) +class DataMigrationOwnMigratorTest +{ + @Autowired + private DataMigrationOwnMigratorTestConfiguration configuration; + @Autowired + private PersistedEntityRepository repository; + + @Test + void assertUpdateV1Executed() + { + Assertions.assertEquals(1, this.repository.count()); + } +} diff --git a/spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/data/migration/own/migrator/DataMigrationOwnMigratorTestConfiguration.java b/spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/data/migration/own/migrator/DataMigrationOwnMigratorTestConfiguration.java new file mode 100644 index 00000000..982e52de --- /dev/null +++ b/spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/data/migration/own/migrator/DataMigrationOwnMigratorTestConfiguration.java @@ -0,0 +1,46 @@ +/* + * 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.data.migration.own.migrator; + +import java.util.Optional; + +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.ComponentScan; +import org.springframework.context.annotation.Configuration; + +import software.xdev.micromigration.migrater.MicroMigrater; +import software.xdev.spring.data.eclipse.store.integration.TestConfiguration; +import software.xdev.spring.data.eclipse.store.repository.config.EnableEclipseStoreRepositories; + + +@ComponentScan({"software.xdev.spring.data.eclipse.store.integration.isolated.tests.data.migration.own.migrator"}) +@Configuration +@EnableEclipseStoreRepositories +public class DataMigrationOwnMigratorTestConfiguration extends TestConfiguration +{ + @Autowired + protected DataMigrationOwnMigratorTestConfiguration( + final EclipseStoreProperties defaultEclipseStoreProperties, + final EmbeddedStorageFoundationFactory defaultEclipseStoreProvider, + final ClassLoaderProvider classLoaderProvider, + final Optional possibleMigrater) + { + super(defaultEclipseStoreProperties, defaultEclipseStoreProvider, classLoaderProvider, possibleMigrater); + } +} diff --git a/spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/data/migration/own/migrator/PersistedEntity.java b/spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/data/migration/own/migrator/PersistedEntity.java new file mode 100644 index 00000000..35af58d6 --- /dev/null +++ b/spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/data/migration/own/migrator/PersistedEntity.java @@ -0,0 +1,13 @@ +package software.xdev.spring.data.eclipse.store.integration.isolated.tests.data.migration.own.migrator; + +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; + + +public class PersistedEntity +{ + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + private int id; +} diff --git a/spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/data/migration/own/migrator/PersistedEntityRepository.java b/spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/data/migration/own/migrator/PersistedEntityRepository.java new file mode 100644 index 00000000..09669a9a --- /dev/null +++ b/spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/data/migration/own/migrator/PersistedEntityRepository.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.data.migration.own.migrator; + +import org.springframework.data.repository.CrudRepository; + + +public interface PersistedEntityRepository extends CrudRepository +{ +} diff --git a/spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/data/migration/own/migrator/v1_0_0_Init.java b/spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/data/migration/own/migrator/v1_0_0_Init.java new file mode 100644 index 00000000..4c0eec43 --- /dev/null +++ b/spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/data/migration/own/migrator/v1_0_0_Init.java @@ -0,0 +1,28 @@ +package software.xdev.spring.data.eclipse.store.integration.isolated.tests.data.migration.own.migrator; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import software.xdev.micromigration.eclipsestore.MigrationEmbeddedStorageManager; +import software.xdev.micromigration.scripts.Context; +import software.xdev.spring.data.eclipse.store.repository.root.VersionedRoot; +import software.xdev.spring.data.eclipse.store.repository.root.data.version.DataMigrationScript; + + +@SuppressWarnings("CheckStyle") +@Component +public class v1_0_0_Init extends DataMigrationScript +{ + private final PersistedEntityRepository repository; + + public v1_0_0_Init(@Autowired final PersistedEntityRepository repository) + { + this.repository = repository; + } + + @Override + public void migrate(final Context context) + { + this.repository.save(new PersistedEntity()); + } +} From 2de5958ed667f53ed86cb16ed2020a84f480cad2 Mon Sep 17 00:00:00 2001 From: XDEV Renovate Bot Date: Sat, 28 Dec 2024 02:30:06 +0000 Subject: [PATCH 09/20] Update net.sourceforge.pmd to v7.9.0 --- pom.xml | 4 ++-- spring-data-eclipse-store/pom.xml | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/pom.xml b/pom.xml index 908481b2..352603eb 100644 --- a/pom.xml +++ b/pom.xml @@ -150,12 +150,12 @@ net.sourceforge.pmd pmd-core - 7.8.0 + 7.9.0 net.sourceforge.pmd pmd-java - 7.8.0 + 7.9.0 diff --git a/spring-data-eclipse-store/pom.xml b/spring-data-eclipse-store/pom.xml index 4bd7d1ca..523e8c5f 100644 --- a/spring-data-eclipse-store/pom.xml +++ b/spring-data-eclipse-store/pom.xml @@ -484,12 +484,12 @@ net.sourceforge.pmd pmd-core - 7.8.0 + 7.9.0 net.sourceforge.pmd pmd-java - 7.8.0 + 7.9.0 From e07743083eea90f85403636a09fc9409eac350e8 Mon Sep 17 00:00:00 2001 From: XDEV Renovate Bot Date: Sun, 29 Dec 2024 02:38:49 +0000 Subject: [PATCH 10/20] Update dependency com.puppycrawl.tools:checkstyle to v10.21.1 --- pom.xml | 2 +- spring-data-eclipse-store/pom.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 908481b2..ce4cd741 100644 --- a/pom.xml +++ b/pom.xml @@ -107,7 +107,7 @@ com.puppycrawl.tools checkstyle - 10.21.0 + 10.21.1 diff --git a/spring-data-eclipse-store/pom.xml b/spring-data-eclipse-store/pom.xml index 4bd7d1ca..f294ceb6 100644 --- a/spring-data-eclipse-store/pom.xml +++ b/spring-data-eclipse-store/pom.xml @@ -442,7 +442,7 @@ com.puppycrawl.tools checkstyle - 10.21.0 + 10.21.1 From 7f00a348433ec9425484a01e08646ec9f12cc3af Mon Sep 17 00:00:00 2001 From: JohannesRabauer Date: Tue, 7 Jan 2025 11:37:13 +0100 Subject: [PATCH 11/20] DataMigration basically working --- spring-data-eclipse-store/pom.xml | 2 +- .../store/repository/EclipseStoreStorage.java | 1 + .../EclipseStoreClientConfiguration.java | 50 ++++++++----- .../{ => root}/EclipseStoreMigrator.java | 24 +++++- .../store/repository/root/VersionedRoot.java | 5 +- .../root/data/version/DataMigrater.java | 74 ++++++++++++++++++- .../data/version/DataMigrationScript.java | 15 ++++ .../root/data/version/DataVersion.java | 15 ++++ .../update/scripts/LoggingUpdateScript.java | 3 +- .../scripts/v2_0_0_InitializeVersioning.java | 3 +- .../update/scripts/v2_4_0_InitializeLazy.java | 3 +- .../DataMigrationOwnMigratorTest.java | 19 +++++ .../own/migrator/PersistedEntity.java | 15 ++++ .../migration/own/migrator/v1_0_0_Init.java | 15 ++++ 14 files changed, 211 insertions(+), 33 deletions(-) rename spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/{ => root}/EclipseStoreMigrator.java (76%) diff --git a/spring-data-eclipse-store/pom.xml b/spring-data-eclipse-store/pom.xml index 4bd7d1ca..f32b2e31 100644 --- a/spring-data-eclipse-store/pom.xml +++ b/spring-data-eclipse-store/pom.xml @@ -156,7 +156,7 @@ software.xdev micro-migration - 2.0.0 + 3.0.0 storage-embedded 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 e8850781..53b5cff6 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 @@ -41,6 +41,7 @@ import software.xdev.spring.data.eclipse.store.repository.config.EclipseStoreClientConfiguration; import software.xdev.spring.data.eclipse.store.repository.config.EclipseStoreStorageFoundationProvider; import software.xdev.spring.data.eclipse.store.repository.interfaces.EclipseStoreRepository; +import software.xdev.spring.data.eclipse.store.repository.root.EclipseStoreMigrator; import software.xdev.spring.data.eclipse.store.repository.root.VersionedRoot; import software.xdev.spring.data.eclipse.store.repository.root.data.version.DataVersion; import software.xdev.spring.data.eclipse.store.repository.root.v2_4.EntityData; 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 63f2ad6e..a87f1e40 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 @@ -17,7 +17,6 @@ import java.util.Optional; -import jakarta.annotation.PostConstruct; import jakarta.validation.Validation; import jakarta.validation.Validator; import jakarta.validation.ValidatorFactory; @@ -26,7 +25,6 @@ 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.eclipse.store.storage.embedded.types.EmbeddedStorageManager; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.ObjectProvider; @@ -37,12 +35,13 @@ import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; import org.springframework.context.event.ContextClosedEvent; +import org.springframework.context.event.ContextRefreshedEvent; import org.springframework.context.event.EventListener; import org.springframework.transaction.PlatformTransactionManager; import software.xdev.micromigration.migrater.MicroMigrater; -import software.xdev.spring.data.eclipse.store.repository.EclipseStoreMigrator; import software.xdev.spring.data.eclipse.store.repository.EclipseStoreStorage; +import software.xdev.spring.data.eclipse.store.repository.root.EclipseStoreMigrator; import software.xdev.spring.data.eclipse.store.transactions.EclipseStoreTransactionManager; @@ -82,7 +81,7 @@ public abstract class EclipseStoreClientConfiguration implements EclipseStoreSto @Value("${spring-data-eclipse-store.context-close-shutdown-storage.only-when-dev-tools:true}") protected boolean contextCloseShutdownStorageOnlyWhenDevTools; - protected Optional possibleMigrater; + protected MicroMigrater possibleMigrater; /** * Upstream value from Spring Boot DevTools. @@ -104,7 +103,20 @@ protected EclipseStoreClientConfiguration( this.classLoaderProvider = classLoaderProvider; this.defaultEclipseStoreProperties.setAutoStart(false); this.defaultEclipseStoreProvider = defaultEclipseStoreProvider; - this.possibleMigrater = possibleMigrater; + this.possibleMigrater = possibleMigrater.orElse(null); + } + + protected EclipseStoreClientConfiguration( + final EclipseStoreProperties defaultEclipseStoreProperties, + final EmbeddedStorageFoundationFactory defaultEclipseStoreProvider, + final ClassLoaderProvider classLoaderProvider) + { + this( + defaultEclipseStoreProperties, + defaultEclipseStoreProvider, + classLoaderProvider, + Optional.empty() + ); } public EclipseStoreProperties getEclipseStoreProperties() @@ -224,28 +236,26 @@ public Validator getValidator() } } - @PostConstruct - public void migrateDataOnPostConstruct() + @EventListener + public void migrateDataOnContextStarted(final ContextRefreshedEvent event) { // "Why don't you migrate the data wherever you call EclipseStoreMigrator.migrateStructure?" - // Because in order to be able to access repositories in DataMigrationScripts, we can't have - // the migration-method block the start of the storage. That would lead to a deadlock and we don't + // the migration-method block the start of the storage. That would lead to a deadlock, and we don't // want that. - final EmbeddedStorageManager instanceOfStorageManager = - this.getStorageInstance().getInstanceOfStorageManager(); - EclipseStoreMigrator.migrateData( - this.getStorageInstance().getRoot().getDataVersion(), - this.getDataMigrator(), - instanceOfStorageManager - ); + if(this.getDataMigrator() != null) + { + this.getStorageInstance().start(); // In case the storage hasn't started yet. + EclipseStoreMigrator.migrateData( + this.getStorageInstance().getRoot(), + this.getDataMigrator(), + this.getStorageInstance().getInstanceOfStorageManager() + ); + } } public MicroMigrater getDataMigrator() { - if(this.possibleMigrater != null && this.possibleMigrater.isPresent()) - { - return this.possibleMigrater.get(); - } - return null; + return this.possibleMigrater; } } diff --git a/spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/EclipseStoreMigrator.java b/spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/root/EclipseStoreMigrator.java similarity index 76% rename from spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/EclipseStoreMigrator.java rename to spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/root/EclipseStoreMigrator.java index 06e9705b..a8943a46 100644 --- a/spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/EclipseStoreMigrator.java +++ b/spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/root/EclipseStoreMigrator.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package software.xdev.spring.data.eclipse.store.repository; +package software.xdev.spring.data.eclipse.store.repository.root; import java.util.TreeSet; @@ -24,7 +24,6 @@ import software.xdev.micromigration.migrater.MicroMigrater; import software.xdev.micromigration.scripts.VersionAgnosticMigrationScript; import software.xdev.micromigration.version.MigrationVersion; -import software.xdev.spring.data.eclipse.store.repository.root.VersionedRoot; import software.xdev.spring.data.eclipse.store.repository.root.data.version.DataVersion; import software.xdev.spring.data.eclipse.store.repository.root.update.scripts.v2_0_0_InitializeVersioning; import software.xdev.spring.data.eclipse.store.repository.root.update.scripts.v2_4_0_InitializeLazy; @@ -49,16 +48,33 @@ public static void migrateStructure(final VersionedRoot versionedRoot, final Emb } public static void migrateData( - final DataVersion versionedData, + final VersionedRoot versionedRoot, final MicroMigrater migrater, final EmbeddedStorageManager storageManager) { if(migrater != null) { - new MigrationManager(versionedData, migrater, storageManager).migrate(versionedData); + final DataVersion dataVersion = versionedRoot.getDataVersion(); + new MigrationManager( + dataVersion::getVersion, + dataVersion::setVersion, + newVersion -> EclipseStoreMigrator.versionStorer(versionedRoot, storageManager, newVersion), + migrater, + storageManager) + .migrate(dataVersion); } } + private static void versionStorer( + final VersionedRoot versionedRoot, + final EmbeddedStorageManager currentStorageManager, + final MigrationVersion newVersion) + { + currentStorageManager.store(versionedRoot); + currentStorageManager.store(versionedRoot.getDataVersion()); + currentStorageManager.store(newVersion); + } + public static MigrationVersion getLatestVersion() { final ExplicitMigrater migrater = new ExplicitMigrater(SCRIPTS); diff --git a/spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/root/VersionedRoot.java b/spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/root/VersionedRoot.java index 8679d7c3..f1e59e28 100644 --- a/spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/root/VersionedRoot.java +++ b/spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/root/VersionedRoot.java @@ -17,7 +17,6 @@ import software.xdev.micromigration.version.MigrationVersion; import software.xdev.micromigration.version.Versioned; -import software.xdev.spring.data.eclipse.store.repository.EclipseStoreMigrator; import software.xdev.spring.data.eclipse.store.repository.Root; import software.xdev.spring.data.eclipse.store.repository.root.data.version.DataVersion; import software.xdev.spring.data.eclipse.store.repository.root.v2_4.RootDataV2_4; @@ -110,6 +109,10 @@ public MigrationVersion getVersion() public DataVersion getDataVersion() { + if(this.dataVersion == null) + { + this.dataVersion = new DataVersion(); + } return this.dataVersion; } } diff --git a/spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/root/data/version/DataMigrater.java b/spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/root/data/version/DataMigrater.java index 14d7c376..48c627b5 100644 --- a/spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/root/data/version/DataMigrater.java +++ b/spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/root/data/version/DataMigrater.java @@ -1,19 +1,85 @@ +/* + * 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.repository.root.data.version; import java.util.List; +import java.util.TreeSet; +import java.util.function.Consumer; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Component; import software.xdev.micromigration.migrater.ExplicitMigrater; -import software.xdev.micromigration.migrater.VersionAlreadyRegisteredException; +import software.xdev.micromigration.migrater.MicroMigrater; +import software.xdev.micromigration.notification.ScriptExecutionNotificationWithScriptReference; +import software.xdev.micromigration.scripts.VersionAgnosticMigrationScript; +import software.xdev.micromigration.version.MigrationVersion; +import software.xdev.micromigration.versionagnostic.VersionAgnosticMigrationEmbeddedStorageManager; @Component -public class DataMigrater extends ExplicitMigrater +public class DataMigrater implements MicroMigrater { - public DataMigrater(@Autowired final List scripts) throws VersionAlreadyRegisteredException + @Lazy + @Autowired + private List scripts; + + private ExplicitMigrater explicitMigrater; + + private ExplicitMigrater ensureExplicitMigrater() { - super(scripts.toArray(DataMigrationScript[]::new)); + if(this.explicitMigrater == null) + { + this.explicitMigrater = new ExplicitMigrater(this.scripts.toArray(DataMigrationScript[]::new)); + } + return this.explicitMigrater; + } + + @Override + public TreeSet> getSortedScripts() + { + return this.ensureExplicitMigrater().getSortedScripts(); + } + + @Override + public > MigrationVersion migrateToNewest( + final MigrationVersion fromVersion, + final E storageManager, + final Object root) + { + return this.ensureExplicitMigrater().migrateToNewest(fromVersion, storageManager, root); + } + + @Override + public > MigrationVersion migrateToVersion( + final MigrationVersion fromVersion, + final MigrationVersion targetVersion, + final E storageManager, + final Object objectToMigrate) + { + return this.ensureExplicitMigrater() + .migrateToVersion(fromVersion, targetVersion, storageManager, objectToMigrate); + } + + @Override + public void registerNotificationConsumer( + final Consumer notificationConsumer + ) + { + this.ensureExplicitMigrater().registerNotificationConsumer(notificationConsumer); } } diff --git a/spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/root/data/version/DataMigrationScript.java b/spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/root/data/version/DataMigrationScript.java index 6ea412f7..a7f35208 100644 --- a/spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/root/data/version/DataMigrationScript.java +++ b/spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/root/data/version/DataMigrationScript.java @@ -1,3 +1,18 @@ +/* + * 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.repository.root.data.version; import org.springframework.stereotype.Component; diff --git a/spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/root/data/version/DataVersion.java b/spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/root/data/version/DataVersion.java index db03b15a..69fa9eff 100644 --- a/spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/root/data/version/DataVersion.java +++ b/spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/root/data/version/DataVersion.java @@ -1,3 +1,18 @@ +/* + * 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.repository.root.data.version; import java.util.ArrayList; diff --git a/spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/root/update/scripts/LoggingUpdateScript.java b/spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/root/update/scripts/LoggingUpdateScript.java index 71b03434..0603618d 100644 --- a/spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/root/update/scripts/LoggingUpdateScript.java +++ b/spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/root/update/scripts/LoggingUpdateScript.java @@ -21,12 +21,13 @@ import software.xdev.micromigration.eclipsestore.MigrationEmbeddedStorageManager; import software.xdev.micromigration.scripts.Context; import software.xdev.micromigration.scripts.ReflectiveVersionMigrationScript; +import software.xdev.spring.data.eclipse.store.repository.root.EclipseStoreMigrator; import software.xdev.spring.data.eclipse.store.repository.root.VersionedRoot; /** * All migration scripts must be added to - * {@link software.xdev.spring.data.eclipse.store.repository.EclipseStoreMigrator#SCRIPTS}! + * {@link EclipseStoreMigrator#SCRIPTS}! */ public abstract class LoggingUpdateScript extends ReflectiveVersionMigrationScript diff --git a/spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/root/update/scripts/v2_0_0_InitializeVersioning.java b/spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/root/update/scripts/v2_0_0_InitializeVersioning.java index 73eba636..99dd0e84 100644 --- a/spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/root/update/scripts/v2_0_0_InitializeVersioning.java +++ b/spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/root/update/scripts/v2_0_0_InitializeVersioning.java @@ -20,6 +20,7 @@ import software.xdev.micromigration.eclipsestore.MigrationEmbeddedStorageManager; import software.xdev.micromigration.scripts.Context; +import software.xdev.spring.data.eclipse.store.repository.root.EclipseStoreMigrator; import software.xdev.spring.data.eclipse.store.repository.root.RootDataV2; import software.xdev.spring.data.eclipse.store.repository.root.VersionedRoot; import software.xdev.spring.data.eclipse.store.repository.root.v2_4.EntityData; @@ -30,7 +31,7 @@ * version of Root({@link RootDataV2}). *

* All migration scripts must be added to - * {@link software.xdev.spring.data.eclipse.store.repository.EclipseStoreMigrator#SCRIPTS}! + * {@link EclipseStoreMigrator#SCRIPTS}! */ @SuppressWarnings({"checkstyle:TypeName", "deprecation"}) public class v2_0_0_InitializeVersioning extends LoggingUpdateScript diff --git a/spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/root/update/scripts/v2_4_0_InitializeLazy.java b/spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/root/update/scripts/v2_4_0_InitializeLazy.java index c34032e2..c57abcad 100644 --- a/spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/root/update/scripts/v2_4_0_InitializeLazy.java +++ b/spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/root/update/scripts/v2_4_0_InitializeLazy.java @@ -20,6 +20,7 @@ import software.xdev.micromigration.eclipsestore.MigrationEmbeddedStorageManager; import software.xdev.micromigration.scripts.Context; +import software.xdev.spring.data.eclipse.store.repository.root.EclipseStoreMigrator; import software.xdev.spring.data.eclipse.store.repository.root.RootDataV2; import software.xdev.spring.data.eclipse.store.repository.root.VersionedRoot; @@ -29,7 +30,7 @@ * version of Root({@link RootDataV2}). *

* All migration scripts must be added to - * {@link software.xdev.spring.data.eclipse.store.repository.EclipseStoreMigrator#SCRIPTS}! + * {@link EclipseStoreMigrator#SCRIPTS}! */ @SuppressWarnings({"checkstyle:TypeName", "deprecation"}) public class v2_4_0_InitializeLazy extends LoggingUpdateScript diff --git a/spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/data/migration/own/migrator/DataMigrationOwnMigratorTest.java b/spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/data/migration/own/migrator/DataMigrationOwnMigratorTest.java index 110bf5a9..89626fd0 100644 --- a/spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/data/migration/own/migrator/DataMigrationOwnMigratorTest.java +++ b/spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/data/migration/own/migrator/DataMigrationOwnMigratorTest.java @@ -20,6 +20,8 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.test.context.ContextConfiguration; +import software.xdev.micromigration.version.MigrationVersion; +import software.xdev.spring.data.eclipse.store.helper.TestUtil; import software.xdev.spring.data.eclipse.store.integration.isolated.IsolatedTestAnnotations; @@ -36,5 +38,22 @@ class DataMigrationOwnMigratorTest void assertUpdateV1Executed() { Assertions.assertEquals(1, this.repository.count()); + Assertions.assertEquals( + new MigrationVersion(1, 0, 0), + this.configuration.getStorageInstance().getRoot().getDataVersion().getVersion()); + } + + @Test + void assertNotUpdatedAfterMigration() + { + TestUtil.doBeforeAndAfterRestartOfDatastore( + this.configuration, + () -> { + Assertions.assertEquals(1, this.repository.count()); + Assertions.assertEquals( + new MigrationVersion(1, 0, 0), + this.configuration.getStorageInstance().getRoot().getDataVersion().getVersion()); + } + ); } } diff --git a/spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/data/migration/own/migrator/PersistedEntity.java b/spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/data/migration/own/migrator/PersistedEntity.java index 35af58d6..a2286e77 100644 --- a/spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/data/migration/own/migrator/PersistedEntity.java +++ b/spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/data/migration/own/migrator/PersistedEntity.java @@ -1,3 +1,18 @@ +/* + * 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.data.migration.own.migrator; import jakarta.persistence.GeneratedValue; diff --git a/spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/data/migration/own/migrator/v1_0_0_Init.java b/spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/data/migration/own/migrator/v1_0_0_Init.java index 4c0eec43..a92000a5 100644 --- a/spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/data/migration/own/migrator/v1_0_0_Init.java +++ b/spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/data/migration/own/migrator/v1_0_0_Init.java @@ -1,3 +1,18 @@ +/* + * 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.data.migration.own.migrator; import org.springframework.beans.factory.annotation.Autowired; From 8247d36b9a1169810b7688d807606a0fbca5a7bb Mon Sep 17 00:00:00 2001 From: JohannesRabauer Date: Tue, 7 Jan 2025 13:57:46 +0100 Subject: [PATCH 12/20] Update Micro-Migration Lib --- spring-data-eclipse-store/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spring-data-eclipse-store/pom.xml b/spring-data-eclipse-store/pom.xml index f32b2e31..95663e5d 100644 --- a/spring-data-eclipse-store/pom.xml +++ b/spring-data-eclipse-store/pom.xml @@ -156,7 +156,7 @@ software.xdev micro-migration - 3.0.0 + 3.0.1 storage-embedded From 706b340d4faf5dd4324d425350da1a1769f4688e Mon Sep 17 00:00:00 2001 From: JohannesRabauer Date: Tue, 7 Jan 2025 14:49:58 +0100 Subject: [PATCH 13/20] Data Migration working --- .../store/repository/EclipseStoreStorage.java | 4 -- ...efaultEclipseStoreClientConfiguration.java | 5 +- ...clipseStoreClientConfigurationFactory.java | 10 +--- .../EclipseStoreClientConfiguration.java | 49 +++++++------------ .../root/data/version/DataMigrater.java | 40 +++++++++++---- .../store/integration/TestConfiguration.java | 17 ++----- ...MigrationOwnMigratorTestConfiguration.java | 8 +-- 7 files changed, 58 insertions(+), 75 deletions(-) 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 53b5cff6..105fb7a0 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 @@ -20,7 +20,6 @@ import java.util.HashMap; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; -import java.util.function.Supplier; import org.eclipse.serializer.persistence.binary.jdk17.java.util.BinaryHandlerImmutableCollectionsList12; import org.eclipse.serializer.persistence.binary.jdk17.java.util.BinaryHandlerImmutableCollectionsSet12; @@ -33,7 +32,6 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import software.xdev.micromigration.migrater.MicroMigrater; import software.xdev.spring.data.eclipse.store.core.EntityListProvider; import software.xdev.spring.data.eclipse.store.core.EntityProvider; import software.xdev.spring.data.eclipse.store.exceptions.AlreadyRegisteredException; @@ -81,7 +79,6 @@ public class EclipseStoreStorage private final Map, VersionManager> versionManagers = new ConcurrentHashMap<>(); private final EclipseStoreStorageFoundationProvider foundationProvider; private final ClassLoaderProvider classLoaderProvider; - private final Supplier dataMigraterProvider; private EntitySetCollector entitySetCollector; private PersistableChecker persistenceChecker; private EmbeddedStorageManager storageManager; @@ -95,7 +92,6 @@ public EclipseStoreStorage(final EclipseStoreClientConfiguration storeConfigurat { this.foundationProvider = storeConfiguration; this.classLoaderProvider = storeConfiguration.getClassLoaderProvider(); - this.dataMigraterProvider = storeConfiguration::getDataMigrator; } public EmbeddedStorageManager getInstanceOfStorageManager() 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 a3fa5ae3..38f88c2f 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 @@ -35,9 +35,8 @@ public class DefaultEclipseStoreClientConfiguration extends EclipseStoreClientCo protected DefaultEclipseStoreClientConfiguration( final EclipseStoreProperties defaultEclipseStoreProperties, final EmbeddedStorageFoundationFactory defaultEclipseStoreProvider, - final ClassLoaderProvider classLoaderProvider, - final Optional possibleMigrater) + final ClassLoaderProvider classLoaderProvider) { - super(defaultEclipseStoreProperties, defaultEclipseStoreProvider, classLoaderProvider, possibleMigrater); + 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 0c828684..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,8 +15,6 @@ */ package software.xdev.spring.data.eclipse.store.repository.config; -import java.util.Optional; - 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; @@ -24,8 +22,6 @@ import org.springframework.context.annotation.Bean; import org.springframework.stereotype.Component; -import software.xdev.micromigration.migrater.MicroMigrater; - @Component public class DefaultEclipseStoreClientConfigurationFactory @@ -35,13 +31,11 @@ public class DefaultEclipseStoreClientConfigurationFactory public DefaultEclipseStoreClientConfiguration getEclipseStoreClientConfiguration( final EclipseStoreProperties defaultEclipseStoreProperties, final EmbeddedStorageFoundationFactory defaultEclipseStoreProvider, - final ClassLoaderProvider classLoaderProvider, - final Optional possibleMigrater) + final ClassLoaderProvider classLoaderProvider) { return new DefaultEclipseStoreClientConfiguration( defaultEclipseStoreProperties, defaultEclipseStoreProvider, - classLoaderProvider, - possibleMigrater); + 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 a87f1e40..929e61ef 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,8 +15,6 @@ */ package software.xdev.spring.data.eclipse.store.repository.config; -import java.util.Optional; - import jakarta.validation.Validation; import jakarta.validation.Validator; import jakarta.validation.ValidatorFactory; @@ -27,13 +25,16 @@ import org.eclipse.store.storage.embedded.types.EmbeddedStorageFoundation; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.NoSuchBeanDefinitionException; 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.ApplicationContext; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Lazy; import org.springframework.context.event.ContextClosedEvent; import org.springframework.context.event.ContextRefreshedEvent; import org.springframework.context.event.EventListener; @@ -81,8 +82,6 @@ public abstract class EclipseStoreClientConfiguration implements EclipseStoreSto @Value("${spring-data-eclipse-store.context-close-shutdown-storage.only-when-dev-tools:true}") protected boolean contextCloseShutdownStorageOnlyWhenDevTools; - protected MicroMigrater possibleMigrater; - /** * Upstream value from Spring Boot DevTools. * @@ -92,31 +91,17 @@ public abstract class EclipseStoreClientConfiguration implements EclipseStoreSto protected boolean springDevtoolsRestartEnabled; @SuppressWarnings("OptionalUsedAsFieldOrParameterType") + @Lazy @Autowired protected EclipseStoreClientConfiguration( final EclipseStoreProperties defaultEclipseStoreProperties, final EmbeddedStorageFoundationFactory defaultEclipseStoreProvider, - final ClassLoaderProvider classLoaderProvider, - final Optional possibleMigrater) + final ClassLoaderProvider classLoaderProvider) { this.defaultEclipseStoreProperties = defaultEclipseStoreProperties; this.classLoaderProvider = classLoaderProvider; this.defaultEclipseStoreProperties.setAutoStart(false); this.defaultEclipseStoreProvider = defaultEclipseStoreProvider; - this.possibleMigrater = possibleMigrater.orElse(null); - } - - protected EclipseStoreClientConfiguration( - final EclipseStoreProperties defaultEclipseStoreProperties, - final EmbeddedStorageFoundationFactory defaultEclipseStoreProvider, - final ClassLoaderProvider classLoaderProvider) - { - this( - defaultEclipseStoreProperties, - defaultEclipseStoreProvider, - classLoaderProvider, - Optional.empty() - ); } public EclipseStoreProperties getEclipseStoreProperties() @@ -236,26 +221,28 @@ public Validator getValidator() } } + /** + * "Why don't you migrate the data wherever you call EclipseStoreMigrator.migrateStructure?" - Because in + * order to be able to access repositories in DataMigrationScripts, we can't have the migration-method block the + * start of the storage. That would lead to a deadlock, and we don't want that. + */ @EventListener public void migrateDataOnContextStarted(final ContextRefreshedEvent event) { - // "Why don't you migrate the data wherever you call EclipseStoreMigrator.migrateStructure?" - - // Because in order to be able to access repositories in DataMigrationScripts, we can't have - // the migration-method block the start of the storage. That would lead to a deadlock, and we don't - // want that. - if(this.getDataMigrator() != null) + final ApplicationContext applicationContext = event.getApplicationContext(); + try { + final MicroMigrater dataMigrater = event.getApplicationContext().getBean(MicroMigrater.class); this.getStorageInstance().start(); // In case the storage hasn't started yet. EclipseStoreMigrator.migrateData( this.getStorageInstance().getRoot(), - this.getDataMigrator(), + dataMigrater, this.getStorageInstance().getInstanceOfStorageManager() ); } - } - - public MicroMigrater getDataMigrator() - { - return this.possibleMigrater; + catch(final NoSuchBeanDefinitionException e) + { + LOG.info("No migration of data needed since there is no migrater defined."); + } } } diff --git a/spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/root/data/version/DataMigrater.java b/spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/root/data/version/DataMigrater.java index 48c627b5..525bc78f 100644 --- a/spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/root/data/version/DataMigrater.java +++ b/spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/root/data/version/DataMigrater.java @@ -16,11 +16,11 @@ package software.xdev.spring.data.eclipse.store.repository.root.data.version; import java.util.List; +import java.util.Optional; import java.util.TreeSet; import java.util.function.Consumer; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Component; import software.xdev.micromigration.migrater.ExplicitMigrater; @@ -30,16 +30,18 @@ import software.xdev.micromigration.version.MigrationVersion; import software.xdev.micromigration.versionagnostic.VersionAgnosticMigrationEmbeddedStorageManager; - @Component public class DataMigrater implements MicroMigrater { - @Lazy - @Autowired - private List scripts; - + private final List scripts; private ExplicitMigrater explicitMigrater; + @Autowired + public DataMigrater(final Optional> scripts) + { + this.scripts = scripts.orElse(List.of()); + } + private ExplicitMigrater ensureExplicitMigrater() { if(this.explicitMigrater == null) @@ -49,10 +51,19 @@ private ExplicitMigrater ensureExplicitMigrater() return this.explicitMigrater; } + private boolean isUseful() + { + return this.scripts != null && !this.scripts.isEmpty(); + } + @Override public TreeSet> getSortedScripts() { - return this.ensureExplicitMigrater().getSortedScripts(); + if(this.isUseful()) + { + return this.ensureExplicitMigrater().getSortedScripts(); + } + return new TreeSet<>(); } @Override @@ -61,7 +72,11 @@ private ExplicitMigrater ensureExplicitMigrater() final E storageManager, final Object root) { - return this.ensureExplicitMigrater().migrateToNewest(fromVersion, storageManager, root); + if(this.isUseful()) + { + return this.ensureExplicitMigrater().migrateToNewest(fromVersion, storageManager, root); + } + return null; } @Override @@ -71,8 +86,12 @@ private ExplicitMigrater ensureExplicitMigrater() final E storageManager, final Object objectToMigrate) { + if(this.isUseful()) + { return this.ensureExplicitMigrater() .migrateToVersion(fromVersion, targetVersion, storageManager, objectToMigrate); + } + return null; } @Override @@ -80,6 +99,9 @@ public void registerNotificationConsumer( final Consumer notificationConsumer ) { - this.ensureExplicitMigrater().registerNotificationConsumer(notificationConsumer); + if(this.isUseful()) + { + this.ensureExplicitMigrater().registerNotificationConsumer(notificationConsumer); + } } } 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 6d499de5..d83c5844 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 @@ -19,7 +19,6 @@ import java.io.IOException; import java.nio.file.Path; -import java.util.Optional; import org.eclipse.serializer.reflect.ClassLoaderProvider; import org.eclipse.store.integrations.spring.boot.types.configuration.EclipseStoreProperties; @@ -33,7 +32,6 @@ import org.springframework.context.event.EventListener; import org.springframework.util.FileSystemUtils; -import software.xdev.micromigration.migrater.MicroMigrater; import software.xdev.spring.data.eclipse.store.helper.StorageDirectoryNameProvider; import software.xdev.spring.data.eclipse.store.repository.config.EclipseStoreClientConfiguration; @@ -42,23 +40,14 @@ public class TestConfiguration extends EclipseStoreClientConfiguration { private final String storageDirectory = StorageDirectoryNameProvider.getNewStorageDirectoryPath(); - - protected TestConfiguration( - final EclipseStoreProperties defaultEclipseStoreProperties, - final EmbeddedStorageFoundationFactory defaultEclipseStoreProvider, - final ClassLoaderProvider classLoaderProvider) - { - this(defaultEclipseStoreProperties, defaultEclipseStoreProvider, classLoaderProvider, Optional.empty()); - } - + @Autowired protected TestConfiguration( final EclipseStoreProperties defaultEclipseStoreProperties, final EmbeddedStorageFoundationFactory defaultEclipseStoreProvider, - final ClassLoaderProvider classLoaderProvider, - final Optional possibleMigrater) + final ClassLoaderProvider classLoaderProvider) { - super(defaultEclipseStoreProperties, defaultEclipseStoreProvider, classLoaderProvider, possibleMigrater); + super(defaultEclipseStoreProperties, defaultEclipseStoreProvider, classLoaderProvider); } @Override diff --git a/spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/data/migration/own/migrator/DataMigrationOwnMigratorTestConfiguration.java b/spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/data/migration/own/migrator/DataMigrationOwnMigratorTestConfiguration.java index 982e52de..af53cb8a 100644 --- a/spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/data/migration/own/migrator/DataMigrationOwnMigratorTestConfiguration.java +++ b/spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/data/migration/own/migrator/DataMigrationOwnMigratorTestConfiguration.java @@ -15,8 +15,6 @@ */ package software.xdev.spring.data.eclipse.store.integration.isolated.tests.data.migration.own.migrator; -import java.util.Optional; - 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; @@ -24,7 +22,6 @@ import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; -import software.xdev.micromigration.migrater.MicroMigrater; import software.xdev.spring.data.eclipse.store.integration.TestConfiguration; import software.xdev.spring.data.eclipse.store.repository.config.EnableEclipseStoreRepositories; @@ -38,9 +35,8 @@ public class DataMigrationOwnMigratorTestConfiguration extends TestConfiguration protected DataMigrationOwnMigratorTestConfiguration( final EclipseStoreProperties defaultEclipseStoreProperties, final EmbeddedStorageFoundationFactory defaultEclipseStoreProvider, - final ClassLoaderProvider classLoaderProvider, - final Optional possibleMigrater) + final ClassLoaderProvider classLoaderProvider) { - super(defaultEclipseStoreProperties, defaultEclipseStoreProvider, classLoaderProvider, possibleMigrater); + super(defaultEclipseStoreProperties, defaultEclipseStoreProvider, classLoaderProvider); } } From 7528d8dd5f0df3ec4c542e2a38870cecbef2e53c Mon Sep 17 00:00:00 2001 From: JohannesRabauer Date: Tue, 7 Jan 2025 15:23:56 +0100 Subject: [PATCH 14/20] Made the DataMigrater optional --- CHANGELOG.md | 1 + spring-data-eclipse-store/pom.xml | 3 +- .../EclipseStoreClientConfiguration.java | 2 - .../root/data/version/DataMigrater.java | 10 +-- .../data/version/DataMigraterFactory.java | 37 ++++++++ .../with/migrater/CustomMigrater.java | 86 +++++++++++++++++++ .../DataMigrationWithMigraterTest.java | 59 +++++++++++++ ...igrationWithMigraterTestConfiguration.java | 42 +++++++++ .../with/migrater/PersistedEntity.java | 28 ++++++ .../migrater/PersistedEntityRepository.java | 23 +++++ .../migration/with/migrater/v1_0_0_Init.java | 40 +++++++++ .../DataMigrationWithScriptsTest.java} | 8 +- ...igrationWithScriptsTestConfiguration.java} | 8 +- .../scripts}/PersistedEntity.java | 2 +- .../scripts}/PersistedEntityRepository.java | 2 +- .../scripts}/v1_0_0_Init.java | 2 +- 16 files changed, 332 insertions(+), 21 deletions(-) create mode 100644 spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/root/data/version/DataMigraterFactory.java create mode 100644 spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/data/migration/with/migrater/CustomMigrater.java create mode 100644 spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/data/migration/with/migrater/DataMigrationWithMigraterTest.java create mode 100644 spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/data/migration/with/migrater/DataMigrationWithMigraterTestConfiguration.java create mode 100644 spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/data/migration/with/migrater/PersistedEntity.java create mode 100644 spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/data/migration/with/migrater/PersistedEntityRepository.java create mode 100644 spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/data/migration/with/migrater/v1_0_0_Init.java rename spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/data/migration/{own/migrator/DataMigrationOwnMigratorTest.java => with/scripts/DataMigrationWithScriptsTest.java} (90%) rename spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/data/migration/{own/migrator/DataMigrationOwnMigratorTestConfiguration.java => with/scripts/DataMigrationWithScriptsTestConfiguration.java} (89%) rename spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/data/migration/{own/migrator => with/scripts}/PersistedEntity.java (95%) rename spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/data/migration/{own/migrator => with/scripts}/PersistedEntityRepository.java (95%) rename spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/data/migration/{own/migrator => with/scripts}/v1_0_0_Init.java (97%) diff --git a/CHANGELOG.md b/CHANGELOG.md index 480cfdd0..6fe2169a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # 2.4.2 * Updated org.springframework.boot.version to v3.4.1 +* Added support for the [micro-migration-Framework](https://github.com/xdev-software/micro-migration) # 2.4.1 diff --git a/spring-data-eclipse-store/pom.xml b/spring-data-eclipse-store/pom.xml index 95663e5d..5bce0a47 100644 --- a/spring-data-eclipse-store/pom.xml +++ b/spring-data-eclipse-store/pom.xml @@ -58,6 +58,7 @@ 6.0.1 6.0.0-M1 6.6.4.Final + 3.0.1 @@ -156,7 +157,7 @@ software.xdev micro-migration - 3.0.1 + ${micro-migration.version} storage-embedded 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 929e61ef..3dc0d0b3 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 @@ -30,7 +30,6 @@ 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.ApplicationContext; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; @@ -229,7 +228,6 @@ public Validator getValidator() @EventListener public void migrateDataOnContextStarted(final ContextRefreshedEvent event) { - final ApplicationContext applicationContext = event.getApplicationContext(); try { final MicroMigrater dataMigrater = event.getApplicationContext().getBean(MicroMigrater.class); diff --git a/spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/root/data/version/DataMigrater.java b/spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/root/data/version/DataMigrater.java index 525bc78f..244fc879 100644 --- a/spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/root/data/version/DataMigrater.java +++ b/spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/root/data/version/DataMigrater.java @@ -20,9 +20,6 @@ import java.util.TreeSet; import java.util.function.Consumer; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; - import software.xdev.micromigration.migrater.ExplicitMigrater; import software.xdev.micromigration.migrater.MicroMigrater; import software.xdev.micromigration.notification.ScriptExecutionNotificationWithScriptReference; @@ -30,16 +27,14 @@ import software.xdev.micromigration.version.MigrationVersion; import software.xdev.micromigration.versionagnostic.VersionAgnosticMigrationEmbeddedStorageManager; -@Component public class DataMigrater implements MicroMigrater { private final List scripts; private ExplicitMigrater explicitMigrater; - @Autowired - public DataMigrater(final Optional> scripts) + public DataMigrater(final List scripts) { - this.scripts = scripts.orElse(List.of()); + this.scripts = scripts; } private ExplicitMigrater ensureExplicitMigrater() @@ -63,6 +58,7 @@ private boolean isUseful() { return this.ensureExplicitMigrater().getSortedScripts(); } + // noinspection SortedCollectionWithNonComparableKeys return new TreeSet<>(); } diff --git a/spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/root/data/version/DataMigraterFactory.java b/spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/root/data/version/DataMigraterFactory.java new file mode 100644 index 00000000..b852401c --- /dev/null +++ b/spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/root/data/version/DataMigraterFactory.java @@ -0,0 +1,37 @@ +/* + * 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.repository.root.data.version; + +import java.util.List; +import java.util.Optional; + +import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; +import org.springframework.context.annotation.Bean; +import org.springframework.stereotype.Component; + +import software.xdev.micromigration.migrater.MicroMigrater; + + +@Component +public class DataMigraterFactory +{ + @Bean + @ConditionalOnMissingBean(MicroMigrater.class) + public MicroMigrater getDataMigrater(final Optional> scripts) + { + return new DataMigrater(scripts.orElse(List.of())); + } +} diff --git a/spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/data/migration/with/migrater/CustomMigrater.java b/spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/data/migration/with/migrater/CustomMigrater.java new file mode 100644 index 00000000..c9b52e46 --- /dev/null +++ b/spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/data/migration/with/migrater/CustomMigrater.java @@ -0,0 +1,86 @@ +/* + * 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.data.migration.with.migrater; + +import java.util.TreeSet; +import java.util.function.Consumer; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import software.xdev.micromigration.migrater.ExplicitMigrater; +import software.xdev.micromigration.migrater.MicroMigrater; +import software.xdev.micromigration.notification.ScriptExecutionNotificationWithScriptReference; +import software.xdev.micromigration.scripts.VersionAgnosticMigrationScript; +import software.xdev.micromigration.version.MigrationVersion; +import software.xdev.micromigration.versionagnostic.VersionAgnosticMigrationEmbeddedStorageManager; + + +@Component +public class CustomMigrater implements MicroMigrater +{ + private ExplicitMigrater explicitMigrater; + final PersistedEntityRepository repository; + + @Autowired + public CustomMigrater(final PersistedEntityRepository repository) + { + this.repository = repository; + } + + private ExplicitMigrater ensureExplicitMigrater() + { + if(this.explicitMigrater == null) + { + this.explicitMigrater = new ExplicitMigrater(new v1_0_0_Init(this.repository)); + } + return this.explicitMigrater; + } + + @Override + public TreeSet> getSortedScripts() + { + return this.ensureExplicitMigrater().getSortedScripts(); + } + + @Override + public > MigrationVersion migrateToNewest( + final MigrationVersion fromVersion, + final E storageManager, + final Object root) + { + return this.ensureExplicitMigrater().migrateToNewest(fromVersion, storageManager, root); + } + + @Override + public > MigrationVersion migrateToVersion( + final MigrationVersion fromVersion, + final MigrationVersion targetVersion, + final E storageManager, + final Object objectToMigrate) + { + return this.ensureExplicitMigrater() + .migrateToVersion(fromVersion, targetVersion, storageManager, objectToMigrate); + } + + @Override + public void registerNotificationConsumer( + final Consumer notificationConsumer + ) + { + this.ensureExplicitMigrater().registerNotificationConsumer(notificationConsumer); + } +} diff --git a/spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/data/migration/with/migrater/DataMigrationWithMigraterTest.java b/spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/data/migration/with/migrater/DataMigrationWithMigraterTest.java new file mode 100644 index 00000000..f35e26a2 --- /dev/null +++ b/spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/data/migration/with/migrater/DataMigrationWithMigraterTest.java @@ -0,0 +1,59 @@ +/* + * 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.data.migration.with.migrater; + +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.micromigration.version.MigrationVersion; +import software.xdev.spring.data.eclipse.store.helper.TestUtil; +import software.xdev.spring.data.eclipse.store.integration.isolated.IsolatedTestAnnotations; + + +@IsolatedTestAnnotations +@ContextConfiguration(classes = {DataMigrationWithMigraterTestConfiguration.class}) +class DataMigrationWithMigraterTest +{ + @Autowired + private DataMigrationWithMigraterTestConfiguration configuration; + @Autowired + private PersistedEntityRepository repository; + + @Test + void assertUpdateV1Executed() + { + Assertions.assertEquals(1, this.repository.count()); + Assertions.assertEquals( + new MigrationVersion(1, 0, 0), + this.configuration.getStorageInstance().getRoot().getDataVersion().getVersion()); + } + + @Test + void assertNotUpdatedAfterMigration() + { + TestUtil.doBeforeAndAfterRestartOfDatastore( + this.configuration, + () -> { + Assertions.assertEquals(1, this.repository.count()); + Assertions.assertEquals( + new MigrationVersion(1, 0, 0), + this.configuration.getStorageInstance().getRoot().getDataVersion().getVersion()); + } + ); + } +} diff --git a/spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/data/migration/with/migrater/DataMigrationWithMigraterTestConfiguration.java b/spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/data/migration/with/migrater/DataMigrationWithMigraterTestConfiguration.java new file mode 100644 index 00000000..d205b0b3 --- /dev/null +++ b/spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/data/migration/with/migrater/DataMigrationWithMigraterTestConfiguration.java @@ -0,0 +1,42 @@ +/* + * 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.data.migration.with.migrater; + +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.ComponentScan; +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; + + +@ComponentScan({"software.xdev.spring.data.eclipse.store.integration.isolated.tests.data.migration.with.migrater"}) +@Configuration +@EnableEclipseStoreRepositories +public class DataMigrationWithMigraterTestConfiguration extends TestConfiguration +{ + @Autowired + protected DataMigrationWithMigraterTestConfiguration( + 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/data/migration/with/migrater/PersistedEntity.java b/spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/data/migration/with/migrater/PersistedEntity.java new file mode 100644 index 00000000..82eda477 --- /dev/null +++ b/spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/data/migration/with/migrater/PersistedEntity.java @@ -0,0 +1,28 @@ +/* + * 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.data.migration.with.migrater; + +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; + + +public class PersistedEntity +{ + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + private int id; +} diff --git a/spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/data/migration/with/migrater/PersistedEntityRepository.java b/spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/data/migration/with/migrater/PersistedEntityRepository.java new file mode 100644 index 00000000..9fbffdc0 --- /dev/null +++ b/spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/data/migration/with/migrater/PersistedEntityRepository.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.data.migration.with.migrater; + +import org.springframework.data.repository.CrudRepository; + + +public interface PersistedEntityRepository extends CrudRepository +{ +} diff --git a/spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/data/migration/with/migrater/v1_0_0_Init.java b/spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/data/migration/with/migrater/v1_0_0_Init.java new file mode 100644 index 00000000..32e2a376 --- /dev/null +++ b/spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/data/migration/with/migrater/v1_0_0_Init.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.data.migration.with.migrater; + +import software.xdev.micromigration.eclipsestore.MigrationEmbeddedStorageManager; +import software.xdev.micromigration.scripts.Context; +import software.xdev.spring.data.eclipse.store.repository.root.VersionedRoot; +import software.xdev.spring.data.eclipse.store.repository.root.data.version.DataMigrationScript; + + +@SuppressWarnings("CheckStyle") +public class v1_0_0_Init extends DataMigrationScript +{ + private final PersistedEntityRepository + repository; + + public v1_0_0_Init(final PersistedEntityRepository repository) + { + this.repository = repository; + } + + @Override + public void migrate(final Context context) + { + this.repository.save(new PersistedEntity()); + } +} diff --git a/spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/data/migration/own/migrator/DataMigrationOwnMigratorTest.java b/spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/data/migration/with/scripts/DataMigrationWithScriptsTest.java similarity index 90% rename from spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/data/migration/own/migrator/DataMigrationOwnMigratorTest.java rename to spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/data/migration/with/scripts/DataMigrationWithScriptsTest.java index 89626fd0..377807dd 100644 --- a/spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/data/migration/own/migrator/DataMigrationOwnMigratorTest.java +++ b/spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/data/migration/with/scripts/DataMigrationWithScriptsTest.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package software.xdev.spring.data.eclipse.store.integration.isolated.tests.data.migration.own.migrator; +package software.xdev.spring.data.eclipse.store.integration.isolated.tests.data.migration.with.scripts; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; @@ -26,11 +26,11 @@ @IsolatedTestAnnotations -@ContextConfiguration(classes = {DataMigrationOwnMigratorTestConfiguration.class}) -class DataMigrationOwnMigratorTest +@ContextConfiguration(classes = {DataMigrationWithScriptsTestConfiguration.class}) +class DataMigrationWithScriptsTest { @Autowired - private DataMigrationOwnMigratorTestConfiguration configuration; + private DataMigrationWithScriptsTestConfiguration configuration; @Autowired private PersistedEntityRepository repository; diff --git a/spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/data/migration/own/migrator/DataMigrationOwnMigratorTestConfiguration.java b/spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/data/migration/with/scripts/DataMigrationWithScriptsTestConfiguration.java similarity index 89% rename from spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/data/migration/own/migrator/DataMigrationOwnMigratorTestConfiguration.java rename to spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/data/migration/with/scripts/DataMigrationWithScriptsTestConfiguration.java index af53cb8a..207372ea 100644 --- a/spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/data/migration/own/migrator/DataMigrationOwnMigratorTestConfiguration.java +++ b/spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/data/migration/with/scripts/DataMigrationWithScriptsTestConfiguration.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package software.xdev.spring.data.eclipse.store.integration.isolated.tests.data.migration.own.migrator; +package software.xdev.spring.data.eclipse.store.integration.isolated.tests.data.migration.with.scripts; import org.eclipse.serializer.reflect.ClassLoaderProvider; import org.eclipse.store.integrations.spring.boot.types.configuration.EclipseStoreProperties; @@ -26,13 +26,13 @@ import software.xdev.spring.data.eclipse.store.repository.config.EnableEclipseStoreRepositories; -@ComponentScan({"software.xdev.spring.data.eclipse.store.integration.isolated.tests.data.migration.own.migrator"}) +@ComponentScan({"software.xdev.spring.data.eclipse.store.integration.isolated.tests.data.migration.with.scripts"}) @Configuration @EnableEclipseStoreRepositories -public class DataMigrationOwnMigratorTestConfiguration extends TestConfiguration +public class DataMigrationWithScriptsTestConfiguration extends TestConfiguration { @Autowired - protected DataMigrationOwnMigratorTestConfiguration( + protected DataMigrationWithScriptsTestConfiguration( final EclipseStoreProperties defaultEclipseStoreProperties, final EmbeddedStorageFoundationFactory defaultEclipseStoreProvider, final ClassLoaderProvider classLoaderProvider) diff --git a/spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/data/migration/own/migrator/PersistedEntity.java b/spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/data/migration/with/scripts/PersistedEntity.java similarity index 95% rename from spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/data/migration/own/migrator/PersistedEntity.java rename to spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/data/migration/with/scripts/PersistedEntity.java index a2286e77..a589b089 100644 --- a/spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/data/migration/own/migrator/PersistedEntity.java +++ b/spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/data/migration/with/scripts/PersistedEntity.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package software.xdev.spring.data.eclipse.store.integration.isolated.tests.data.migration.own.migrator; +package software.xdev.spring.data.eclipse.store.integration.isolated.tests.data.migration.with.scripts; import jakarta.persistence.GeneratedValue; import jakarta.persistence.GenerationType; diff --git a/spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/data/migration/own/migrator/PersistedEntityRepository.java b/spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/data/migration/with/scripts/PersistedEntityRepository.java similarity index 95% rename from spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/data/migration/own/migrator/PersistedEntityRepository.java rename to spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/data/migration/with/scripts/PersistedEntityRepository.java index 09669a9a..acb78eda 100644 --- a/spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/data/migration/own/migrator/PersistedEntityRepository.java +++ b/spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/data/migration/with/scripts/PersistedEntityRepository.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package software.xdev.spring.data.eclipse.store.integration.isolated.tests.data.migration.own.migrator; +package software.xdev.spring.data.eclipse.store.integration.isolated.tests.data.migration.with.scripts; import org.springframework.data.repository.CrudRepository; diff --git a/spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/data/migration/own/migrator/v1_0_0_Init.java b/spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/data/migration/with/scripts/v1_0_0_Init.java similarity index 97% rename from spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/data/migration/own/migrator/v1_0_0_Init.java rename to spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/data/migration/with/scripts/v1_0_0_Init.java index a92000a5..683f5933 100644 --- a/spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/data/migration/own/migrator/v1_0_0_Init.java +++ b/spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/data/migration/with/scripts/v1_0_0_Init.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package software.xdev.spring.data.eclipse.store.integration.isolated.tests.data.migration.own.migrator; +package software.xdev.spring.data.eclipse.store.integration.isolated.tests.data.migration.with.scripts; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; From 774230866a05ca4874d2495fec23ec31984a24de Mon Sep 17 00:00:00 2001 From: XDEV Renovate Bot Date: Wed, 8 Jan 2025 02:32:51 +0000 Subject: [PATCH 15/20] Update dependency software.xdev:micro-migration to v3 --- spring-data-eclipse-store/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spring-data-eclipse-store/pom.xml b/spring-data-eclipse-store/pom.xml index 4bd7d1ca..95663e5d 100644 --- a/spring-data-eclipse-store/pom.xml +++ b/spring-data-eclipse-store/pom.xml @@ -156,7 +156,7 @@ software.xdev micro-migration - 2.0.0 + 3.0.1 storage-embedded From 8ffb798f65ebdfad212c4bc8612489b703f203ee Mon Sep 17 00:00:00 2001 From: JohannesRabauer Date: Wed, 8 Jan 2025 07:15:18 +0100 Subject: [PATCH 16/20] Added multiple migration scripts tests --- .../DataMigrationWithMultipleScriptsTest.java | 59 +++++++++++++++++++ ...nWithMultipleScriptsTestConfiguration.java | 43 ++++++++++++++ .../multiple/scripts/PersistedEntity.java | 28 +++++++++ .../scripts/PersistedEntityRepository.java | 23 ++++++++ .../with/multiple/scripts/v1_0_0_Init.java | 44 ++++++++++++++ .../multiple/scripts/v1_1_0_NextScript.java | 44 ++++++++++++++ .../DataMigrationWithScriptTest.java} | 8 +-- ...MigrationWithScriptTestConfiguration.java} | 8 +-- .../{scripts => script}/PersistedEntity.java | 2 +- .../PersistedEntityRepository.java | 2 +- .../with/{scripts => script}/v1_0_0_Init.java | 2 +- 11 files changed, 252 insertions(+), 11 deletions(-) create mode 100644 spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/data/migration/with/multiple/scripts/DataMigrationWithMultipleScriptsTest.java create mode 100644 spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/data/migration/with/multiple/scripts/DataMigrationWithMultipleScriptsTestConfiguration.java create mode 100644 spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/data/migration/with/multiple/scripts/PersistedEntity.java create mode 100644 spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/data/migration/with/multiple/scripts/PersistedEntityRepository.java create mode 100644 spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/data/migration/with/multiple/scripts/v1_0_0_Init.java create mode 100644 spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/data/migration/with/multiple/scripts/v1_1_0_NextScript.java rename spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/data/migration/with/{scripts/DataMigrationWithScriptsTest.java => script/DataMigrationWithScriptTest.java} (89%) rename spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/data/migration/with/{scripts/DataMigrationWithScriptsTestConfiguration.java => script/DataMigrationWithScriptTestConfiguration.java} (88%) rename spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/data/migration/with/{scripts => script}/PersistedEntity.java (95%) rename spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/data/migration/with/{scripts => script}/PersistedEntityRepository.java (95%) rename spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/data/migration/with/{scripts => script}/v1_0_0_Init.java (97%) diff --git a/spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/data/migration/with/multiple/scripts/DataMigrationWithMultipleScriptsTest.java b/spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/data/migration/with/multiple/scripts/DataMigrationWithMultipleScriptsTest.java new file mode 100644 index 00000000..84e9f2d2 --- /dev/null +++ b/spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/data/migration/with/multiple/scripts/DataMigrationWithMultipleScriptsTest.java @@ -0,0 +1,59 @@ +/* + * 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.data.migration.with.multiple.scripts; + +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.micromigration.version.MigrationVersion; +import software.xdev.spring.data.eclipse.store.helper.TestUtil; +import software.xdev.spring.data.eclipse.store.integration.isolated.IsolatedTestAnnotations; + + +@IsolatedTestAnnotations +@ContextConfiguration(classes = {DataMigrationWithMultipleScriptsTestConfiguration.class}) +class DataMigrationWithMultipleScriptsTest +{ + @Autowired + private DataMigrationWithMultipleScriptsTestConfiguration configuration; + @Autowired + private PersistedEntityRepository repository; + + @Test + void assertUpdateV1Executed() + { + Assertions.assertEquals(2, this.repository.count()); + Assertions.assertEquals( + new MigrationVersion(1, 1, 0), + this.configuration.getStorageInstance().getRoot().getDataVersion().getVersion()); + } + + @Test + void assertNotUpdatedAfterMigration() + { + TestUtil.doBeforeAndAfterRestartOfDatastore( + this.configuration, + () -> { + Assertions.assertEquals(2, this.repository.count()); + Assertions.assertEquals( + new MigrationVersion(1, 1, 0), + this.configuration.getStorageInstance().getRoot().getDataVersion().getVersion()); + } + ); + } +} diff --git a/spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/data/migration/with/multiple/scripts/DataMigrationWithMultipleScriptsTestConfiguration.java b/spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/data/migration/with/multiple/scripts/DataMigrationWithMultipleScriptsTestConfiguration.java new file mode 100644 index 00000000..1e934721 --- /dev/null +++ b/spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/data/migration/with/multiple/scripts/DataMigrationWithMultipleScriptsTestConfiguration.java @@ -0,0 +1,43 @@ +/* + * 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.data.migration.with.multiple.scripts; + +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.ComponentScan; +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; + + +@ComponentScan({ + "software.xdev.spring.data.eclipse.store.integration.isolated.tests.data.migration.with.multiple.scripts"}) +@Configuration +@EnableEclipseStoreRepositories +public class DataMigrationWithMultipleScriptsTestConfiguration extends TestConfiguration +{ + @Autowired + protected DataMigrationWithMultipleScriptsTestConfiguration( + 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/data/migration/with/multiple/scripts/PersistedEntity.java b/spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/data/migration/with/multiple/scripts/PersistedEntity.java new file mode 100644 index 00000000..ede993b2 --- /dev/null +++ b/spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/data/migration/with/multiple/scripts/PersistedEntity.java @@ -0,0 +1,28 @@ +/* + * 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.data.migration.with.multiple.scripts; + +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; + + +public class PersistedEntity +{ + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + private int id; +} diff --git a/spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/data/migration/with/multiple/scripts/PersistedEntityRepository.java b/spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/data/migration/with/multiple/scripts/PersistedEntityRepository.java new file mode 100644 index 00000000..7d9c4791 --- /dev/null +++ b/spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/data/migration/with/multiple/scripts/PersistedEntityRepository.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.data.migration.with.multiple.scripts; + +import org.springframework.data.repository.CrudRepository; + + +public interface PersistedEntityRepository extends CrudRepository +{ +} diff --git a/spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/data/migration/with/multiple/scripts/v1_0_0_Init.java b/spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/data/migration/with/multiple/scripts/v1_0_0_Init.java new file mode 100644 index 00000000..e5a4ed34 --- /dev/null +++ b/spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/data/migration/with/multiple/scripts/v1_0_0_Init.java @@ -0,0 +1,44 @@ +/* + * 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.data.migration.with.multiple.scripts; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import software.xdev.micromigration.eclipsestore.MigrationEmbeddedStorageManager; +import software.xdev.micromigration.scripts.Context; +import software.xdev.spring.data.eclipse.store.repository.root.VersionedRoot; +import software.xdev.spring.data.eclipse.store.repository.root.data.version.DataMigrationScript; + + +@SuppressWarnings("CheckStyle") +@Component +public class v1_0_0_Init extends DataMigrationScript +{ + private final PersistedEntityRepository + repository; + + public v1_0_0_Init(@Autowired final PersistedEntityRepository repository) + { + this.repository = repository; + } + + @Override + public void migrate(final Context context) + { + this.repository.save(new PersistedEntity()); + } +} diff --git a/spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/data/migration/with/multiple/scripts/v1_1_0_NextScript.java b/spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/data/migration/with/multiple/scripts/v1_1_0_NextScript.java new file mode 100644 index 00000000..f50b24f3 --- /dev/null +++ b/spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/data/migration/with/multiple/scripts/v1_1_0_NextScript.java @@ -0,0 +1,44 @@ +/* + * 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.data.migration.with.multiple.scripts; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import software.xdev.micromigration.eclipsestore.MigrationEmbeddedStorageManager; +import software.xdev.micromigration.scripts.Context; +import software.xdev.spring.data.eclipse.store.repository.root.VersionedRoot; +import software.xdev.spring.data.eclipse.store.repository.root.data.version.DataMigrationScript; + + +@SuppressWarnings("CheckStyle") +@Component +public class v1_1_0_NextScript extends DataMigrationScript +{ + private final PersistedEntityRepository + repository; + + public v1_1_0_NextScript(@Autowired final PersistedEntityRepository repository) + { + this.repository = repository; + } + + @Override + public void migrate(final Context context) + { + this.repository.save(new PersistedEntity()); + } +} diff --git a/spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/data/migration/with/scripts/DataMigrationWithScriptsTest.java b/spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/data/migration/with/script/DataMigrationWithScriptTest.java similarity index 89% rename from spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/data/migration/with/scripts/DataMigrationWithScriptsTest.java rename to spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/data/migration/with/script/DataMigrationWithScriptTest.java index 377807dd..3970616c 100644 --- a/spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/data/migration/with/scripts/DataMigrationWithScriptsTest.java +++ b/spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/data/migration/with/script/DataMigrationWithScriptTest.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package software.xdev.spring.data.eclipse.store.integration.isolated.tests.data.migration.with.scripts; +package software.xdev.spring.data.eclipse.store.integration.isolated.tests.data.migration.with.script; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; @@ -26,11 +26,11 @@ @IsolatedTestAnnotations -@ContextConfiguration(classes = {DataMigrationWithScriptsTestConfiguration.class}) -class DataMigrationWithScriptsTest +@ContextConfiguration(classes = {DataMigrationWithScriptTestConfiguration.class}) +class DataMigrationWithScriptTest { @Autowired - private DataMigrationWithScriptsTestConfiguration configuration; + private DataMigrationWithScriptTestConfiguration configuration; @Autowired private PersistedEntityRepository repository; diff --git a/spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/data/migration/with/scripts/DataMigrationWithScriptsTestConfiguration.java b/spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/data/migration/with/script/DataMigrationWithScriptTestConfiguration.java similarity index 88% rename from spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/data/migration/with/scripts/DataMigrationWithScriptsTestConfiguration.java rename to spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/data/migration/with/script/DataMigrationWithScriptTestConfiguration.java index 207372ea..c1d44162 100644 --- a/spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/data/migration/with/scripts/DataMigrationWithScriptsTestConfiguration.java +++ b/spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/data/migration/with/script/DataMigrationWithScriptTestConfiguration.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package software.xdev.spring.data.eclipse.store.integration.isolated.tests.data.migration.with.scripts; +package software.xdev.spring.data.eclipse.store.integration.isolated.tests.data.migration.with.script; import org.eclipse.serializer.reflect.ClassLoaderProvider; import org.eclipse.store.integrations.spring.boot.types.configuration.EclipseStoreProperties; @@ -26,13 +26,13 @@ import software.xdev.spring.data.eclipse.store.repository.config.EnableEclipseStoreRepositories; -@ComponentScan({"software.xdev.spring.data.eclipse.store.integration.isolated.tests.data.migration.with.scripts"}) +@ComponentScan({"software.xdev.spring.data.eclipse.store.integration.isolated.tests.data.migration.with.script"}) @Configuration @EnableEclipseStoreRepositories -public class DataMigrationWithScriptsTestConfiguration extends TestConfiguration +public class DataMigrationWithScriptTestConfiguration extends TestConfiguration { @Autowired - protected DataMigrationWithScriptsTestConfiguration( + protected DataMigrationWithScriptTestConfiguration( final EclipseStoreProperties defaultEclipseStoreProperties, final EmbeddedStorageFoundationFactory defaultEclipseStoreProvider, final ClassLoaderProvider classLoaderProvider) diff --git a/spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/data/migration/with/scripts/PersistedEntity.java b/spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/data/migration/with/script/PersistedEntity.java similarity index 95% rename from spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/data/migration/with/scripts/PersistedEntity.java rename to spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/data/migration/with/script/PersistedEntity.java index a589b089..61f5a771 100644 --- a/spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/data/migration/with/scripts/PersistedEntity.java +++ b/spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/data/migration/with/script/PersistedEntity.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package software.xdev.spring.data.eclipse.store.integration.isolated.tests.data.migration.with.scripts; +package software.xdev.spring.data.eclipse.store.integration.isolated.tests.data.migration.with.script; import jakarta.persistence.GeneratedValue; import jakarta.persistence.GenerationType; diff --git a/spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/data/migration/with/scripts/PersistedEntityRepository.java b/spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/data/migration/with/script/PersistedEntityRepository.java similarity index 95% rename from spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/data/migration/with/scripts/PersistedEntityRepository.java rename to spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/data/migration/with/script/PersistedEntityRepository.java index acb78eda..062fbaa8 100644 --- a/spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/data/migration/with/scripts/PersistedEntityRepository.java +++ b/spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/data/migration/with/script/PersistedEntityRepository.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package software.xdev.spring.data.eclipse.store.integration.isolated.tests.data.migration.with.scripts; +package software.xdev.spring.data.eclipse.store.integration.isolated.tests.data.migration.with.script; import org.springframework.data.repository.CrudRepository; diff --git a/spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/data/migration/with/scripts/v1_0_0_Init.java b/spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/data/migration/with/script/v1_0_0_Init.java similarity index 97% rename from spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/data/migration/with/scripts/v1_0_0_Init.java rename to spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/data/migration/with/script/v1_0_0_Init.java index 683f5933..bd2ad263 100644 --- a/spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/data/migration/with/scripts/v1_0_0_Init.java +++ b/spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/data/migration/with/script/v1_0_0_Init.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package software.xdev.spring.data.eclipse.store.integration.isolated.tests.data.migration.with.scripts; +package software.xdev.spring.data.eclipse.store.integration.isolated.tests.data.migration.with.script; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; From 6e7773d7a2ff7b1d2b7901ade6ac347ee284c30e Mon Sep 17 00:00:00 2001 From: JohannesRabauer Date: Wed, 8 Jan 2025 07:49:11 +0100 Subject: [PATCH 17/20] Improved Migration for non reflective scripts --- .../demo/complex/ComplexDemoApplication.java | 5 +- .../store/demo/complex/OwnerService.java | 14 ++--- .../migration/CustomNameScriptAddOwner.java | 57 +++++++++++++++++++ .../demo/complex/migration/v1_0_0_Init.java | 52 +++++++++++++++++ .../data/version/DataMigrationScript.java | 6 +- .../ReflectiveDataMigrationScript.java | 30 ++++++++++ .../migration/with/migrater/v1_0_0_Init.java | 3 +- .../DataMigrationWithMultipleScriptsTest.java | 8 +-- .../with/multiple/scripts/v1_0_0_Init.java | 4 +- .../multiple/scripts/v1_1_0_NextScript.java | 3 +- .../scripts/v1_2_0_CustomNamedScript.java | 51 +++++++++++++++++ .../migration/with/script/v1_0_0_Init.java | 4 +- 12 files changed, 213 insertions(+), 24 deletions(-) create mode 100644 spring-data-eclipse-store-demo/src/main/java/software/xdev/spring/data/eclipse/store/demo/complex/migration/CustomNameScriptAddOwner.java create mode 100644 spring-data-eclipse-store-demo/src/main/java/software/xdev/spring/data/eclipse/store/demo/complex/migration/v1_0_0_Init.java create mode 100644 spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/root/data/version/ReflectiveDataMigrationScript.java create mode 100644 spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/data/migration/with/multiple/scripts/v1_2_0_CustomNamedScript.java diff --git a/spring-data-eclipse-store-demo/src/main/java/software/xdev/spring/data/eclipse/store/demo/complex/ComplexDemoApplication.java b/spring-data-eclipse-store-demo/src/main/java/software/xdev/spring/data/eclipse/store/demo/complex/ComplexDemoApplication.java index fdb997ed..844d4727 100644 --- a/spring-data-eclipse-store-demo/src/main/java/software/xdev/spring/data/eclipse/store/demo/complex/ComplexDemoApplication.java +++ b/spring-data-eclipse-store-demo/src/main/java/software/xdev/spring/data/eclipse/store/demo/complex/ComplexDemoApplication.java @@ -55,10 +55,7 @@ public void run(final String... args) */ private void ownerCalls() { - this.ownerService.logOwners(); - this.ownerService.deleteAll(); - this.ownerService.logOwners(); - this.ownerService.createNewOwnerAndVisit(); + this.ownerService.createNewOwnerAndVisit("Stevie", "Nicks", "Peter"); this.ownerService.logOwnersAndVisits(); } diff --git a/spring-data-eclipse-store-demo/src/main/java/software/xdev/spring/data/eclipse/store/demo/complex/OwnerService.java b/spring-data-eclipse-store-demo/src/main/java/software/xdev/spring/data/eclipse/store/demo/complex/OwnerService.java index 606619ad..cef33d8d 100644 --- a/spring-data-eclipse-store-demo/src/main/java/software/xdev/spring/data/eclipse/store/demo/complex/OwnerService.java +++ b/spring-data-eclipse-store-demo/src/main/java/software/xdev/spring/data/eclipse/store/demo/complex/OwnerService.java @@ -88,16 +88,16 @@ public void logOwnersAndVisits() /** * Transactional */ - public void createNewOwnerAndVisit() + public void createNewOwnerAndVisit(final String ownerFirstName, final String ownerLastName, final String petName) { new TransactionTemplate(this.transactionManager).execute( status -> { - final Owner owner = this.createOwner(); + final Owner owner = this.createOwner(ownerFirstName, ownerLastName, petName); this.ownerRepository.save(owner); final Visit visit = this.createVisit(); - owner.addVisit("Peter", visit); + owner.addVisit(petName, visit); this.ownerRepository.save(owner); LOG.info("----Stored new owner and visit----"); return null; @@ -113,14 +113,14 @@ private Visit createVisit() } @SuppressWarnings("checkstyle:MagicNumber") - private Owner createOwner() + private Owner createOwner(final String ownerFirstName, final String ownerLastName, final String petName) { final Owner owner = new Owner(); - owner.setFirstName("Stevie"); - owner.setLastName("Nicks"); + owner.setFirstName(ownerFirstName); + owner.setLastName(ownerLastName); final Pet pet = new Pet(); pet.setBirthDate(LocalDate.now().minusWeeks(6)); - pet.setName("Peter"); + pet.setName(petName); final PetType petType = new PetType(); petType.setName("Dog"); pet.setType(petType); diff --git a/spring-data-eclipse-store-demo/src/main/java/software/xdev/spring/data/eclipse/store/demo/complex/migration/CustomNameScriptAddOwner.java b/spring-data-eclipse-store-demo/src/main/java/software/xdev/spring/data/eclipse/store/demo/complex/migration/CustomNameScriptAddOwner.java new file mode 100644 index 00000000..70775382 --- /dev/null +++ b/spring-data-eclipse-store-demo/src/main/java/software/xdev/spring/data/eclipse/store/demo/complex/migration/CustomNameScriptAddOwner.java @@ -0,0 +1,57 @@ +/* + * 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.demo.complex.migration; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import software.xdev.micromigration.eclipsestore.MigrationEmbeddedStorageManager; +import software.xdev.micromigration.scripts.Context; +import software.xdev.micromigration.version.MigrationVersion; +import software.xdev.spring.data.eclipse.store.demo.complex.OwnerService; +import software.xdev.spring.data.eclipse.store.repository.root.VersionedRoot; +import software.xdev.spring.data.eclipse.store.repository.root.data.version.DataMigrationScript; + + +/** + * This is automatically called by the + * {@link software.xdev.spring.data.eclipse.store.repository.root.data.version.DataMigrater} through dependency + * injection. + *

+ * In contrast to {@link v1_0_0_Init} the version of this script is defined in the method {@link #getTargetVersion()}. + */ +@Component +public class CustomNameScriptAddOwner implements DataMigrationScript +{ + private final OwnerService service; + + public CustomNameScriptAddOwner(@Autowired final OwnerService service) + { + this.service = service; + } + + @Override + public MigrationVersion getTargetVersion() + { + return new MigrationVersion(1, 1, 0); + } + + @Override + public void migrate(final Context context) + { + this.service.createNewOwnerAndVisit("John", "McVie", "Ivan"); + } +} diff --git a/spring-data-eclipse-store-demo/src/main/java/software/xdev/spring/data/eclipse/store/demo/complex/migration/v1_0_0_Init.java b/spring-data-eclipse-store-demo/src/main/java/software/xdev/spring/data/eclipse/store/demo/complex/migration/v1_0_0_Init.java new file mode 100644 index 00000000..04bd5a32 --- /dev/null +++ b/spring-data-eclipse-store-demo/src/main/java/software/xdev/spring/data/eclipse/store/demo/complex/migration/v1_0_0_Init.java @@ -0,0 +1,52 @@ +/* + * 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.demo.complex.migration; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import software.xdev.micromigration.eclipsestore.MigrationEmbeddedStorageManager; +import software.xdev.micromigration.scripts.Context; +import software.xdev.spring.data.eclipse.store.demo.complex.OwnerService; +import software.xdev.spring.data.eclipse.store.repository.root.VersionedRoot; +import software.xdev.spring.data.eclipse.store.repository.root.data.version.ReflectiveDataMigrationScript; + + +/** + * This is automatically called by the + * {@link software.xdev.spring.data.eclipse.store.repository.root.data.version.DataMigrater} through dependency + * injection. + *

+ * In contrast to {@link CustomNameScriptAddOwner} the version of this script is defined by + * the name of the class defines the version. + */ +@SuppressWarnings("CheckStyle") +@Component +public class v1_0_0_Init extends ReflectiveDataMigrationScript +{ + private final OwnerService service; + + public v1_0_0_Init(@Autowired final OwnerService service) + { + this.service = service; + } + + @Override + public void migrate(final Context context) + { + this.service.createNewOwnerAndVisit("Mick", "Fleetwood", "Isabella"); + } +} diff --git a/spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/root/data/version/DataMigrationScript.java b/spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/root/data/version/DataMigrationScript.java index a7f35208..2f2cf9df 100644 --- a/spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/root/data/version/DataMigrationScript.java +++ b/spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/root/data/version/DataMigrationScript.java @@ -18,12 +18,12 @@ import org.springframework.stereotype.Component; import software.xdev.micromigration.eclipsestore.MigrationEmbeddedStorageManager; -import software.xdev.micromigration.scripts.ReflectiveVersionMigrationScript; +import software.xdev.micromigration.scripts.VersionAgnosticMigrationScript; import software.xdev.spring.data.eclipse.store.repository.root.VersionedRoot; @Component -public abstract class DataMigrationScript - extends ReflectiveVersionMigrationScript +public interface DataMigrationScript + extends VersionAgnosticMigrationScript { } diff --git a/spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/root/data/version/ReflectiveDataMigrationScript.java b/spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/root/data/version/ReflectiveDataMigrationScript.java new file mode 100644 index 00000000..36616e95 --- /dev/null +++ b/spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/root/data/version/ReflectiveDataMigrationScript.java @@ -0,0 +1,30 @@ +/* + * 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.repository.root.data.version; + +import org.springframework.stereotype.Component; + +import software.xdev.micromigration.eclipsestore.MigrationEmbeddedStorageManager; +import software.xdev.micromigration.scripts.ReflectiveVersionMigrationScript; +import software.xdev.spring.data.eclipse.store.repository.root.VersionedRoot; + + +@Component +public abstract class ReflectiveDataMigrationScript + extends ReflectiveVersionMigrationScript + implements DataMigrationScript +{ +} diff --git a/spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/data/migration/with/migrater/v1_0_0_Init.java b/spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/data/migration/with/migrater/v1_0_0_Init.java index 32e2a376..8dd2c367 100644 --- a/spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/data/migration/with/migrater/v1_0_0_Init.java +++ b/spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/data/migration/with/migrater/v1_0_0_Init.java @@ -19,10 +19,11 @@ import software.xdev.micromigration.scripts.Context; import software.xdev.spring.data.eclipse.store.repository.root.VersionedRoot; import software.xdev.spring.data.eclipse.store.repository.root.data.version.DataMigrationScript; +import software.xdev.spring.data.eclipse.store.repository.root.data.version.ReflectiveDataMigrationScript; @SuppressWarnings("CheckStyle") -public class v1_0_0_Init extends DataMigrationScript +public class v1_0_0_Init extends ReflectiveDataMigrationScript { private final PersistedEntityRepository repository; diff --git a/spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/data/migration/with/multiple/scripts/DataMigrationWithMultipleScriptsTest.java b/spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/data/migration/with/multiple/scripts/DataMigrationWithMultipleScriptsTest.java index 84e9f2d2..516064a2 100644 --- a/spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/data/migration/with/multiple/scripts/DataMigrationWithMultipleScriptsTest.java +++ b/spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/data/migration/with/multiple/scripts/DataMigrationWithMultipleScriptsTest.java @@ -37,9 +37,9 @@ class DataMigrationWithMultipleScriptsTest @Test void assertUpdateV1Executed() { - Assertions.assertEquals(2, this.repository.count()); + Assertions.assertEquals(3, this.repository.count()); Assertions.assertEquals( - new MigrationVersion(1, 1, 0), + new MigrationVersion(1, 2, 0), this.configuration.getStorageInstance().getRoot().getDataVersion().getVersion()); } @@ -49,9 +49,9 @@ void assertNotUpdatedAfterMigration() TestUtil.doBeforeAndAfterRestartOfDatastore( this.configuration, () -> { - Assertions.assertEquals(2, this.repository.count()); + Assertions.assertEquals(3, this.repository.count()); Assertions.assertEquals( - new MigrationVersion(1, 1, 0), + new MigrationVersion(1, 2, 0), this.configuration.getStorageInstance().getRoot().getDataVersion().getVersion()); } ); diff --git a/spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/data/migration/with/multiple/scripts/v1_0_0_Init.java b/spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/data/migration/with/multiple/scripts/v1_0_0_Init.java index e5a4ed34..a16a6d1f 100644 --- a/spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/data/migration/with/multiple/scripts/v1_0_0_Init.java +++ b/spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/data/migration/with/multiple/scripts/v1_0_0_Init.java @@ -21,12 +21,12 @@ import software.xdev.micromigration.eclipsestore.MigrationEmbeddedStorageManager; import software.xdev.micromigration.scripts.Context; import software.xdev.spring.data.eclipse.store.repository.root.VersionedRoot; -import software.xdev.spring.data.eclipse.store.repository.root.data.version.DataMigrationScript; +import software.xdev.spring.data.eclipse.store.repository.root.data.version.ReflectiveDataMigrationScript; @SuppressWarnings("CheckStyle") @Component -public class v1_0_0_Init extends DataMigrationScript +public class v1_0_0_Init extends ReflectiveDataMigrationScript { private final PersistedEntityRepository repository; diff --git a/spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/data/migration/with/multiple/scripts/v1_1_0_NextScript.java b/spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/data/migration/with/multiple/scripts/v1_1_0_NextScript.java index f50b24f3..379425a2 100644 --- a/spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/data/migration/with/multiple/scripts/v1_1_0_NextScript.java +++ b/spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/data/migration/with/multiple/scripts/v1_1_0_NextScript.java @@ -22,11 +22,12 @@ import software.xdev.micromigration.scripts.Context; import software.xdev.spring.data.eclipse.store.repository.root.VersionedRoot; import software.xdev.spring.data.eclipse.store.repository.root.data.version.DataMigrationScript; +import software.xdev.spring.data.eclipse.store.repository.root.data.version.ReflectiveDataMigrationScript; @SuppressWarnings("CheckStyle") @Component -public class v1_1_0_NextScript extends DataMigrationScript +public class v1_1_0_NextScript extends ReflectiveDataMigrationScript { private final PersistedEntityRepository repository; diff --git a/spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/data/migration/with/multiple/scripts/v1_2_0_CustomNamedScript.java b/spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/data/migration/with/multiple/scripts/v1_2_0_CustomNamedScript.java new file mode 100644 index 00000000..f5a0d667 --- /dev/null +++ b/spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/data/migration/with/multiple/scripts/v1_2_0_CustomNamedScript.java @@ -0,0 +1,51 @@ +/* + * 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.data.migration.with.multiple.scripts; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import software.xdev.micromigration.eclipsestore.MigrationEmbeddedStorageManager; +import software.xdev.micromigration.scripts.Context; +import software.xdev.micromigration.version.MigrationVersion; +import software.xdev.spring.data.eclipse.store.repository.root.VersionedRoot; +import software.xdev.spring.data.eclipse.store.repository.root.data.version.DataMigrationScript; + + +@SuppressWarnings("CheckStyle") +@Component +public class v1_2_0_CustomNamedScript implements DataMigrationScript +{ + private final PersistedEntityRepository + repository; + + public v1_2_0_CustomNamedScript(@Autowired final PersistedEntityRepository repository) + { + this.repository = repository; + } + + @Override + public MigrationVersion getTargetVersion() + { + return new MigrationVersion(1, 2, 0); + } + + @Override + public void migrate(final Context context) + { + this.repository.save(new PersistedEntity()); + } +} diff --git a/spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/data/migration/with/script/v1_0_0_Init.java b/spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/data/migration/with/script/v1_0_0_Init.java index bd2ad263..9a706dd2 100644 --- a/spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/data/migration/with/script/v1_0_0_Init.java +++ b/spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/data/migration/with/script/v1_0_0_Init.java @@ -21,12 +21,12 @@ import software.xdev.micromigration.eclipsestore.MigrationEmbeddedStorageManager; import software.xdev.micromigration.scripts.Context; import software.xdev.spring.data.eclipse.store.repository.root.VersionedRoot; -import software.xdev.spring.data.eclipse.store.repository.root.data.version.DataMigrationScript; +import software.xdev.spring.data.eclipse.store.repository.root.data.version.ReflectiveDataMigrationScript; @SuppressWarnings("CheckStyle") @Component -public class v1_0_0_Init extends DataMigrationScript +public class v1_0_0_Init extends ReflectiveDataMigrationScript { private final PersistedEntityRepository repository; From 2bd44bacfd6924f2e865dabf827f042db8966962 Mon Sep 17 00:00:00 2001 From: JohannesRabauer Date: Wed, 8 Jan 2025 08:43:41 +0100 Subject: [PATCH 18/20] Added Docs / Cleanup --- docs/modules/ROOT/nav.adoc | 3 +- .../modules/ROOT/pages/features/features.adoc | 1 + .../pages/features/versioned-migration.adoc | 116 ++++++++++++++++++ ...migration.adoc => migration-from-jpa.adoc} | 0 ...iptAddOwner.java => CustomNameScript.java} | 4 +- .../demo/complex/migration/v1_0_0_Init.java | 5 +- .../with/migrater/CustomMigrater.java | 23 +--- 7 files changed, 130 insertions(+), 22 deletions(-) create mode 100644 docs/modules/ROOT/pages/features/versioned-migration.adoc rename docs/modules/ROOT/pages/{migration.adoc => migration-from-jpa.adoc} (100%) rename spring-data-eclipse-store-demo/src/main/java/software/xdev/spring/data/eclipse/store/demo/complex/migration/{CustomNameScriptAddOwner.java => CustomNameScript.java} (93%) diff --git a/docs/modules/ROOT/nav.adoc b/docs/modules/ROOT/nav.adoc index c056d12a..b339858f 100644 --- a/docs/modules/ROOT/nav.adoc +++ b/docs/modules/ROOT/nav.adoc @@ -8,7 +8,8 @@ ** xref:features/queries.adoc[Queries] ** xref:features/transactions.adoc[Transactions] ** xref:features/versions.adoc[Versions] +** xref:features/versioned-migration.adoc[Versioned Migration] ** xref:features/rest-api.adoc[REST Interface] ** xref:features/validation-constraints.adoc[Validation Constraints] -* xref:migration.adoc[Migration from JPA] +* xref:migration-from-jpa.adoc[Migration from JPA] * xref:known-issues.adoc[Known issues] diff --git a/docs/modules/ROOT/pages/features/features.adoc b/docs/modules/ROOT/pages/features/features.adoc index 0692dfe8..a9ccae5c 100644 --- a/docs/modules/ROOT/pages/features/features.adoc +++ b/docs/modules/ROOT/pages/features/features.adoc @@ -5,5 +5,6 @@ * xref:features/queries.adoc[Queries] * xref:features/transactions.adoc[Transactions] * xref:features/versions.adoc[Versions] +* xref:features/versioned-migration.adoc[Versioned Migration] * xref:features/rest-api.adoc[REST Interface] * xref:features/validation-constraints.adoc[Validation Constraints] diff --git a/docs/modules/ROOT/pages/features/versioned-migration.adoc b/docs/modules/ROOT/pages/features/versioned-migration.adoc new file mode 100644 index 00000000..5ce7df97 --- /dev/null +++ b/docs/modules/ROOT/pages/features/versioned-migration.adoc @@ -0,0 +1,116 @@ += Versioned Migration + +To keep the data in the store up-to-date, {product-name} utilizes https://github.com/xdev-software/micro-migration[XDEV's Micro-Migration]. +This means the user can use versioning for the stored data and only apply changes for certain versions of data. +This can be very useful specifically with build-pipelines. https://github.com/xdev-software/micro-migration#intro[More info at Micro-Migration...] + +== Implementation + +This can be easily achieved by either of these 3 methods: + +=== 1. Reflective Scripts + +Simply implement a new component with a specific pattern of naming, that extends the ``ReflectiveDataMigrationScript``. + +[source,java,title="https://github.com/xdev-software/spring-data-eclipse-store/blob/develop/spring-data-eclipse-store-demo/src/main/java/software/xdev/spring/data/eclipse/store/demo/complex/migration/v1_0_0_Init.java[Reflective example from complex demo]"] +---- +package software.xdev.spring.data.eclipse.store.demo.complex.migration; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +//... +import software.xdev.spring.data.eclipse.store.repository.root.data.version.ReflectiveDataMigrationScript; + +@Component +public class v1_0_0_Init extends ReflectiveDataMigrationScript +{ + private final OwnerService service; + + @Autowired + public v1_0_0_Init(final OwnerService service) + { + this.service = service; + } + + @Override + public void migrate(final Context context) + { + this.service.createNewOwnerAndVisit("Mick", "Fleetwood", "Isabella"); + } +} +---- + +Here the version number on which the data is updated on execution is derived from the class name. + +The ``MigrationVersion`` is stored in the root object in the data store. +Therefore, the storage always knows on which version the current data is and the ``DataMigrater`` will only execute the newer scripts. + +The scripts are automatically registered by declaring them as ``@Component``s. +That means that they can be anywhere as long as they are discovered by Spring as a component. + +=== 2. Custom Scripts + +Implementing a script without special naming is possible by implementing the +``DataMigrationScript``. + +[source,java,title="https://github.com/xdev-software/spring-data-eclipse-store/blob/develop/spring-data-eclipse-store-demo/src/main/java/software/xdev/spring/data/eclipse/store/demo/complex/migration/CustomNameScript.java[Custom script example from complex demo]"] +---- +package software.xdev.spring.data.eclipse.store.demo.complex.migration; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +//... +import software.xdev.spring.data.eclipse.store.repository.root.data.version.DataMigrationScript; + +@Component +public class CustomNameScriptAddOwner implements DataMigrationScript +{ + private final OwnerService service; + + public CustomNameScriptAddOwner(@Autowired final OwnerService service) + { + this.service = service; + } + + @Override + public MigrationVersion getTargetVersion() + { + return new MigrationVersion(1, 1, 0); + } + + @Override + public void migrate(final Context context) + { + this.service.createNewOwnerAndVisit("John", "McVie", "Ivan"); + } +} +---- + +The version number must be returned explicitly in the ``#getTargetVersion``-method. + +=== 3. Custom Migrater + +If more customization is needed it is also possible to replace the ``DataMigrater`` completely and implement your own ``MicroMigrater``. +This should only be used if necessary since it adds a lot of complexity to the code. + +[source,java,title="https://github.com/xdev-software/spring-data-eclipse-store/blob/develop/spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/data/migration/with/migrater/CustomMigrater.java[Custom migrater from tests]"] +---- +package software.xdev.spring.data.eclipse.store.integration.isolated.tests.data.migration.with.migrater; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import software.xdev.micromigration.migrater.ExplicitMigrater; +import software.xdev.micromigration.migrater.MicroMigrater; +//... + +@Component +public class CustomMigrater implements MicroMigrater +{ +private final ExplicitMigrater explicitMigrater; + + @Autowired + public CustomMigrater(final PersistedEntityRepository repository) + { + this.explicitMigrater = new ExplicitMigrater(new v1_0_0_Init(repository)); + } +---- diff --git a/docs/modules/ROOT/pages/migration.adoc b/docs/modules/ROOT/pages/migration-from-jpa.adoc similarity index 100% rename from docs/modules/ROOT/pages/migration.adoc rename to docs/modules/ROOT/pages/migration-from-jpa.adoc diff --git a/spring-data-eclipse-store-demo/src/main/java/software/xdev/spring/data/eclipse/store/demo/complex/migration/CustomNameScriptAddOwner.java b/spring-data-eclipse-store-demo/src/main/java/software/xdev/spring/data/eclipse/store/demo/complex/migration/CustomNameScript.java similarity index 93% rename from spring-data-eclipse-store-demo/src/main/java/software/xdev/spring/data/eclipse/store/demo/complex/migration/CustomNameScriptAddOwner.java rename to spring-data-eclipse-store-demo/src/main/java/software/xdev/spring/data/eclipse/store/demo/complex/migration/CustomNameScript.java index 70775382..6d95522c 100644 --- a/spring-data-eclipse-store-demo/src/main/java/software/xdev/spring/data/eclipse/store/demo/complex/migration/CustomNameScriptAddOwner.java +++ b/spring-data-eclipse-store-demo/src/main/java/software/xdev/spring/data/eclipse/store/demo/complex/migration/CustomNameScript.java @@ -34,11 +34,11 @@ * In contrast to {@link v1_0_0_Init} the version of this script is defined in the method {@link #getTargetVersion()}. */ @Component -public class CustomNameScriptAddOwner implements DataMigrationScript +public class CustomNameScript implements DataMigrationScript { private final OwnerService service; - public CustomNameScriptAddOwner(@Autowired final OwnerService service) + public CustomNameScript(@Autowired final OwnerService service) { this.service = service; } diff --git a/spring-data-eclipse-store-demo/src/main/java/software/xdev/spring/data/eclipse/store/demo/complex/migration/v1_0_0_Init.java b/spring-data-eclipse-store-demo/src/main/java/software/xdev/spring/data/eclipse/store/demo/complex/migration/v1_0_0_Init.java index 04bd5a32..7ec4fb2e 100644 --- a/spring-data-eclipse-store-demo/src/main/java/software/xdev/spring/data/eclipse/store/demo/complex/migration/v1_0_0_Init.java +++ b/spring-data-eclipse-store-demo/src/main/java/software/xdev/spring/data/eclipse/store/demo/complex/migration/v1_0_0_Init.java @@ -30,7 +30,7 @@ * {@link software.xdev.spring.data.eclipse.store.repository.root.data.version.DataMigrater} through dependency * injection. *

- * In contrast to {@link CustomNameScriptAddOwner} the version of this script is defined by + * In contrast to {@link CustomNameScript} the version of this script is defined by * the name of the class defines the version. */ @SuppressWarnings("CheckStyle") @@ -39,7 +39,8 @@ public class v1_0_0_Init extends ReflectiveDataMigrationScript { private final OwnerService service; - public v1_0_0_Init(@Autowired final OwnerService service) + @Autowired + public v1_0_0_Init(final OwnerService service) { this.service = service; } diff --git a/spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/data/migration/with/migrater/CustomMigrater.java b/spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/data/migration/with/migrater/CustomMigrater.java index c9b52e46..d7d7a73f 100644 --- a/spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/data/migration/with/migrater/CustomMigrater.java +++ b/spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/data/migration/with/migrater/CustomMigrater.java @@ -32,28 +32,18 @@ @Component public class CustomMigrater implements MicroMigrater { - private ExplicitMigrater explicitMigrater; - final PersistedEntityRepository repository; + private final ExplicitMigrater explicitMigrater; @Autowired public CustomMigrater(final PersistedEntityRepository repository) { - this.repository = repository; - } - - private ExplicitMigrater ensureExplicitMigrater() - { - if(this.explicitMigrater == null) - { - this.explicitMigrater = new ExplicitMigrater(new v1_0_0_Init(this.repository)); - } - return this.explicitMigrater; + this.explicitMigrater = new ExplicitMigrater(new v1_0_0_Init(repository)); } @Override public TreeSet> getSortedScripts() { - return this.ensureExplicitMigrater().getSortedScripts(); + return this.explicitMigrater.getSortedScripts(); } @Override @@ -62,7 +52,7 @@ private ExplicitMigrater ensureExplicitMigrater() final E storageManager, final Object root) { - return this.ensureExplicitMigrater().migrateToNewest(fromVersion, storageManager, root); + return this.explicitMigrater.migrateToNewest(fromVersion, storageManager, root); } @Override @@ -72,8 +62,7 @@ private ExplicitMigrater ensureExplicitMigrater() final E storageManager, final Object objectToMigrate) { - return this.ensureExplicitMigrater() - .migrateToVersion(fromVersion, targetVersion, storageManager, objectToMigrate); + return this.explicitMigrater.migrateToVersion(fromVersion, targetVersion, storageManager, objectToMigrate); } @Override @@ -81,6 +70,6 @@ public void registerNotificationConsumer( final Consumer notificationConsumer ) { - this.ensureExplicitMigrater().registerNotificationConsumer(notificationConsumer); + this.explicitMigrater.registerNotificationConsumer(notificationConsumer); } } From 6db8d8cc1dda2bb1ce1201afe087b51bb9245992 Mon Sep 17 00:00:00 2001 From: JohannesRabauer Date: Wed, 8 Jan 2025 09:13:33 +0100 Subject: [PATCH 19/20] Fix checkstyle --- .../eclipse/store/demo/complex/migration/v1_0_0_Init.java | 2 +- .../config/DefaultEclipseStoreClientConfiguration.java | 4 ---- .../store/repository/root/data/version/DataMigrater.java | 1 - .../tests/data/migration/with/migrater/v1_0_0_Init.java | 3 +-- .../data/migration/with/multiple/scripts/v1_0_0_Init.java | 3 +-- .../migration/with/multiple/scripts/v1_1_0_NextScript.java | 4 +--- .../with/multiple/scripts/v1_2_0_CustomNamedScript.java | 3 +-- .../tests/data/migration/with/script/v1_0_0_Init.java | 2 +- 8 files changed, 6 insertions(+), 16 deletions(-) diff --git a/spring-data-eclipse-store-demo/src/main/java/software/xdev/spring/data/eclipse/store/demo/complex/migration/v1_0_0_Init.java b/spring-data-eclipse-store-demo/src/main/java/software/xdev/spring/data/eclipse/store/demo/complex/migration/v1_0_0_Init.java index 7ec4fb2e..2e9c3d84 100644 --- a/spring-data-eclipse-store-demo/src/main/java/software/xdev/spring/data/eclipse/store/demo/complex/migration/v1_0_0_Init.java +++ b/spring-data-eclipse-store-demo/src/main/java/software/xdev/spring/data/eclipse/store/demo/complex/migration/v1_0_0_Init.java @@ -33,7 +33,7 @@ * In contrast to {@link CustomNameScript} the version of this script is defined by * the name of the class defines the version. */ -@SuppressWarnings("CheckStyle") +@SuppressWarnings("checkstyle:TypeName") @Component public class v1_0_0_Init extends ReflectiveDataMigrationScript { 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 38f88c2f..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,15 +15,11 @@ */ package software.xdev.spring.data.eclipse.store.repository.config; -import java.util.Optional; - 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; -import software.xdev.micromigration.migrater.MicroMigrater; - /** * Provides the Default implementation of an {@link EclipseStoreClientConfiguration}. The class can't be final because diff --git a/spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/root/data/version/DataMigrater.java b/spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/root/data/version/DataMigrater.java index 244fc879..d23e39b3 100644 --- a/spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/root/data/version/DataMigrater.java +++ b/spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/root/data/version/DataMigrater.java @@ -16,7 +16,6 @@ package software.xdev.spring.data.eclipse.store.repository.root.data.version; import java.util.List; -import java.util.Optional; import java.util.TreeSet; import java.util.function.Consumer; diff --git a/spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/data/migration/with/migrater/v1_0_0_Init.java b/spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/data/migration/with/migrater/v1_0_0_Init.java index 8dd2c367..94c9cfd3 100644 --- a/spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/data/migration/with/migrater/v1_0_0_Init.java +++ b/spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/data/migration/with/migrater/v1_0_0_Init.java @@ -18,11 +18,10 @@ import software.xdev.micromigration.eclipsestore.MigrationEmbeddedStorageManager; import software.xdev.micromigration.scripts.Context; import software.xdev.spring.data.eclipse.store.repository.root.VersionedRoot; -import software.xdev.spring.data.eclipse.store.repository.root.data.version.DataMigrationScript; import software.xdev.spring.data.eclipse.store.repository.root.data.version.ReflectiveDataMigrationScript; -@SuppressWarnings("CheckStyle") +@SuppressWarnings("checkstyle:TypeName") public class v1_0_0_Init extends ReflectiveDataMigrationScript { private final PersistedEntityRepository diff --git a/spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/data/migration/with/multiple/scripts/v1_0_0_Init.java b/spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/data/migration/with/multiple/scripts/v1_0_0_Init.java index a16a6d1f..609edd8f 100644 --- a/spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/data/migration/with/multiple/scripts/v1_0_0_Init.java +++ b/spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/data/migration/with/multiple/scripts/v1_0_0_Init.java @@ -23,8 +23,7 @@ import software.xdev.spring.data.eclipse.store.repository.root.VersionedRoot; import software.xdev.spring.data.eclipse.store.repository.root.data.version.ReflectiveDataMigrationScript; - -@SuppressWarnings("CheckStyle") +@SuppressWarnings("checkstyle:TypeName") @Component public class v1_0_0_Init extends ReflectiveDataMigrationScript { diff --git a/spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/data/migration/with/multiple/scripts/v1_1_0_NextScript.java b/spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/data/migration/with/multiple/scripts/v1_1_0_NextScript.java index 379425a2..85bcd62c 100644 --- a/spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/data/migration/with/multiple/scripts/v1_1_0_NextScript.java +++ b/spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/data/migration/with/multiple/scripts/v1_1_0_NextScript.java @@ -21,11 +21,9 @@ import software.xdev.micromigration.eclipsestore.MigrationEmbeddedStorageManager; import software.xdev.micromigration.scripts.Context; import software.xdev.spring.data.eclipse.store.repository.root.VersionedRoot; -import software.xdev.spring.data.eclipse.store.repository.root.data.version.DataMigrationScript; import software.xdev.spring.data.eclipse.store.repository.root.data.version.ReflectiveDataMigrationScript; - -@SuppressWarnings("CheckStyle") +@SuppressWarnings("checkstyle:TypeName") @Component public class v1_1_0_NextScript extends ReflectiveDataMigrationScript { diff --git a/spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/data/migration/with/multiple/scripts/v1_2_0_CustomNamedScript.java b/spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/data/migration/with/multiple/scripts/v1_2_0_CustomNamedScript.java index f5a0d667..654cd327 100644 --- a/spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/data/migration/with/multiple/scripts/v1_2_0_CustomNamedScript.java +++ b/spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/data/migration/with/multiple/scripts/v1_2_0_CustomNamedScript.java @@ -24,8 +24,7 @@ import software.xdev.spring.data.eclipse.store.repository.root.VersionedRoot; import software.xdev.spring.data.eclipse.store.repository.root.data.version.DataMigrationScript; - -@SuppressWarnings("CheckStyle") +@SuppressWarnings("checkstyle:TypeName") @Component public class v1_2_0_CustomNamedScript implements DataMigrationScript { diff --git a/spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/data/migration/with/script/v1_0_0_Init.java b/spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/data/migration/with/script/v1_0_0_Init.java index 9a706dd2..07697ef2 100644 --- a/spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/data/migration/with/script/v1_0_0_Init.java +++ b/spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/data/migration/with/script/v1_0_0_Init.java @@ -24,7 +24,7 @@ import software.xdev.spring.data.eclipse.store.repository.root.data.version.ReflectiveDataMigrationScript; -@SuppressWarnings("CheckStyle") +@SuppressWarnings("checkstyle:TypeName") @Component public class v1_0_0_Init extends ReflectiveDataMigrationScript { From f3f83e7f65b7693cb9097d1ee00669a973ea9b89 Mon Sep 17 00:00:00 2001 From: JohannesRabauer Date: Wed, 8 Jan 2025 09:20:45 +0100 Subject: [PATCH 20/20] Upgraded version to 2.5.0 --- CHANGELOG.md | 2 +- README.md | 2 +- docs/antora.yml | 6 +++--- 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 +- 8 files changed, 13 insertions(+), 13 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6fe2169a..658c675f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,4 @@ -# 2.4.2 +# 2.5.0 * Updated org.springframework.boot.version to v3.4.1 * Added support for the [micro-migration-Framework](https://github.com/xdev-software/micro-migration) diff --git a/README.md b/README.md index 4ea3e2a8..75a52bd9 100644 --- a/README.md +++ b/README.md @@ -59,7 +59,7 @@ instructions** are in the documentation](https://xdev-software.github.io/spring- | ``2.2.0-2.3.1`` | ``17`` | ``3.3.4`` | ``1.4.0`` | | ``2.4.0`` | ``17`` | ``3.4.0`` | ``2.0.0`` | | ``2.4.1`` | ``17`` | ``3.4.0`` | ``2.1.0`` | -| ``>= 2.4.2`` | ``17`` | ``3.4.1`` | ``2.1.0`` | +| ``>= 2.5.0`` | ``17`` | ``3.4.1`` | ``2.1.0`` | ## Demo diff --git a/docs/antora.yml b/docs/antora.yml index 096cac35..6bfa46c8 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.4.1' +display_version: '2.5.0' start_page: index.adoc nav: - modules/ROOT/nav.adoc asciidoc: attributes: product-name: 'Spring-Data-Eclipse-Store' - display-version: '2.4.1' - maven-version: '2.4.1' + display-version: '2.5.0' + maven-version: '2.5.0' page-editable: false page-out-of-support: false diff --git a/pom.xml b/pom.xml index 2a173917..9726aae0 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ software.xdev spring-data-eclipse-store-root - 2.4.2-SNAPSHOT + 2.5.0-SNAPSHOT pom diff --git a/spring-data-eclipse-store-benchmark/pom.xml b/spring-data-eclipse-store-benchmark/pom.xml index 8cd771bd..a8db67fa 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.4.2-SNAPSHOT + 2.5.0-SNAPSHOT spring-data-eclipse-store-benchmark - 2.4.2-SNAPSHOT + 2.5.0-SNAPSHOT jar 2023 diff --git a/spring-data-eclipse-store-demo/pom.xml b/spring-data-eclipse-store-demo/pom.xml index 37bd6bbc..b511c91a 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.4.2-SNAPSHOT + 2.5.0-SNAPSHOT spring-data-eclipse-store-demo - 2.4.2-SNAPSHOT + 2.5.0-SNAPSHOT jar diff --git a/spring-data-eclipse-store-jpa/pom.xml b/spring-data-eclipse-store-jpa/pom.xml index 44e55b6d..7bc0d4a6 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.4.2-SNAPSHOT + 2.5.0-SNAPSHOT spring-data-eclipse-store-jpa - 2.4.2-SNAPSHOT + 2.5.0-SNAPSHOT jar 2023 diff --git a/spring-data-eclipse-store/pom.xml b/spring-data-eclipse-store/pom.xml index c18f9dc1..3a03d420 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.4.2-SNAPSHOT + 2.5.0-SNAPSHOT jar spring-data-eclipse-store