Skip to content

Commit 7431027

Browse files
implemented TransactionAction
1 parent 93686a1 commit 7431027

8 files changed

Lines changed: 144 additions & 23 deletions

File tree

spring-data-eclipse-store-demo/src/main/java/software/xdev/spring/data/eclipse/store/demo/simple/SimpleDemoApplication.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,10 @@ public class SimpleDemoApplication implements CommandLineRunner
3434
private final CustomerRepository customerRepository;
3535
private final PetRepository petRepository;
3636

37-
public SimpleDemoApplication(final CustomerRepository customerRepository, final PetRepository petRepository)
37+
public SimpleDemoApplication(
38+
final CustomerRepository customerRepository,
39+
final PetRepository petRepository
40+
)
3841
{
3942
this.customerRepository = customerRepository;
4043
this.petRepository = petRepository;

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

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -82,9 +82,11 @@ public EmbeddedStorageFoundation<?> createEmbeddedStorageFoundation()
8282
@Bean
8383
@ConditionalOnMissingBean(TransactionManager.class)
8484
public PlatformTransactionManager transactionManager(
85-
final ObjectProvider<TransactionManagerCustomizers> transactionManagerCustomizers)
85+
final ObjectProvider<TransactionManagerCustomizers> transactionManagerCustomizers,
86+
final EclipseStoreStorage storage)
8687
{
87-
final EclipseStoreTransactionManager transactionManager = new EclipseStoreTransactionManager();
88+
final EclipseStoreTransactionManager transactionManager =
89+
new EclipseStoreTransactionManager(storage);
8890
transactionManagerCustomizers.ifAvailable((customizers) -> customizers.customize((TransactionManager)transactionManager));
8991
return transactionManager;
9092
}

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

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -27,11 +27,10 @@
2727

2828
import org.slf4j.Logger;
2929
import org.slf4j.LoggerFactory;
30-
import org.springframework.beans.factory.annotation.Autowired;
3130
import org.springframework.data.domain.Page;
3231
import org.springframework.data.domain.Pageable;
3332
import org.springframework.data.domain.Sort;
34-
import org.springframework.transaction.PlatformTransactionManager;
33+
import org.springframework.transaction.support.TransactionSynchronizationManager;
3534

3635
import software.xdev.spring.data.eclipse.store.exceptions.FieldAccessReflectionException;
3736
import software.xdev.spring.data.eclipse.store.exceptions.NoIdFieldFoundException;
@@ -47,7 +46,8 @@
4746
import software.xdev.spring.data.eclipse.store.repository.query.executors.PageableQueryExecutor;
4847
import software.xdev.spring.data.eclipse.store.repository.support.copier.working.WorkingCopier;
4948
import software.xdev.spring.data.eclipse.store.repository.support.copier.working.WorkingCopierResult;
50-
import software.xdev.spring.data.eclipse.store.transactions.EclipseStoreTransactionManager;
49+
import software.xdev.spring.data.eclipse.store.transactions.EclipseStoreNoTransactionObject;
50+
import software.xdev.spring.data.eclipse.store.transactions.EclipseStoreTransaction;
5151

5252

5353
public class SimpleEclipseStoreRepository<T, ID>
@@ -62,8 +62,6 @@ public class SimpleEclipseStoreRepository<T, ID>
6262
private final EclipseStoreStorage storage;
6363
private final Class<T> domainClass;
6464
private final WorkingCopier<T> copier;
65-
@Autowired
66-
private PlatformTransactionManager transactionManager;
6765
private Field idField;
6866

6967
public SimpleEclipseStoreRepository(
@@ -93,14 +91,17 @@ public Field getIdField()
9391
return this.idField;
9492
}
9593

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+
96101
@SuppressWarnings("unchecked")
97102
public synchronized <S extends T> List<S> saveBulk(final Collection<S> entities)
98103
{
99-
if(this.transactionManager instanceof final EclipseStoreTransactionManager estm)
100-
{
101-
estm
102-
.getResourceFactory();
103-
}
104+
final EclipseStoreTransaction transaction = this.getTransaction(this.storage);
104105
if(LOG.isDebugEnabled())
105106
{
106107
LOG.debug("Saving {} entities...", entities.size());
@@ -127,7 +128,7 @@ public synchronized <S extends T> List<S> saveBulk(final Collection<S> entities)
127128
LOG.debug("Collected {} non-entities to store.", nonEntitiesToStore.size());
128129
}
129130
this.storage.store(nonEntitiesToStore, this.domainClass, entitiesToStore);
130-
return (List<S>)entitiesToStore;
131+
return (List<S>)entities;
131132
}
132133

133134
@Override
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
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.transactions;
17+
18+
public class EclipseStoreExistingTransactionObject implements EclipseStoreTransaction
19+
{
20+
public void startTransaction()
21+
{
22+
23+
}
24+
25+
public void rollbackTransaction()
26+
{
27+
28+
}
29+
30+
public void commitTransaction()
31+
{
32+
33+
}
34+
35+
@Override
36+
public void addAction(final EclipseStoreTransactionAction action)
37+
{
38+
39+
}
40+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
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.transactions;
17+
18+
public class EclipseStoreNoTransactionObject implements EclipseStoreTransaction
19+
{
20+
@Override
21+
public void addAction(final EclipseStoreTransactionAction action)
22+
{
23+
action.execute();
24+
}
25+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
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.transactions;
17+
18+
public interface EclipseStoreTransaction
19+
{
20+
void addAction(EclipseStoreTransactionAction action);
21+
}

spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/transactions/EclipseStoreTransactionObject.java renamed to spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/transactions/EclipseStoreTransactionAction.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@
1515
*/
1616
package software.xdev.spring.data.eclipse.store.transactions;
1717

18-
public class EclipseStoreTransactionObject
18+
@FunctionalInterface
19+
public interface EclipseStoreTransactionAction
1920
{
21+
void execute();
2022
}

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

Lines changed: 35 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -20,11 +20,21 @@
2020
import org.springframework.transaction.TransactionException;
2121
import org.springframework.transaction.support.AbstractPlatformTransactionManager;
2222
import org.springframework.transaction.support.DefaultTransactionStatus;
23-
import org.springframework.transaction.support.ResourceTransactionManager;
23+
import org.springframework.transaction.support.TransactionSynchronizationManager;
24+
import org.springframework.util.Assert;
25+
26+
import software.xdev.spring.data.eclipse.store.repository.EclipseStoreStorage;
27+
2428

2529
public class EclipseStoreTransactionManager extends AbstractPlatformTransactionManager
26-
implements ResourceTransactionManager, InitializingBean
30+
implements InitializingBean
2731
{
32+
private final EclipseStoreStorage storage;
33+
34+
public EclipseStoreTransactionManager(final EclipseStoreStorage storage)
35+
{
36+
this.storage = storage;
37+
}
2838

2939
@Override
3040
public void afterPropertiesSet() throws Exception
@@ -35,30 +45,47 @@ public void afterPropertiesSet() throws Exception
3545
@Override
3646
protected Object doGetTransaction() throws TransactionException
3747
{
38-
return new EclipseStoreTransactionObject();
48+
final EclipseStoreExistingTransactionObject transactionObject =
49+
(EclipseStoreExistingTransactionObject)TransactionSynchronizationManager.getResource(this.storage);
50+
return transactionObject == null ? new EclipseStoreExistingTransactionObject() : transactionObject;
3951
}
4052

4153
@Override
4254
protected void doBegin(final Object transaction, final TransactionDefinition definition) throws TransactionException
4355
{
44-
System.out.println(transaction);
56+
final EclipseStoreExistingTransactionObject transactionObject =
57+
this.extractEclipseStoreTransaction(transaction);
58+
transactionObject.startTransaction();
59+
TransactionSynchronizationManager.bindResource(this.storage, transactionObject);
4560
}
4661

4762
@Override
4863
protected void doCommit(final DefaultTransactionStatus status) throws TransactionException
4964
{
50-
System.out.println(status);
65+
this.extractEclipseStoreTransaction(status.getTransaction()).commitTransaction();
5166
}
5267

5368
@Override
5469
protected void doRollback(final DefaultTransactionStatus status) throws TransactionException
5570
{
56-
System.out.println(status);
71+
this.extractEclipseStoreTransaction(status.getTransaction()).rollbackTransaction();
5772
}
5873

5974
@Override
60-
public Object getResourceFactory()
75+
protected void doCleanupAfterCompletion(final Object transaction)
76+
{
77+
TransactionSynchronizationManager.unbindResource(this.storage);
78+
}
79+
80+
private EclipseStoreExistingTransactionObject extractEclipseStoreTransaction(final Object transaction)
6181
{
62-
return null;
82+
Assert.isInstanceOf(
83+
EclipseStoreExistingTransactionObject.class, transaction,
84+
() -> String.format(
85+
"Expected to find a %s but it turned out to be %s.",
86+
EclipseStoreExistingTransactionObject.class,
87+
transaction.getClass()));
88+
89+
return (EclipseStoreExistingTransactionObject)transaction;
6390
}
6491
}

0 commit comments

Comments
 (0)