Skip to content

Commit 98b458a

Browse files
Made it possible to have two repositories with the same class/entity
1 parent 930e371 commit 98b458a

18 files changed

+333
-147
lines changed

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

Lines changed: 56 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,6 @@
2121
import java.util.List;
2222
import java.util.Map;
2323
import java.util.concurrent.ConcurrentHashMap;
24-
import java.util.function.Consumer;
25-
import java.util.function.Supplier;
2624

2725
import org.eclipse.serializer.persistence.binary.jdk17.java.util.BinaryHandlerImmutableCollectionsList12;
2826
import org.eclipse.serializer.persistence.binary.jdk17.java.util.BinaryHandlerImmutableCollectionsSet12;
@@ -37,6 +35,7 @@
3735
import software.xdev.spring.data.eclipse.store.exceptions.AlreadyRegisteredException;
3836
import software.xdev.spring.data.eclipse.store.repository.config.EclipseStoreClientConfiguration;
3937
import software.xdev.spring.data.eclipse.store.repository.config.EclipseStoreStorageFoundationProvider;
38+
import software.xdev.spring.data.eclipse.store.repository.support.SimpleEclipseStoreRepository;
4039
import software.xdev.spring.data.eclipse.store.repository.support.concurrency.ReadWriteLock;
4140
import software.xdev.spring.data.eclipse.store.repository.support.concurrency.ReentrantJavaReadWriteLock;
4241
import software.xdev.spring.data.eclipse.store.repository.support.copier.id.IdSetter;
@@ -48,8 +47,8 @@ public class EclipseStoreStorage
4847
implements EntityListProvider, IdSetterProvider, PersistableChecker, ObjectSwizzling
4948
{
5049
private static final Logger LOG = LoggerFactory.getLogger(EclipseStoreStorage.class);
51-
private final Map<Class<?>, String> entityClassToRepositoryName = new HashMap<>();
52-
private final Map<Class<?>, IdSetter<?>> entityClassToIdSetter = new ConcurrentHashMap<>();
50+
private final Map<Class<?>, SimpleEclipseStoreRepository<?, ?>> entityClassToRepository = new HashMap<>();
51+
private final Map<Class<?>, IdSetter<?>> idSetters = new ConcurrentHashMap<>();
5352
private final EclipseStoreStorageFoundationProvider foundationProvider;
5453
private EntitySetCollector entitySetCollector;
5554
private PersistableChecker persistenceChecker;
@@ -98,58 +97,56 @@ private synchronized void ensureEntitiesInRoot()
9897
}
9998
}
10099

100+
public <T> SimpleEclipseStoreRepository<T, ?> getRepository(final Class<T> entityClass)
101+
{
102+
return (SimpleEclipseStoreRepository<T, ?>)this.entityClassToRepository.get(entityClass);
103+
}
104+
101105
private void initRoot()
102106
{
103107
if(LOG.isDebugEnabled())
104108
{
105109
LOG.debug("Initializing entity lists...");
106110
}
107111
this.repositorySynchronizer =
108-
new SimpleRepositorySynchronizer(this.entityClassToRepositoryName, this.root);
112+
new SimpleRepositorySynchronizer(this.root);
109113
boolean entityListMustGetStored = false;
110-
for(final String entityName : this.entityClassToRepositoryName.values())
114+
for(final Class<?> entityClass : this.entityClassToRepository.keySet())
111115
{
112-
if(!this.root.getEntityLists().containsKey(entityName))
116+
if(this.root.getEntityList(entityClass) == null)
113117
{
114-
this.root.getEntityLists().put(entityName, new IdentitySet<>());
118+
this.root.createNewEntityList(entityClass);
115119
entityListMustGetStored = true;
116120
}
117121
}
118122
if(entityListMustGetStored)
119123
{
120124
this.storageManager.store(this.root.getEntityLists());
121125
}
122-
this.entitySetCollector = new EntitySetCollector(this.root.getEntityLists(), this.entityClassToRepositoryName);
126+
this.entitySetCollector =
127+
new EntitySetCollector(this.root::getEntityList, this.entityClassToRepository.keySet());
123128
if(LOG.isDebugEnabled())
124129
{
125130
LOG.debug("Done initializing entity lists.");
126131
}
127132
}
128133

129-
public <T> void registerEntity(final Class<T> classToRegister)
130-
{
131-
this.readWriteLock.write(
132-
() -> {
133-
final String entityName = this.getEntityName(classToRegister);
134-
if(this.entityClassToRepositoryName.containsKey(classToRegister))
135-
{
136-
throw new AlreadyRegisteredException(entityName);
137-
}
138-
this.entityClassToRepositoryName.put(classToRegister, entityName);
139-
140-
// If the storage is running and a new entity is registered, we need to stop the storage to restart
141-
// again with the registered entity.
142-
if(this.storageManager != null)
143-
{
144-
this.stop();
145-
}
146-
}
147-
);
148-
}
149-
150-
private <T> String getEntityName(final Class<T> classToRegister)
134+
public synchronized <T> void registerEntity(
135+
final Class<T> classToRegister,
136+
final SimpleEclipseStoreRepository<T, ?> repository)
151137
{
152-
return classToRegister.getName();
138+
if(this.entityClassToRepository.containsKey(classToRegister))
139+
{
140+
throw new AlreadyRegisteredException(classToRegister.getSimpleName());
141+
}
142+
this.entityClassToRepository.put(classToRegister, repository);
143+
144+
// If the storage is running and a new entity is registered, we need to stop the storage to restart
145+
// again with the registered entity.
146+
if(this.storageManager != null)
147+
{
148+
this.stop();
149+
}
153150
}
154151

155152
@SuppressWarnings("unchecked")
@@ -158,7 +155,7 @@ public <T> IdentitySet<T> getEntityList(final Class<T> clazz)
158155
{
159156
this.ensureEntitiesInRoot();
160157
return this.readWriteLock.read(
161-
() -> (IdentitySet<T>)this.root.getEntityLists().get(this.getEntityName(clazz))
158+
() -> this.root.getEntityList(clazz)
162159
);
163160
}
164161

@@ -170,8 +167,7 @@ public <T> long getEntityCount(final Class<T> clazz)
170167
return this.readWriteLock.read(
171168
() ->
172169
{
173-
final IdentitySet<T> entityList =
174-
(IdentitySet<T>)this.root.getEntityLists().get(this.getEntityName(clazz));
170+
final IdentitySet<T> entityList = this.root.getEntityList(clazz);
175171
return entityList == null ? 0 : entityList.size();
176172
}
177173
);
@@ -260,9 +256,9 @@ public <T> void deleteAll(final Class<T> clazz)
260256
this.readWriteLock.write(
261257
() ->
262258
{
263-
final IdentitySet<?> entities = this.root.getEntityLists().get(this.getEntityName(clazz));
259+
final IdentitySet<T> entities = this.root.getEntityList(clazz);
264260
final int oldSize = entities.size();
265-
final List<?> entitiesToRemove = entities.stream().toList();
261+
final List<T> entitiesToRemove = entities.stream().toList();
266262
final List<IdentitySet<Object>> entityLists =
267263
this.entitySetCollector.getRelatedIdentitySets(clazz);
268264
entityLists.forEach(entityList ->
@@ -321,7 +317,7 @@ public synchronized void stop()
321317
this.storageManager = null;
322318
this.root = null;
323319
this.registry.reset();
324-
this.entityClassToIdSetter.clear();
320+
this.idSetters.clear();
325321
LOG.info("Stopped storage.");
326322
}
327323
else
@@ -337,22 +333,29 @@ public synchronized void stop()
337333
public <T> IdSetter<T> ensureIdSetter(final Class<T> domainClass)
338334
{
339335
this.ensureEntitiesInRoot();
340-
return (IdSetter<T>)this.entityClassToIdSetter.computeIfAbsent(
336+
return (IdSetter<T>)this.idSetters.computeIfAbsent(
341337
domainClass,
342-
clazz -> {
343-
final String entityName = this.getEntityName(domainClass);
344-
final Consumer<Object> idSetter =
345-
id ->
346-
this.readWriteLock.write(
347-
() ->
348-
{
349-
this.root.getLastIds().put(entityName, id);
350-
this.storageManager.store(this.root.getLastIds());
351-
}
352-
);
353-
final Supplier<Object> idGetter =
354-
() -> this.readWriteLock.read(() -> this.root.getLastIds().get(entityName));
355-
return IdSetter.createIdSetter(domainClass, idSetter, idGetter);
338+
clazz ->
339+
IdSetter.createIdSetter(
340+
clazz,
341+
id -> this.setLastId(clazz, id),
342+
() -> this.getLastId(clazz)
343+
)
344+
);
345+
}
346+
347+
public Object getLastId(final Class<?> entityClass)
348+
{
349+
return this.readWriteLock.read(() -> this.root.getLastId(entityClass));
350+
}
351+
352+
public void setLastId(final Class<?> entityClass, final Object lastId)
353+
{
354+
this.readWriteLock.write(
355+
() ->
356+
{
357+
this.root.setLastId(entityClass, lastId);
358+
this.storageManager.store(this.root.getLastIds());
356359
}
357360
);
358361
}

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

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@
1919
import java.util.HashMap;
2020
import java.util.List;
2121
import java.util.Map;
22+
import java.util.Set;
23+
import java.util.function.Function;
2224

2325
import org.slf4j.Logger;
2426
import org.slf4j.LoggerFactory;
@@ -32,32 +34,32 @@ public class EntitySetCollector
3234
private final Map<Class<?>, List<IdentitySet<? super Object>>> childClassToParentSets = new HashMap<>();
3335

3436
public EntitySetCollector(
35-
final Map<String, IdentitySet<Object>> entityLists,
36-
final Map<Class<?>, String> entityClassToRepositoryName)
37+
final Function<Class<?>, IdentitySet<?>> entityLists,
38+
final Set<Class<?>> entityClasses)
3739
{
38-
this.buildParentClassList(entityLists, entityClassToRepositoryName);
40+
this.buildParentClassList(entityLists, entityClasses);
3941
}
4042

4143
private void buildParentClassList(
42-
final Map<String, IdentitySet<Object>> entityLists,
43-
final Map<Class<?>, String> entityClassToRepositoryName
44+
final Function<Class<?>, IdentitySet<?>> entityLists,
45+
final Set<Class<?>> entityClasses
4446
)
4547
{
4648
if(LOG.isDebugEnabled())
4749
{
4850
LOG.debug("Initializing parent class list...");
4951
}
50-
for(final Map.Entry<Class<?>, String> possibleParentEntry : entityClassToRepositoryName.entrySet())
52+
for(final Class<?> possibleParentEntry : entityClasses)
5153
{
52-
for(final Map.Entry<Class<?>, String> possibleChildEntry : entityClassToRepositoryName.entrySet())
54+
for(final Class<?> possibleChildEntry : entityClasses)
5355
{
5456
this.childClassToParentSets.putIfAbsent(
55-
possibleChildEntry.getKey(), new ArrayList<>()
57+
possibleChildEntry, new ArrayList<>()
5658
);
57-
if(possibleParentEntry.getKey().isAssignableFrom(possibleChildEntry.getKey()))
59+
if(possibleParentEntry.isAssignableFrom(possibleChildEntry))
5860
{
59-
this.childClassToParentSets.get(possibleChildEntry.getKey())
60-
.add(entityLists.get(entityClassToRepositoryName.get(possibleParentEntry.getKey())));
61+
this.childClassToParentSets.get(possibleChildEntry)
62+
.add((IdentitySet<? super Object>)entityLists.apply(possibleParentEntry));
6163
}
6264
}
6365
}

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

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,30 @@ public Map<String, IdentitySet<Object>> getEntityLists()
4040
return this.entityLists;
4141
}
4242

43+
public <T> IdentitySet<T> getEntityList(final Class<T> entityClass)
44+
{
45+
return (IdentitySet<T>)this.entityLists.get(this.getEntityName(entityClass));
46+
}
47+
48+
public <T> void createNewEntityList(final Class<T> entityClass)
49+
{
50+
this.entityLists.put(this.getEntityName(entityClass), new IdentitySet<>());
51+
}
52+
53+
private <T> String getEntityName(final Class<T> classToRegister)
54+
{
55+
return classToRegister.getName();
56+
}
57+
58+
public Object getLastId(final Class<?> entityClass)
59+
{
60+
return this.getLastIds().get(this.getEntityName(entityClass));
61+
}
62+
63+
public void setLastId(final Class<?> entityClass, final Object lastId)
64+
{
65+
this.getLastIds().put(this.getEntityName(entityClass), lastId);
66+
}
4367
public Map<String, Object> getLastIds()
4468
{
4569
return this.lastIds;

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

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,13 @@ private <T> WorkingCopier<T> createWorkingCopier(
8888
@Nonnull
8989
protected Object getTargetRepository(@Nonnull final RepositoryInformation metadata)
9090
{
91+
final SimpleEclipseStoreRepository<?, ?> existingRepository =
92+
this.storage.getRepository(metadata.getDomainType());
93+
if(existingRepository != null)
94+
{
95+
return existingRepository;
96+
}
97+
9198
return this.getTargetRepositoryViaReflection(
9299
metadata,
93100
this.storage,

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ public SimpleEclipseStoreRepository(
8282
{
8383
this.storage = storage;
8484
this.domainClass = domainClass;
85-
this.storage.registerEntity(domainClass);
85+
this.storage.registerEntity(domainClass, this);
8686
this.copier = copier;
8787
this.transactionManager = transactionManager;
8888
}

spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/support/reposyncer/SimpleRepositorySynchronizer.java

Lines changed: 5 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@
1818
import java.lang.reflect.Modifier;
1919
import java.util.Collection;
2020
import java.util.HashSet;
21-
import java.util.Map;
2221

2322
import org.eclipse.serializer.util.traversing.ObjectGraphTraverser;
2423
import org.slf4j.Logger;
@@ -31,16 +30,12 @@
3130
public class SimpleRepositorySynchronizer implements RepositorySynchronizer
3231
{
3332
private static final Logger LOG = LoggerFactory.getLogger(SimpleRepositorySynchronizer.class);
34-
private final Map<Class<?>, String> entityWithRepositoryNamesAndClasses;
3533
private final Root root;
3634
private final HashSet<IdentitySet<Object>> listsToStore;
3735
private final ObjectGraphTraverser buildObjectGraphTraverser;
3836

39-
public SimpleRepositorySynchronizer(
40-
final Map<Class<?>, String> entityWithRepositoryNamesAndClasses,
41-
final Root root)
37+
public SimpleRepositorySynchronizer(final Root root)
4238
{
43-
this.entityWithRepositoryNamesAndClasses = entityWithRepositoryNamesAndClasses;
4439
this.root = root;
4540
this.listsToStore = new HashSet<>();
4641

@@ -54,13 +49,11 @@ public SimpleRepositorySynchronizer(
5449
{
5550
return;
5651
}
57-
final Class<?> objectInGraphClass = objectInGraph.getClass();
58-
final String objectInGraphClassname =
59-
this.entityWithRepositoryNamesAndClasses.get(objectInGraphClass);
60-
if(objectInGraphClassname != null)
52+
final Class<Object> objectInGraphClass = (Class<Object>)objectInGraph.getClass();
53+
final IdentitySet<Object> entityListForCurrentObject = this.root.getEntityList(objectInGraphClass);
54+
if(entityListForCurrentObject != null)
6155
{
62-
final IdentitySet<Object> entityListForCurrentObject =
63-
this.root.getEntityLists().get(objectInGraphClassname);
56+
6457
if(!entityListForCurrentObject.contains(objectInGraph))
6558
{
6659
entityListForCurrentObject.add(objectInGraph);
Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,11 +13,12 @@
1313
* See the License for the specific language governing permissions and
1414
* limitations under the License.
1515
*/
16-
package software.xdev.spring.data.eclipse.store.integration.shared.repositories.immutables;
16+
package software.xdev.spring.data.eclipse.store.integration.isolated.tests.duplicated.repositories;
1717

1818
import org.springframework.data.repository.CrudRepository;
1919

2020

21-
public interface CustomerWithFinalIdRepository extends CrudRepository<CustomerWithFinalId, Integer>
21+
public interface DaoFirstRepository
22+
extends CrudRepository<DaoObject, Integer>
2223
{
2324
}

0 commit comments

Comments
 (0)