Skip to content

Commit 10c285c

Browse files
LazyRepositories: Implemented StorageCommunicator
1 parent 00d4907 commit 10c285c

19 files changed

Lines changed: 487 additions & 97 deletions

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

Lines changed: 54 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,6 @@
4141
import software.xdev.spring.data.eclipse.store.repository.interfaces.EclipseStoreRepository;
4242
import software.xdev.spring.data.eclipse.store.repository.root.EntityData;
4343
import software.xdev.spring.data.eclipse.store.repository.root.VersionedRoot;
44-
import software.xdev.spring.data.eclipse.store.repository.support.SimpleEclipseStoreRepository;
4544
import software.xdev.spring.data.eclipse.store.repository.support.concurrency.ReadWriteLock;
4645
import software.xdev.spring.data.eclipse.store.repository.support.concurrency.ReentrantJavaReadWriteLock;
4746
import software.xdev.spring.data.eclipse.store.repository.support.copier.version.EntityVersionIncrementer;
@@ -60,6 +59,7 @@ public class EclipseStoreStorage
6059
{
6160
private static final Logger LOG = LoggerFactory.getLogger(EclipseStoreStorage.class);
6261
private final Map<Class<?>, EclipseStoreRepository<?, ?>> entityClassToRepository = new HashMap<>();
62+
private final Map<Class<?>, EclipseStoreRepository<?, ?>> lazyEntityClassToRepository = new HashMap<>();
6363
/**
6464
* "Why are the IdManagers seperated from the repositories?" - Because there might be entities for which there are
6565
* no repositories, but they still have IDs.
@@ -161,6 +161,11 @@ else if(!(embeddedStorageManager.root() instanceof VersionedRoot))
161161
return this.entityClassToRepository.get(entityClass);
162162
}
163163

164+
public <T> EclipseStoreRepository<?, ?> getLazyRepository(final Class<T> entityClass)
165+
{
166+
return this.lazyEntityClassToRepository.get(entityClass);
167+
}
168+
164169
private void initRoot()
165170
{
166171
if(LOG.isDebugEnabled())
@@ -169,6 +174,20 @@ private void initRoot()
169174
}
170175
this.repositorySynchronizer =
171176
new SimpleRepositorySynchronizer(this.root.getCurrentRootData());
177+
this.ensureEntityData();
178+
this.ensureLazyEntityData();
179+
this.entitySetCollector =
180+
new EntitySetCollector(
181+
this.root.getCurrentRootData()::getEntityData,
182+
this.entityClassToRepository.keySet());
183+
if(LOG.isDebugEnabled())
184+
{
185+
LOG.debug("Done initializing entity lists.");
186+
}
187+
}
188+
189+
private void ensureEntityData()
190+
{
172191
boolean entityListMustGetStored = false;
173192
for(final Class<?> entityClass : this.entityClassToRepository.keySet())
174193
{
@@ -186,13 +205,26 @@ private void initRoot()
186205
{
187206
this.storageManager.store(this.root.getCurrentRootData().getEntityListsToStore());
188207
}
189-
this.entitySetCollector =
190-
new EntitySetCollector(
191-
this.root.getCurrentRootData()::getEntityData,
192-
this.entityClassToRepository.keySet());
193-
if(LOG.isDebugEnabled())
208+
}
209+
210+
private void ensureLazyEntityData()
211+
{
212+
boolean entityListMustGetStored = false;
213+
for(final Class<?> entityClass : this.lazyEntityClassToRepository.keySet())
194214
{
195-
LOG.debug("Done initializing entity lists.");
215+
if(this.root.getCurrentRootData().getLazyEntityData(entityClass) == null)
216+
{
217+
this.createNewLazyEntityData(entityClass, this.root);
218+
entityListMustGetStored = true;
219+
}
220+
else
221+
{
222+
this.setIdManagerForEntityData(entityClass, this.root);
223+
}
224+
}
225+
if(entityListMustGetStored)
226+
{
227+
this.storageManager.store(this.root.getCurrentRootData().getLazyEntityListsToStore());
196228
}
197229
}
198230

@@ -202,6 +234,12 @@ private <T, ID> void createNewEntityData(final Class<T> entityClass, final Versi
202234
root.getCurrentRootData().createNewEntityData(entityClass, idManager::getId);
203235
}
204236

237+
private <T, ID> void createNewLazyEntityData(final Class<T> entityClass, final VersionedRoot root)
238+
{
239+
final IdManager<T, ID> idManager = this.ensureIdManager(entityClass);
240+
root.getCurrentRootData().createNewLazyEntityData(entityClass, idManager::getId);
241+
}
242+
205243
private <T, ID> void setIdManagerForEntityData(final Class<T> entityClass, final VersionedRoot root)
206244
{
207245
final IdManager<T, ID> idManager = this.ensureIdManager(entityClass);
@@ -237,9 +275,13 @@ public synchronized <T> void registerEntity(
237275
private <T, ID> EntityData<T, ID> getEntityData(final Class<T> clazz)
238276
{
239277
this.ensureEntitiesInRoot();
240-
return this.readWriteLock.read(
241-
() -> this.root.getCurrentRootData().getEntityData(clazz)
242-
);
278+
return this.readWriteLock.read(() -> this.root.getCurrentRootData().getEntityData(clazz));
279+
}
280+
281+
private <T, ID> EntityData<T, ID> getLazyEntityData(final Class<T> clazz)
282+
{
283+
this.ensureEntitiesInRoot();
284+
return this.readWriteLock.read(() -> this.root.getCurrentRootData().getLazyEntityData(clazz));
243285
}
244286

245287
@Override
@@ -298,10 +340,12 @@ private <T, ID> Collection<Object> collectRootEntitiesToStore(
298340
final Iterable<T> entitiesToStore)
299341
{
300342
final EntityData<T, ID> entityData = this.getEntityData(clazz);
343+
final EntityData<T, ID> lazyEntityData = this.getLazyEntityData(clazz);
301344
final Collection<Object> objectsToStore = new ArrayList<>();
302345
for(final T entityToStore : entitiesToStore)
303346
{
304347
objectsToStore.addAll(entityData.ensureEntityAndReturnObjectsToStore(entityToStore));
348+
objectsToStore.addAll(lazyEntityData.ensureEntityAndReturnObjectsToStore(entityToStore));
305349
objectsToStore.add(entityToStore);
306350
// Add the separate lists of entities to store.
307351
this.repositorySynchronizer.syncAndReturnChangedObjectLists(entityToStore).forEach(
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package software.xdev.spring.data.eclipse.store.repository;
2+
3+
import java.util.List;
4+
import java.util.Set;
5+
import java.util.stream.Collectors;
6+
7+
import software.xdev.spring.data.eclipse.store.core.EntityProvider;
8+
import software.xdev.spring.data.eclipse.store.repository.support.concurrency.ReadWriteLock;
9+
10+
11+
public interface StorageCommunicator
12+
{
13+
ReadWriteLock getReadWriteLock();
14+
15+
<T> void store(Set<Object> nonEntitiesToStore, Class<T> domainClass, List<T> entitiesToStore);
16+
17+
<T, ID> EntityProvider<T, ID> getEntityProvider(final Class<T> clazz);
18+
19+
<T> long getEntityCount(Class<T> domainClass);
20+
21+
<T> void delete(Class<T> domainClass, T foundEntity);
22+
23+
<T> void deleteAll(Class<T> domainClass);
24+
}

spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/interfaces/lazy/LazyEclipseStoreCrudRepository.java

Lines changed: 3 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -15,14 +15,13 @@
1515
*/
1616
package software.xdev.spring.data.eclipse.store.repository.interfaces.lazy;
1717

18-
import org.eclipse.serializer.reference.Lazy;
1918
import org.springframework.data.repository.CrudRepository;
2019
import org.springframework.data.repository.NoRepositoryBean;
2120

2221

2322
@SuppressWarnings("java:S119")
2423
@NoRepositoryBean
25-
public interface LazyEclipseStoreCrudRepository<T, ID> extends CrudRepository<Lazy<T>, ID>
24+
public interface LazyEclipseStoreCrudRepository<T, ID> extends CrudRepository<T, ID>
2625
{
2726
/**
2827
* @inheritDoc <b>Caution with referenced objects!</b><br/> If you are deleting an object that is referenced by
@@ -40,15 +39,6 @@ public interface LazyEclipseStoreCrudRepository<T, ID> extends CrudRepository<La
4039
@Override
4140
void deleteById(ID id);
4241

43-
/**
44-
* @inheritDoc <b>Caution with referenced objects!</b><br/> If you are deleting an object that is referenced by
45-
* another object, the behavior of this function may differ from what you are used to!
46-
* <p>
47-
* For more information see {@link #deleteById(Object)}
48-
* </p>
49-
*/
50-
void deleteEntity(T entity);
51-
5242
/**
5343
* @inheritDoc <b>Caution with referenced objects!</b><br/> If you are deleting an object that is referenced by
5444
* another object, the behavior of this function may differ from what you are used to!
@@ -57,7 +47,7 @@ public interface LazyEclipseStoreCrudRepository<T, ID> extends CrudRepository<La
5747
* </p>
5848
*/
5949
@Override
60-
void delete(Lazy<T> entity);
50+
void delete(T entity);
6151

6252
/**
6353
* @inheritDoc <b>Caution with referenced objects!</b><br/> If you are deleting an object that is referenced by
@@ -77,16 +67,7 @@ public interface LazyEclipseStoreCrudRepository<T, ID> extends CrudRepository<La
7767
* </p>
7868
*/
7969
@Override
80-
void deleteAll(Iterable<? extends Lazy<T>> entities);
81-
82-
/**
83-
* @inheritDoc <b>Caution with referenced objects!</b><br/> If you are deleting an object that is referenced by
84-
* another object, the behavior of this function may differ from what you are used to!
85-
* <p>
86-
* For more information see {@link #deleteById(Object)}
87-
* </p>
88-
*/
89-
void deleteAllEntities(Iterable<? extends T> entities);
70+
void deleteAll(Iterable<? extends T> entities);
9071

9172
/**
9273
* @inheritDoc <b>Caution with referenced objects!</b><br/> If you are deleting an object that is referenced by

spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/interfaces/lazy/LazyEclipseStoreCustomRepository.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,6 @@
2222

2323
@SuppressWarnings("java:S119")
2424
@NoRepositoryBean
25-
public interface LazyEclipseStoreCustomRepository<T, ID> extends Repository<Lazy<T>, ID>
25+
public interface LazyEclipseStoreCustomRepository<T, ID> extends Repository<T, ID>
2626
{
2727
}

spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/interfaces/lazy/LazyEclipseStoreListCrudRepository.java

Lines changed: 3 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -15,16 +15,13 @@
1515
*/
1616
package software.xdev.spring.data.eclipse.store.repository.interfaces.lazy;
1717

18-
import java.util.List;
19-
20-
import org.eclipse.serializer.reference.Lazy;
2118
import org.springframework.data.repository.ListCrudRepository;
2219
import org.springframework.data.repository.NoRepositoryBean;
2320

2421

2522
@SuppressWarnings("java:S119")
2623
@NoRepositoryBean
27-
public interface LazyEclipseStoreListCrudRepository<T, ID> extends ListCrudRepository<Lazy<T>, ID>
24+
public interface LazyEclipseStoreListCrudRepository<T, ID> extends ListCrudRepository<T, ID>
2825
{
2926
/**
3027
* @inheritDoc <b>Caution with referenced objects!</b><br/> If you are deleting an object that is referenced by
@@ -34,26 +31,7 @@ public interface LazyEclipseStoreListCrudRepository<T, ID> extends ListCrudRepos
3431
* </p>
3532
*/
3633
@Override
37-
void deleteById(ID id);
38-
39-
/**
40-
* @inheritDoc <b>Caution with referenced objects!</b><br/> If you are deleting an object that is referenced by
41-
* another object, the behavior of this function may differ from what you are used to!
42-
* <p>
43-
* For more information see {@link LazyEclipseStoreCrudRepository#deleteById(Object)}
44-
* </p>
45-
*/
46-
@Override
47-
void delete(Lazy<T> entity);
48-
49-
/**
50-
* @inheritDoc <b>Caution with referenced objects!</b><br/> If you are deleting an object that is referenced by
51-
* another object, the behavior of this function may differ from what you are used to!
52-
* <p>
53-
* For more information see {@link LazyEclipseStoreCrudRepository#deleteById(Object)}
54-
* </p>
55-
*/
56-
void deleteEntity(T entity);
34+
void delete(T entity);
5735

5836
/**
5937
* @inheritDoc <b>Caution with referenced objects!</b><br/> If you are deleting an object that is referenced by
@@ -73,16 +51,7 @@ public interface LazyEclipseStoreListCrudRepository<T, ID> extends ListCrudRepos
7351
* </p>
7452
*/
7553
@Override
76-
void deleteAll(Iterable<? extends Lazy<T>> entities);
77-
78-
/**
79-
* @inheritDoc <b>Caution with referenced objects!</b><br/> If you are deleting an object that is referenced by
80-
* another object, the behavior of this function may differ from what you are used to!
81-
* <p>
82-
* For more information see {@link LazyEclipseStoreCrudRepository#deleteById(Object)}
83-
* </p>
84-
*/
85-
void deleteAllEntities(Iterable<? extends T> entities);
54+
void deleteAll(Iterable<? extends T> entities);
8655

8756
/**
8857
* @inheritDoc <b>Caution with referenced objects!</b><br/> If you are deleting an object that is referenced by
@@ -93,8 +62,4 @@ public interface LazyEclipseStoreListCrudRepository<T, ID> extends ListCrudRepos
9362
*/
9463
@Override
9564
void deleteAll();
96-
97-
<S extends T> List<S> saveAllEntities(Iterable<S> entities);
98-
99-
<S extends T> S saveEntity(S entity);
10065
}

spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/interfaces/lazy/LazyEclipseStoreListPagingAndSortingRepositoryRepository.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,6 @@
2323
@SuppressWarnings("java:S119")
2424
@NoRepositoryBean
2525
public interface LazyEclipseStoreListPagingAndSortingRepositoryRepository<T, ID>
26-
extends ListPagingAndSortingRepository<Lazy<T>, ID>
26+
extends ListPagingAndSortingRepository<T, ID>
2727
{
2828
}

spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/interfaces/lazy/LazyEclipseStorePagingAndSortingRepositoryRepository.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,6 @@
2323
@SuppressWarnings("java:S119")
2424
@NoRepositoryBean
2525
public interface LazyEclipseStorePagingAndSortingRepositoryRepository<T, ID>
26-
extends PagingAndSortingRepository<Lazy<T>, ID>
26+
extends PagingAndSortingRepository<T, ID>
2727
{
2828
}

spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/interfaces/lazy/LazyEclipseStoreQueryByExampleExecutor.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,6 @@
2222

2323
@SuppressWarnings("java:S119")
2424
@NoRepositoryBean
25-
public interface LazyEclipseStoreQueryByExampleExecutor<T> extends QueryByExampleExecutor<Lazy<T>>
25+
public interface LazyEclipseStoreQueryByExampleExecutor<T> extends QueryByExampleExecutor<T>
2626
{
2727
}

spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/interfaces/lazy/LazyEclipseStoreRepository.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,6 @@ public interface LazyEclipseStoreRepository<T, ID>
2828
LazyEclipseStoreListCrudRepository<T, ID>,
2929
LazyEclipseStoreListPagingAndSortingRepositoryRepository<T, ID>,
3030
LazyEclipseStoreQueryByExampleExecutor<T>,
31-
EclipseStoreRepository<Lazy<T>, ID>
31+
EclipseStoreRepository<T, ID>
3232
{
3333
}

spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/query/by/example/EclipseStoreFetchableFluentQuery.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@
2525
import org.springframework.data.domain.Sort;
2626
import org.springframework.data.repository.query.FluentQuery;
2727

28-
import software.xdev.spring.data.eclipse.store.repository.EclipseStoreStorage;
28+
import software.xdev.spring.data.eclipse.store.repository.StorageCommunicator;
2929
import software.xdev.spring.data.eclipse.store.repository.query.criteria.CriteriaByExample;
3030
import software.xdev.spring.data.eclipse.store.repository.query.executors.CountQueryExecutor;
3131
import software.xdev.spring.data.eclipse.store.repository.query.executors.ExistsQueryExecutor;
@@ -43,14 +43,14 @@ public class EclipseStoreFetchableFluentQuery<T, S extends T> implements FluentQ
4343
private final WorkingCopier<T> copier;
4444
private final Example<S> example;
4545
private final Class<T> domainClass;
46-
private final EclipseStoreStorage storage;
46+
private final StorageCommunicator storage;
4747
private final Sort sort;
4848

4949
public EclipseStoreFetchableFluentQuery(
5050
final WorkingCopier<T> copier,
5151
final Example<S> example,
5252
final Class<T> domainClass,
53-
final EclipseStoreStorage storage,
53+
final StorageCommunicator storage,
5454
final Sort sort
5555
)
5656
{

0 commit comments

Comments
 (0)