Skip to content

Commit 55aa939

Browse files
Fixed some ID issues
1 parent 27af367 commit 55aa939

13 files changed

Lines changed: 257 additions & 117 deletions

File tree

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

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
import software.xdev.spring.data.eclipse.store.repository.SupportedChecker;
3535
import software.xdev.spring.data.eclipse.store.repository.config.EclipseStoreClientConfiguration;
3636
import software.xdev.spring.data.eclipse.store.repository.support.SimpleEclipseStoreRepository;
37+
import software.xdev.spring.data.eclipse.store.repository.support.copier.id.IdManager;
3738
import software.xdev.spring.data.eclipse.store.repository.support.copier.working.RecursiveWorkingCopier;
3839
import software.xdev.spring.data.eclipse.store.transactions.EclipseStoreTransactionManager;
3940

@@ -254,6 +255,7 @@ private <T> void createRepositoryForType(
254255
private <T> SimpleEclipseStoreRepository<T, ?> createEclipseStoreRepo(final Class<T> domainClass)
255256
{
256257
final EclipseStoreStorage storageInstance = this.configuration.getStorageInstance();
258+
final IdManager<T, Object> idManager = storageInstance.ensureIdManager(domainClass);
257259
return new SimpleEclipseStoreRepository<>(
258260
storageInstance,
259261
new RecursiveWorkingCopier<>(
@@ -262,10 +264,12 @@ private <T> void createRepositoryForType(
262264
storageInstance,
263265
storageInstance,
264266
new SupportedChecker.Implementation(),
265-
storageInstance
267+
storageInstance,
268+
idManager
266269
),
267270
domainClass,
268-
new EclipseStoreTransactionManager()
271+
new EclipseStoreTransactionManager(),
272+
idManager
269273
);
270274
}
271275

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

Lines changed: 20 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@
3838
import software.xdev.spring.data.eclipse.store.repository.support.SimpleEclipseStoreRepository;
3939
import software.xdev.spring.data.eclipse.store.repository.support.concurrency.ReadWriteLock;
4040
import software.xdev.spring.data.eclipse.store.repository.support.concurrency.ReentrantJavaReadWriteLock;
41+
import software.xdev.spring.data.eclipse.store.repository.support.copier.id.IdManager;
4142
import software.xdev.spring.data.eclipse.store.repository.support.copier.id.IdSetter;
4243
import software.xdev.spring.data.eclipse.store.repository.support.reposyncer.RepositorySynchronizer;
4344
import software.xdev.spring.data.eclipse.store.repository.support.reposyncer.SimpleRepositorySynchronizer;
@@ -48,7 +49,7 @@ public class EclipseStoreStorage
4849
{
4950
private static final Logger LOG = LoggerFactory.getLogger(EclipseStoreStorage.class);
5051
private final Map<Class<?>, SimpleEclipseStoreRepository<?, ?>> entityClassToRepository = new HashMap<>();
51-
private final Map<Class<?>, IdSetter<?>> idSetters = new ConcurrentHashMap<>();
52+
private final Map<Class<?>, IdManager<?, ?>> idManagers = new ConcurrentHashMap<>();
5253
private final EclipseStoreStorageFoundationProvider foundationProvider;
5354
private EntitySetCollector entitySetCollector;
5455
private PersistableChecker persistenceChecker;
@@ -317,7 +318,7 @@ public synchronized void stop()
317318
this.storageManager = null;
318319
this.root = null;
319320
this.registry.reset();
320-
this.idSetters.clear();
321+
this.idManagers.clear();
321322
LOG.info("Stopped storage.");
322323
}
323324
else
@@ -328,22 +329,32 @@ public synchronized void stop()
328329
);
329330
}
330331

331-
@Override
332332
@SuppressWarnings("unchecked")
333-
public <T> IdSetter<T> ensureIdSetter(final Class<T> domainClass)
333+
public <T, ID> IdManager<T, ID> ensureIdManager(final Class<T> domainClass)
334334
{
335335
this.ensureEntitiesInRoot();
336-
return (IdSetter<T>)this.idSetters.computeIfAbsent(
336+
return (IdManager<T, ID>)this.idManagers.computeIfAbsent(
337337
domainClass,
338338
clazz ->
339-
IdSetter.createIdSetter(
340-
clazz,
341-
id -> this.setLastId(clazz, id),
342-
() -> this.getLastId(clazz)
339+
new IdManager<>(
340+
domainClass,
341+
(IdSetter<T, ID>)IdSetter.createIdSetter(
342+
clazz,
343+
id -> this.setLastId(clazz, id),
344+
() -> this.getLastId(clazz)
345+
),
346+
this
343347
)
344348
);
345349
}
346350

351+
@Override
352+
@SuppressWarnings("unchecked")
353+
public <T, ID> IdSetter<T, ID> ensureIdSetter(final Class<T> domainClass)
354+
{
355+
return (IdSetter<T, ID>)this.ensureIdManager(domainClass).getIdSetter();
356+
}
357+
347358
public Object getLastId(final Class<?> entityClass)
348359
{
349360
return this.readWriteLock.read(() -> this.root.getLastId(entityClass));

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,5 +20,5 @@
2020

2121
public interface IdSetterProvider
2222
{
23-
<T> IdSetter<T> ensureIdSetter(final Class<T> domainClass);
23+
<T, ID> IdSetter<T, ID> ensureIdSetter(final Class<T> domainClass);
2424
}

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

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,8 @@ private <T> WorkingCopier<T> createWorkingCopier(
8080
storage,
8181
storage,
8282
new SupportedChecker.Implementation(),
83-
storage
83+
storage,
84+
storage.ensureIdManager(domainType)
8485
);
8586
}
8687

@@ -100,7 +101,8 @@ protected Object getTargetRepository(@Nonnull final RepositoryInformation metada
100101
this.storage,
101102
this.createWorkingCopier(metadata.getDomainType(), this.storage),
102103
metadata.getDomainType(),
103-
this.transactionManager
104+
this.transactionManager,
105+
this.storage.ensureIdManager(metadata.getDomainType())
104106
);
105107
}
106108

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

Lines changed: 23 additions & 84 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@
1515
*/
1616
package software.xdev.spring.data.eclipse.store.repository.support;
1717

18-
import java.lang.reflect.Field;
1918
import java.util.ArrayList;
2019
import java.util.Collection;
2120
import java.util.List;
@@ -34,10 +33,7 @@
3433
import org.springframework.data.domain.Sort;
3534
import org.springframework.data.repository.query.FluentQuery;
3635

37-
import software.xdev.spring.data.eclipse.store.exceptions.FieldAccessReflectionException;
38-
import software.xdev.spring.data.eclipse.store.exceptions.NoIdFieldFoundException;
3936
import software.xdev.spring.data.eclipse.store.repository.EclipseStoreStorage;
40-
import software.xdev.spring.data.eclipse.store.repository.access.modifier.FieldAccessModifier;
4137
import software.xdev.spring.data.eclipse.store.repository.interfaces.EclipseStoreCrudRepository;
4238
import software.xdev.spring.data.eclipse.store.repository.interfaces.EclipseStoreListCrudRepository;
4339
import software.xdev.spring.data.eclipse.store.repository.interfaces.EclipseStoreListPagingAndSortingRepositoryRepository;
@@ -52,6 +48,7 @@
5248
import software.xdev.spring.data.eclipse.store.repository.query.executors.ListQueryExecutor;
5349
import software.xdev.spring.data.eclipse.store.repository.query.executors.PageableQueryExecutor;
5450
import software.xdev.spring.data.eclipse.store.repository.query.executors.SingleOptionalQueryExecutor;
51+
import software.xdev.spring.data.eclipse.store.repository.support.copier.id.IdManager;
5552
import software.xdev.spring.data.eclipse.store.repository.support.copier.working.WorkingCopier;
5653
import software.xdev.spring.data.eclipse.store.repository.support.copier.working.WorkingCopierResult;
5754
import software.xdev.spring.data.eclipse.store.transactions.EclipseStoreTransaction;
@@ -72,37 +69,24 @@ public class SimpleEclipseStoreRepository<T, ID>
7269
private final Class<T> domainClass;
7370
private final WorkingCopier<T> copier;
7471
private final EclipseStoreTransactionManager transactionManager;
75-
private Field idField;
72+
private final IdManager<T, ID> idManager;
7673

7774
public SimpleEclipseStoreRepository(
7875
final EclipseStoreStorage storage,
7976
final WorkingCopier<T> copier,
8077
final Class<T> domainClass,
81-
final EclipseStoreTransactionManager transactionManager)
78+
final EclipseStoreTransactionManager transactionManager,
79+
final IdManager<T, ID> idManager
80+
)
8281
{
8382
this.storage = storage;
8483
this.domainClass = domainClass;
84+
this.idManager = idManager;
8585
this.storage.registerEntity(domainClass, this);
8686
this.copier = copier;
8787
this.transactionManager = transactionManager;
8888
}
8989

90-
public Field getIdField()
91-
{
92-
if(this.idField == null)
93-
{
94-
final Optional<Field> foundIdField = IdFieldFinder.findIdField(this.domainClass);
95-
if(foundIdField.isEmpty())
96-
{
97-
throw new NoIdFieldFoundException(String.format(
98-
"Could not find id field in class %s",
99-
this.domainClass.getSimpleName()));
100-
}
101-
this.idField = foundIdField.get();
102-
}
103-
return this.idField;
104-
}
105-
10690
@SuppressWarnings("unchecked")
10791
public <S extends T> List<S> saveBulk(final Collection<S> entities)
10892
{
@@ -180,39 +164,17 @@ public <S extends T> List<S> saveAll(@Nonnull final Iterable<S> entities)
180164
public Optional<T> findById(@Nonnull final ID id)
181165
{
182166
return this.storage.getReadWriteLock().read(
183-
() -> this.storage
184-
.getEntityList(this.domainClass)
185-
.parallelStream()
186-
.filter(
187-
entity ->
188-
{
189-
try(final FieldAccessModifier<T> fam = FieldAccessModifier.prepareForField(
190-
this.getIdField(),
191-
entity))
192-
{
193-
if(id.equals(fam.getValueOfField(entity)))
194-
{
195-
return true;
196-
}
197-
}
198-
catch(final Exception e)
199-
{
200-
throw new FieldAccessReflectionException(String.format(
201-
FieldAccessReflectionException.COULD_NOT_READ_FIELD,
202-
this.getIdField().getName()), e);
203-
}
204-
return false;
205-
}
206-
)
207-
.findAny()
167+
() -> this.idManager.findById(id)
208168
.map(foundEntity -> this.copier.copy(foundEntity))
209169
);
210170
}
211171

212172
@Override
213173
public boolean existsById(@Nonnull final ID id)
214174
{
215-
return this.findById(id).isPresent();
175+
return this.storage.getReadWriteLock().read(
176+
() -> this.idManager.findById(id).isPresent()
177+
);
216178
}
217179

218180
@Override
@@ -233,37 +195,7 @@ public List<T> findAllById(@Nonnull final Iterable<ID> idsToFind)
233195
// Must get copied as one list to keep same references objects the same.
234196
// (Example: If o1 and o2 (both part of the entity list) are referencing o3,
235197
// o3 should be the same no matter from where it is referenced.
236-
() -> this.copier.copy(
237-
this.storage
238-
.getEntityList(this.domainClass)
239-
.parallelStream()
240-
.filter(
241-
entity ->
242-
{
243-
try(final FieldAccessModifier<T> fam = FieldAccessModifier.prepareForField(
244-
this.getIdField(),
245-
entity))
246-
{
247-
final Object idOfEntity = fam.getValueOfField(entity);
248-
for(final ID idToFind : idsToFind)
249-
{
250-
if(idToFind.equals(idOfEntity))
251-
{
252-
return true;
253-
}
254-
}
255-
}
256-
catch(final Exception e)
257-
{
258-
throw new FieldAccessReflectionException(String.format(
259-
FieldAccessReflectionException.COULD_NOT_READ_FIELD,
260-
this.getIdField().getName()), e);
261-
}
262-
return false;
263-
}
264-
)
265-
.toList()
266-
)
198+
() -> this.copier.copy(this.idManager.findAllById(idsToFind))
267199
);
268200
}
269201

@@ -276,11 +208,18 @@ public long count()
276208
@Override
277209
public void deleteById(@Nonnull final ID id)
278210
{
279-
this.storage.getReadWriteLock().write(
280-
() -> {
281-
final Optional<T> byId = this.findById(id);
282-
byId.ifPresent(this::delete);
283-
}
211+
final EclipseStoreTransaction transaction = this.transactionManager.getTransaction();
212+
transaction.addAction(() ->
213+
this.storage.getReadWriteLock().write(
214+
() -> {
215+
this
216+
.idManager
217+
.findById(id)
218+
.ifPresent(
219+
foundEntity -> this.storage.delete(this.domainClass, foundEntity)
220+
);
221+
}
222+
)
284223
);
285224
}
286225

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
/*
2+
* Copyright © 2024 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.repository.support.copier.id;
17+
18+
import java.util.Optional;
19+
20+
21+
public interface EntityGetterById<T, ID>
22+
{
23+
Optional<T> findById(ID id);
24+
}

0 commit comments

Comments
 (0)