Skip to content

Commit 302d307

Browse files
Basically working, but tests failing
1 parent 1ca2f11 commit 302d307

File tree

10 files changed

+450
-10
lines changed

10 files changed

+450
-10
lines changed

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
import org.springframework.beans.factory.DisposableBean;
2121
import org.springframework.beans.factory.annotation.Autowired;
2222
import org.springframework.beans.factory.annotation.Value;
23+
import org.springframework.context.annotation.ComponentScan;
2324
import org.springframework.context.annotation.Configuration;
2425
import org.springframework.context.event.ContextRefreshedEvent;
2526
import org.springframework.context.event.EventListener;
@@ -28,7 +29,9 @@
2829
import software.xdev.spring.data.eclipse.store.repository.EclipseStoreStorage;
2930
import software.xdev.spring.data.eclipse.store.repository.config.EnableEclipseStoreRepositories;
3031

32+
3133
@Configuration
34+
@ComponentScan("software.xdev.spring.data.eclipse.store.importer")
3235
@EnableEclipseStoreRepositories
3336
public class TestConfiguration implements DisposableBean
3437
{

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

Lines changed: 29 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -22,28 +22,51 @@
2222
import org.junit.jupiter.api.Test;
2323
import org.springframework.beans.factory.annotation.Autowired;
2424

25+
import software.xdev.spring.data.eclipse.store.importer.EclipseStoreDataImporterComponent;
2526
import software.xdev.spring.data.eclipse.store.jpa.DefaultTestAnnotations;
26-
import software.xdev.spring.data.eclipse.store.jpa.integration.repository.PersonToTest;
27-
import software.xdev.spring.data.eclipse.store.jpa.integration.repository.PersonToTestRepository;
27+
import software.xdev.spring.data.eclipse.store.jpa.integration.repository.PersonToTestInEclipseStore;
28+
import software.xdev.spring.data.eclipse.store.jpa.integration.repository.PersonToTestInEclipseStoreRepository;
29+
import software.xdev.spring.data.eclipse.store.jpa.integration.repository.PersonToTestInJpa;
30+
import software.xdev.spring.data.eclipse.store.jpa.integration.repository.PersonToTestInJpaRepository;
31+
import software.xdev.spring.data.eclipse.store.repository.support.SimpleEclipseStoreRepository;
2832

2933

3034
@DefaultTestAnnotations
3135
public class IntegrationTest
3236
{
3337
@Autowired
34-
private PersonToTestRepository personToTestRepository;
38+
private PersonToTestInEclipseStoreRepository personToTestInEclipseStoreRepository;
39+
40+
@Autowired
41+
private PersonToTestInJpaRepository personToTestInJpaRepository;
42+
43+
@Autowired
44+
private EclipseStoreDataImporterComponent eclipseStoreDataImporter;
3545

3646
/**
3747
* Super simple test if there are any start-up errors when running parallel to a JPA configuration
3848
*/
3949
@Test
4050
void testBasicSaveAndFindSingleRecords()
4151
{
42-
final PersonToTest customer = new PersonToTest("", "");
43-
this.personToTestRepository.save(customer);
52+
final PersonToTestInEclipseStore customer = new PersonToTestInEclipseStore("", "");
53+
this.personToTestInEclipseStoreRepository.save(customer);
4454

45-
final List<PersonToTest> customers = this.personToTestRepository.findAll();
55+
final List<PersonToTestInEclipseStore> customers = this.personToTestInEclipseStoreRepository.findAll();
4656
Assertions.assertEquals(1, customers.size());
4757
Assertions.assertEquals(customer, customers.get(0));
4858
}
59+
60+
@Test
61+
void testEclipseStoreImport()
62+
{
63+
final PersonToTestInJpa customer = new PersonToTestInJpa("", "");
64+
this.personToTestInJpaRepository.save(customer);
65+
66+
final List<SimpleEclipseStoreRepository<?, ?>> simpleEclipseStoreRepositories =
67+
this.eclipseStoreDataImporter.importData();
68+
Assertions.assertEquals(1, simpleEclipseStoreRepositories.size());
69+
final List<?> allEntities = simpleEclipseStoreRepositories.get(0).findAll();
70+
Assertions.assertEquals(1, allEntities.size());
71+
}
4972
}
Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,15 +5,15 @@
55
import org.springframework.data.annotation.Id;
66

77

8-
public class PersonToTest
8+
public class PersonToTestInEclipseStore
99
{
1010
@Id
1111
private String id;
1212

1313
private final String firstName;
1414
private final String lastName;
1515

16-
public PersonToTest(final String firstName, final String lastName)
16+
public PersonToTestInEclipseStore(final String firstName, final String lastName)
1717
{
1818
this.firstName = firstName;
1919
this.lastName = lastName;
@@ -30,7 +30,7 @@ public boolean equals(final Object o)
3030
{
3131
return false;
3232
}
33-
final PersonToTest customer = (PersonToTest)o;
33+
final PersonToTestInEclipseStore customer = (PersonToTestInEclipseStore)o;
3434
return Objects.equals(this.id, customer.id) && Objects.equals(this.firstName, customer.firstName)
3535
&& Objects.equals(this.lastName, customer.lastName);
3636
}
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,6 @@
33
import software.xdev.spring.data.eclipse.store.repository.interfaces.EclipseStoreListCrudRepository;
44

55

6-
public interface PersonToTestRepository extends EclipseStoreListCrudRepository<PersonToTest, String>
6+
public interface PersonToTestInEclipseStoreRepository extends EclipseStoreListCrudRepository<PersonToTestInEclipseStore, String>
77
{
88
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
package software.xdev.spring.data.eclipse.store.jpa.integration.repository;
2+
3+
import java.util.Objects;
4+
5+
import jakarta.persistence.Entity;
6+
import jakarta.persistence.Id;
7+
8+
9+
@Entity
10+
public class PersonToTestInJpa
11+
{
12+
@Id
13+
private String id;
14+
15+
private String firstName;
16+
private String lastName;
17+
18+
public PersonToTestInJpa(final String firstName, final String lastName)
19+
{
20+
this.firstName = firstName;
21+
this.lastName = lastName;
22+
}
23+
24+
public PersonToTestInJpa()
25+
{
26+
27+
}
28+
29+
@Override
30+
public boolean equals(final Object o)
31+
{
32+
if(this == o)
33+
{
34+
return true;
35+
}
36+
if(o == null || this.getClass() != o.getClass())
37+
{
38+
return false;
39+
}
40+
final PersonToTestInJpa customer = (PersonToTestInJpa)o;
41+
return Objects.equals(this.id, customer.id) && Objects.equals(this.firstName, customer.firstName)
42+
&& Objects.equals(this.lastName, customer.lastName);
43+
}
44+
45+
@Override
46+
public int hashCode()
47+
{
48+
return Objects.hash(this.id, this.firstName, this.lastName);
49+
}
50+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package software.xdev.spring.data.eclipse.store.jpa.integration.repository;
2+
3+
import org.springframework.data.jpa.repository.JpaRepository;
4+
5+
6+
public interface PersonToTestInJpaRepository extends JpaRepository<PersonToTestInJpa, String>
7+
{
8+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,158 @@
1+
/*
2+
* Copyright © 2023 XDEV Software (https://xdev.software)
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* http://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
package software.xdev.spring.data.eclipse.store.importer;
17+
18+
import java.util.ArrayList;
19+
import java.util.Arrays;
20+
import java.util.List;
21+
import java.util.stream.Collectors;
22+
import java.util.stream.Stream;
23+
import java.util.stream.StreamSupport;
24+
25+
import jakarta.persistence.EntityManagerFactory;
26+
import jakarta.persistence.metamodel.EntityType;
27+
28+
import org.slf4j.Logger;
29+
import org.slf4j.LoggerFactory;
30+
31+
import software.xdev.spring.data.eclipse.store.repository.EclipseStoreStorage;
32+
import software.xdev.spring.data.eclipse.store.repository.support.SimpleEclipseStoreRepository;
33+
import software.xdev.spring.data.eclipse.store.repository.support.copier.working.RecursiveWorkingCopier;
34+
35+
36+
public class EclipseStoreDataImporter
37+
{
38+
private static final Logger LOG = LoggerFactory.getLogger(EclipseStoreDataImporter.class);
39+
private final EclipseStoreStorage eclipseStoreStorage;
40+
41+
public EclipseStoreDataImporter(final EclipseStoreStorage eclipseStoreStorage)
42+
{
43+
this.eclipseStoreStorage = eclipseStoreStorage;
44+
}
45+
46+
public List<SimpleEclipseStoreRepository<?, ?>> importData(final EntityManagerFactory... entityManagerFactories)
47+
{
48+
return this.importData(Arrays.stream(entityManagerFactories));
49+
}
50+
51+
public List<SimpleEclipseStoreRepository<?, ?>> importData(final Iterable<EntityManagerFactory> entityManagerFactories)
52+
{
53+
return this.importData(StreamSupport.stream(entityManagerFactories.spliterator(), false));
54+
}
55+
56+
public List<SimpleEclipseStoreRepository<?, ?>> importData(final Stream<EntityManagerFactory> entityManagerFactories)
57+
{
58+
LOG.info("Start importing data from JPA Repositories to EclipseStore...");
59+
60+
// First create all repositories to register them in the EclipseStoreStorage
61+
final List<EntityManagerFactoryRepositoryListPair> allRepositories =
62+
entityManagerFactories
63+
.map(this::createEclipseStoreRepositoriesFromEntityManager)
64+
.toList();
65+
LOG.info(String.format("Found %d repositories to export data from.", allRepositories.size()));
66+
67+
// Now copy the data
68+
allRepositories.forEach(
69+
entityManagerFactoryRepositoryListPair ->
70+
entityManagerFactoryRepositoryListPair
71+
.classRepositoryPairs
72+
.forEach(
73+
classRepositoryPair -> copyData(entityManagerFactoryRepositoryListPair, classRepositoryPair)
74+
)
75+
);
76+
LOG.info("Done importing data from JPA Repositories to EclipseStore.");
77+
78+
return allRepositories
79+
.stream()
80+
.map(EntityManagerFactoryRepositoryListPair::classRepositoryPairs)
81+
.flatMap(List::stream)
82+
.map(ClassRepositoryPair::repository)
83+
.collect(Collectors.toList());
84+
}
85+
86+
private static <T> void copyData(
87+
final EntityManagerFactoryRepositoryListPair entityManagerFactoryRepositoryListPair,
88+
final ClassRepositoryPair<T> classRepositoryPair)
89+
{
90+
final String className = classRepositoryPair.domainClass.getName();
91+
92+
LOG.info(String.format("Loading entities of %s...", className));
93+
final List<T> existingEntitiesToExport =
94+
entityManagerFactoryRepositoryListPair.entityManagerFactory.createEntityManager()
95+
.createQuery("SELECT c FROM " + className + " c")
96+
.getResultList();
97+
LOG.info(String.format(
98+
"Loaded %d entities of type %s to export.",
99+
existingEntitiesToExport.size(),
100+
className
101+
));
102+
103+
LOG.info(String.format(
104+
"Saving %d entities of type %s to the EclipseStore Repository...",
105+
existingEntitiesToExport.size(),
106+
className
107+
));
108+
classRepositoryPair.repository.saveAll(existingEntitiesToExport);
109+
LOG.info(String.format(
110+
"Done saving entities of type %s. The EclipseStore now holds %d entities of that type.",
111+
className,
112+
classRepositoryPair.repository.count()
113+
));
114+
}
115+
116+
private EntityManagerFactoryRepositoryListPair createEclipseStoreRepositoriesFromEntityManager(
117+
final EntityManagerFactory entityManagerFactory)
118+
{
119+
final List<ClassRepositoryPair<?>> repositoryList = new ArrayList<>();
120+
entityManagerFactory.getMetamodel().getEntities().forEach(
121+
entityType -> this.createRepositoryForType(entityType, repositoryList)
122+
);
123+
124+
return new EntityManagerFactoryRepositoryListPair(entityManagerFactory, repositoryList);
125+
}
126+
127+
private <T> void createRepositoryForType(
128+
final EntityType<T> entityType,
129+
final List<ClassRepositoryPair<?>> repositoryList)
130+
{
131+
final Class<T> javaType = entityType.getJavaType();
132+
repositoryList.add(new ClassRepositoryPair<>(javaType, this.createEclipseStoreRepo(javaType)));
133+
}
134+
135+
private <T> SimpleEclipseStoreRepository<T, ?> createEclipseStoreRepo(final Class<T> domainClass)
136+
{
137+
return new SimpleEclipseStoreRepository<>(
138+
this.eclipseStoreStorage,
139+
new RecursiveWorkingCopier<>(
140+
domainClass,
141+
this.eclipseStoreStorage.getRegistry(),
142+
this.eclipseStoreStorage,
143+
this.eclipseStoreStorage),
144+
domainClass);
145+
}
146+
147+
private record EntityManagerFactoryRepositoryListPair(
148+
EntityManagerFactory entityManagerFactory,
149+
List<ClassRepositoryPair<?>> classRepositoryPairs
150+
)
151+
{
152+
}
153+
154+
155+
private record ClassRepositoryPair<T>(Class<T> domainClass, SimpleEclipseStoreRepository<T, ?> repository)
156+
{
157+
}
158+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
/*
2+
* Copyright © 2023 XDEV Software (https://xdev.software)
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* http://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
package software.xdev.spring.data.eclipse.store.importer;
17+
18+
import java.util.List;
19+
import java.util.Map;
20+
21+
import jakarta.persistence.EntityManagerFactory;
22+
23+
import org.springframework.context.ApplicationContext;
24+
import org.springframework.stereotype.Component;
25+
26+
import software.xdev.spring.data.eclipse.store.repository.EclipseStoreStorage;
27+
import software.xdev.spring.data.eclipse.store.repository.support.SimpleEclipseStoreRepository;
28+
29+
30+
@Component
31+
public class EclipseStoreDataImporterComponent
32+
{
33+
private final EclipseStoreDataImporter importer;
34+
private final ApplicationContext applicationContext;
35+
36+
public EclipseStoreDataImporterComponent(
37+
final EclipseStoreStorage eclipseStoreStorage,
38+
final ApplicationContext applicationContext)
39+
{
40+
this.importer = new EclipseStoreDataImporter(eclipseStoreStorage);
41+
this.applicationContext = applicationContext;
42+
}
43+
44+
public List<SimpleEclipseStoreRepository<?,?>> importData()
45+
{
46+
final Map<String, EntityManagerFactory> beansOfEms =
47+
this.applicationContext.getBeansOfType(EntityManagerFactory.class);
48+
return this.importer.importData(beansOfEms.values());
49+
}
50+
}

0 commit comments

Comments
 (0)