Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
<dependency>
<groupId>one.microstream</groupId>
<artifactId>filesystem.oraclenosql</artifactId>
<version>04.00.00-MS-GA</version>
</dependency>KVStore kvstore = KVStoreFactory.getStore(
new KVStoreConfig("kvstore", "kvlite:5000")
);
BlobStoreFileSystem fileSystem = BlobStoreFileSystem.New(
OracleNoSqlConnector.Caching(kvstore)
);
EmbeddedStorage.start(fileSystem.ensureDirectoryPath("microstream_storage"));<dependency>
<groupId>one.microstream</groupId>
<artifactId>filesystem.oraclecloud</artifactId>
<version>04.00.00-MS-GA</version>
</dependency>ObjectStorageClient client = ...;
BlobStoreFileSystem fileSystem = BlobStoreFileSystem.New(
OracleCloudObjectStorageConnector.Caching(client)
);
EmbeddedStorage.start(fileSystem.ensureDirectoryPath("microstream_storage"));<dependency>
<groupId>one.microstream</groupId>
<artifactId>filesystem.coherence</artifactId>
<version>04.00.00-MS-GA</version>
</dependency>NamedCache cache = CacheFactory.getCache("cache-name");
BlobStoreFileSystem fileSystem = BlobStoreFileSystem.New(
CoherenceConnector.Caching(cache)
);
EmbeddedStorage.start(fileSystem.ensureDirectoryPath("microstream_storage"));EmbeddedStorageManager storageManager = EmbeddedStorage
.Foundation()
.setLockFileSetupProvider(Storage.LockFileSetupProvider())
.start();NioFileSystem fileSystem = NioFileSystem.New();
EmbeddedStorage.start(fileSystem.ensureDirectoryPath("path", "to", "storage"));<properties>
<property name="backupDirectory" value ="/save/backup" />
...
</properties>backupDirectory = backupDir
EmbeddedStorageManager storageManager = Configuration.Default()
.setBackupDirectory("A safe place")
.createEmbeddedStorageFoundation()
.createEmbeddedStorageManager();<dependency>
<groupId>one.microstream</groupId>
<artifactId>filesystem.sql</artifactId>
<version>04.00.00-MS-GA</version>
</dependency>
<dependency>
<groupId>org.xerial</groupId>
<artifactId>sqlite-jdbc</artifactId>
<version>3.32.3</version>
</dependency>SQLiteDataSource dataSource = new SQLiteDataSource();
dataSource.setUrl("jdbc:sqlite:microstreamdb");
SqlFileSystem fileSystem = SqlFileSystem.New(
SqlConnector.Caching(
SqlProviderSqlite.New(dataSource)
)
);
EmbeddedStorage.start(fileSystem.ensureDirectoryPath("microstream_storage"));
<dependency>
<groupId>one.microstream</groupId>
<artifactId>filesystem.sql</artifactId>
<version>04.00.00-MS-GA</version>
</dependency>
<dependency>
<groupId>com.oracle.database.jdbc</groupId>
<artifactId>ojdbc8</artifactId>
<version>19.7.0.0</version>
</dependency>OracleDataSource dataSource = new OracleDataSource();
dataSource.setURL("jdbc:oracle:thin:@localhost:1521/db");
dataSource.setUser("user");
dataSource.setPassword("secret");
SqlFileSystem fileSystem = SqlFileSystem.New(
SqlConnector.Caching(
SqlProviderOracle.New(dataSource)
)
);
EmbeddedStorage.start(fileSystem.ensureDirectoryPath("microstream_storage"));<dependency>
<groupId>one.microstream</groupId>
<artifactId>filesystem.sql</artifactId>
<version>04.00.00-MS-GA</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.21</version>
</dependency>MysqlDataSource dataSource = new MysqlDataSource();
dataSource.setUrl("jdbc:mysql://host:3306/mydb");
dataSource.setUser("user");
dataSource.setPassword("secret");
SqlFileSystem fileSystem = SqlFileSystem.New(
SqlConnector.Caching(
SqlProviderMySql.New(dataSource)
)
);
EmbeddedStorage.start(fileSystem.ensureDirectoryPath("microstream_storage"));
StorageFileNameProvider fileNameProvider = StorageFileNameProvider.Builder()
.setChannelDirectoryPrefix("canal_")
.setDataFilePrefix ("canal_")
.setDataFileSuffix (".bin")
.setTransactionsFilePrefix("events_")
.setTransactionsFileSuffix(".bin")
.setTypeDictionaryFileName("typeDictionary.txt")
.createFileNameProvider ()
;
NioFileSystem fileSystem = NioFileSystem.New();
StorageLiveFileProvider fileProvider = Storage
.FileProviderBuilder (fileSystem)
.setDirectory (fileSystem.ensureDirectoryPath(WORKINGDIR))
.setDeletionDirectory (fileSystem.ensureDirectoryPath(DELETIONDIR))
.setTruncationDirectory(fileSystem.ensureDirectoryPath(TRUNCATIONDIR))
.setFileNameProvider (fileNameProvider)
.createFileProvider ()
;NioFileSystem fileSystem = NioFileSystem.New();
StorageBackupSetup backupSetup = StorageBackupSetup.New(
Storage.BackupFileProviderBuilder(fileSystem)
.setDirectory(fileSystem.ensureDirectoryPath(BACKUPDIR))
.setTruncationDirectory(fileSystem.ensureDirectoryPath(TRUNCATIONDIR))
.setDeletionDirectory(fileSystem.ensureDirectoryPath(DELETIONDIR))
.createFileProvider()
);
StorageConfiguration configuration = StorageConfiguration.Builder()
.setBackupSetup(backupSetup)
.setStorageFileProvider(StorageLiveFileProvider.New(
fileSystem.ensureDirectoryPath(WORKINGDIR)
))
.createConfiguration()
;List subset = myCollection.getSubset();
subset.foreach(item -> item.modify());
storage.storeAll(subset);storage.storeAll(itemA, iteamB, iteamC);EmbeddedStorage.start(Paths.get("path", "to", "storage"));NioFileSystem fileSystem = NioFileSystem.New();
EmbeddedStorage.start(fileSystem.ensureDirectoryPath("path", "to", "storage"));<!-- sql file system -->
<dependency>
<groupId>one.microstream</groupId>
<artifactId>filesystem.sql</artifactId>
<version>04.00.00-MS-GA</version>
</dependency>
<!-- driver of your choice -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.21</version>
</dependency>
// create JDBC data source
MysqlDataSource dataSource = new MysqlDataSource();
dataSource.setUrl("jdbc:mysql://host:3306/mydb");
dataSource.setUser("user");
dataSource.setPassword("secret");
// create sql file system
SqlFileSystem fileSystem = SqlFileSystem.New(
// use caching connector
SqlConnector.Caching(
SqlProviderMySql.New(dataSource)
)
);
EmbeddedStorage.start(fileSystem.ensureDirectoryPath("path", "to", "storage"));
PersonUpdater.New(mike)
.firstName("Jim")
.lastName("Hope")
.update();PersonUpdater.setFirstName(mike, "Jim");CacheConfiguration.Load() the default configuration file is used, which is either a file in the classpath root named microstream-cache.properties, or the path configured via the system property microstream.cache.configuration.path.CachingProvider provider = Caching.getCachingProvider();
CacheManager cacheManager = provider.getCacheManager();
CacheConfiguration<Integer, String> configuration = CacheConfiguration
.Builder(Integer.class, String.class)
.storeByValue()
.expiryPolicyFactory(CreatedExpiryPolicy.factoryOf(Duration.ONE_MINUTE))
.build();
Cache<Integer, String> cache = cacheManager.createCache("jCache", configuration);
cache.put(1, "Hello World");
String value = cache.get(1); EntityVersionContext<Long> versionContext =
EntityVersionContext.AutoIncrementingLong();
JulLogger logger = new JulLogger();
Person john = PersonCreator.New()
.addLayer(versionContext)
.addLayer(logger)
.firstName("John")
.lastName("Doe")
.create();EmbeddedStorageManager storage = EmbeddedStorage.Foundation(
Storage.ConfigurationBuilder()
.setHousekeepingController(Storage.HousekeepingController(1000, 10_000_000))
.createConfiguration())
.start();EmbeddedStorageManager storage = EmbeddedStorage.Foundation(
Storage.ConfigurationBuilder()
.setDataFileEvaluator(Storage.DataFileEvaluator(1024*1024, 1024*1024*8, 0.75))
.createConfiguration())
.start();EmbeddedStorageManager storage = EmbeddedStorage.Foundation(
Storage.ConfigurationBuilder()
.setEntityCacheEvaluator(Storage.EntityCacheEvaluator(
86_400_000,
1_000_000_000))
.createConfiguration())
.start();
EmbeddedStorageManager storageManager = Configuration.Default()
.setChannelCount(4)
.setChannelDirectoryPrefix("channel_")
.setDataFilePrefix("channel_")
.setDataFileSuffix(".bin")
.createEmbeddedStorageFoundation()
.createEmbeddedStorageManager();
<properties>
<property name="channelCount" value="4" />
<property name="channelDirectoryPrefix" value="channel_" />
<property name="dataFilePrefix value="channel_" />
<property name="dataFileSuffix" value=".dat" />
</properties>channelCount = 4
channelDirectoryPrefix = prefix
dataFilePrefix = channel_
dataFileSuffix = .datNioFileSystem fileSystem = NioFileSystem.New();
EmbeddedStorageManager storage = EmbeddedStorage.Foundation(
Storage.ConfigurationBuilder()
.setChannelCountProvider(Storage.ChannelCountProvider(4))
.setStorageFileProvider(
StorageLiveFileProvider.Builder()
.setDirectory(fileSystem.ensureDirectoryPath("storage"))
.createFileProvider()
)
.createConfiguration()
)
.start();// Init storage manager
final EmbeddedStorageManager storageManager = EmbeddedStorage.start(root);
// Store the root object
storageManager.storeRoot();// Add a new data object to the list in root
MyData dataItem = new MyData("Alice");
root.myObjects.add(dataItem);
// Store the modified list
storageManager.store(root.myObjects);// Modify a value type memeber and store it
dataItem.setIntValue(100);
storageManager.store(dataItem);// Change a string object and store it
dataItem.setName("Bob");
storageManager.store(dataItem);CacheConfiguration<Integer, String> configuration = CacheConfiguration
.Load("cache-config.properties", Integer.class, String.class);<dependency>
<groupId>one.microstream</groupId>
<artifactId>jigsaw</artifactId>
<version>04.00.00-MS-GA</version>
</dependency><repositories>
<repository>
<id>microstream-releases</id>
<url>https://repo.microstream.one/repository/maven-public/</url>
</repository>
</repositories>
<dependencies>
<dependency>
<groupId>one.microstream</groupId>
<artifactId>storage.embedded</artifactId>
<version>04.00.00-MS-GA</version>
</dependency>
<dependency>
<groupId>one.microstream</groupId>
<artifactId>storage.embedded.configuration</artifactId>
<version>04.00.00-MS-GA</version>
</dependency>
</dependencies>// Initialize a storage manager ("the database") with purely defaults.
final EmbeddedStorageManager storageManager = EmbeddedStorage.start();
// print the last loaded root instance,
// replace it with a current version and store it
System.out.println(storageManager.root());
storageManager.setRoot("Hello World! @ " + new Date());
storageManager.storeRoot();
// shutdown storage
storageManager.shutdown();<repositories>
<repository>
<id>microstream-releases</id>
<url>https://repo.microstream.one/repository/maven-public/</url>
</repository>
</repositories>
<dependencies>
<dependency>
<groupId>one.microstream</groupId>
<artifactId>cache</artifactId>
<version>04.00.00-MS-GA</version>
</dependency>
</dependencies>CachingProvider provider = Caching.getCachingProvider();
CacheManager cacheManager = provider.getCacheManager();
MutableConfiguration<Integer, String> configuration = new MutableConfiguration<>()
.setTypes(Integer.class, String.class)
.setStoreByValue(false)
.setExpiryPolicyFactory(CreatedExpiryPolicy.factoryOf(Duration.ONE_MINUTE));
Cache<Integer, String> cache = cacheManager.createCache("jCache", configuration);
cache.put(1, "Hello World");
String value = cache.get(1); public class JulLogger implements EntityLogger
{
@Override
public void afterUpdate(
final Entity identity,
final Entity data,
final boolean successful)
{
Logger.getLogger(identity.getClass().getName())
.info("Entity updated");
}
}root.MyArrayList.remove(0);
storage.store(root.MyArrayList);Frequently Asked Questions - Answered
Lazy.get(Lazy)
Gets the lazy referenced object, loads it if required.
return value:
null if the lazy reference itself is null otherwise the referenced object
JulLogger logger = new JulLogger();
Person john = PersonCreator.New()
.addLayer(logger)
.firstName("John")
.lastName("Doe")
.create();spring.jpa.properties.hibernate.cache.microstream.missing_cache_strategy=create
spring.jpa.properties.hibernate.cache.region.factory_class=one.microstream.cache.hibernate.CacheRegionFactory
spring.jpa.properties.hibernate.cache.use_query_cache=true
spring.jpa.properties.hibernate.cache.use_second_level_cache=true
spring.jpa.properties.javax.persistence.sharedCache.mode=ALL<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>...</version>
</dependency><dependencies>
<dependency>
<groupId>one.microstream</groupId>
<artifactId>base</artifactId>
<version>04.00.00-MS-GA</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
<annotationProcessors>
<annotationProcessor>one.microstream.entity.codegen.EntityProcessor</annotationProcessor>
</annotationProcessors>
<compilerArgs>
<arg>-Amicrostream.entity.hashequalator=true</arg>
<arg>-Amicrostream.entity.appendable=true</arg>
</compilerArgs>
</configuration>
</plugin>
</plugins>
</build>
public class CustomEagerStoringFieldEvaluator
implements PersistenceEagerStoringFieldEvaluator
{
@Override
public boolean isEagerStoring(Class<?> clazz, Field field)
{
if(clazz == MyClass.class && field.getName().equals("eagerField")
{
return true;
}
return false;
}
}EmbeddedStorageManager storage = EmbeddedStorage.start();public class User
{
private String username;
//do not persist the users password
private transient String password;
}PersistenceFieldEvaluator fieldEvaluator =
(clazz, field) -> !field.getName().startsWith("_");
EmbeddedStorageManager storage = EmbeddedStorage.Foundation()
.onConnectionFoundation(
c -> c.setFieldEvaluatorPersistable(fieldEvaluator)
)
.createEmbeddedStorageManager()
.start();public List<Article> getUnAvailableArticles()
{
return shop.getArticles().stream()
.filter(a -> !a.available())
.collect(Collectors.toList())
;
}<dependencies>
<dependency>
<groupId>one.microstream</groupId>
<artifactId>base</artifactId>
<version>04.00.00-MS-GA</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
<annotationProcessors>
<annotationProcessor>one.microstream.wrapping.codegen.WrapperProcessor</annotationProcessor>
</annotationProcessors>
<compilerArgs>
<arg>-Amicrostream.wrapper.types=one.microstream.persistence.types.PersistenceStoring</arg>
</compilerArgs>
</configuration>
</plugin>
</plugins>
</build>
Persister fields can be customized via PersistenceFoundation#setFieldEvaluatorPersister.
Note, however, that the check for compatibility with the Persister type is done in any case to avoid inconsistencies/crashes.class MyEntity
{
String name ;
int value;
transient EmbeddedStorageManager storage;
}EmbeddedStorageManager storage = EmbeddedStorage.Foundation(Paths.get("mydb"))
.onConnectionFoundation(cf ->
cf.setClassLoaderProvider(ClassLoaderProvider.New(myClassLoader))
)
.start();public class DataRoot
{
private String content;
public DataRoot()
{
super();
}
public String getContent()
{
return this.content;
}
public void setContent(final String content)
{
this.content = content;
}
@Override
public String toString()
{
return "Root: " + this.content;
}
}// Application-specific root instance
final DataRoot root = new DataRoot();
// Initialize a storage manager ("the database") with the given directory.
final EmbeddedStorageManager storageManager = EmbeddedStorage.start(
root, // root object
Paths.get("data") // storage directory
);// Set content data to the root element, including the time to visualize
// changes on the next execution.
root.setContent("Hello World! @ " + new Date());
// Store the modified root and its content.
storageManager.storeRoot();storageManager.shutdown();NioFileSystem fileSystem = NioFileSystem.New();
EmbeddedStorageManager storageManager = EmbeddedStorageFoundation.New()
.setConfiguration(
StorageConfiguration.Builder()
.setStorageFileProvider(
Storage.FileProviderBuilder(fileSystem)
.setDirectory(fileSystem.ensureDirectoryPath("storageDir"))
.createFileProvider()
)
.setChannelCountProvider(StorageChannelCountProvider.New(4))
.setBackupSetup(StorageBackupSetup.New(
fileSystem.ensureDirectoryPath("backupDir")
))
.createConfiguration()
)
.createEmbeddedStorageManager();<repositories>
<repository>
<id>microstream-releases</id>
<url>https://repo.microstream.one/repository/maven-public/</url>
</repository>
</repositories>
<dependencies>
<dependency>
<groupId>one.microstream</groupId>
<artifactId>storage.embedded.configuration</artifactId>
<version>04.00.00-MS-GA</version>
</dependency>
</dependencies>EmbeddedStorageManager storageManager = Configuration.Default()
.setBaseDirectoryInUserHome("data-dir")
.setBackupDirectory("backup-dir")
.setChannelCount(4)
.createEmbeddedStorageFoundation()
.createEmbeddedStorageManager();Configuration configuration = Configuration.LoadXml(
HelloWorld.class.getResource("/META-INF/microstream/storage.xml")
);<?xml version="1.0" encoding="UTF-8"?>
<properties>
<property name="baseDirectory" value ="data" />
<property name="channelCount" value ="4" />
</properties>Configuration configuration = Configuration.LoadIni(
HelloWorld.class.getResource("/META-INF/microstream/storage.ini")
);baseDirectory = data
channelCount = 4EmbeddedStorageManager storageManager = EmbeddedStorage.start();
CachingProvider provider = (one.microstream.cache.CachingProvider)Caching.getCachingProvider();
CacheManager cacheManager = provider.getCacheManager();
CacheConfiguration<Integer, String> configuration = CacheConfiguration
.Builder(Integer.class, String.class, "jCache", storageManager)
.expiryPolicyFactory(CreatedExpiryPolicy.factoryOf(Duration.ONE_HOUR))
.build();
Cache<Integer, String> cache = cacheManager.createCache("jCache", configuration);
cache.put(1, "one");
String value = cache.get(1); PersonUpdater.setLastName(john, "Smith");Oct 15, 2019 11:17:53 AM JulLogger afterUpdate
INFO: Entity updatedspring:
jpa:
properties:
hibernate:
cache:
microstream:
missing_cache_strategy: create
region:
factory_class: one.microstream.cache.hibernate.CacheRegionFactory
use_query_cache: true
use_second_level_cache: true
javax:
persistence:
sharedCache:
mode: ALL<repositories>
<repository>
<id>microstream-releases</id>
<url>https://repo.microstream.one/repository/maven-public/</url>
</repository>
</repositories>
<dependencies>
<dependency>
<groupId>one.microstream</groupId>
<artifactId>cache.hibernate</artifactId>
<version>04.00.00-MS-GA</version>
</dependency>
</dependencies><?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.1"
xmlns="http://xmlns.jcp.org/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd">
<persistence-unit name="...">
<provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
...
<properties>
...
<property name="hibernate.cache.region.factory_class"
value="one.microstream.cache.hibernate.CacheRegionFactory" />
...
</properties>
</persistence-unit>
</persistence><repositories>
<repository>
<id>microstream-releases</id>
<url>https://repo.microstream.one/repository/maven-public/</url>
</repository>
</repositories>
<dependencies>
<dependency>
<groupId>one.microstream</groupId>
<artifactId>cache</artifactId>
<version>04.00.00-MS-GA</version>
</dependency>
</dependencies><dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-cache</artifactId>
</dependency>@SpringBootApplication
@EnableCaching
public class MyApplication@Component
public class CachingSetup implements JCacheManagerCustomizer
{
@Override
public void customize(CacheManager cacheManager)
{
cacheManager.createCache("my_cache", new MutableConfiguration<>()
.setExpiryPolicyFactory(CreatedExpiryPolicy.factoryOf(new Duration(SECONDS, 10000)))
.setStoreByValue(true)
.setStatisticsEnabled(true));
}
}NioFileSystem fileSystem = NioFileSystem.New();
EmbeddedStorageManager storage = EmbeddedStorage
.Foundation(fileSystem.ensureDirectoryPath(WORKINGDIR))
.onConnectionFoundation(f ->
{
f.setReferenceFieldEagerEvaluator(new CustomEagerStoringFieldEvaluator());
})
.start(ROOT)
;final EmbeddedStorageManager storage = EmbeddedStorage.start();
if(storage.root() == null)
{
//No existing Database found
}
else
{
MyRoot root = (MyRoot) storage.root();
}@GenerateWrapper
public interface MyInterface
{
public void doStuff();
public String getStuff();
}@GenerateWrapperFor("one.microstream.persistence.types.PersistenceStoring")
public class WrapperGenerationDummy
{
}LazyReferenceManager.set(LazyReferenceManager.New(
Lazy.Checker(
Duration.ofMinutes(30).toMillis(), // timeout of lazy access
0.75 // memory quota
)
);Storer storer = storage.createEagerStorer();
storer.store(myData);
storer.commit();EmbeddedStorageManager storage = EmbeddedStorage.Foundation(Paths.get("mydb"))
.onConnectionFoundation(cf ->
cf.setClassLoaderProvider(typeName -> {
if(typeName.startsWith("com.company.module1."))
{
return module1ClassLoader;
}
if(typeName.startsWith("com.company.module2."))
{
return module2ClassLoader;
}
return ClassLoader.getSystemClassLoader();
})
)
.start();EmbeddedStorageManager storage = EmbeddedStorage.Foundation(Paths.get("mydb"))
.onConnectionFoundation(cf ->
cf.setClassLoaderProvider(ClassLoaderProvider.New(
Thread.currentThread().getContextClassLoader()
))
)
.start();// Start the database manager
EmbeddedStorageManager storageManager = EmbeddedStorage.start();
// Set the entity (graph) as root
storageManager.setRoot("Hello World");
// Store root
storageManager.storeRoot();// Empty application-specific root, to be filled during start()
MyApplicationRoot root = new MyApplicationRoot();
// Start the database manager
EmbeddedStorageManager storage = EmbeddedStorage.start();
// root must be filled at this point... but how?
root.printAllMyEntities();// Empty application-specific root, to be filled during start()
MyApplicationRoot root = new MyApplicationRoot();
// Start the database manager with a reference to the application's root.
EmbeddedStorageManager storageManager = EmbeddedStorage.start(root);
// root is "magically" filled at this point. (Yay!)
root.printAllMyEntities();storageManager.defaultRoot();
storageManager.customRoot();PersonEntitypublic interface Person extends Entity
{
public String firstName();
public String lastName();
}Person john = PersonCreator.New()
.firstName("John")
.lastName("Doe")
.create();String firstName = john.firstName(); // -> John
String lastName = john.lastName(); // -> Doe Person mike = PersonCreator.New(john) // use John as template
.firstName("Mike")
.create();EmbeddedStorageManager storageManager = EmbeddedStorage.start();
CachingProvider provider = Caching.getCachingProvider();
CacheManager cacheManager = provider.getCacheManager();
CacheConfiguration<Integer, String> configuration = CacheConfiguration
.Builder(Integer.class, String.class, "my-cache", storageManager)
.build();
Cache<Integer, String> cache = cacheManager.createCache("jCache", configuration);keyType = java.lang.Integer
valueType = java.lang.String
readThrough = true
writeThrough = true
storageConfigurationResourceName = microstream-storage.propertiesbaseDirectory = ~/cache-data
channelCount = 4keyType = java.lang.Integer
valueType = java.lang.String
readThrough = true
writeThrough = true
storage.baseDirectory = ~/cache-data
storage.channelCount = 4spring.jpa.properties.hibernate.cache.microstream.missing_cache_strategy = create
spring.jpa.properties.hibernate.cache.microstream.readThrough = true
spring.jpa.properties.hibernate.cache.microstreamwriteThrough = true
spring.jpa.properties.hibernate.cache.microstream.storage.baseDirectory = ~/cache-data
spring.jpa.properties.hibernate.cache.microstream.storage.channelCount = 4
spring.jpa.properties.hibernate.cache.region.factory_class = one.microstream.cache.hibernate.CacheRegionFactory
spring.jpa.properties.hibernate.cache.use_query_cache = true
spring.jpa.properties.hibernate.cache.use_second_level_cache = true<repositories>
<repository>
<id>microstream-releases</id>
<url>https://repo.microstream.one/repository/maven-public/</url>
</repository>
</repositories>
<dependencies>
<dependency>
<groupId>one.microstream</groupId>
<artifactId>storage.restservice.sparkjava</artifactId>
<version>04.00.00-MS-GA</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
<version>1.7.30</version>
</dependency>
</dependencies>EmbeddedStorageManager storage = EmbeddedStorage.start();
if(storage.root() == null)
{
storage.setRoot(new Object[] {
LocalDate.now(),
X.List("a", "b", "c"),
1337
});
storage.storeRoot();
}
StorageRestService service = StorageRestServiceResolver.resolve(storage);
service.start();<repositories>
<repository>
<id>microstream-releases</id>
<url>https://repo.microstream.one/repository/maven-public/</url>
</repository>
</repositories>
<dependencies>
<dependency>
<groupId>one.microstream</groupId>
<artifactId>storage.restclient.app</artifactId>
<version>04.00.00-MS-GA</version>
</dependency>
</dependencies>java -jar storage.restclient.app-04.00.00-MS-GA.jar --port=80public interface PersistenceStoring
{
public long store(Object instance);
public long[] storeAll(Object... instances);
public void storeAll(Iterable<?> instances);
public void storeSelfStoring(SelfStoring storing);
}public interface WrapperPersistenceStoring
extends Wrapper<PersistenceStoring>, PersistenceStoring
{
@Override
public default long store(final Object instance)
{
return this.wrapped().store(instance);
}
@Override
public default long[] storeAll(final Object... instances)
{
return this.wrapped().storeAll(instances);
}
@Override
public default void storeAll(final Iterable<?> instances)
{
this.wrapped().storeAll(instances);
}
@Override
public default void storeSelfStoring(final SelfStoring storing)
{
this.wrapped().storeSelfStoring(storing);
}
}spring:
jpa:
properties:
hibernate:
cache:
microstream:
missing_cache_strategy: create
readThrough: true
writeThrough: true
storage:
baseDirectory: ~/cache-data
channelCount: 4
region:
factory_class: one.microstream.cache.hibernate.CacheRegionFactory
use_query_cache: true
use_second_level_cache: trueStorageRestServiceSparkJava service = StorageRestServiceSparkJava.New(storage);
service.setSparkService(
Service.ignite().port(80)
);
service.setInstanceName("my-name");EmbeddedStorageManager storage = EmbeddedStorage.Foundation()
.onConnectionFoundation(
f -> f.setReferenceFieldEagerEvaluator(
new CustomEagerStoringFieldEvaluator()
)
)
.start();public class PersistenceStoringWithLogging implements PersistenceStoring
{
private final PersistenceStoring wrapped;
public PersistenceStoringWithLogging(final PersistenceStoring wrapped)
{
super();
this.wrapped = wrapped;
}
@Override
public long store(final Object instance)
{
Logger.getLogger(PersistenceStoring.class.getName())
.info("Object stored: " + instance);
return this.wrapped.store(instance);
}
@Override
public long[] storeAll(final Object... instances)
{
return this.wrapped.storeAll(instances);
}
@Override
public void storeAll(final Iterable<?> instances)
{
this.wrapped.storeAll(instances);
}
@Override
public void storeSelfStoring(final SelfStoring storing)
{
this.wrapped.storeSelfStoring(storing);
}
}public abstract class BaseWrapperPersistenceStoring implements PersistenceStoring
{
private final PersistenceStoring wrapped;
public BaseWrapperPersistenceStoring(final PersistenceStoring wrapped)
{
super();
this.wrapped = wrapped;
}
@Override
public long store(final Object instance)
{
return this.wrapped.store(instance);
}
@Override
public long[] storeAll(final Object... instances)
{
return this.wrapped.storeAll(instances);
}
@Override
public void storeAll(final Iterable<?> instances)
{
this.wrapped.storeAll(instances);
}
@Override
public void storeSelfStoring(final SelfStoring storing)
{
this.wrapped.storeSelfStoring(storing);
}
}public class PersistenceStoringWithLogging extends BaseWrapperPersistenceStoring
{
public PersistenceStoringWithLogging(PersistenceStoring wrapped)
{
super(wrapped);
}
@Override
public long store(Object instance)
{
Logger.getLogger(PersistenceStoring.class.getName())
.info("Object stored: " + instance);
return super.store(instance);
}
}public interface Wrapper<W>
{
public W wrapped();
public abstract class Abstract<W> implements Wrapper<W>
{
private final W wrapped;
protected Abstract(final W wrapped)
{
super();
this.wrapped = wrapped;
}
@Override
public final W wrapped()
{
return this.wrapped;
}
}
}public class PersistenceStoringWithLogging
extends Wrapper.Abstract<PersistenceStoring>
implements WrapperPersistenceStoring
{
public PersistenceStoringWithLogging(final PersistenceStoring wrapped)
{
super(wrapped);
}
@Override
public long store(Object instance)
{
Logger.getLogger(PersistenceStoring.class.getName())
.info("Object stored: " + instance);
return WrapperPersistenceStoring.super.store(instance);
}
}public class PersistenceStoringWithLogging
implements WrapperPersistenceStoring
{
private final PersistenceStoring wrapped;
public PersistenceStoringWithLogging(final PersistenceStoring wrapped)
{
super();
this.wrapped = wrapped;
}
@Override
public PersistenceStoring wrapped()
{
return this.wrapped;
}
@Override
public long store(Object instance)
{
Logger.getLogger(PersistenceStoring.class.getName())
.info("Object stored: " + instance);
return WrapperPersistenceStoring.super.store(instance);
}
}EntityVersionContext<Long> versionContext =
EntityVersionContext.AutoIncrementingLong();
Person john = PersonCreator.New()
.addLayer(versionContext)
.firstName("John")
.lastName("Doe")
.create();PersonUpdater.setLastName(john, "Smith");
PersonUpdater.setLastName(john, "Archer");
PersonUpdater.setLastName(john, "Bennett");john.lastName() // now returns "Bennett"versionContext.versions(john).get(1L); // -> "John Smith"EntityVersionCleaner<Long> versionCleaner =
EntityVersionCleaner.AmountPreserving(10);
EntityVersionContext<Long> versionContext =
EntityVersionContext.AutoIncrementingLong(cleaner);EntityVersionContext<Long> systemTimeContext =
EntityVersionContext.AutoIncrementingSystemTimeMillis();
EntityVersionContext<Long> nanoTimeContext =
EntityVersionContext.AutoIncrementingSystemNanoTime();
EntityVersionContext<Instant> instantContext =
EntityVersionContext.AutoIncrementingInstant();EntityVersionCleaner<Instant> cleaner =
EntityVersionCleaner.AgePreservingInstant(Duration.of(1, ChronoUnit.YEARS));
EntityVersionContext<Instant> context =
EntityVersionContext.AutoIncrementingInstant(cleaner);EntityVersionContext.Mutable<String> versionContext =
EntityVersionContext.Mutable();
versionContext.currentVersion("rev-1");
Person john = PersonCreator.New()
.addLayer(versionContext)
.firstName("John")
.lastName("Doe")
.create();
versionContext.currentVersion("rev-2");
PersonUpdater.setLastName(john, "Smith");
versionContext.currentVersion("rev-3");
PersonUpdater.setLastName(john, "Archer");
versionContext.currentVersion("rev-4");
PersonUpdater.setLastName(john, "Bennett");
EmbeddedStorageManager storage = EmbeddedStorage
.Foundation(WORKINGDIR)
.onConnectionFoundation(f ->
f.registerCustomTypeHandlers(new CustomBufferedImageHandler())
)
.start(ROOT);public class Employee
{
/*
* Fields with primitive data are (for whatever reason, e.g. project
* design rules) all object types, but records should be stored as
* efficient as possible, i.e. without overhead of references and value objects.
*
* MicroStream's generic type analysis does not know of this and hence cannot
* do it. But defining a custom type handler can
*/
String id ;
Double salary ;
Date dateOfBirth;
// constructor, getters, setters, etc
/*
* The entity class must just contain "any" method returning a suitable type
* handler and MicroStream will recognize it and use the returned handler
* automatically.
*
* Type type handler just needs to specify the entity class and define a list
* of fields comprised of (name, getter, setter) in arbitrary order.
*/
static BinaryTypeHandler<Employee> provideTypeHandler()
{
return Binary.TypeHandler(
Employee.class,
Binary.Field_long("id",
e -> Long.parseLong(e.id),
(e, value) -> e.id = String.valueOf(value)
),
Binary.Field_long("dateOfBirth",
e -> e.dateOfBirth.getTime(),
(e, value) -> e.dateOfBirth = new Date(value)
),
Binary.Field_double("salary",
e -> e.salary.longValue(),
(e, value) -> e.salary = Double.valueOf(value)
)
);
}
}public class BusinessYear
{
// ...
private Lazy<ArrayList<Turnover>> turnovers = ...; // we will get to that
// ...
}ArrayList<Turnover> turnovers = this.turnovers.get();private Lazy<ArrayList<Turnover>> turnovers = Lazy.Reference(new ArrayList<>());private Lazy<ArrayList<Turnover>> turnovers = Lazy.Reference(null);private Lazy<ArrayList<Turnover>> turnovers = null;return this.turnovers == null ? null : this.turnovers.get();return Lazy.get(this.turnovers);@Lazy
private ArrayList<Turnover> turnovers = new ArrayList<>();{
"objectId": "1000000000000000028",
"typeId": "110",
"length": "0",
"variableLength": [
"3"
],
"simplified": false,
"data": [
[
"1000000000000000029",
"1000000000000000030",
"1000000000000000031"
]
],
"references": null
}No entity found for objectId 1000000000000000123[Type dictionary contents]{
"creationTime": "2020-04-15T13:32:26.003Z",
"channelStatistics": {
"0": {
"channelIndex": 0,
"files": [
{
"fileNumber": "1",
"file": "storage\\channel_0\\channel_0_1.dat",
"fileCount": "1",
"liveDataLength": "2898",
"totalDataLength": "2930"
}
],
"fileCount": "1",
"liveDataLength": "2898",
"totalDataLength": "2930"
}
},
"fileCount": "1",
"liveDataLength": "2898",
"totalDataLength": "2930"
}{
name: "ROOT",
objectId: "1000000000000000028"
}NioFileSystem fileSystem = NioFileSystem.New();
EmbeddedStorageManager storage = EmbeddedStorage.start(
fileSystem.ensureDirectoryPath("storage")
);
String fileSuffix = "bin";
StorageConnection connection = storage.createConnection();
StorageEntityTypeExportStatistics exportResult = connection.exportTypes(
new StorageEntityTypeExportFileProvider.Default(
fileSystem.ensureDirectoryPath("export-dir"),
fileSuffix
),
typeHandler -> true // export all, customize if necessary
);
XSequence<Path> exportFiles = CQL
.from(exportResult.typeStatistics().values())
.project(s -> Paths.get(s.file().identifier()))
.execute()
;NioFileSystem fileSystem = NioFileSystem.New();
EmbeddedStorageManager storage = EmbeddedStorage.start(
fileSystem.ensureDirectoryPath("storage")
);
StorageConnection connection = storage.createConnection();
connection.importFiles(X.Enum(
fileSystem.ensureFilePath("type1.bin"),
fileSystem.ensureFilePath("type2.bin")
));NioFileSystem fileSystem = NioFileSystem.New();
EmbeddedStorageManager storage = EmbeddedStorage.start(
fileSystem.ensureDirectoryPath("storage")
);
StorageDataConverterTypeBinaryToCsv converter =
new StorageDataConverterTypeBinaryToCsv.UTF8(
StorageDataConverterCsvConfiguration.defaultConfiguration(),
new StorageEntityTypeConversionFileProvider.Default(
fileSystem.ensureDirectoryPath("csv-dir"),
"csv"
),
storage.typeDictionary(),
null, // no type name mapping
4096, // read buffer size
4096 // write buffer size
);
AReadableFile dataFile = fileSystem.ensureFilePath("type1.bin").useReading();
try
{
converter.convertDataFile(dataFile);
}
finally
{
dataFile.close();
}NioFileSystem fileSystem = NioFileSystem.New();
EmbeddedStorageManager storage = EmbeddedStorage.start(
fileSystem.ensureDirectoryPath("storage")
);
StorageDataConverterTypeCsvToBinary<AFile> converter =
StorageDataConverterTypeCsvToBinary.New(
StorageDataConverterCsvConfiguration.defaultConfiguration(),
storage.typeDictionary(),
new StorageEntityTypeConversionFileProvider.Default(
fileSystem.ensureDirectoryPath("bin-dir"),
"dat"
)
);
converter.convertCsv(fileSystem.ensureFilePath("type1.csv"));__________________________________________________
[RAM ]{ Code } | ( Filesystem )
,- "Channel 0": [Data]{Thread} <-I|O-> (Storage Subdirectory 0)
/-- "Channel 1": [Data]{Thread} <-I|O-> (Storage Subdirectory 1)
StorageManager |
\-- "Channel 2": [Data]{Thread} <-I|O-> (Storage Subdirectory 2)
'- "Channel 3": [Data]{Thread} <-I|O-> (Storage Subdirectory 3)
_________________________________________________|EmbeddedStorageConnectionFoundation f = foundation.getConnectionFoundation();foundation.onConnectionFoundation(f ->
{
...
});f.setLegacyTypeMappingResultor(...);PersistenceLegacyTypeMappingResultor.New()PrintingLegacyTypeMappingResultor.New(PersistenceLegacyTypeMappingResultor.New())InquiringLegacyTypeMappingResultor.New(PersistenceLegacyTypeMappingResultor.New())InquiringLegacyTypeMappingResultor.New(
PersistenceLegacyTypeMappingResultor.New()) // implicitely 1.0
InquiringLegacyTypeMappingResultor.New(
PersistenceLegacyTypeMappingResultor.New(), 0.7) // 0.7 thresholdint customerid ; // -> pin
String firstname ; // -> firstName
String surname ; // -> lastName
String comment ; // discarded, NOT new commerceIdInteger pin ; // <- customerid
String firstName ; // <- firstname
String lastName ; // <- surname
String commerceId; // new, NOT old comment
Address address ; // new [***new***] pin
firstname -0,944----> firstName
surname -0,688----> lastName
comment -0,750----> commerceId
[***new***] address
customerid [discarded]customerid -[mapped]-> pin
firstname -0,944----> firstName
surname -0,688----> lastName
[***new***] commerceId
[***new***] address
comment [discarded]








repositories {
maven {
url = uri("https://repo.microstream.one/repository/maven-public")
}
}
dependencies {
implementation("one.microstream:storage.embedded:04.00.00-MS-GA")
}resolvers += "microstream-releases" at "https://repo.microstream.one/repository/maven-public"
libraryDependencies += "one.microstream" % "storage.embedded" % "04.00.00-MS-GA"<resolvers>
<ibiblio name="microstream-releases"
root="https://repo.microstream.one/repository/maven-public"
m2compatible="true" />
</resolvers><dependencies>
<dependency org="one.microstream"
name="storage.embedded"
rev="04.00.00-MS-GA" />
</dependencies>repositories.remote << 'https://repo.microstream.one/repository/maven-public'
define 'my-app' do
compile.with 'one.microstream:storage.embedded:04.00.00-MS-GA'
endload("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")
RULES_JVM_EXTERNAL_TAG = "2.8"
RULES_JVM_EXTERNAL_SHA = "79c9850690d7614ecdb72d68394f994fef7534b292c4867ce5e7dec0aa7bdfad"
http_archive(
name = "rules_jvm_external",
strip_prefix = "rules_jvm_external-%s" % RULES_JVM_EXTERNAL_TAG,
sha256 = RULES_JVM_EXTERNAL_SHA,
url = "https://github.com/bazelbuild/rules_jvm_external/archive/%s.zip" % RULES_JVM_EXTERNAL_TAG,
)
load("@rules_jvm_external//:defs.bzl", "maven_install")
maven_install(
artifacts = [
"one.microstream:storage.embedded:04.00.00-MS-GA"
],
repositories = [
"https://repo.microstream.one/repository/maven-public"
],
)maven_jar(
name = "microstream",
artifact = "one.microstream:storage.embedded:04.00.00-MS-GA"
)<repositories>
<repository>
<id>microstream-releases</id>
<url>https://repo.microstream.one/repository/maven-public</url>
</repository>
</repositories>
<dependencies>
<dependency>
<groupId>one.microstream</groupId>
<artifactId>storage.embedded</artifactId>
<version>04.00.00-MS-GA</version>
</dependency>
</dependencies>repositories {
maven {
url 'https://repo.microstream.one/repository/maven-public'
}
}
dependencies {
implementation 'one.microstream:storage.embedded:04.00.00-MS-GA'
}<repositories>
<repository>
<id>microstream-releases</id>
<url>https://repo.microstream.one/repository/maven-public/</url>
</repository>
</repositories>
<dependencies>
<dependency>
<groupId>one.microstream</groupId>
<artifactId>persistence.binary.jdk8</artifactId>
<version>04.00.00-MS-GA</version>
</dependency>
</dependencies>final EmbeddedStorageFoundation<?> foundation = EmbeddedStorage.Foundation();
foundation.onConnectionFoundation(BinaryHandlersJDK8::registerJDK8TypeHandlers);public interface Person extends Entity
{
public String firstName();
public String lastName();
}public class PersonEntity extends EntityLayerIdentity implements Person
{
protected PersonEntity()
{
super();
}
@Override
protected Person entityData()
{
return (Person)super.entityData();
}
@Override
public final String firstName()
{
return this.entityData().firstName();
}
@Override
public final String lastName()
{
return this.entityData().lastName();
}
}public class PersonData extends EntityData implements Person
{
private final String firstName;
private final String lastName ;
protected PersonData(final Person entity,
final String firstName,
final String lastName )
{
super(entity);
this.firstName = firstName;
this.lastName = lastName ;
}
@Override
public String firstName()
{
return this.firstName;
}
@Override
public String lastName()
{
return this.lastName;
}
}public interface PersonCreator extends Entity.Creator<Person, PersonCreator>
{
public PersonCreator firstName(String firstName);
public PersonCreator lastName(String lastName);
public static PersonCreator New()
{
return new Default();
}
public static PersonCreator New(final Person other)
{
return new Default().copy(other);
}
public class Default
extends Entity.Creator.Abstract<Person, PersonCreator>
implements PersonCreator
{
private String firstName;
private String lastName ;
protected Default()
{
super();
}
@Override
public PersonCreator firstName(final String firstName)
{
this.firstName = firstName;
return this;
}
@Override
public PersonCreator lastName(final String lastName)
{
this.lastName = lastName;
return this;
}
@Override
protected EntityLayerIdentity createEntityInstance()
{
return new PersonEntity();
}
@Override
public Person createData(final Person entityInstance)
{
return new PersonData(entityInstance,
this.firstName,
this.lastName );
}
@Override
public PersonCreator copy(final Person other)
{
final Person data = Entity.data(other);
this.firstName = data.firstName();
this.lastName = data.lastName ();
return this;
}
}
}public interface PersonUpdater extends Entity.Updater<Person, PersonUpdater>
{
public static boolean setFirstName(final Person person, final String firstName)
{
return New(person).firstName(firstName).update();
}
public static boolean setLastName(final Person person, final String lastName)
{
return New(person).lastName(lastName).update();
}
public PersonUpdater firstName(String firstName);
public PersonUpdater lastName(String lastName);
public static PersonUpdater New(final Person person)
{
return new Default(person);
}
public class Default
extends Entity.Updater.Abstract<Person, PersonUpdater>
implements PersonUpdater
{
private String firstName;
private String lastName ;
protected Default(final Person person)
{
super(person);
}
@Override
public PersonUpdater firstName(final String firstName)
{
this.firstName = firstName;
return this;
}
@Override
public PersonUpdater lastName(final String lastName)
{
this.lastName = lastName;
return this;
}
@Override
public Person createData(final Person entityInstance)
{
return new PersonData(entityInstance,
this.firstName,
this.lastName );
}
@Override
public PersonUpdater copy(final Person other)
{
final Person data = Entity.data(other);
this.firstName = data.firstName();
this.lastName = data.lastName ();
return this;
}
}
}public interface PersonHashEqualator extends HashEqualator<Person>
{
public static PersonHashEqualator New()
{
return new Default();
}
public final class Default implements PersonHashEqualator, Stateless
{
public static boolean equals(final Person person1, final Person person2)
{
return X.equal(person1.firstName(), person2.firstName())
&& X.equal(person1.lastName (), person2.lastName ())
;
}
public static int hashCode(final Person person)
{
return Objects.hash(
person.firstName(),
person.lastName ()
);
}
Default()
{
super();
}
@Override
public boolean equal(final Person person1, final Person person2)
{
return equals(person1, person2);
}
@Override
public int hash(final Person person)
{
return hashCode(person);
}
}
}public interface PersonAppendable extends VarString.Appendable
{
public static String toString(final Person person)
{
return New(person).appendTo(VarString.New()).toString();
}
public static PersonAppendable New(final Person person)
{
return new Default(person);
}
public static class Default implements PersonAppendable
{
private final Person person;
Default(final Person person)
{
super();
this.person = person;
}
@Override
public VarString appendTo(final VarString vs)
{
return vs.append(this.person.getClass().getSimpleName())
.append(" [lastName = ")
.append(this.person.lastName())
.append(", firstName = ")
.append(this.person.firstName())
.append(']');
}
}
}public class Contact
{
String name ;
String firstname;
int age ;
String email ;
String note ;
Object link ;
}public class Contact
{
String firstname ; // moved
String lastname ; // renamed
String emailAddress ; // renamed
String supportNode ; // renamed
PostalAddress postalAddress; // new
int age ; // moved
}----------
Legacy type mapping required for legacy type
1000055:Contact
to current type
1000056:Contact
Fields:
java.lang.String Contact#firstname -1.000 ----> java.lang.String Contact#firstname
java.lang.String Contact#name -0.750 ----> java.lang.String Contact#lastname
java.lang.String Contact#email -0.708 ----> java.lang.String Contact#emailAddress
java.lang.String Contact#note -0.636 ----> java.lang.String Contact#supportNode
[***new***] PostalAddress Contact#postalAddress
int Contact#age -1.000 ----> int Contact#age
java.lang.Object Contact#link [discarded]
---
Write 'y' to accept the mapping.EmbeddedStorageFoundation<?> foundation = EmbeddedStorage.Foundation(myDataDir);
foundation.getConnectionFoundation().setLegacyTypeMappingResultor(
InquiringLegacyTypeMappingResultor.New(
PersistenceLegacyTypeMappingResultor.New()
)
);
EmbeddedStorageManager storageManager =
foundation.createEmbeddedStorageManager(myRoot).start();package com.my.app.entities;
public class OldContact
{
String name ;
String firstname;
int age ;
String email ;
String note ;
Object link ; // to be discarded
}package com.my.app.entities;
public class NewContact
{
String firstname ; // moved
String lastname ; // renamed
String emailAddress ; // renamed
String supportNote ; // renamed
PostalAddress postalAddress; // new
int age ; // moved
}old current
com.my.app.entities.OldContact com.my.app.entities.NewContact
com.my.app.entities.OldContact#firstname com.my.app.entities.NewContact#firstname
com.my.app.entities.OldContact#name com.my.app.entities.NewContact#lastname
com.my.app.entities.OldContact#email com.my.app.entities.NewContact#emailAddress
com.my.app.entities.OldContact#note com.my.app.entities.NewContact#supportNote
com.my.app.entities.NewContact#postalAddress
com.my.app.entities.OldContact#age com.my.app.entities.NewContact#age
com.my.app.entities.OldContact#link EmbeddedStorageFoundation<?> foundation = EmbeddedStorage.Foundation(dataDir);
foundation.setRefactoringMappingProvider(
Persistence.RefactoringMapping(Paths.get("refactorings.csv"))
);
EmbeddedStorageManager storageManager =
foundation.createEmbeddedStorageManager(root).start();public interface Beeing<B>
{
public B partner();
}public interface Named
{
public String name();
}public interface Animal extends Beeing<Animal>, Entity
{
public String species();
}public interface Pet extends Animal, Named
{
}public interface Human extends Beeing<Human>, Named, Entity
{
}public class AnimalEntity extends EntityLayerIdentity implements Animal
{
protected AnimalEntity()
{
super();
}
@Override
protected Animal entityData()
{
return (Animal)super.entityData();
}
@Override
public final String species()
{
return this.entityData().species();
}
@Override
public final Animal partner()
{
return this.entityData().partner();
}
}public class AnimalData extends EntityData implements Animal
{
private final String species;
private final Animal partner;
protected AnimalData(final Animal entity,
final String species,
final Animal partner)
{
super(entity);
this.species = species;
this.partner = partner;
}
@Override
public String species()
{
return this.species;
}
@Override
public Animal partner()
{
return this.partner;
}
}public interface AnimalCreator extends Entity.Creator<Animal, AnimalCreator>
{
public AnimalCreator species(String species);
public AnimalCreator partner(Animal partner);
public static AnimalCreator New()
{
return new Default();
}
public static AnimalCreator New(final Animal other)
{
return new Default().copy(other);
}
public class Default
extends Entity.Creator.Abstract<Animal, AnimalCreator>
implements AnimalCreator
{
private String species;
private Animal partner;
protected Default()
{
super();
}
@Override
public AnimalCreator species(final String species)
{
this.species = species;
return this;
}
@Override
public AnimalCreator partner(final Animal partner)
{
this.partner = partner;
return this;
}
@Override
protected EntityLayerIdentity createEntityInstance()
{
return new AnimalEntity();
}
@Override
public Animal createData(final Animal entityInstance)
{
return new AnimalData(entityInstance,
this.species,
this.partner);
}
@Override
public AnimalCreator copy(final Animal other)
{
final Animal data = Entity.data(other);
this.species = data.species();
this.partner = data.partner();
return this;
}
}
}public interface AnimalUpdater extends Entity.Updater<Animal, AnimalUpdater>
{
public static boolean setSpecies(final Animal animal, final String species)
{
return New(animal).species(species).update();
}
public static boolean setPartner(final Animal animal, final Animal partner)
{
return New(animal).partner(partner).update();
}
public AnimalUpdater species(String species);
public AnimalUpdater partner(Animal partner);
public static AnimalUpdater New(final Animal animal)
{
return new Default(animal);
}
public class Default
extends Entity.Updater.Abstract<Animal, AnimalUpdater>
implements AnimalUpdater
{
private String species;
private Animal partner;
protected Default(final Animal animal)
{
super(animal);
}
@Override
public AnimalUpdater species(final String species)
{
this.species = species;
return this;
}
@Override
public AnimalUpdater partner(final Animal partner)
{
this.partner = partner;
return this;
}
@Override
public Animal createData(final Animal entityInstance)
{
return new AnimalData(entityInstance,
this.species,
this.partner);
}
@Override
public AnimalUpdater copy(final Animal other)
{
final Animal data = Entity.data(other);
this.species = data.species();
this.partner = data.partner();
return this;
}
}
}public class PetEntity extends EntityLayerIdentity implements Pet
{
protected PetEntity()
{
super();
}
@Override
protected Pet entityData()
{
return (Pet)super.entityData();
}
@Override
public final String species()
{
return this.entityData().species();
}
@Override
public final Animal partner()
{
return this.entityData().partner();
}
@Override
public final String name()
{
return this.entityData().name();
}
}public class PetData extends EntityData implements Pet
{
private final String species;
private final Animal partner;
private final String name ;
protected PetData(final Pet entity,
final String species,
final Animal partner,
final String name )
{
super(entity);
this.species = species;
this.partner = partner;
this.name = name ;
}
@Override
public String species()
{
return this.species;
}
@Override
public Animal partner()
{
return this.partner;
}
@Override
public String name()
{
return this.name;
}
}public interface PetCreator extends Entity.Creator<Pet, PetCreator>
{
public PetCreator species(String species);
public PetCreator partner(Animal partner);
public PetCreator name(String name);
public static PetCreator New()
{
return new Default();
}
public static PetCreator New(final Pet other)
{
return new Default().copy(other);
}
public class Default
extends Entity.Creator.Abstract<Pet, PetCreator>
implements PetCreator
{
private String species;
private Animal partner;
private String name ;
protected Default()
{
super();
}
@Override
public PetCreator species(final String species)
{
this.species = species;
return this;
}
@Override
public PetCreator partner(final Animal partner)
{
this.partner = partner;
return this;
}
@Override
public PetCreator name(final String name)
{
this.name = name;
return this;
}
@Override
protected EntityLayerIdentity createEntityInstance()
{
return new PetEntity();
}
@Override
public Pet createData(final Pet entityInstance)
{
return new PetData(entityInstance,
this.species,
this.partner,
this.name );
}
@Override
public PetCreator copy(final Pet other)
{
final Pet data = Entity.data(other);
this.species = data.species();
this.partner = data.partner();
this.name = data.name ();
return this;
}
}
}public interface PetUpdater extends Entity.Updater<Pet, PetUpdater>
{
public static boolean setSpecies(final Pet pet, final String species)
{
return New(pet).species(species).update();
}
public static boolean setPartner(final Pet pet, final Animal partner)
{
return New(pet).partner(partner).update();
}
public static boolean setName(final Pet pet, final String name)
{
return New(pet).name(name).update();
}
public PetUpdater species(String species);
public PetUpdater partner(Animal partner);
public PetUpdater name(String name);
public static PetUpdater New(final Pet pet)
{
return new Default(pet);
}
public class Default
extends Entity.Updater.Abstract<Pet, PetUpdater>
implements PetUpdater
{
private String species;
private Animal partner;
private String name ;
protected Default(final Pet pet)
{
super(pet);
}
@Override
public PetUpdater species(final String species)
{
this.species = species;
return this;
}
@Override
public PetUpdater partner(final Animal partner)
{
this.partner = partner;
return this;
}
@Override
public PetUpdater name(final String name)
{
this.name = name;
return this;
}
@Override
public Pet createData(final Pet entityInstance)
{
return new PetData(entityInstance,
this.species,
this.partner,
this.name );
}
@Override
public PetUpdater copy(final Pet other)
{
final Pet data = Entity.data(other);
this.species = data.species();
this.partner = data.partner();
this.name = data.name ();
return this;
}
}
}public class HumanEntity extends EntityLayerIdentity implements Human
{
protected HumanEntity()
{
super();
}
@Override
protected Human entityData()
{
return (Human)super.entityData();
}
@Override
public final Human partner()
{
return this.entityData().partner();
}
@Override
public final String name()
{
return this.entityData().name();
}
}