Skip to content

Commit f16525d

Browse files
First try with implementing DataMigrator
1 parent 072879a commit f16525d

18 files changed

Lines changed: 332 additions & 18 deletions

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

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,9 +21,11 @@
2121

2222
import software.xdev.micromigration.eclipsestore.MigrationManager;
2323
import software.xdev.micromigration.migrater.ExplicitMigrater;
24+
import software.xdev.micromigration.migrater.MicroMigrater;
2425
import software.xdev.micromigration.scripts.VersionAgnosticMigrationScript;
2526
import software.xdev.micromigration.version.MigrationVersion;
2627
import software.xdev.spring.data.eclipse.store.repository.root.VersionedRoot;
28+
import software.xdev.spring.data.eclipse.store.repository.root.data.version.DataVersion;
2729
import software.xdev.spring.data.eclipse.store.repository.root.update.scripts.v2_0_0_InitializeVersioning;
2830
import software.xdev.spring.data.eclipse.store.repository.root.update.scripts.v2_4_0_InitializeLazy;
2931

@@ -40,12 +42,23 @@ private EclipseStoreMigrator()
4042
{
4143
}
4244

43-
public static void migrate(final VersionedRoot versionedRoot, final EmbeddedStorageManager storageManager)
45+
public static void migrateStructure(final VersionedRoot versionedRoot, final EmbeddedStorageManager storageManager)
4446
{
4547
final ExplicitMigrater migrater = new ExplicitMigrater(SCRIPTS);
4648
new MigrationManager(versionedRoot, migrater, storageManager).migrate(versionedRoot);
4749
}
4850

51+
public static void migrateData(
52+
final DataVersion versionedData,
53+
final MicroMigrater migrater,
54+
final EmbeddedStorageManager storageManager)
55+
{
56+
if(migrater != null)
57+
{
58+
new MigrationManager(versionedData, migrater, storageManager).migrate(versionedData);
59+
}
60+
}
61+
4962
public static MigrationVersion getLatestVersion()
5063
{
5164
final ExplicitMigrater migrater = new ExplicitMigrater(SCRIPTS);

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

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
import java.util.HashMap;
2121
import java.util.Map;
2222
import java.util.concurrent.ConcurrentHashMap;
23+
import java.util.function.Supplier;
2324

2425
import org.eclipse.serializer.persistence.binary.jdk17.java.util.BinaryHandlerImmutableCollectionsList12;
2526
import org.eclipse.serializer.persistence.binary.jdk17.java.util.BinaryHandlerImmutableCollectionsSet12;
@@ -32,6 +33,7 @@
3233
import org.slf4j.Logger;
3334
import org.slf4j.LoggerFactory;
3435

36+
import software.xdev.micromigration.migrater.MicroMigrater;
3537
import software.xdev.spring.data.eclipse.store.core.EntityListProvider;
3638
import software.xdev.spring.data.eclipse.store.core.EntityProvider;
3739
import software.xdev.spring.data.eclipse.store.exceptions.AlreadyRegisteredException;
@@ -40,6 +42,7 @@
4042
import software.xdev.spring.data.eclipse.store.repository.config.EclipseStoreStorageFoundationProvider;
4143
import software.xdev.spring.data.eclipse.store.repository.interfaces.EclipseStoreRepository;
4244
import software.xdev.spring.data.eclipse.store.repository.root.VersionedRoot;
45+
import software.xdev.spring.data.eclipse.store.repository.root.data.version.DataVersion;
4346
import software.xdev.spring.data.eclipse.store.repository.root.v2_4.EntityData;
4447
import software.xdev.spring.data.eclipse.store.repository.support.SimpleEclipseStoreRepository;
4548
import software.xdev.spring.data.eclipse.store.repository.support.concurrency.ReadWriteLock;
@@ -77,6 +80,7 @@ public class EclipseStoreStorage
7780
private final Map<Class<?>, VersionManager<?>> versionManagers = new ConcurrentHashMap<>();
7881
private final EclipseStoreStorageFoundationProvider foundationProvider;
7982
private final ClassLoaderProvider classLoaderProvider;
83+
private final Supplier<MicroMigrater> dataMigraterProvider;
8084
private EntitySetCollector entitySetCollector;
8185
private PersistableChecker persistenceChecker;
8286
private EmbeddedStorageManager storageManager;
@@ -90,9 +94,10 @@ public EclipseStoreStorage(final EclipseStoreClientConfiguration storeConfigurat
9094
{
9195
this.foundationProvider = storeConfiguration;
9296
this.classLoaderProvider = storeConfiguration.getClassLoaderProvider();
97+
this.dataMigraterProvider = storeConfiguration::getDataMigrator;
9398
}
9499

95-
public StorageManager getInstanceOfStorageManager()
100+
public EmbeddedStorageManager getInstanceOfStorageManager()
96101
{
97102
this.ensureEntitiesInRoot();
98103
return this.storageManager;
@@ -120,7 +125,7 @@ private synchronized void ensureEntitiesInRoot()
120125
this.root.getCurrentRootData().getEntityTypesCount(),
121126
this.root.getCurrentRootData().getEntityCount()
122127
);
123-
EclipseStoreMigrator.migrate(this.root, this.storageManager);
128+
EclipseStoreMigrator.migrateStructure(this.root, this.storageManager);
124129
}
125130
}
126131

@@ -492,6 +497,11 @@ public Object getObject(final long objectId)
492497
return this.storageManager.getObject(objectId);
493498
}
494499

500+
public DataVersion getDataVersion()
501+
{
502+
return this.getRoot().getDataVersion();
503+
}
504+
495505
@Override
496506
public ReadWriteLock getReadWriteLock()
497507
{

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,8 @@
2222

2323

2424
/**
25-
* This is the root object for all versions <2.0.0 and is used for upgrading to the new root.
26-
* @deprecated should not be initialised any more. Version for <2.0.0
25+
* This is the root object for all versions {@literal <}2.0.0 and is used for upgrading to the new root.
26+
* @deprecated should not be initialised any more. Version for {@literal <}2.0.0
2727
*/
2828
@Deprecated(forRemoval = false, since = "2.0.0")
2929
public class Root

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

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,11 +15,15 @@
1515
*/
1616
package software.xdev.spring.data.eclipse.store.repository.config;
1717

18+
import java.util.Optional;
19+
1820
import org.eclipse.serializer.reflect.ClassLoaderProvider;
1921
import org.eclipse.store.integrations.spring.boot.types.configuration.EclipseStoreProperties;
2022
import org.eclipse.store.integrations.spring.boot.types.factories.EmbeddedStorageFoundationFactory;
2123
import org.springframework.context.annotation.Configuration;
2224

25+
import software.xdev.micromigration.migrater.MicroMigrater;
26+
2327

2428
/**
2529
* Provides the Default implementation of an {@link EclipseStoreClientConfiguration}. The class can't be final because
@@ -31,8 +35,9 @@ public class DefaultEclipseStoreClientConfiguration extends EclipseStoreClientCo
3135
protected DefaultEclipseStoreClientConfiguration(
3236
final EclipseStoreProperties defaultEclipseStoreProperties,
3337
final EmbeddedStorageFoundationFactory defaultEclipseStoreProvider,
34-
final ClassLoaderProvider classLoaderProvider)
38+
final ClassLoaderProvider classLoaderProvider,
39+
final Optional<MicroMigrater> possibleMigrater)
3540
{
36-
super(defaultEclipseStoreProperties, defaultEclipseStoreProvider, classLoaderProvider);
41+
super(defaultEclipseStoreProperties, defaultEclipseStoreProvider, classLoaderProvider, possibleMigrater);
3742
}
3843
}

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

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,13 +15,17 @@
1515
*/
1616
package software.xdev.spring.data.eclipse.store.repository.config;
1717

18+
import java.util.Optional;
19+
1820
import org.eclipse.serializer.reflect.ClassLoaderProvider;
1921
import org.eclipse.store.integrations.spring.boot.types.configuration.EclipseStoreProperties;
2022
import org.eclipse.store.integrations.spring.boot.types.factories.EmbeddedStorageFoundationFactory;
2123
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
2224
import org.springframework.context.annotation.Bean;
2325
import org.springframework.stereotype.Component;
2426

27+
import software.xdev.micromigration.migrater.MicroMigrater;
28+
2529

2630
@Component
2731
public class DefaultEclipseStoreClientConfigurationFactory
@@ -31,11 +35,13 @@ public class DefaultEclipseStoreClientConfigurationFactory
3135
public DefaultEclipseStoreClientConfiguration getEclipseStoreClientConfiguration(
3236
final EclipseStoreProperties defaultEclipseStoreProperties,
3337
final EmbeddedStorageFoundationFactory defaultEclipseStoreProvider,
34-
final ClassLoaderProvider classLoaderProvider)
38+
final ClassLoaderProvider classLoaderProvider,
39+
final Optional<MicroMigrater> possibleMigrater)
3540
{
3641
return new DefaultEclipseStoreClientConfiguration(
3742
defaultEclipseStoreProperties,
3843
defaultEclipseStoreProvider,
39-
classLoaderProvider);
44+
classLoaderProvider,
45+
possibleMigrater);
4046
}
4147
}

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

Lines changed: 38 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,9 @@
1515
*/
1616
package software.xdev.spring.data.eclipse.store.repository.config;
1717

18+
import java.util.Optional;
19+
20+
import jakarta.annotation.PostConstruct;
1821
import jakarta.validation.Validation;
1922
import jakarta.validation.Validator;
2023
import jakarta.validation.ValidatorFactory;
@@ -23,6 +26,7 @@
2326
import org.eclipse.store.integrations.spring.boot.types.configuration.EclipseStoreProperties;
2427
import org.eclipse.store.integrations.spring.boot.types.factories.EmbeddedStorageFoundationFactory;
2528
import org.eclipse.store.storage.embedded.types.EmbeddedStorageFoundation;
29+
import org.eclipse.store.storage.embedded.types.EmbeddedStorageManager;
2630
import org.slf4j.Logger;
2731
import org.slf4j.LoggerFactory;
2832
import org.springframework.beans.factory.ObjectProvider;
@@ -36,6 +40,8 @@
3640
import org.springframework.context.event.EventListener;
3741
import org.springframework.transaction.PlatformTransactionManager;
3842

43+
import software.xdev.micromigration.migrater.MicroMigrater;
44+
import software.xdev.spring.data.eclipse.store.repository.EclipseStoreMigrator;
3945
import software.xdev.spring.data.eclipse.store.repository.EclipseStoreStorage;
4046
import software.xdev.spring.data.eclipse.store.transactions.EclipseStoreTransactionManager;
4147

@@ -76,6 +82,8 @@ public abstract class EclipseStoreClientConfiguration implements EclipseStoreSto
7682
@Value("${spring-data-eclipse-store.context-close-shutdown-storage.only-when-dev-tools:true}")
7783
protected boolean contextCloseShutdownStorageOnlyWhenDevTools;
7884

85+
protected Optional<MicroMigrater> possibleMigrater;
86+
7987
/**
8088
* Upstream value from Spring Boot DevTools.
8189
*
@@ -84,16 +92,19 @@ public abstract class EclipseStoreClientConfiguration implements EclipseStoreSto
8492
@Value("${spring.devtools.restart.enabled:true}")
8593
protected boolean springDevtoolsRestartEnabled;
8694

95+
@SuppressWarnings("OptionalUsedAsFieldOrParameterType")
8796
@Autowired
8897
protected EclipseStoreClientConfiguration(
8998
final EclipseStoreProperties defaultEclipseStoreProperties,
9099
final EmbeddedStorageFoundationFactory defaultEclipseStoreProvider,
91-
final ClassLoaderProvider classLoaderProvider)
100+
final ClassLoaderProvider classLoaderProvider,
101+
final Optional<MicroMigrater> possibleMigrater)
92102
{
93103
this.defaultEclipseStoreProperties = defaultEclipseStoreProperties;
94104
this.classLoaderProvider = classLoaderProvider;
95105
this.defaultEclipseStoreProperties.setAutoStart(false);
96106
this.defaultEclipseStoreProvider = defaultEclipseStoreProvider;
107+
this.possibleMigrater = possibleMigrater;
97108
}
98109

99110
public EclipseStoreProperties getEclipseStoreProperties()
@@ -207,9 +218,34 @@ public void shutdownStorageOnContextClosed(final ContextClosedEvent event)
207218
@Bean
208219
public Validator getValidator()
209220
{
210-
try(ValidatorFactory factory = Validation.buildDefaultValidatorFactory())
221+
try(final ValidatorFactory factory = Validation.buildDefaultValidatorFactory())
211222
{
212223
return factory.getValidator();
213224
}
214225
}
226+
227+
@PostConstruct
228+
public void migrateDataOnPostConstruct()
229+
{
230+
// "Why don't you migrate the data wherever you call EclipseStoreMigrator.migrateStructure?" -
231+
// 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
233+
// want that.
234+
final EmbeddedStorageManager instanceOfStorageManager =
235+
this.getStorageInstance().getInstanceOfStorageManager();
236+
EclipseStoreMigrator.migrateData(
237+
this.getStorageInstance().getRoot().getDataVersion(),
238+
this.getDataMigrator(),
239+
instanceOfStorageManager
240+
);
241+
}
242+
243+
public MicroMigrater getDataMigrator()
244+
{
245+
if(this.possibleMigrater != null && this.possibleMigrater.isPresent())
246+
{
247+
return this.possibleMigrater.get();
248+
}
249+
return null;
250+
}
215251
}

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,8 @@
2424

2525

2626
/**
27-
* This is a object for all versions <2.4.0 and is used for upgrading to the new root.
28-
* @deprecated should not be initialised anymore. Version for <2.4.0
27+
* This is a object for all versions {@literal <}2.4.0 and is used for upgrading to the new root.
28+
* @deprecated should not be initialised anymore. Version for {@literal <}2.4.0
2929
*
3030
* @param <T> type of entity to store
3131
* @param <ID> type of id of the entity to store. Can be {@link Void} if no ID is used.

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,8 @@
2121

2222

2323
/**
24-
* This is a object for all versions <2.4.0 and is used for upgrading to the new root.
25-
* @deprecated should not be initialised anymore. Version for <2.4.0
24+
* This is a object for all versions {@literal <}2.4.0 and is used for upgrading to the new root.
25+
* @deprecated should not be initialised anymore. Version for {@literal <}2.4.0
2626
*/
2727
@Deprecated(forRemoval = false, since = "2.4.0")
2828
@SuppressWarnings({"java:S119", "unchecked"})

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

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
import software.xdev.micromigration.version.Versioned;
2020
import software.xdev.spring.data.eclipse.store.repository.EclipseStoreMigrator;
2121
import software.xdev.spring.data.eclipse.store.repository.Root;
22+
import software.xdev.spring.data.eclipse.store.repository.root.data.version.DataVersion;
2223
import software.xdev.spring.data.eclipse.store.repository.root.v2_4.RootDataV2_4;
2324

2425

@@ -27,6 +28,8 @@ public class VersionedRoot implements Versioned
2728
{
2829
private MigrationVersion version;
2930

31+
private DataVersion dataVersion;
32+
3033
private Root rootDataV1;
3134

3235
private RootDataV2 rootDataV2;
@@ -40,7 +43,7 @@ public VersionedRoot()
4043
}
4144

4245
/**
43-
* @param rootDataV1 is only filled if this is a old version <2.0.0 and needs upgrading
46+
* @param rootDataV1 is only filled if this is a old version {@literal <}2.0.0 and needs upgrading
4447
*/
4548
public VersionedRoot(final Root rootDataV1)
4649
{
@@ -104,4 +107,9 @@ public MigrationVersion getVersion()
104107
{
105108
return this.version;
106109
}
110+
111+
public DataVersion getDataVersion()
112+
{
113+
return this.dataVersion;
114+
}
107115
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package software.xdev.spring.data.eclipse.store.repository.root.data.version;
2+
3+
import java.util.List;
4+
5+
import org.springframework.beans.factory.annotation.Autowired;
6+
import org.springframework.stereotype.Component;
7+
8+
import software.xdev.micromigration.migrater.ExplicitMigrater;
9+
import software.xdev.micromigration.migrater.VersionAlreadyRegisteredException;
10+
11+
12+
@Component
13+
public class DataMigrater extends ExplicitMigrater
14+
{
15+
public DataMigrater(@Autowired final List<DataMigrationScript> scripts) throws VersionAlreadyRegisteredException
16+
{
17+
super(scripts.toArray(DataMigrationScript[]::new));
18+
}
19+
}

0 commit comments

Comments
 (0)