Skip to content

Commit c500cb1

Browse files
Merge pull request #39 from xdev-software/multiple-storages
Multiple storages
2 parents 0a730da + d509676 commit c500cb1

File tree

111 files changed

+867
-456
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

111 files changed

+867
-456
lines changed

.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,8 @@ target/
6868

6969
# EclipseStore
7070
storage
71+
storage-person
72+
storage-invoice
7173
storage-jpa
7274

7375
# == IntelliJ ==

.run/Run Dual Storage Demo.run.xml

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
<component name="ProjectRunConfigurationManager">
2+
<configuration default="false" name="Run Dual Storage Demo" type="Application" factoryName="Application">
3+
<option name="MAIN_CLASS_NAME" value="software.xdev.spring.data.eclipse.store.demo.dual.storage.DualStorageDemoApplication" />
4+
<module name="spring-data-eclipse-store-demo" />
5+
<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" />
6+
<option name="WORKING_DIRECTORY" value="$MODULE_DIR$" />
7+
<extension name="coverage">
8+
<pattern>
9+
<option name="PATTERN" value="software.xdev.*" />
10+
<option name="ENABLED" value="true" />
11+
</pattern>
12+
</extension>
13+
<method v="2">
14+
<option name="Make" enabled="true" />
15+
</method>
16+
</configuration>
17+
</component>

CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
# 1.0.4
2+
3+
* Added possibility to use multiple storages
4+
15
# 1.0.3
26

37
* Added the EclipseStoreDataImporter to import data from JPA repositories.

README.md

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -55,12 +55,13 @@ instructions** are in the documentation](https://xdev-software.github.io/spring-
5555

5656
## Demo
5757

58-
To see how easy it is to implement EclipseStore in your Spring project, take a look at the three
59-
[demos](./spring-data-eclipse-store-demo):<br/>
60-
A [simple](./spring-data-eclipse-store-demo/src/main/java/software/xdev/spring/data/eclipse/store/demo/simple), a
61-
more [complex demo](./spring-data-eclipse-store-demo/src/main/java/software/xdev/spring/data/eclipse/store/demo/complex)
62-
and
63-
a [demo with coexisting JPA](./spring-data-eclipse-store-jpa/src/main/java/software/xdev/spring/data/eclipse/store/jpa).
58+
To see how easy it is to implement EclipseStore in your Spring project, take a look at
59+
the [demos](./spring-data-eclipse-store-demo):
60+
61+
* [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)
62+
* [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)
63+
* [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)
64+
* [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)
6465

6566
> [!NOTE]
6667
> Since the library is using reflection to copy data, the following JVM-Arguments may have to be set:
@@ -71,7 +72,6 @@ a [demo with coexisting JPA](./spring-data-eclipse-store-jpa/src/main/java/softw
7172
> --add-opens=java.base/java.time=ALL-UNNAMED
7273
> ```
7374
74-
7575
## Support
7676
7777
If you need support as soon as possible, and you can't wait for any pull request, feel free to

docs/modules/ROOT/nav.adoc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
* xref:index.adoc[Home]
22
* xref:installation.adoc[Installation]
3+
* xref:configuration.adoc[Configuration]
34
* xref:working-copies.adoc[Working Copies]
45
* xref:migration.adoc[Migration]
56
* xref:known-issues.adoc[Known issues]
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
= Configuration
2+
3+
== EclipseStore Spring-Boot Configuration
4+
5+
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].
6+
7+
== Detailed Configuration
8+
9+
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:
10+
11+
[source,java,title="Demo configuration"]
12+
----
13+
import org.eclipse.store.storage.embedded.types.EmbeddedStorage;
14+
import org.eclipse.store.storage.embedded.types.EmbeddedStorageFoundation;
15+
import org.eclipse.store.storage.types.Storage;
16+
...
17+
@Configuration
18+
@EnableEclipseStoreRepositories(clientConfigurationClass = DemoConfiguration.class)
19+
public class DemoConfiguration extends EclipseStoreClientConfiguration
20+
{
21+
@Override
22+
public EmbeddedStorageFoundation<?> createEmbeddedStorageFoundation()
23+
{
24+
return EmbeddedStorage.Foundation(Storage.Configuration(Storage.FileProvider(Path.of("demo-storage"))));
25+
}
26+
}
27+
----
28+
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].
29+
30+
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].

docs/modules/ROOT/pages/installation.adoc

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,8 +38,12 @@ Since the library is using reflection to copy data, the following JVM-Arguments
3838

3939
== Demo
4040

41-
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]:
42-
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].
41+
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]:
42+
43+
* 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]
44+
* 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]
45+
* 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]
46+
* 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]
4347

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

pom.xml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,11 @@
1414
<url>https://xdev.software</url>
1515
</organization>
1616

17+
<properties>
18+
<javaVersion>17</javaVersion>
19+
<maven.compiler.release>${javaVersion}</maven.compiler.release>
20+
</properties>
21+
1722
<modules>
1823
<module>spring-data-eclipse-store</module>
1924
<module>spring-data-eclipse-store-demo</module>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
package software.xdev.spring.data.eclipse.store.demo.dual.storage;
2+
3+
import org.slf4j.Logger;
4+
import org.slf4j.LoggerFactory;
5+
import org.springframework.boot.CommandLineRunner;
6+
import org.springframework.boot.SpringApplication;
7+
import org.springframework.boot.autoconfigure.SpringBootApplication;
8+
import org.springframework.context.ConfigurableApplicationContext;
9+
10+
import software.xdev.spring.data.eclipse.store.demo.dual.storage.invoice.Invoice;
11+
import software.xdev.spring.data.eclipse.store.demo.dual.storage.invoice.InvoiceRepository;
12+
import software.xdev.spring.data.eclipse.store.demo.dual.storage.person.Person;
13+
import software.xdev.spring.data.eclipse.store.demo.dual.storage.person.PersonRepository;
14+
15+
16+
@SpringBootApplication
17+
public class DualStorageDemoApplication implements CommandLineRunner
18+
{
19+
private static final Logger LOG = LoggerFactory.getLogger(DualStorageDemoApplication.class);
20+
private final InvoiceRepository invoiceRepository;
21+
private final PersonRepository personRepository;
22+
23+
public DualStorageDemoApplication(
24+
final InvoiceRepository invoiceRepository,
25+
final PersonRepository personRepository)
26+
{
27+
this.invoiceRepository = invoiceRepository;
28+
this.personRepository = personRepository;
29+
}
30+
31+
public static void main(final String[] args)
32+
{
33+
final ConfigurableApplicationContext run = SpringApplication.run(DualStorageDemoApplication.class, args);
34+
run.close();
35+
}
36+
37+
@Override
38+
public void run(final String... args)
39+
{
40+
LOG.info("----Invoices-BeforeDeleteAll----");
41+
this.invoiceRepository.findAll().forEach(i -> LOG.info(i.toString()));
42+
this.invoiceRepository.deleteAll();
43+
44+
LOG.info("----Invoices-AfterDeleteAll----");
45+
this.invoiceRepository.findAll().forEach(i -> LOG.info(i.toString()));
46+
47+
this.invoiceRepository.save(new Invoice("N1", 100.0));
48+
49+
LOG.info("----Persons-BeforeDeleteAll----");
50+
this.personRepository.findAll().forEach(i -> LOG.info(i.toString()));
51+
this.personRepository.deleteAll();
52+
53+
LOG.info("----Persons-AfterDeleteAll----");
54+
this.personRepository.findAll().forEach(i -> LOG.info(i.toString()));
55+
56+
this.personRepository.save(new Person("Stevie", "Nicks"));
57+
}
58+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
package software.xdev.spring.data.eclipse.store.demo.dual.storage.invoice;
2+
3+
public record Invoice(String id, double sum)
4+
{
5+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package software.xdev.spring.data.eclipse.store.demo.dual.storage.invoice;
2+
3+
import org.springframework.data.repository.CrudRepository;
4+
5+
6+
public interface InvoiceRepository extends CrudRepository<Invoice, Integer>
7+
{
8+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
package software.xdev.spring.data.eclipse.store.demo.dual.storage.invoice;
2+
3+
import java.nio.file.Path;
4+
5+
import org.eclipse.store.storage.embedded.types.EmbeddedStorage;
6+
import org.eclipse.store.storage.embedded.types.EmbeddedStorageFoundation;
7+
import org.eclipse.store.storage.types.Storage;
8+
import org.springframework.context.annotation.Configuration;
9+
10+
import software.xdev.spring.data.eclipse.store.repository.config.EclipseStoreClientConfiguration;
11+
import software.xdev.spring.data.eclipse.store.repository.config.EnableEclipseStoreRepositories;
12+
13+
14+
@Configuration
15+
@EnableEclipseStoreRepositories(
16+
value = "software.xdev.spring.data.eclipse.store.demo.dual.storage.invoice",
17+
clientConfiguration = "persistenceInvoiceConfiguration"
18+
)
19+
public class PersistenceInvoiceConfiguration extends EclipseStoreClientConfiguration
20+
{
21+
@Override
22+
public EmbeddedStorageFoundation<?> createEmbeddedStorageFoundation()
23+
{
24+
return EmbeddedStorage.Foundation(Storage.Configuration(Storage.FileProvider(Path.of("storage-invoice"))));
25+
}
26+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package software.xdev.spring.data.eclipse.store.demo.dual.storage.person;
2+
3+
import static org.eclipse.store.storage.embedded.types.EmbeddedStorage.Foundation;
4+
5+
import java.nio.file.Path;
6+
7+
import org.eclipse.store.storage.embedded.types.EmbeddedStorageFoundation;
8+
import org.eclipse.store.storage.types.Storage;
9+
import org.springframework.context.annotation.Configuration;
10+
11+
import software.xdev.spring.data.eclipse.store.repository.config.EclipseStoreClientConfiguration;
12+
import software.xdev.spring.data.eclipse.store.repository.config.EnableEclipseStoreRepositories;
13+
14+
15+
@Configuration
16+
@EnableEclipseStoreRepositories(
17+
value = "software.xdev.spring.data.eclipse.store.demo.dual.storage.person",
18+
clientConfigurationClass = PersistencePersonConfiguration.class
19+
)
20+
public class PersistencePersonConfiguration extends EclipseStoreClientConfiguration
21+
{
22+
@Override
23+
public EmbeddedStorageFoundation<?> createEmbeddedStorageFoundation()
24+
{
25+
return Foundation(Storage.Configuration(Storage.FileProvider(Path.of("storage-person"))));
26+
}
27+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
package software.xdev.spring.data.eclipse.store.demo.dual.storage.person;
2+
3+
public record Person(String firstName, String lastName)
4+
{
5+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package software.xdev.spring.data.eclipse.store.demo.dual.storage.person;
2+
3+
import org.springframework.data.repository.CrudRepository;
4+
5+
6+
public interface PersonRepository extends CrudRepository<Person, Integer>
7+
{
8+
}

spring-data-eclipse-store-jpa/src/test/java/software/xdev/spring/data/eclipse/store/jpa/integration/IntegrationTest.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@
2727
import software.xdev.spring.data.eclipse.store.jpa.integration.repository.PersonToTestInEclipseStoreRepository;
2828
import software.xdev.spring.data.eclipse.store.jpa.integration.repository.PersonToTestInJpa;
2929
import software.xdev.spring.data.eclipse.store.jpa.integration.repository.PersonToTestInJpaRepository;
30-
import software.xdev.spring.data.eclipse.store.repository.EclipseStoreStorage;
30+
import software.xdev.spring.data.eclipse.store.repository.config.EclipseStoreClientConfiguration;
3131
import software.xdev.spring.data.eclipse.store.repository.support.SimpleEclipseStoreRepository;
3232

3333

@@ -44,7 +44,7 @@ class IntegrationTest
4444
private EclipseStoreDataImporterComponent eclipseStoreDataImporter;
4545

4646
@Autowired
47-
private EclipseStoreStorage eclipseStoreStorage;
47+
private EclipseStoreClientConfiguration configuration;
4848

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

75-
this.eclipseStoreStorage.stop();
75+
this.configuration.getStorageInstance().stop();
7676
Assertions.assertEquals(
7777
1,
78-
this.eclipseStoreStorage.getEntityCount(PersonToTestInJpa.class),
78+
this.configuration.getStorageInstance().getEntityCount(PersonToTestInJpa.class),
7979
"After restart the imported entities are not there anymore.");
8080
}
8181

spring-data-eclipse-store-jpa/src/test/java/software/xdev/spring/data/eclipse/store/jpa/integration/TestConfiguration.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@
2828
import org.springframework.context.event.EventListener;
2929
import org.springframework.util.FileSystemUtils;
3030

31-
import software.xdev.spring.data.eclipse.store.repository.EclipseStoreStorage;
31+
import software.xdev.spring.data.eclipse.store.repository.config.EclipseStoreClientConfiguration;
3232
import software.xdev.spring.data.eclipse.store.repository.config.EnableEclipseStoreRepositories;
3333

3434

@@ -40,7 +40,7 @@
4040
public class TestConfiguration implements DisposableBean
4141
{
4242
@Autowired
43-
EclipseStoreStorage storage;
43+
EclipseStoreClientConfiguration configuration;
4444

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

5555
@Override
5656
public void destroy() throws Exception
5757
{
5858
// End with empty root object
59-
this.storage.clearData();
60-
this.storage.stop();
59+
this.configuration.getStorageInstance().clearData();
60+
this.configuration.getStorageInstance().stop();
6161
FileSystemUtils.deleteRecursively(Path.of(this.storageDirectory));
6262
}
6363
}

spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/importer/EclipseStoreDataImporter.java

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131

3232
import software.xdev.spring.data.eclipse.store.repository.EclipseStoreStorage;
3333
import software.xdev.spring.data.eclipse.store.repository.SupportedChecker;
34+
import software.xdev.spring.data.eclipse.store.repository.config.EclipseStoreClientConfiguration;
3435
import software.xdev.spring.data.eclipse.store.repository.support.SimpleEclipseStoreRepository;
3536
import software.xdev.spring.data.eclipse.store.repository.support.copier.working.RecursiveWorkingCopier;
3637

@@ -41,11 +42,11 @@
4142
public class EclipseStoreDataImporter
4243
{
4344
private static final Logger LOG = LoggerFactory.getLogger(EclipseStoreDataImporter.class);
44-
private final EclipseStoreStorage eclipseStoreStorage;
45+
private final EclipseStoreClientConfiguration configuration;
4546

46-
public EclipseStoreDataImporter(final EclipseStoreStorage eclipseStoreStorage)
47+
public EclipseStoreDataImporter(final EclipseStoreClientConfiguration configuration)
4748
{
48-
this.eclipseStoreStorage = eclipseStoreStorage;
49+
this.configuration = configuration;
4950
}
5051

5152
/**
@@ -196,13 +197,14 @@ private <T> void createRepositoryForType(
196197

197198
private <T> SimpleEclipseStoreRepository<T, ?> createEclipseStoreRepo(final Class<T> domainClass)
198199
{
200+
final EclipseStoreStorage storageInstance = this.configuration.getStorageInstance();
199201
return new SimpleEclipseStoreRepository<>(
200-
this.eclipseStoreStorage,
202+
storageInstance,
201203
new RecursiveWorkingCopier<>(
202204
domainClass,
203-
this.eclipseStoreStorage.getRegistry(),
204-
this.eclipseStoreStorage,
205-
this.eclipseStoreStorage,
205+
storageInstance.getRegistry(),
206+
storageInstance,
207+
storageInstance,
206208
new SupportedChecker.Implementation()),
207209
domainClass);
208210
}

0 commit comments

Comments
 (0)