Skip to content

Commit 368edb6

Browse files
committed
Reorganize repository so modules may be added.
Closes #1503.
2 parents 5faa047 + 28d9f8f commit 368edb6

32 files changed

+1321
-210
lines changed

README.adoc

+23
Original file line numberDiff line numberDiff line change
@@ -194,6 +194,29 @@ It can be staged and accessed via :
194194
----
195195
https://mikereiche.github.io/staged/index.html
196196

197+
=== Building and staging reference documentation for review
198+
199+
[source,bash]
200+
----
201+
export MY_GIT_USER=<github-user>
202+
mvn generate-resources
203+
docs=`pwd`/target/site/reference/html
204+
pushd /tmp
205+
mkdir $$
206+
cd $$
207+
# see https://docs.github.com/en/pages/getting-started-with-github-pages/creating-a-github-pages-site
208+
# this examples uses a repository named "staged"
209+
git clone [email protected]:${MY_GIT_USER}/staged.git -b gh-pages
210+
cd staged
211+
cp -R $docs/* .
212+
git add .
213+
git commit --message "stage for review"
214+
git push origin gh-pages
215+
popd
216+
----
217+
218+
The generated documentation is available from `target/site/reference/html/index.html`.
219+
197220
== Examples
198221

199222
* https://github.com/spring-projects/spring-data-examples/[Spring Data Examples] contains example projects that explain specific features in more detail.

spring-data-couchbase/src/main/java/org/springframework/data/couchbase/config/AbstractCouchbaseConfiguration.java

+11
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@
5151
import org.springframework.transaction.annotation.AnnotationTransactionAttributeSource;
5252
import org.springframework.transaction.interceptor.TransactionAttributeSource;
5353
import org.springframework.transaction.interceptor.TransactionInterceptor;
54+
import org.springframework.transaction.support.TransactionTemplate;
5455
import org.springframework.util.ClassUtils;
5556
import org.springframework.util.StringUtils;
5657

@@ -330,6 +331,16 @@ CouchbaseCallbackTransactionManager couchbaseTransactionManager(CouchbaseClientF
330331
return new CouchbaseCallbackTransactionManager(clientFactory);
331332
}
332333

334+
/**
335+
* The default transaction template manager.
336+
*
337+
* @param couchbaseTransactionManager
338+
* @return
339+
*/
340+
@Bean(BeanNames.COUCHBASE_TRANSACTION_TEMPLATE)
341+
TransactionTemplate couchbaseTransactionTemplate(CouchbaseCallbackTransactionManager couchbaseTransactionManager) {
342+
return new TransactionTemplate(couchbaseTransactionManager);
343+
}
333344
/**
334345
* The default TransactionalOperator.
335346
*

spring-data-couchbase/src/main/java/org/springframework/data/couchbase/config/BeanNames.java

+2
Original file line numberDiff line numberDiff line change
@@ -64,5 +64,7 @@ public class BeanNames {
6464

6565
public static final String COUCHBASE_TRANSACTION_MANAGER = "couchbaseTransactionManager";
6666

67+
public static final String COUCHBASE_TRANSACTION_TEMPLATE = "couchbaseTransactionTemplate";
68+
6769
public static final String COUCHBASE_TRANSACTIONAL_OPERATOR = "couchbaseTransactionalOperator";
6870
}

spring-data-couchbase/src/test/java/org/springframework/data/couchbase/transactions/CouchbasePersonTransactionReactiveIntegrationTests.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,7 @@ public void shouldRollbackAfterException() {
108108

109109
@Test
110110
public void shouldRollbackAfterExceptionOfTxAnnotatedMethod() {
111-
assertThrowsWithCause(() -> personService.declarativeSavePersonErrors(WalterWhite).blockLast(),
111+
assertThrowsWithCause(() -> personService.declarativeSavePersonErrors(WalterWhite).block(),
112112
TransactionSystemUnambiguousException.class, SimulateFailureException.class);
113113
}
114114

spring-data-couchbase/src/test/java/org/springframework/data/couchbase/transactions/CouchbaseTransactionalNonAllowableOperationsIntegrationTests.java

+1-4
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,6 @@
3636
import org.springframework.data.couchbase.util.ClusterType;
3737
import org.springframework.data.couchbase.util.IgnoreWhen;
3838
import org.springframework.data.couchbase.util.JavaIntegrationTests;
39-
import org.springframework.stereotype.Component;
4039
import org.springframework.stereotype.Service;
4140
import org.springframework.test.context.junit.jupiter.SpringJUnitConfig;
4241
import org.springframework.transaction.annotation.EnableTransactionManagement;
@@ -114,9 +113,7 @@ public void upsertById() {
114113
});
115114
}
116115

117-
@Service
118-
@Component
119-
@EnableTransactionManagement
116+
@Service // this will work in the unit tests even without @Service because of explicit loading by @SpringJUnitConfig
120117
static class PersonService {
121118
final CouchbaseOperations personOperations;
122119

spring-data-couchbase/src/test/java/org/springframework/data/couchbase/transactions/CouchbaseTransactionalOptionsIntegrationTests.java

+1-4
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,6 @@
3636
import org.springframework.data.couchbase.util.ClusterType;
3737
import org.springframework.data.couchbase.util.IgnoreWhen;
3838
import org.springframework.data.couchbase.util.JavaIntegrationTests;
39-
import org.springframework.stereotype.Component;
4039
import org.springframework.stereotype.Service;
4140
import org.springframework.test.context.junit.jupiter.SpringJUnitConfig;
4241
import org.springframework.transaction.annotation.EnableTransactionManagement;
@@ -100,9 +99,7 @@ public void supportedIsolation() {
10099
personService.supportedIsolation();
101100
}
102101

103-
@Service
104-
@Component
105-
@EnableTransactionManagement
102+
@Service // this will work in the unit tests even without @Service because of explicit loading by @SpringJUnitConfig
106103
static class PersonService {
107104
final CouchbaseOperations ops;
108105

spring-data-couchbase/src/test/java/org/springframework/data/couchbase/transactions/CouchbaseTransactionalPropagationIntegrationTests.java

+1-4
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,6 @@
4343
import org.springframework.data.couchbase.util.IgnoreWhen;
4444
import org.springframework.data.couchbase.util.JavaIntegrationTests;
4545
import org.springframework.lang.Nullable;
46-
import org.springframework.stereotype.Component;
4746
import org.springframework.stereotype.Service;
4847
import org.springframework.test.context.junit.jupiter.SpringJUnitConfig;
4948
import org.springframework.transaction.IllegalTransactionStateException;
@@ -285,9 +284,7 @@ public void callDefaultThatCallsDefaultRetries() {
285284
assertEquals(3, attempts.get());
286285
}
287286

288-
@Service
289-
@Component
290-
@EnableTransactionManagement
287+
@Service // this will work in the unit tests even without @Service because of explicit loading by @SpringJUnitConfig
291288
static class PersonService {
292289
final CouchbaseOperations ops;
293290

spring-data-couchbase/src/test/java/org/springframework/data/couchbase/transactions/CouchbaseTransactionalRepositoryIntegrationTests.java

+1-5
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,6 @@
4040
import org.springframework.data.couchbase.util.ClusterType;
4141
import org.springframework.data.couchbase.util.IgnoreWhen;
4242
import org.springframework.data.couchbase.util.JavaIntegrationTests;
43-
import org.springframework.stereotype.Component;
4443
import org.springframework.stereotype.Service;
4544
import org.springframework.test.context.junit.jupiter.SpringJUnitConfig;
4645
import org.springframework.transaction.annotation.EnableTransactionManagement;
@@ -114,7 +113,6 @@ public void saveRolledBack() {
114113
String id = UUID.randomUUID().toString();
115114

116115
assertThrowsWithCause(() -> {
117-
;
118116
userService.run(repo -> {
119117
User user = repo.save(new User(id, "Ada", "Lovelace"));
120118
SimulateFailureException.throwEx("fail");
@@ -125,9 +123,7 @@ public void saveRolledBack() {
125123
assertNull(user);
126124
}
127125

128-
@Service
129-
@Component
130-
@EnableTransactionManagement
126+
@Service // this will work in the unit tests even without @Service because of explicit loading by @SpringJUnitConfig
131127
static class UserService {
132128
@Autowired UserRepository userRepo;
133129

spring-data-couchbase/src/test/java/org/springframework/data/couchbase/transactions/CouchbaseTransactionalTemplateIntegrationTests.java

+1-4
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,6 @@
5252
import org.springframework.data.couchbase.util.ClusterType;
5353
import org.springframework.data.couchbase.util.IgnoreWhen;
5454
import org.springframework.data.couchbase.util.JavaIntegrationTests;
55-
import org.springframework.stereotype.Component;
5655
import org.springframework.stereotype.Service;
5756
import org.springframework.test.context.junit.jupiter.SpringJUnitConfig;
5857
import org.springframework.transaction.annotation.EnableTransactionManagement;
@@ -366,9 +365,7 @@ public void removeEntityById() {
366365
}, TransactionSystemUnambiguousException.class, IllegalArgumentException.class);
367366
}
368367

369-
@Service
370-
@Component
371-
@EnableTransactionManagement
368+
@Service // this will work in the unit tests even without @Service because of explicit loading by @SpringJUnitConfig
372369
static class PersonService {
373370
final CouchbaseOperations personOperations;
374371
final ReactiveCouchbaseOperations personOperationsRx;

spring-data-couchbase/src/test/java/org/springframework/data/couchbase/transactions/CouchbaseTransactionalUnsettableParametersIntegrationTests.java

+1-5
Original file line numberDiff line numberDiff line change
@@ -36,10 +36,8 @@
3636
import org.springframework.data.couchbase.util.ClusterType;
3737
import org.springframework.data.couchbase.util.IgnoreWhen;
3838
import org.springframework.data.couchbase.util.JavaIntegrationTests;
39-
import org.springframework.stereotype.Component;
4039
import org.springframework.stereotype.Service;
4140
import org.springframework.test.context.junit.jupiter.SpringJUnitConfig;
42-
import org.springframework.transaction.annotation.EnableTransactionManagement;
4341
import org.springframework.transaction.annotation.Transactional;
4442

4543
import com.couchbase.client.core.msg.kv.DurabilityLevel;
@@ -202,9 +200,7 @@ public void findWithOptions() {
202200
});
203201
}
204202

205-
@Service
206-
@Component
207-
@EnableTransactionManagement
203+
@Service // this will work in the unit tests even without @Service because of explicit loading by @SpringJUnitConfig
208204
static class PersonService {
209205
final CouchbaseOperations personOperations;
210206

spring-data-couchbase/src/test/java/org/springframework/data/couchbase/transactions/PersonService.java

+53-75
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@
2020
import static org.springframework.data.couchbase.util.JavaIntegrationTests.throwSimulateFailureException;
2121
import static org.springframework.data.couchbase.util.Util.assertInAnnotationTransaction;
2222

23-
import reactor.core.publisher.Flux;
2423
import reactor.core.publisher.Mono;
2524

2625
import java.util.List;
@@ -32,93 +31,76 @@
3231
import org.springframework.data.couchbase.domain.Person;
3332
import org.springframework.stereotype.Component;
3433
import org.springframework.stereotype.Service;
35-
import org.springframework.transaction.annotation.EnableTransactionManagement;
3634
import org.springframework.transaction.annotation.Transactional;
37-
import org.springframework.transaction.reactive.TransactionalOperator;
3835

3936
/**
4037
* PersonService for tests
4138
*
4239
* @author Michael Reiche
4340
*/
44-
@Service
45-
@Component
46-
@EnableTransactionManagement
41+
@Service // this will work in the unit tests even without @Service because of explicit loading by @SpringJUnitConfig
4742
class PersonService {
4843

4944
final CouchbaseOperations personOperations;
50-
final ReactiveCouchbaseOperations personOperationsRx;
51-
final TransactionalOperator transactionalOperator;
45+
final ReactiveCouchbaseOperations reactivePersonOperations;
5246

53-
public PersonService(CouchbaseOperations ops, ReactiveCouchbaseOperations opsRx,
54-
TransactionalOperator transactionalOperator) {
47+
public PersonService(CouchbaseOperations ops, ReactiveCouchbaseOperations reactiveOps) {
5548
personOperations = ops;
56-
personOperationsRx = opsRx;
57-
this.transactionalOperator = transactionalOperator;
49+
reactivePersonOperations = reactiveOps;
5850
}
5951

52+
@Transactional
6053
public Person savePersonErrors(Person person) {
6154
assertInAnnotationTransaction(false);
62-
63-
return personOperationsRx.insertById(Person.class).one(person)//
64-
.<Person> flatMap(it -> Mono.error(new SimulateFailureException()))//
65-
.as(transactionalOperator::transactional).block();
55+
Person p = personOperations.insertById(Person.class).one(person);
56+
SimulateFailureException.throwEx("savePersonErrors");
57+
return p;
6658
}
6759

60+
@Transactional
6861
public Person savePerson(Person person) {
69-
assertInAnnotationTransaction(false);
70-
return personOperationsRx.insertById(Person.class).one(person)//
71-
.as(transactionalOperator::transactional).block();
62+
assertInAnnotationTransaction(true);
63+
return personOperations.insertById(Person.class).one(person);
7264
}
7365

66+
@Transactional
7467
public Long countDuringTx(Person person) {
75-
assertInAnnotationTransaction(false);
76-
return personOperationsRx.insertById(Person.class).one(person)//
77-
.then(personOperationsRx.findByQuery(Person.class).withConsistency(REQUEST_PLUS).count())
78-
.as(transactionalOperator::transactional).block();
68+
assertInAnnotationTransaction(true);
69+
Person p = personOperations.insertById(Person.class).one(person);
70+
return personOperations.findByQuery(Person.class).withConsistency(REQUEST_PLUS).count();
7971
}
8072

73+
@Transactional
8174
public List<CouchbasePersonTransactionIntegrationTests.EventLog> saveWithLogs(Person person) {
82-
assertInAnnotationTransaction(false);
83-
return Flux
84-
.merge(
85-
personOperationsRx.insertById(CouchbasePersonTransactionIntegrationTests.EventLog.class)
86-
.one(new CouchbasePersonTransactionIntegrationTests.EventLog(new ObjectId(), "beforeConvert")),
87-
personOperationsRx.insertById(CouchbasePersonTransactionIntegrationTests.EventLog.class)
88-
.one(new CouchbasePersonTransactionIntegrationTests.EventLog(new ObjectId(), "afterConvert")),
89-
personOperationsRx.insertById(CouchbasePersonTransactionIntegrationTests.EventLog.class)
90-
.one(new CouchbasePersonTransactionIntegrationTests.EventLog(new ObjectId(), "beforeInsert")),
91-
personOperationsRx.insertById(Person.class).one(person),
92-
personOperationsRx.insertById(CouchbasePersonTransactionIntegrationTests.EventLog.class)
93-
.one(new CouchbasePersonTransactionIntegrationTests.EventLog(new ObjectId(), "afterInsert"))) //
94-
.thenMany(personOperationsRx.findByQuery(CouchbasePersonTransactionIntegrationTests.EventLog.class)
95-
.withConsistency(REQUEST_PLUS).all()) //
96-
.as(transactionalOperator::transactional).collectList().block();
75+
assertInAnnotationTransaction(true);
76+
personOperations.insertById(CouchbasePersonTransactionIntegrationTests.EventLog.class)
77+
.one(new CouchbasePersonTransactionIntegrationTests.EventLog(new ObjectId(), "beforeConvert"));
78+
personOperations.insertById(CouchbasePersonTransactionIntegrationTests.EventLog.class)
79+
.one(new CouchbasePersonTransactionIntegrationTests.EventLog(new ObjectId(), "afterConvert"));
80+
personOperations.insertById(CouchbasePersonTransactionIntegrationTests.EventLog.class)
81+
.one(new CouchbasePersonTransactionIntegrationTests.EventLog(new ObjectId(), "beforeInsert"));
82+
personOperations.insertById(Person.class).one(person);
83+
personOperations.insertById(CouchbasePersonTransactionIntegrationTests.EventLog.class)
84+
.one(new CouchbasePersonTransactionIntegrationTests.EventLog(new ObjectId(), "afterInsert"));
85+
return personOperations.findByQuery(CouchbasePersonTransactionIntegrationTests.EventLog.class)
86+
.withConsistency(REQUEST_PLUS).all();
9787
}
9888

89+
@Transactional
9990
public List<CouchbasePersonTransactionIntegrationTests.EventLog> saveWithErrorLogs(Person person) {
100-
assertInAnnotationTransaction(false);
101-
102-
return Flux
103-
.merge(
104-
personOperationsRx.insertById(CouchbasePersonTransactionIntegrationTests.EventLog.class)
105-
.one(new CouchbasePersonTransactionIntegrationTests.EventLog(new ObjectId(), "beforeConvert")),
106-
//
107-
personOperationsRx.insertById(CouchbasePersonTransactionIntegrationTests.EventLog.class)
108-
.one(new CouchbasePersonTransactionIntegrationTests.EventLog(new ObjectId(), "afterConvert")),
109-
//
110-
personOperationsRx.insertById(CouchbasePersonTransactionIntegrationTests.EventLog.class)
111-
.one(new CouchbasePersonTransactionIntegrationTests.EventLog(new ObjectId(), "beforeInsert")),
112-
//
113-
personOperationsRx.insertById(Person.class).one(person),
114-
//
115-
personOperationsRx.insertById(CouchbasePersonTransactionIntegrationTests.EventLog.class)
116-
.one(new CouchbasePersonTransactionIntegrationTests.EventLog(new ObjectId(), "afterInsert"))) //
117-
.thenMany(personOperationsRx.findByQuery(CouchbasePersonTransactionIntegrationTests.EventLog.class)
118-
.withConsistency(REQUEST_PLUS).all()) //
119-
.<CouchbasePersonTransactionIntegrationTests.EventLog> flatMap(it -> Mono.error(new SimulateFailureException()))
120-
.as(transactionalOperator::transactional).collectList().block();
121-
91+
assertInAnnotationTransaction(true);
92+
personOperations.insertById(CouchbasePersonTransactionIntegrationTests.EventLog.class)
93+
.one(new CouchbasePersonTransactionIntegrationTests.EventLog(new ObjectId(), "beforeConvert"));
94+
personOperations.insertById(CouchbasePersonTransactionIntegrationTests.EventLog.class)
95+
.one(new CouchbasePersonTransactionIntegrationTests.EventLog(new ObjectId(), "afterConvert"));
96+
personOperations.insertById(CouchbasePersonTransactionIntegrationTests.EventLog.class)
97+
.one(new CouchbasePersonTransactionIntegrationTests.EventLog(new ObjectId(), "beforeInsert"));
98+
personOperations.insertById(Person.class).one(person);
99+
personOperations.insertById(CouchbasePersonTransactionIntegrationTests.EventLog.class)
100+
.one(new CouchbasePersonTransactionIntegrationTests.EventLog(new ObjectId(), "afterInsert"));
101+
SimulateFailureException.throwEx("saveEventError");
102+
return personOperations.findByQuery(CouchbasePersonTransactionIntegrationTests.EventLog.class)
103+
.withConsistency(REQUEST_PLUS).all();
122104
}
123105

124106
// org.springframework.beans.factory.NoUniqueBeanDefinitionException:
@@ -160,14 +142,12 @@ public Person declarativeFindReplacePersonCallback(Person person, AtomicInteger
160142
* @param person
161143
* @return
162144
*/
163-
// @Transactional(transactionManager = BeanNames.REACTIVE_COUCHBASE_TRANSACTION_MANAGER)
164-
// must use transactionalOperator
145+
@Transactional
165146
public Mono<Person> declarativeFindReplacePersonReactive(Person person, AtomicInteger tryCount) {
166-
// assertInAnnotationTransaction(true);
167-
return personOperationsRx.findById(Person.class).one(person.id())
147+
assertInAnnotationTransaction(true);
148+
return reactivePersonOperations.findById(Person.class).one(person.id())
168149
.map((p) -> ReplaceLoopThread.updateOutOfTransaction(personOperations, p, tryCount.incrementAndGet()))
169-
.flatMap(p -> personOperationsRx.replaceById(Person.class).one(p.withFirstName(person.getFirstname())))
170-
.as(transactionalOperator::transactional);
150+
.flatMap(p -> reactivePersonOperations.replaceById(Person.class).one(p.withFirstName(person.getFirstname())));
171151
}
172152

173153
/**
@@ -183,19 +163,17 @@ public Person declarativeFindReplacePerson(Person person, AtomicInteger tryCount
183163
return personOperations.replaceById(Person.class).one(p.withFirstName(person.getFirstname()));
184164
}
185165

186-
// @Transactional(transactionManager = BeanNames.REACTIVE_COUCHBASE_TRANSACTION_MANAGER)
187-
// must use transactionalOperator
166+
@Transactional
188167
public Mono<Person> declarativeSavePersonReactive(Person person) {
189-
// assertInAnnotationTransaction(true);
190-
return personOperationsRx.insertById(Person.class).one(person).as(transactionalOperator::transactional);
168+
assertInAnnotationTransaction(true);
169+
return reactivePersonOperations.insertById(Person.class).one(person);
191170
}
192171

193-
// @Transactional(transactionManager = BeanNames.REACTIVE_COUCHBASE_TRANSACTION_MANAGER)
194-
// must use transactionalOperator
172+
@Transactional
195173
public Mono<Person> declarativeSavePersonErrorsReactive(Person person) {
196-
// assertInAnnotationTransaction(true);
197-
return personOperationsRx.insertById(Person.class).one(person).map((pp) -> throwSimulateFailureException(pp))
198-
.as(transactionalOperator::transactional); //
174+
assertInAnnotationTransaction(true);
175+
return reactivePersonOperations.insertById(Person.class).one(person).map((pp) -> throwSimulateFailureException(pp));
176+
199177
}
200178

201179
}

0 commit comments

Comments
 (0)