Skip to content

Commit a49beec

Browse files
TransactionManager synchronizing access
1 parent f825471 commit a49beec

6 files changed

Lines changed: 74 additions & 54 deletions

File tree

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

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

3839

3940
/**
@@ -208,7 +209,8 @@ private <T> void createRepositoryForType(
208209
new SupportedChecker.Implementation(),
209210
storageInstance
210211
),
211-
domainClass
212+
domainClass,
213+
new EclipseStoreTransactionManager()
212214
);
213215
}
214216

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

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@ public abstract class EclipseStoreClientConfiguration implements EclipseStoreSto
5454
private final EmbeddedStorageFoundationFactory defaultEclipseStoreProvider;
5555

5656
private EclipseStoreStorage storageInstance;
57+
private EclipseStoreTransactionManager transactionManager;
5758

5859
@Autowired
5960
protected EclipseStoreClientConfiguration(
@@ -85,23 +86,31 @@ public EmbeddedStorageFoundation<?> createEmbeddedStorageFoundation()
8586
return this.getStoreProvider().createStorageFoundation(this.getEclipseStoreProperties());
8687
}
8788

89+
public EclipseStoreStorage getStorageInstance()
90+
{
91+
if(this.storageInstance == null)
92+
{
93+
this.storageInstance = new EclipseStoreStorage(this);
94+
}
95+
return this.storageInstance;
96+
}
97+
8898
@Bean
8999
@ConditionalOnMissingBean(TransactionManager.class)
90100
public PlatformTransactionManager transactionManager(
91101
final ObjectProvider<TransactionManagerCustomizers> transactionManagerCustomizers)
92102
{
93-
final EclipseStoreTransactionManager transactionManager =
94-
new EclipseStoreTransactionManager(this.getStorageInstance());
103+
final EclipseStoreTransactionManager transactionManager = this.getTransactionManagerInstance();
95104
transactionManagerCustomizers.ifAvailable((customizers) -> customizers.customize((TransactionManager)transactionManager));
96105
return transactionManager;
97106
}
98107

99-
public EclipseStoreStorage getStorageInstance()
108+
public EclipseStoreTransactionManager getTransactionManagerInstance()
100109
{
101-
if(this.storageInstance == null)
110+
if(this.transactionManager == null)
102111
{
103-
this.storageInstance = new EclipseStoreStorage(this);
112+
this.transactionManager = new EclipseStoreTransactionManager();
104113
}
105-
return this.storageInstance;
114+
return this.transactionManager;
106115
}
107116
}

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

Lines changed: 19 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
import org.springframework.data.repository.query.QueryMethodEvaluationContextProvider;
3131
import org.springframework.data.util.TypeInformation;
3232
import org.springframework.lang.Nullable;
33+
import org.springframework.transaction.PlatformTransactionManager;
3334

3435
import software.xdev.spring.data.eclipse.store.repository.EclipseStoreStorage;
3536
import software.xdev.spring.data.eclipse.store.repository.SupportedChecker;
@@ -43,10 +44,14 @@
4344
public class EclipseStoreRepositoryFactory extends RepositoryFactorySupport
4445
{
4546
private final EclipseStoreStorage storage;
47+
private final PlatformTransactionManager transactionManager;
4648

47-
public EclipseStoreRepositoryFactory(final EclipseStoreStorage storage)
49+
public EclipseStoreRepositoryFactory(
50+
final EclipseStoreStorage storage,
51+
final PlatformTransactionManager transactionManager)
4852
{
4953
this.storage = storage;
54+
this.transactionManager = transactionManager;
5055
}
5156

5257
@Override
@@ -65,19 +70,6 @@ protected Optional<QueryLookupStrategy> getQueryLookupStrategy(
6570
return Optional.of(new EclipseStoreQueryLookupStrategy(this.storage, this::createWorkingCopier));
6671
}
6772

68-
69-
@Override
70-
@Nonnull
71-
protected Object getTargetRepository(@Nonnull final RepositoryInformation metadata)
72-
{
73-
return this.getTargetRepositoryViaReflection(
74-
metadata,
75-
this.storage,
76-
this.createWorkingCopier(metadata.getDomainType(), this.storage),
77-
metadata.getDomainType()
78-
);
79-
}
80-
8173
private <T> WorkingCopier<T> createWorkingCopier(
8274
final Class<T> domainType,
8375
final EclipseStoreStorage storage)
@@ -92,6 +84,19 @@ private <T> WorkingCopier<T> createWorkingCopier(
9284
);
9385
}
9486

87+
@Override
88+
@Nonnull
89+
protected Object getTargetRepository(@Nonnull final RepositoryInformation metadata)
90+
{
91+
return this.getTargetRepositoryViaReflection(
92+
metadata,
93+
this.storage,
94+
this.createWorkingCopier(metadata.getDomainType(), this.storage),
95+
metadata.getDomainType(),
96+
this.transactionManager
97+
);
98+
}
99+
95100
@Override
96101
@Nonnull
97102
protected Class<?> getRepositoryBaseClass(@Nonnull final RepositoryMetadata metadata)

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

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
package software.xdev.spring.data.eclipse.store.repository.support;
1717

1818
import java.io.Serializable;
19+
import java.util.Objects;
1920

2021
import jakarta.annotation.Nonnull;
2122

@@ -45,8 +46,9 @@ public class EclipseStoreRepositoryFactoryBean<T extends Repository<S, ID>, S, I
4546
extends RepositoryFactoryBeanSupport<T, S, ID>
4647
{
4748
private static final Logger LOG = LoggerFactory.getLogger(EclipseStoreRepositoryFactoryBean.class);
48-
private Class<?> configurationClass;
49+
private EclipseStoreClientConfiguration configuration;
4950
private BeanFactory beanFactory;
51+
private Class<?> configurationClass;
5052

5153
public EclipseStoreRepositoryFactoryBean(
5254
final Class<? extends T> repositoryInterface)
@@ -75,7 +77,20 @@ public void setBeanFactory(final BeanFactory beanFactory) throws BeansException
7577
@Nonnull
7678
protected RepositoryFactorySupport createRepositoryFactory()
7779
{
78-
return new EclipseStoreRepositoryFactory(this.getConfiguration().getStorageInstance());
80+
final EclipseStoreClientConfiguration ensuredConfiguration = this.ensureConfiguration();
81+
return new EclipseStoreRepositoryFactory(
82+
ensuredConfiguration.getStorageInstance(),
83+
ensuredConfiguration.getTransactionManagerInstance()
84+
);
85+
}
86+
87+
private EclipseStoreClientConfiguration ensureConfiguration()
88+
{
89+
if(this.configuration == null)
90+
{
91+
this.configuration = this.createConfiguration();
92+
}
93+
return this.configuration;
7994
}
8095

8196
/**
@@ -87,8 +102,10 @@ protected RepositoryFactorySupport createRepositoryFactory()
87102
* is set, the {@link DefaultEclipseStoreClientConfiguration} is used.
88103
* </p>
89104
*/
90-
private EclipseStoreClientConfiguration getConfiguration()
105+
private EclipseStoreClientConfiguration createConfiguration()
91106
{
107+
Objects.requireNonNull(this.configurationClass);
108+
Objects.requireNonNull(this.beanFactory);
92109
try
93110
{
94111
if(this.configurationClass != null

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

Lines changed: 6 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,6 @@
3030
import org.springframework.data.domain.Page;
3131
import org.springframework.data.domain.Pageable;
3232
import org.springframework.data.domain.Sort;
33-
import org.springframework.transaction.support.TransactionSynchronizationManager;
3433

3534
import software.xdev.spring.data.eclipse.store.exceptions.FieldAccessReflectionException;
3635
import software.xdev.spring.data.eclipse.store.exceptions.NoIdFieldFoundException;
@@ -46,8 +45,8 @@
4645
import software.xdev.spring.data.eclipse.store.repository.query.executors.PageableQueryExecutor;
4746
import software.xdev.spring.data.eclipse.store.repository.support.copier.working.WorkingCopier;
4847
import software.xdev.spring.data.eclipse.store.repository.support.copier.working.WorkingCopierResult;
49-
import software.xdev.spring.data.eclipse.store.transactions.EclipseStoreNoTransactionObject;
5048
import software.xdev.spring.data.eclipse.store.transactions.EclipseStoreTransaction;
49+
import software.xdev.spring.data.eclipse.store.transactions.EclipseStoreTransactionManager;
5150

5251

5352
public class SimpleEclipseStoreRepository<T, ID>
@@ -62,17 +61,20 @@ public class SimpleEclipseStoreRepository<T, ID>
6261
private final EclipseStoreStorage storage;
6362
private final Class<T> domainClass;
6463
private final WorkingCopier<T> copier;
64+
private final EclipseStoreTransactionManager transactionManager;
6565
private Field idField;
6666

6767
public SimpleEclipseStoreRepository(
6868
final EclipseStoreStorage storage,
6969
final WorkingCopier<T> copier,
70-
final Class<T> domainClass)
70+
final Class<T> domainClass,
71+
final EclipseStoreTransactionManager transactionManager)
7172
{
7273
this.storage = storage;
7374
this.domainClass = domainClass;
7475
this.storage.registerEntity(domainClass);
7576
this.copier = copier;
77+
this.transactionManager = transactionManager;
7678
}
7779

7880
public Field getIdField()
@@ -91,17 +93,10 @@ public Field getIdField()
9193
return this.idField;
9294
}
9395

94-
public EclipseStoreTransaction getTransaction(final EclipseStoreStorage storage)
95-
{
96-
final EclipseStoreTransaction transactionObject =
97-
(EclipseStoreTransaction)TransactionSynchronizationManager.getResource(storage);
98-
return transactionObject == null ? new EclipseStoreNoTransactionObject() : transactionObject;
99-
}
100-
10196
@SuppressWarnings("unchecked")
10297
public synchronized <S extends T> List<S> saveBulk(final Collection<S> entities)
10398
{
104-
final EclipseStoreTransaction transaction = this.getTransaction(this.storage);
99+
final EclipseStoreTransaction transaction = this.transactionManager.getTransaction();
105100
if(LOG.isDebugEnabled())
106101
{
107102
LOG.debug("Saving {} entities...", entities.size());

spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/transactions/EclipseStoreTransactionManager.java

Lines changed: 11 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -15,38 +15,23 @@
1515
*/
1616
package software.xdev.spring.data.eclipse.store.transactions;
1717

18-
import org.springframework.beans.factory.InitializingBean;
1918
import org.springframework.transaction.TransactionDefinition;
2019
import org.springframework.transaction.TransactionException;
2120
import org.springframework.transaction.support.AbstractPlatformTransactionManager;
2221
import org.springframework.transaction.support.DefaultTransactionStatus;
2322
import org.springframework.transaction.support.TransactionSynchronizationManager;
2423
import org.springframework.util.Assert;
2524

26-
import software.xdev.spring.data.eclipse.store.repository.EclipseStoreStorage;
27-
2825

2926
public class EclipseStoreTransactionManager extends AbstractPlatformTransactionManager
30-
implements InitializingBean
3127
{
32-
private final EclipseStoreStorage storage;
33-
34-
public EclipseStoreTransactionManager(final EclipseStoreStorage storage)
35-
{
36-
this.storage = storage;
37-
}
38-
39-
@Override
40-
public void afterPropertiesSet() throws Exception
41-
{
42-
System.out.println("trest");
43-
}
28+
private static final String TRANSACTION_MANAGER = "ATransactionManagerForThisThread";
4429

4530
@Override
4631
protected Object doGetTransaction() throws TransactionException
4732
{
4833
final EclipseStoreExistingTransactionObject transactionObject =
49-
(EclipseStoreExistingTransactionObject)TransactionSynchronizationManager.getResource(this.storage);
34+
(EclipseStoreExistingTransactionObject)TransactionSynchronizationManager.getResource(TRANSACTION_MANAGER);
5035
return transactionObject == null ? new EclipseStoreExistingTransactionObject() : transactionObject;
5136
}
5237

@@ -56,7 +41,7 @@ protected void doBegin(final Object transaction, final TransactionDefinition def
5641
final EclipseStoreExistingTransactionObject transactionObject =
5742
this.extractEclipseStoreTransaction(transaction);
5843
transactionObject.startTransaction();
59-
TransactionSynchronizationManager.bindResource(this.storage, transactionObject);
44+
TransactionSynchronizationManager.bindResource(TRANSACTION_MANAGER, transactionObject);
6045
}
6146

6247
@Override
@@ -74,7 +59,7 @@ protected void doRollback(final DefaultTransactionStatus status) throws Transact
7459
@Override
7560
protected void doCleanupAfterCompletion(final Object transaction)
7661
{
77-
TransactionSynchronizationManager.unbindResource(this.storage);
62+
TransactionSynchronizationManager.unbindResource(TRANSACTION_MANAGER);
7863
}
7964

8065
private EclipseStoreExistingTransactionObject extractEclipseStoreTransaction(final Object transaction)
@@ -88,4 +73,11 @@ private EclipseStoreExistingTransactionObject extractEclipseStoreTransaction(fin
8873

8974
return (EclipseStoreExistingTransactionObject)transaction;
9075
}
76+
77+
public EclipseStoreTransaction getTransaction()
78+
{
79+
final EclipseStoreTransaction transactionObject =
80+
(EclipseStoreTransaction)TransactionSynchronizationManager.getResource(TRANSACTION_MANAGER);
81+
return transactionObject == null ? new EclipseStoreNoTransactionObject() : transactionObject;
82+
}
9183
}

0 commit comments

Comments
 (0)