Skip to content

Multiple storages #39

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 7 commits into from
Mar 7, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,8 @@ target/

# EclipseStore
storage
storage-person
storage-invoice
storage-jpa

# == IntelliJ ==
Expand Down
17 changes: 17 additions & 0 deletions .run/Run Dual Storage Demo.run.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
<component name="ProjectRunConfigurationManager">
<configuration default="false" name="Run Dual Storage Demo" type="Application" factoryName="Application">
<option name="MAIN_CLASS_NAME" value="software.xdev.spring.data.eclipse.store.demo.dual.storage.DualStorageDemoApplication" />
<module name="spring-data-eclipse-store-demo" />
<option name="VM_PARAMETERS" value="--add-opens java.base/java.util=ALL-UNNAMED --add-opens java.base/java.time=ALL-UNNAMED --add-exports java.base/jdk.internal.misc=ALL-UNNAMED" />
<option name="WORKING_DIRECTORY" value="$MODULE_DIR$" />
<extension name="coverage">
<pattern>
<option name="PATTERN" value="software.xdev.*" />
<option name="ENABLED" value="true" />
</pattern>
</extension>
<method v="2">
<option name="Make" enabled="true" />
</method>
</configuration>
</component>
4 changes: 4 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,7 @@
# 1.0.4

* Added possibility to use multiple storages

# 1.0.3

* Added the EclipseStoreDataImporter to import data from JPA repositories.
Expand Down
14 changes: 7 additions & 7 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -55,12 +55,13 @@ instructions** are in the documentation](https://xdev-software.github.io/spring-

## Demo

To see how easy it is to implement EclipseStore in your Spring project, take a look at the three
[demos](./spring-data-eclipse-store-demo):<br/>
A [simple](./spring-data-eclipse-store-demo/src/main/java/software/xdev/spring/data/eclipse/store/demo/simple), a
more [complex demo](./spring-data-eclipse-store-demo/src/main/java/software/xdev/spring/data/eclipse/store/demo/complex)
and
a [demo with coexisting JPA](./spring-data-eclipse-store-jpa/src/main/java/software/xdev/spring/data/eclipse/store/jpa).
To see how easy it is to implement EclipseStore in your Spring project, take a look at
the [demos](./spring-data-eclipse-store-demo):

* [Simple demo](https://github.com/xdev-software/spring-data-eclipse-store/tree/develop/spring-data-eclipse-store-demo/src/main/java/software/xdev/spring/data/eclipse/store/demo/simple)
* [Complex demo](https://github.com/xdev-software/spring-data-eclipse-store/tree/develop/spring-data-eclipse-store-demo/src/main/java/software/xdev/spring/data/eclipse/store/demo/complex)
* [Demo with coexisting JPA](https://github.com/xdev-software/spring-data-eclipse-store/tree/develop/spring-data-eclipse-store-jpa/src/main/java/software/xdev/spring/data/eclipse/store/jpa)
* [Dual storage demo](https://github.com/xdev-software/spring-data-eclipse-store/tree/develop/spring-data-eclipse-store-demo/src/main/java/software/xdev/spring/data/eclipse/store/demo/dual/storage)

> [!NOTE]
> Since the library is using reflection to copy data, the following JVM-Arguments may have to be set:
Expand All @@ -71,7 +72,6 @@ a [demo with coexisting JPA](./spring-data-eclipse-store-jpa/src/main/java/softw
> --add-opens=java.base/java.time=ALL-UNNAMED
> ```


## Support

If you need support as soon as possible, and you can't wait for any pull request, feel free to
Expand Down
1 change: 1 addition & 0 deletions docs/modules/ROOT/nav.adoc
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
* xref:index.adoc[Home]
* xref:installation.adoc[Installation]
* xref:configuration.adoc[Configuration]
* xref:working-copies.adoc[Working Copies]
* xref:migration.adoc[Migration]
* xref:known-issues.adoc[Known issues]
30 changes: 30 additions & 0 deletions docs/modules/ROOT/pages/configuration.adoc
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
= Configuration

== EclipseStore Spring-Boot Configuration

The simplest way to configure your storage is by using the key/value pairs in a configuration file as described in the https://docs.eclipsestore.io/manual/misc/integrations/spring-boot.html[EclipseStore documentation].

== Detailed Configuration

If you need more control or want to configure your storage in code, we provide a simple Configuration class which can be used as follows:

[source,java,title="Demo configuration"]
----
import org.eclipse.store.storage.embedded.types.EmbeddedStorage;
import org.eclipse.store.storage.embedded.types.EmbeddedStorageFoundation;
import org.eclipse.store.storage.types.Storage;
...
@Configuration
@EnableEclipseStoreRepositories(clientConfigurationClass = DemoConfiguration.class)
public class DemoConfiguration extends EclipseStoreClientConfiguration
{
@Override
public EmbeddedStorageFoundation<?> createEmbeddedStorageFoundation()
{
return EmbeddedStorage.Foundation(Storage.Configuration(Storage.FileProvider(Path.of("demo-storage"))));
}
}
----
The method ``createEmbeddedStorageFoundation`` could return a much more complicated ``EmbeddedStorageFoundation`` as described here in the https://docs.eclipsestore.io/manual/storage/configuration/index.html[EclipseStore documentation about configuration and foundations].

This also enables you to use multiple EclipseStore-Storages in one project. See the https://github.com/xdev-software/spring-data-eclipse-store/tree/develop/spring-data-eclipse-store-demo/src/main/java/software/xdev/spring/data/eclipse/store/demo/dual/storage[Dual storages demo].
8 changes: 6 additions & 2 deletions docs/modules/ROOT/pages/installation.adoc
Original file line number Diff line number Diff line change
Expand Up @@ -38,8 +38,12 @@ Since the library is using reflection to copy data, the following JVM-Arguments

== Demo

To see how easy it is to implement EclipseStore in your Spring project, take a look at the three https://github.com/xdev-software/spring-data-eclipse-store/tree/develop/spring-data-eclipse-store-demo[demos]:
A https://github.com/xdev-software/spring-data-eclipse-store/tree/develop/spring-data-eclipse-store-demo/src/main/java/software/xdev/spring/data/eclipse/store/demo/simple[simple], a more https://github.com/xdev-software/spring-data-eclipse-store/tree/develop/spring-data-eclipse-store-demo/src/main/java/software/xdev/spring/data/eclipse/store/demo/complex[complex demo] and a https://github.com/xdev-software/spring-data-eclipse-store/tree/develop/spring-data-eclipse-store-jpa/src/main/java/software/xdev/spring/data/eclipse/store/jpa[demo with coexisting JPA].
To see how easy it is to implement EclipseStore in your Spring project, take a look at the https://github.com/xdev-software/spring-data-eclipse-store/tree/develop/spring-data-eclipse-store-demo[demos]:

* https://github.com/xdev-software/spring-data-eclipse-store/tree/develop/spring-data-eclipse-store-demo/src/main/java/software/xdev/spring/data/eclipse/store/demo/simple[Simple demo]
* https://github.com/xdev-software/spring-data-eclipse-store/tree/develop/spring-data-eclipse-store-demo/src/main/java/software/xdev/spring/data/eclipse/store/demo/complex[Complex demo]
* https://github.com/xdev-software/spring-data-eclipse-store/tree/develop/spring-data-eclipse-store-jpa/src/main/java/software/xdev/spring/data/eclipse/store/jpa[Demo with coexisting JPA]
* https://github.com/xdev-software/spring-data-eclipse-store/tree/develop/spring-data-eclipse-store-demo/src/main/java/software/xdev/spring/data/eclipse/store/demo/dual/storage[Dual storage demo]

== Drop in compatible [[drop-in-compatible]]

Expand Down
5 changes: 5 additions & 0 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,11 @@
<url>https://xdev.software</url>
</organization>

<properties>
<javaVersion>17</javaVersion>
<maven.compiler.release>${javaVersion}</maven.compiler.release>
</properties>

<modules>
<module>spring-data-eclipse-store</module>
<module>spring-data-eclipse-store-demo</module>
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
package software.xdev.spring.data.eclipse.store.demo.dual.storage;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;

import software.xdev.spring.data.eclipse.store.demo.dual.storage.invoice.Invoice;
import software.xdev.spring.data.eclipse.store.demo.dual.storage.invoice.InvoiceRepository;
import software.xdev.spring.data.eclipse.store.demo.dual.storage.person.Person;
import software.xdev.spring.data.eclipse.store.demo.dual.storage.person.PersonRepository;


@SpringBootApplication
public class DualStorageDemoApplication implements CommandLineRunner
{
private static final Logger LOG = LoggerFactory.getLogger(DualStorageDemoApplication.class);
private final InvoiceRepository invoiceRepository;
private final PersonRepository personRepository;

public DualStorageDemoApplication(
final InvoiceRepository invoiceRepository,
final PersonRepository personRepository)
{
this.invoiceRepository = invoiceRepository;
this.personRepository = personRepository;
}

public static void main(final String[] args)
{
final ConfigurableApplicationContext run = SpringApplication.run(DualStorageDemoApplication.class, args);
run.close();
}

@Override
public void run(final String... args)
{
LOG.info("----Invoices-BeforeDeleteAll----");
this.invoiceRepository.findAll().forEach(i -> LOG.info(i.toString()));
this.invoiceRepository.deleteAll();

LOG.info("----Invoices-AfterDeleteAll----");
this.invoiceRepository.findAll().forEach(i -> LOG.info(i.toString()));

this.invoiceRepository.save(new Invoice("N1", 100.0));

LOG.info("----Persons-BeforeDeleteAll----");
this.personRepository.findAll().forEach(i -> LOG.info(i.toString()));
this.personRepository.deleteAll();

LOG.info("----Persons-AfterDeleteAll----");
this.personRepository.findAll().forEach(i -> LOG.info(i.toString()));

this.personRepository.save(new Person("Stevie", "Nicks"));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package software.xdev.spring.data.eclipse.store.demo.dual.storage.invoice;

public record Invoice(String id, double sum)
{
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package software.xdev.spring.data.eclipse.store.demo.dual.storage.invoice;

import org.springframework.data.repository.CrudRepository;


public interface InvoiceRepository extends CrudRepository<Invoice, Integer>
{
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
package software.xdev.spring.data.eclipse.store.demo.dual.storage.invoice;

import java.nio.file.Path;

import org.eclipse.store.storage.embedded.types.EmbeddedStorage;
import org.eclipse.store.storage.embedded.types.EmbeddedStorageFoundation;
import org.eclipse.store.storage.types.Storage;
import org.springframework.context.annotation.Configuration;

import software.xdev.spring.data.eclipse.store.repository.config.EclipseStoreClientConfiguration;
import software.xdev.spring.data.eclipse.store.repository.config.EnableEclipseStoreRepositories;


@Configuration
@EnableEclipseStoreRepositories(
value = "software.xdev.spring.data.eclipse.store.demo.dual.storage.invoice",
clientConfiguration = "persistenceInvoiceConfiguration"
)
public class PersistenceInvoiceConfiguration extends EclipseStoreClientConfiguration
{
@Override
public EmbeddedStorageFoundation<?> createEmbeddedStorageFoundation()
{
return EmbeddedStorage.Foundation(Storage.Configuration(Storage.FileProvider(Path.of("storage-invoice"))));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package software.xdev.spring.data.eclipse.store.demo.dual.storage.person;

import static org.eclipse.store.storage.embedded.types.EmbeddedStorage.Foundation;

import java.nio.file.Path;

import org.eclipse.store.storage.embedded.types.EmbeddedStorageFoundation;
import org.eclipse.store.storage.types.Storage;
import org.springframework.context.annotation.Configuration;

import software.xdev.spring.data.eclipse.store.repository.config.EclipseStoreClientConfiguration;
import software.xdev.spring.data.eclipse.store.repository.config.EnableEclipseStoreRepositories;


@Configuration
@EnableEclipseStoreRepositories(
value = "software.xdev.spring.data.eclipse.store.demo.dual.storage.person",
clientConfigurationClass = PersistencePersonConfiguration.class
)
public class PersistencePersonConfiguration extends EclipseStoreClientConfiguration
{
@Override
public EmbeddedStorageFoundation<?> createEmbeddedStorageFoundation()
{
return Foundation(Storage.Configuration(Storage.FileProvider(Path.of("storage-person"))));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package software.xdev.spring.data.eclipse.store.demo.dual.storage.person;

public record Person(String firstName, String lastName)
{
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package software.xdev.spring.data.eclipse.store.demo.dual.storage.person;

import org.springframework.data.repository.CrudRepository;


public interface PersonRepository extends CrudRepository<Person, Integer>
{
}
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@
import software.xdev.spring.data.eclipse.store.jpa.integration.repository.PersonToTestInEclipseStoreRepository;
import software.xdev.spring.data.eclipse.store.jpa.integration.repository.PersonToTestInJpa;
import software.xdev.spring.data.eclipse.store.jpa.integration.repository.PersonToTestInJpaRepository;
import software.xdev.spring.data.eclipse.store.repository.EclipseStoreStorage;
import software.xdev.spring.data.eclipse.store.repository.config.EclipseStoreClientConfiguration;
import software.xdev.spring.data.eclipse.store.repository.support.SimpleEclipseStoreRepository;


Expand All @@ -44,7 +44,7 @@ class IntegrationTest
private EclipseStoreDataImporterComponent eclipseStoreDataImporter;

@Autowired
private EclipseStoreStorage eclipseStoreStorage;
private EclipseStoreClientConfiguration configuration;

/**
* Super simple test if there are any start-up errors when running parallel to a JPA configuration
Expand Down Expand Up @@ -72,10 +72,10 @@ void testEclipseStoreImport()
final List<?> allEntities = simpleEclipseStoreRepositories.get(0).findAll();
Assertions.assertEquals(1, allEntities.size());

this.eclipseStoreStorage.stop();
this.configuration.getStorageInstance().stop();
Assertions.assertEquals(
1,
this.eclipseStoreStorage.getEntityCount(PersonToTestInJpa.class),
this.configuration.getStorageInstance().getEntityCount(PersonToTestInJpa.class),
"After restart the imported entities are not there anymore.");
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@
import org.springframework.context.event.EventListener;
import org.springframework.util.FileSystemUtils;

import software.xdev.spring.data.eclipse.store.repository.EclipseStoreStorage;
import software.xdev.spring.data.eclipse.store.repository.config.EclipseStoreClientConfiguration;
import software.xdev.spring.data.eclipse.store.repository.config.EnableEclipseStoreRepositories;


Expand All @@ -40,7 +40,7 @@
public class TestConfiguration implements DisposableBean
{
@Autowired
EclipseStoreStorage storage;
EclipseStoreClientConfiguration configuration;

@Value("${org.eclipse.store.storage-directory}")
private String storageDirectory;
Expand All @@ -49,15 +49,15 @@ public class TestConfiguration implements DisposableBean
public void handleContextRefresh(final ContextRefreshedEvent event)
{
// Init with empty root object
this.storage.clearData();
this.configuration.getStorageInstance().clearData();
}

@Override
public void destroy() throws Exception
{
// End with empty root object
this.storage.clearData();
this.storage.stop();
this.configuration.getStorageInstance().clearData();
this.configuration.getStorageInstance().stop();
FileSystemUtils.deleteRecursively(Path.of(this.storageDirectory));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@

import software.xdev.spring.data.eclipse.store.repository.EclipseStoreStorage;
import software.xdev.spring.data.eclipse.store.repository.SupportedChecker;
import software.xdev.spring.data.eclipse.store.repository.config.EclipseStoreClientConfiguration;
import software.xdev.spring.data.eclipse.store.repository.support.SimpleEclipseStoreRepository;
import software.xdev.spring.data.eclipse.store.repository.support.copier.working.RecursiveWorkingCopier;

Expand All @@ -41,11 +42,11 @@
public class EclipseStoreDataImporter
{
private static final Logger LOG = LoggerFactory.getLogger(EclipseStoreDataImporter.class);
private final EclipseStoreStorage eclipseStoreStorage;
private final EclipseStoreClientConfiguration configuration;

public EclipseStoreDataImporter(final EclipseStoreStorage eclipseStoreStorage)
public EclipseStoreDataImporter(final EclipseStoreClientConfiguration configuration)
{
this.eclipseStoreStorage = eclipseStoreStorage;
this.configuration = configuration;
}

/**
Expand Down Expand Up @@ -196,13 +197,14 @@ private <T> void createRepositoryForType(

private <T> SimpleEclipseStoreRepository<T, ?> createEclipseStoreRepo(final Class<T> domainClass)
{
final EclipseStoreStorage storageInstance = this.configuration.getStorageInstance();
return new SimpleEclipseStoreRepository<>(
this.eclipseStoreStorage,
storageInstance,
new RecursiveWorkingCopier<>(
domainClass,
this.eclipseStoreStorage.getRegistry(),
this.eclipseStoreStorage,
this.eclipseStoreStorage,
storageInstance.getRegistry(),
storageInstance,
storageInstance,
new SupportedChecker.Implementation()),
domainClass);
}
Expand Down
Loading