Skip to content

Commit 7f00a34

Browse files
DataMigration basically working
1 parent f16525d commit 7f00a34

File tree

14 files changed

+211
-33
lines changed

14 files changed

+211
-33
lines changed

spring-data-eclipse-store/pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -156,7 +156,7 @@
156156
<dependency>
157157
<groupId>software.xdev</groupId>
158158
<artifactId>micro-migration</artifactId>
159-
<version>2.0.0</version>
159+
<version>3.0.0</version>
160160
<exclusions>
161161
<exclusion>
162162
<artifactId>storage-embedded</artifactId>

spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/EclipseStoreStorage.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@
4141
import software.xdev.spring.data.eclipse.store.repository.config.EclipseStoreClientConfiguration;
4242
import software.xdev.spring.data.eclipse.store.repository.config.EclipseStoreStorageFoundationProvider;
4343
import software.xdev.spring.data.eclipse.store.repository.interfaces.EclipseStoreRepository;
44+
import software.xdev.spring.data.eclipse.store.repository.root.EclipseStoreMigrator;
4445
import software.xdev.spring.data.eclipse.store.repository.root.VersionedRoot;
4546
import software.xdev.spring.data.eclipse.store.repository.root.data.version.DataVersion;
4647
import software.xdev.spring.data.eclipse.store.repository.root.v2_4.EntityData;

spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/config/EclipseStoreClientConfiguration.java

Lines changed: 30 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@
1717

1818
import java.util.Optional;
1919

20-
import jakarta.annotation.PostConstruct;
2120
import jakarta.validation.Validation;
2221
import jakarta.validation.Validator;
2322
import jakarta.validation.ValidatorFactory;
@@ -26,7 +25,6 @@
2625
import org.eclipse.store.integrations.spring.boot.types.configuration.EclipseStoreProperties;
2726
import org.eclipse.store.integrations.spring.boot.types.factories.EmbeddedStorageFoundationFactory;
2827
import org.eclipse.store.storage.embedded.types.EmbeddedStorageFoundation;
29-
import org.eclipse.store.storage.embedded.types.EmbeddedStorageManager;
3028
import org.slf4j.Logger;
3129
import org.slf4j.LoggerFactory;
3230
import org.springframework.beans.factory.ObjectProvider;
@@ -37,12 +35,13 @@
3735
import org.springframework.context.annotation.ComponentScan;
3836
import org.springframework.context.annotation.Configuration;
3937
import org.springframework.context.event.ContextClosedEvent;
38+
import org.springframework.context.event.ContextRefreshedEvent;
4039
import org.springframework.context.event.EventListener;
4140
import org.springframework.transaction.PlatformTransactionManager;
4241

4342
import software.xdev.micromigration.migrater.MicroMigrater;
44-
import software.xdev.spring.data.eclipse.store.repository.EclipseStoreMigrator;
4543
import software.xdev.spring.data.eclipse.store.repository.EclipseStoreStorage;
44+
import software.xdev.spring.data.eclipse.store.repository.root.EclipseStoreMigrator;
4645
import software.xdev.spring.data.eclipse.store.transactions.EclipseStoreTransactionManager;
4746

4847

@@ -82,7 +81,7 @@ public abstract class EclipseStoreClientConfiguration implements EclipseStoreSto
8281
@Value("${spring-data-eclipse-store.context-close-shutdown-storage.only-when-dev-tools:true}")
8382
protected boolean contextCloseShutdownStorageOnlyWhenDevTools;
8483

85-
protected Optional<MicroMigrater> possibleMigrater;
84+
protected MicroMigrater possibleMigrater;
8685

8786
/**
8887
* Upstream value from Spring Boot DevTools.
@@ -104,7 +103,20 @@ protected EclipseStoreClientConfiguration(
104103
this.classLoaderProvider = classLoaderProvider;
105104
this.defaultEclipseStoreProperties.setAutoStart(false);
106105
this.defaultEclipseStoreProvider = defaultEclipseStoreProvider;
107-
this.possibleMigrater = possibleMigrater;
106+
this.possibleMigrater = possibleMigrater.orElse(null);
107+
}
108+
109+
protected EclipseStoreClientConfiguration(
110+
final EclipseStoreProperties defaultEclipseStoreProperties,
111+
final EmbeddedStorageFoundationFactory defaultEclipseStoreProvider,
112+
final ClassLoaderProvider classLoaderProvider)
113+
{
114+
this(
115+
defaultEclipseStoreProperties,
116+
defaultEclipseStoreProvider,
117+
classLoaderProvider,
118+
Optional.empty()
119+
);
108120
}
109121

110122
public EclipseStoreProperties getEclipseStoreProperties()
@@ -224,28 +236,26 @@ public Validator getValidator()
224236
}
225237
}
226238

227-
@PostConstruct
228-
public void migrateDataOnPostConstruct()
239+
@EventListener
240+
public void migrateDataOnContextStarted(final ContextRefreshedEvent event)
229241
{
230242
// "Why don't you migrate the data wherever you call EclipseStoreMigrator.migrateStructure?" -
231243
// Because in order to be able to access repositories in DataMigrationScripts, we can't have
232-
// the migration-method block the start of the storage. That would lead to a deadlock and we don't
244+
// the migration-method block the start of the storage. That would lead to a deadlock, and we don't
233245
// want that.
234-
final EmbeddedStorageManager instanceOfStorageManager =
235-
this.getStorageInstance().getInstanceOfStorageManager();
236-
EclipseStoreMigrator.migrateData(
237-
this.getStorageInstance().getRoot().getDataVersion(),
238-
this.getDataMigrator(),
239-
instanceOfStorageManager
240-
);
246+
if(this.getDataMigrator() != null)
247+
{
248+
this.getStorageInstance().start(); // In case the storage hasn't started yet.
249+
EclipseStoreMigrator.migrateData(
250+
this.getStorageInstance().getRoot(),
251+
this.getDataMigrator(),
252+
this.getStorageInstance().getInstanceOfStorageManager()
253+
);
254+
}
241255
}
242256

243257
public MicroMigrater getDataMigrator()
244258
{
245-
if(this.possibleMigrater != null && this.possibleMigrater.isPresent())
246-
{
247-
return this.possibleMigrater.get();
248-
}
249-
return null;
259+
return this.possibleMigrater;
250260
}
251261
}
Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
* See the License for the specific language governing permissions and
1414
* limitations under the License.
1515
*/
16-
package software.xdev.spring.data.eclipse.store.repository;
16+
package software.xdev.spring.data.eclipse.store.repository.root;
1717

1818
import java.util.TreeSet;
1919

@@ -24,7 +24,6 @@
2424
import software.xdev.micromigration.migrater.MicroMigrater;
2525
import software.xdev.micromigration.scripts.VersionAgnosticMigrationScript;
2626
import software.xdev.micromigration.version.MigrationVersion;
27-
import software.xdev.spring.data.eclipse.store.repository.root.VersionedRoot;
2827
import software.xdev.spring.data.eclipse.store.repository.root.data.version.DataVersion;
2928
import software.xdev.spring.data.eclipse.store.repository.root.update.scripts.v2_0_0_InitializeVersioning;
3029
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
4948
}
5049

5150
public static void migrateData(
52-
final DataVersion versionedData,
51+
final VersionedRoot versionedRoot,
5352
final MicroMigrater migrater,
5453
final EmbeddedStorageManager storageManager)
5554
{
5655
if(migrater != null)
5756
{
58-
new MigrationManager(versionedData, migrater, storageManager).migrate(versionedData);
57+
final DataVersion dataVersion = versionedRoot.getDataVersion();
58+
new MigrationManager(
59+
dataVersion::getVersion,
60+
dataVersion::setVersion,
61+
newVersion -> EclipseStoreMigrator.versionStorer(versionedRoot, storageManager, newVersion),
62+
migrater,
63+
storageManager)
64+
.migrate(dataVersion);
5965
}
6066
}
6167

68+
private static void versionStorer(
69+
final VersionedRoot versionedRoot,
70+
final EmbeddedStorageManager currentStorageManager,
71+
final MigrationVersion newVersion)
72+
{
73+
currentStorageManager.store(versionedRoot);
74+
currentStorageManager.store(versionedRoot.getDataVersion());
75+
currentStorageManager.store(newVersion);
76+
}
77+
6278
public static MigrationVersion getLatestVersion()
6379
{
6480
final ExplicitMigrater migrater = new ExplicitMigrater(SCRIPTS);

spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/root/VersionedRoot.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@
1717

1818
import software.xdev.micromigration.version.MigrationVersion;
1919
import software.xdev.micromigration.version.Versioned;
20-
import software.xdev.spring.data.eclipse.store.repository.EclipseStoreMigrator;
2120
import software.xdev.spring.data.eclipse.store.repository.Root;
2221
import software.xdev.spring.data.eclipse.store.repository.root.data.version.DataVersion;
2322
import software.xdev.spring.data.eclipse.store.repository.root.v2_4.RootDataV2_4;
@@ -110,6 +109,10 @@ public MigrationVersion getVersion()
110109

111110
public DataVersion getDataVersion()
112111
{
112+
if(this.dataVersion == null)
113+
{
114+
this.dataVersion = new DataVersion();
115+
}
113116
return this.dataVersion;
114117
}
115118
}
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,85 @@
1+
/*
2+
* Copyright © 2024 XDEV Software (https://xdev.software)
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* http://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
116
package software.xdev.spring.data.eclipse.store.repository.root.data.version;
217

318
import java.util.List;
19+
import java.util.TreeSet;
20+
import java.util.function.Consumer;
421

522
import org.springframework.beans.factory.annotation.Autowired;
23+
import org.springframework.context.annotation.Lazy;
624
import org.springframework.stereotype.Component;
725

826
import software.xdev.micromigration.migrater.ExplicitMigrater;
9-
import software.xdev.micromigration.migrater.VersionAlreadyRegisteredException;
27+
import software.xdev.micromigration.migrater.MicroMigrater;
28+
import software.xdev.micromigration.notification.ScriptExecutionNotificationWithScriptReference;
29+
import software.xdev.micromigration.scripts.VersionAgnosticMigrationScript;
30+
import software.xdev.micromigration.version.MigrationVersion;
31+
import software.xdev.micromigration.versionagnostic.VersionAgnosticMigrationEmbeddedStorageManager;
1032

1133

1234
@Component
13-
public class DataMigrater extends ExplicitMigrater
35+
public class DataMigrater implements MicroMigrater
1436
{
15-
public DataMigrater(@Autowired final List<DataMigrationScript> scripts) throws VersionAlreadyRegisteredException
37+
@Lazy
38+
@Autowired
39+
private List<DataMigrationScript> scripts;
40+
41+
private ExplicitMigrater explicitMigrater;
42+
43+
private ExplicitMigrater ensureExplicitMigrater()
1644
{
17-
super(scripts.toArray(DataMigrationScript[]::new));
45+
if(this.explicitMigrater == null)
46+
{
47+
this.explicitMigrater = new ExplicitMigrater(this.scripts.toArray(DataMigrationScript[]::new));
48+
}
49+
return this.explicitMigrater;
50+
}
51+
52+
@Override
53+
public TreeSet<? extends VersionAgnosticMigrationScript<?, ?>> getSortedScripts()
54+
{
55+
return this.ensureExplicitMigrater().getSortedScripts();
56+
}
57+
58+
@Override
59+
public <E extends VersionAgnosticMigrationEmbeddedStorageManager<?, ?>> MigrationVersion migrateToNewest(
60+
final MigrationVersion fromVersion,
61+
final E storageManager,
62+
final Object root)
63+
{
64+
return this.ensureExplicitMigrater().migrateToNewest(fromVersion, storageManager, root);
65+
}
66+
67+
@Override
68+
public <E extends VersionAgnosticMigrationEmbeddedStorageManager<?, ?>> MigrationVersion migrateToVersion(
69+
final MigrationVersion fromVersion,
70+
final MigrationVersion targetVersion,
71+
final E storageManager,
72+
final Object objectToMigrate)
73+
{
74+
return this.ensureExplicitMigrater()
75+
.migrateToVersion(fromVersion, targetVersion, storageManager, objectToMigrate);
76+
}
77+
78+
@Override
79+
public void registerNotificationConsumer(
80+
final Consumer<ScriptExecutionNotificationWithScriptReference> notificationConsumer
81+
)
82+
{
83+
this.ensureExplicitMigrater().registerNotificationConsumer(notificationConsumer);
1884
}
1985
}

spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/root/data/version/DataMigrationScript.java

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,18 @@
1+
/*
2+
* Copyright © 2024 XDEV Software (https://xdev.software)
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* http://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
116
package software.xdev.spring.data.eclipse.store.repository.root.data.version;
217

318
import org.springframework.stereotype.Component;

spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/root/data/version/DataVersion.java

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,18 @@
1+
/*
2+
* Copyright © 2024 XDEV Software (https://xdev.software)
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* http://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
116
package software.xdev.spring.data.eclipse.store.repository.root.data.version;
217

318
import java.util.ArrayList;

spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/root/update/scripts/LoggingUpdateScript.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,12 +21,13 @@
2121
import software.xdev.micromigration.eclipsestore.MigrationEmbeddedStorageManager;
2222
import software.xdev.micromigration.scripts.Context;
2323
import software.xdev.micromigration.scripts.ReflectiveVersionMigrationScript;
24+
import software.xdev.spring.data.eclipse.store.repository.root.EclipseStoreMigrator;
2425
import software.xdev.spring.data.eclipse.store.repository.root.VersionedRoot;
2526

2627

2728
/**
2829
* <b>All migration scripts must be added to
29-
* {@link software.xdev.spring.data.eclipse.store.repository.EclipseStoreMigrator#SCRIPTS}!</b>
30+
* {@link EclipseStoreMigrator#SCRIPTS}!</b>
3031
*/
3132
public abstract class LoggingUpdateScript
3233
extends ReflectiveVersionMigrationScript<VersionedRoot, MigrationEmbeddedStorageManager>

spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/root/update/scripts/v2_0_0_InitializeVersioning.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020

2121
import software.xdev.micromigration.eclipsestore.MigrationEmbeddedStorageManager;
2222
import software.xdev.micromigration.scripts.Context;
23+
import software.xdev.spring.data.eclipse.store.repository.root.EclipseStoreMigrator;
2324
import software.xdev.spring.data.eclipse.store.repository.root.RootDataV2;
2425
import software.xdev.spring.data.eclipse.store.repository.root.VersionedRoot;
2526
import software.xdev.spring.data.eclipse.store.repository.root.v2_4.EntityData;
@@ -30,7 +31,7 @@
3031
* version of Root({@link RootDataV2}).
3132
* <p>
3233
* <b>All migration scripts must be added to
33-
* {@link software.xdev.spring.data.eclipse.store.repository.EclipseStoreMigrator#SCRIPTS}!</b>
34+
* {@link EclipseStoreMigrator#SCRIPTS}!</b>
3435
*/
3536
@SuppressWarnings({"checkstyle:TypeName", "deprecation"})
3637
public class v2_0_0_InitializeVersioning extends LoggingUpdateScript

spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/root/update/scripts/v2_4_0_InitializeLazy.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020

2121
import software.xdev.micromigration.eclipsestore.MigrationEmbeddedStorageManager;
2222
import software.xdev.micromigration.scripts.Context;
23+
import software.xdev.spring.data.eclipse.store.repository.root.EclipseStoreMigrator;
2324
import software.xdev.spring.data.eclipse.store.repository.root.RootDataV2;
2425
import software.xdev.spring.data.eclipse.store.repository.root.VersionedRoot;
2526

@@ -29,7 +30,7 @@
2930
* version of Root({@link RootDataV2}).
3031
* <p>
3132
* <b>All migration scripts must be added to
32-
* {@link software.xdev.spring.data.eclipse.store.repository.EclipseStoreMigrator#SCRIPTS}!</b>
33+
* {@link EclipseStoreMigrator#SCRIPTS}!</b>
3334
*/
3435
@SuppressWarnings({"checkstyle:TypeName", "deprecation"})
3536
public class v2_4_0_InitializeLazy extends LoggingUpdateScript

0 commit comments

Comments
 (0)