4141import software .xdev .spring .data .eclipse .store .repository .support .concurrency .ReadWriteLock ;
4242import software .xdev .spring .data .eclipse .store .repository .support .concurrency .ReentrantJavaReadWriteLock ;
4343import software .xdev .spring .data .eclipse .store .repository .support .copier .id .IdManager ;
44+ import software .xdev .spring .data .eclipse .store .repository .support .copier .id .IdManagerProvider ;
4445import software .xdev .spring .data .eclipse .store .repository .support .copier .id .IdSetter ;
46+ import software .xdev .spring .data .eclipse .store .repository .support .copier .version .EntityVersionIncrementer ;
47+ import software .xdev .spring .data .eclipse .store .repository .support .copier .version .VersionManager ;
48+ import software .xdev .spring .data .eclipse .store .repository .support .copier .version .VersionManagerProvider ;
4549import software .xdev .spring .data .eclipse .store .repository .support .reposyncer .RepositorySynchronizer ;
4650import software .xdev .spring .data .eclipse .store .repository .support .reposyncer .SimpleRepositorySynchronizer ;
4751
4852
4953public class EclipseStoreStorage
50- implements EntityListProvider , IdManagerProvider , PersistableChecker , ObjectSwizzling
54+ implements EntityListProvider , IdManagerProvider , VersionManagerProvider , PersistableChecker , ObjectSwizzling
5155{
5256 private static final Logger LOG = LoggerFactory .getLogger (EclipseStoreStorage .class );
5357 private final Map <Class <?>, SimpleEclipseStoreRepository <?, ?>> entityClassToRepository = new HashMap <>();
58+ /**
59+ * "Why are the IdManagers seperated from the repositories?" - Because there might be entities for which there are
60+ * no repositories, but they still have IDs.
61+ */
5462 private final Map <Class <?>, IdManager <?, ?>> idManagers = new ConcurrentHashMap <>();
63+ /**
64+ * "Why are the VersionManagers seperated from the repositories?" - Because there might be entities for which there
65+ * are no repositories, but they still have Versions.
66+ */
67+ private final Map <Class <?>, VersionManager <?>> versionManagers = new ConcurrentHashMap <>();
5568 private final EclipseStoreStorageFoundationProvider foundationProvider ;
5669 private EntitySetCollector entitySetCollector ;
5770 private PersistableChecker persistenceChecker ;
@@ -311,6 +324,7 @@ public synchronized void stop()
311324 this .root = null ;
312325 this .registry .reset ();
313326 this .idManagers .clear ();
327+ this .versionManagers .clear ();
314328 LOG .info ("Stopped storage." );
315329 }
316330 else
@@ -323,23 +337,37 @@ public synchronized void stop()
323337
324338 @ Override
325339 @ SuppressWarnings ("unchecked" )
326- public <T , ID > IdManager <T , ID > ensureIdManager (final Class <T > domainClass )
340+ public <T , ID > IdManager <T , ID > ensureIdManager (final Class <T > classPossiblyWithId )
327341 {
328342 return (IdManager <T , ID >)this .idManagers .computeIfAbsent (
329- domainClass ,
343+ classPossiblyWithId ,
330344 clazz ->
331345 new IdManager <>(
332- domainClass ,
346+ classPossiblyWithId ,
333347 (IdSetter <T >)IdSetter .createIdSetter (
334348 clazz ,
335- id -> this .setLastId (clazz , id ),
336- () -> this .getLastId (clazz )
349+ id -> this .setLastId (classPossiblyWithId , id ),
350+ () -> this .getLastId (classPossiblyWithId )
337351 ),
338352 this
339353 )
340354 );
341355 }
342356
357+ @ Override
358+ @ SuppressWarnings ("unchecked" )
359+ public <T > VersionManager <T > ensureVersionManager (final Class <T > possiblyVersionedClass )
360+ {
361+ return (VersionManager <T >)this .versionManagers .computeIfAbsent (
362+ possiblyVersionedClass ,
363+ clazz ->
364+ new VersionManager <>(
365+ possiblyVersionedClass ,
366+ EntityVersionIncrementer .createVersionSetter (possiblyVersionedClass )
367+ )
368+ );
369+ }
370+
343371 public Object getLastId (final Class <?> entityClass )
344372 {
345373 return this .readWriteLock .read (() -> this .root .getLastId (entityClass ));
0 commit comments