Skip to content

Commit 15ff22f

Browse files
committed
Port to jdk17 and spring 3.0.0
Closes #1278.
1 parent 9f2d7ee commit 15ff22f

16 files changed

+158
-115
lines changed

pom.xml

Lines changed: 39 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
11
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
2-
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
2+
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
3+
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
34

45
<modelVersion>4.0.0</modelVersion>
56

67
<groupId>org.springframework.data</groupId>
78
<artifactId>spring-data-couchbase</artifactId>
8-
<version>4.3.0-SNAPSHOT</version>
9+
<version>5.0.0-SNAPSHOT</version>
910

1011
<name>Spring Data Couchbase</name>
1112
<description>Spring Data integration for Couchbase</description>
@@ -14,14 +15,17 @@
1415
<parent>
1516
<groupId>org.springframework.data.build</groupId>
1617
<artifactId>spring-data-parent</artifactId>
17-
<version>2.6.0-SNAPSHOT</version>
18+
<version>3.0.0-SNAPSHOT</version>
1819
</parent>
1920

2021
<properties>
21-
<couchbase>3.2.1</couchbase>
22-
<couchbase.osgi>3.2.1</couchbase.osgi>
23-
<springdata.commons>2.6.0-SNAPSHOT</springdata.commons>
22+
<couchbase>3.2.3</couchbase>
23+
<couchbase.osgi>3.2.3</couchbase.osgi>
24+
<springdata.commons>3.0.0-SNAPSHOT</springdata.commons>
2425
<java-module-name>spring.data.couchbase</java-module-name>
26+
<jodatime>2.10.13</jodatime>
27+
<jakarta.validation>3.0.1</jakarta.validation>
28+
<hibernate.validator>7.0.1.Final</hibernate.validator>
2529
</properties>
2630

2731
<dependencyManagement>
@@ -64,6 +68,13 @@
6468
<version>${couchbase}</version>
6569
</dependency>
6670

71+
<!-- CDI -->
72+
<dependency>
73+
<groupId>jakarta.enterprise</groupId>
74+
<artifactId>jakarta.enterprise.cdi-api</artifactId>
75+
<version>3.0.0</version>
76+
</dependency>
77+
6778
<dependency>
6879
<groupId>org.springframework</groupId>
6980
<artifactId>spring-test</artifactId>
@@ -72,9 +83,9 @@
7283
</dependency>
7384

7485
<dependency>
75-
<groupId>org.hibernate</groupId>
86+
<groupId>org.hibernate.validator</groupId>
7687
<artifactId>hibernate-validator</artifactId>
77-
<version>5.3.6.Final</version>
88+
<version>7.0.1.Final</version>
7889
<scope>test</scope>
7990
</dependency>
8091

@@ -112,24 +123,25 @@
112123

113124
<!-- JSR 303 Validation -->
114125
<dependency>
115-
<groupId>javax.validation</groupId>
116-
<artifactId>validation-api</artifactId>
126+
<groupId>jakarta.validation</groupId>
127+
<artifactId>jakarta.validation-api</artifactId>
117128
<version>${validation}</version>
118-
<optional>true</optional>
119129
</dependency>
120130

121131
<dependency>
122-
<groupId>javax.el</groupId>
123-
<artifactId>javax.el-api</artifactId>
124-
<version>3.0.0</version>
125-
<scope>test</scope>
132+
<groupId>jakarta.el</groupId>
133+
<artifactId>jakarta.el-api</artifactId>
134+
<version>4.0.0</version>
135+
<scope>provided</scope>
136+
<optional>true</optional>
126137
</dependency>
127138

128139
<dependency>
129140
<groupId>org.glassfish</groupId>
130-
<artifactId>javax.el</artifactId>
131-
<version>3.0.0</version>
132-
<scope>test</scope>
141+
<artifactId>jakarta.el</artifactId>
142+
<version>4.0.2</version>
143+
<scope>provided</scope>
144+
<optional>true</optional>
133145
</dependency>
134146

135147
<!-- CDI -->
@@ -148,21 +160,6 @@
148160
<scope>test</scope>
149161
</dependency>
150162

151-
<dependency>
152-
<groupId>javax.enterprise</groupId>
153-
<artifactId>cdi-api</artifactId>
154-
<version>${cdi}</version>
155-
<scope>provided</scope>
156-
<optional>true</optional>
157-
</dependency>
158-
159-
<dependency>
160-
<groupId>javax.annotation</groupId>
161-
<artifactId>javax.annotation-api</artifactId>
162-
<version>${javax-annotation-api}</version>
163-
<scope>test</scope>
164-
</dependency>
165-
166163
<dependency>
167164
<groupId>org.apache.openwebbeans</groupId>
168165
<artifactId>openwebbeans-se</artifactId>
@@ -280,15 +277,15 @@
280277
</executions>
281278
</plugin>
282279
<plugin>
283-
<groupId>org.apache.maven.plugins</groupId>
284-
<artifactId>maven-jar-plugin</artifactId>
285-
<configuration>
286-
<archive>
287-
<manifestEntries>
288-
<Automatic-Module-Name>${java-module-name}</Automatic-Module-Name>
289-
</manifestEntries>
290-
</archive>
291-
</configuration>
280+
<groupId>org.apache.maven.plugins</groupId>
281+
<artifactId>maven-jar-plugin</artifactId>
282+
<configuration>
283+
<archive>
284+
<manifestEntries>
285+
<Automatic-Module-Name>${java-module-name}</Automatic-Module-Name>
286+
</manifestEntries>
287+
</archive>
288+
</configuration>
292289
</plugin>
293290
<plugin>
294291
<groupId>org.apache.maven.plugins</groupId>

src/main/java/org/springframework/data/couchbase/core/convert/AbstractCouchbaseConverter.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222
import org.springframework.core.convert.ConversionService;
2323
import org.springframework.core.convert.support.GenericConversionService;
2424
import org.springframework.data.convert.CustomConversions;
25-
import org.springframework.data.convert.EntityInstantiators;
25+
import org.springframework.data.mapping.model.EntityInstantiators;
2626

2727
/**
2828
* An abstract {@link CouchbaseConverter} that provides the basics for the {@link MappingCouchbaseConverter}.

src/main/java/org/springframework/data/couchbase/core/convert/MappingCouchbaseConverter.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,6 @@
3636
import org.springframework.core.convert.support.DefaultConversionService;
3737
import org.springframework.data.annotation.Transient;
3838
import org.springframework.data.convert.CustomConversions;
39-
import org.springframework.data.convert.EntityInstantiator;
4039
import org.springframework.data.couchbase.core.mapping.CouchbaseDocument;
4140
import org.springframework.data.couchbase.core.mapping.CouchbaseList;
4241
import org.springframework.data.couchbase.core.mapping.CouchbaseMappingContext;
@@ -60,6 +59,7 @@
6059
import org.springframework.data.mapping.context.MappingContext;
6160
import org.springframework.data.mapping.model.ConvertingPropertyAccessor;
6261
import org.springframework.data.mapping.model.DefaultSpELExpressionEvaluator;
62+
import org.springframework.data.mapping.model.EntityInstantiator;
6363
import org.springframework.data.mapping.model.ParameterValueProvider;
6464
import org.springframework.data.mapping.model.PersistentEntityParameterValueProvider;
6565
import org.springframework.data.mapping.model.PropertyValueProvider;

src/main/java/org/springframework/data/couchbase/core/mapping/event/ValidatingCouchbaseEventListener.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,13 +18,13 @@
1818

1919
import java.util.Set;
2020

21-
import javax.validation.ConstraintViolationException;
22-
import javax.validation.Validator;
2321

22+
import jakarta.validation.ConstraintViolationException;
2423
import org.slf4j.Logger;
2524
import org.slf4j.LoggerFactory;
2625
import org.springframework.data.couchbase.core.mapping.CouchbaseDocument;
2726
import org.springframework.util.Assert;
27+
import org.springframework.validation.beanvalidation.LocalValidatorFactoryBean;
2828

2929
/**
3030
* javax.validation dependant entities validator. When it is registered as Spring component its automatically invoked
@@ -38,14 +38,14 @@ public class ValidatingCouchbaseEventListener extends AbstractCouchbaseEventList
3838

3939
private static final Logger LOG = LoggerFactory.getLogger(ValidatingCouchbaseEventListener.class);
4040

41-
private final Validator validator;
41+
private final LocalValidatorFactoryBean validator;
4242

4343
/**
4444
* Creates a new {@link ValidatingCouchbaseEventListener} using the given {@link Validator}.
4545
*
4646
* @param validator must not be {@literal null}.
4747
*/
48-
public ValidatingCouchbaseEventListener(Validator validator) {
48+
public ValidatingCouchbaseEventListener(LocalValidatorFactoryBean validator) {
4949
Assert.notNull(validator, "Validator must not be null!");
5050
this.validator = validator;
5151
}

src/main/java/org/springframework/data/couchbase/core/query/QueryCriteria.java

Lines changed: 40 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -18,12 +18,15 @@
1818
import static org.springframework.data.couchbase.core.query.N1QLExpression.x;
1919

2020
import java.util.ArrayList;
21+
import java.util.Collection;
22+
import java.util.Collections;
2123
import java.util.Formatter;
2224
import java.util.LinkedList;
2325
import java.util.List;
2426

2527
import org.springframework.data.couchbase.core.convert.CouchbaseConverter;
2628
import org.springframework.lang.Nullable;
29+
import org.springframework.util.CollectionUtils;
2730

2831
import com.couchbase.client.core.error.InvalidArgumentException;
2932
import com.couchbase.client.java.json.JsonArray;
@@ -278,18 +281,30 @@ public QueryCriteria between(@Nullable Object o1, @Nullable Object o2) {
278281

279282
public QueryCriteria in(@Nullable Object... o) {
280283
operator = "IN";
281-
format = "%1$s in ( %3$s )";
282-
// IN takes a single argument that is a list
284+
format = "%1$s in ( ";
283285
if (o.length > 0) {
284286
if (o[0] instanceof JsonArray || o[0] instanceof List || o[0] instanceof Object[]) {
285287
if (o.length != 1) {
286288
throw new RuntimeException("IN cannot take multiple lists");
287289
}
288-
value = o;
290+
if (o[0] instanceof Object[]) {
291+
value = (Object[]) o[0];
292+
} else if (o[0] instanceof JsonArray) {
293+
JsonArray ja = ((JsonArray) o[0]);
294+
value = ja.toList().toArray();
295+
} else if (o[0] instanceof List) {
296+
List l = ((List) o[0]);
297+
value = l.toArray();
298+
}
289299
} else {
290-
value = new Object[1];
291-
value[0] = o; // JsonArray.from(o);
300+
value = o;
292301
}
302+
for (int i = 0; i < value.length; i++) {
303+
if (i > 0)
304+
format = format + ", ";
305+
format = format + "%" + (i + 3) + "$s";
306+
}
307+
format = format + " )";
293308
}
294309
return this;
295310
}
@@ -409,15 +424,13 @@ private String maybeWrapValue(N1QLExpression key, Object value, int[] paramIndex
409424
if (paramIndexPtr[0] >= 0) {
410425
JsonArray params = (JsonArray) parameters;
411426
// from StringBasedN1qlQueryParser.getPositionalPlaceholderValues()
412-
try {
427+
428+
if (value instanceof Object[] || value instanceof Collection) {
429+
addAsCollection(params, asCollection(value), converter);
430+
} else {
413431
params.add(convert(converter, value));
414-
} catch (InvalidArgumentException iae) {
415-
if (value instanceof Object[]) {
416-
addAsArray(params, value, converter);
417-
} else {
418-
throw iae;
419-
}
420432
}
433+
421434
return "$" + (++paramIndexPtr[0]); // these are generated in order
422435
} else {
423436
JsonObject params = (JsonObject) parameters;
@@ -462,15 +475,27 @@ private static Object convert(CouchbaseConverter converter, Object value) {
462475
return converter != null ? converter.convertForWriteIfNeeded(value) : value;
463476
}
464477

465-
private void addAsArray(JsonArray posValues, Object o, CouchbaseConverter converter) {
466-
Object[] array = (Object[]) o;
478+
private void addAsCollection(JsonArray posValues, Collection collection, CouchbaseConverter converter) {
467479
JsonArray ja = JsonValue.ja();
468-
for (Object e : array) {
480+
for (Object e : collection) {
469481
ja.add(String.valueOf(convert(converter, e)));
470482
}
471483
posValues.add(ja);
472484
}
473485

486+
/**
487+
* Returns a collection from the given source object. From MappingCouchbaseConverter.
488+
*
489+
* @param source the source object.
490+
* @return the target collection.
491+
*/
492+
private static Collection<?> asCollection(final Object source) {
493+
if (source instanceof Collection) {
494+
return (Collection<?>) source;
495+
}
496+
return source.getClass().isArray() ? CollectionUtils.arrayToList(source) : Collections.singleton(source);
497+
}
498+
474499
private String maybeBackTic(String value) {
475500
if (value == null || (value.startsWith("`") && value.endsWith("`"))) {
476501
return value;

src/main/java/org/springframework/data/couchbase/repository/auditing/CouchbaseAuditingRegistrar.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
import java.lang.annotation.Annotation;
2020

2121
import org.springframework.beans.factory.config.BeanDefinition;
22+
import org.springframework.beans.factory.support.AbstractBeanDefinition;
2223
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
2324
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
2425
import org.springframework.beans.factory.support.RootBeanDefinition;
@@ -70,7 +71,11 @@ protected BeanDefinitionBuilder getAuditHandlerBeanDefinitionBuilder(AuditingCon
7071
Assert.notNull(configuration, "AuditingConfiguration must not be null!");
7172

7273
BeanDefinitionBuilder builder = BeanDefinitionBuilder.rootBeanDefinition(IsNewAwareAuditingHandler.class);
73-
builder.addConstructorArgReference(BeanNames.COUCHBASE_MAPPING_CONTEXT);
74+
75+
BeanDefinitionBuilder definition = BeanDefinitionBuilder.genericBeanDefinition(PersistentEntitiesFactoryBean.class);
76+
definition.setAutowireMode(AbstractBeanDefinition.AUTOWIRE_CONSTRUCTOR);
77+
78+
builder.addConstructorArgValue(definition.getBeanDefinition());
7479
return configureDefaultAuditHandlerAttributes(configuration, builder);
7580
}
7681

src/main/java/org/springframework/data/couchbase/repository/cdi/CouchbaseRepositoryBean.java

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -15,14 +15,13 @@
1515
*/
1616
package org.springframework.data.couchbase.repository.cdi;
1717

18+
import jakarta.enterprise.inject.spi.Bean;
19+
import jakarta.enterprise.inject.spi.BeanManager;
20+
1821
import java.lang.annotation.Annotation;
1922
import java.util.Optional;
2023
import java.util.Set;
2124

22-
import javax.enterprise.context.spi.CreationalContext;
23-
import javax.enterprise.inject.spi.Bean;
24-
import javax.enterprise.inject.spi.BeanManager;
25-
2625
import org.springframework.data.couchbase.core.CouchbaseOperations;
2726
import org.springframework.data.couchbase.repository.config.RepositoryOperationsMapping;
2827
import org.springframework.data.couchbase.repository.support.CouchbaseRepositoryFactory;
@@ -63,8 +62,7 @@ public CouchbaseRepositoryBean(Bean<CouchbaseOperations> operations, Set<Annotat
6362
* @see org.springframework.data.repository.cdi.CdiRepositoryBean#create(javax.enterprise.context.spi.CreationalContext, java.lang.Class)
6463
*/
6564
@Override
66-
protected T create(CreationalContext<T> creationalContext, Class<T> repositoryType) {
67-
65+
protected T create(jakarta.enterprise.context.spi.CreationalContext<T> creationalContext, Class<T> repositoryType) {
6866
CouchbaseOperations couchbaseOperations = getDependencyInstance(couchbaseOperationsBean, CouchbaseOperations.class);
6967
RepositoryOperationsMapping couchbaseOperationsMapping = new RepositoryOperationsMapping(couchbaseOperations);
7068

@@ -75,4 +73,5 @@ protected T create(CreationalContext<T> creationalContext, Class<T> repositoryTy
7573
public Class<? extends Annotation> getScope() {
7674
return couchbaseOperationsBean.getScope();
7775
}
76+
7877
}

src/main/java/org/springframework/data/couchbase/repository/cdi/CouchbaseRepositoryExtension.java

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -22,13 +22,12 @@
2222
import java.util.Map;
2323
import java.util.Set;
2424

25-
import javax.enterprise.event.Observes;
26-
import javax.enterprise.inject.UnsatisfiedResolutionException;
27-
import javax.enterprise.inject.spi.AfterBeanDiscovery;
28-
import javax.enterprise.inject.spi.Bean;
29-
import javax.enterprise.inject.spi.BeanManager;
30-
import javax.enterprise.inject.spi.ProcessBean;
31-
25+
import jakarta.enterprise.event.Observes;
26+
import jakarta.enterprise.inject.UnsatisfiedResolutionException;
27+
import jakarta.enterprise.inject.spi.AfterBeanDiscovery;
28+
import jakarta.enterprise.inject.spi.Bean;
29+
import jakarta.enterprise.inject.spi.BeanManager;
30+
import jakarta.enterprise.inject.spi.ProcessBean;
3231
import org.springframework.data.couchbase.core.CouchbaseOperations;
3332
import org.springframework.data.repository.cdi.CdiRepositoryBean;
3433
import org.springframework.data.repository.cdi.CdiRepositoryExtensionSupport;
@@ -67,6 +66,7 @@ <T> void processBean(@Observes ProcessBean<T> processBean) {
6766
*
6867
* @param beanManager The BeanManager instance.
6968
*/
69+
7070
void afterBeanDiscovery(@Observes AfterBeanDiscovery afterBeanDiscovery, BeanManager beanManager) {
7171
for (Map.Entry<Class<?>, Set<Annotation>> entry : getRepositoryTypes()) {
7272

src/main/java/org/springframework/data/couchbase/repository/query/CouchbaseQueryExecution.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@
2626
import org.springframework.data.domain.Slice;
2727
import org.springframework.data.domain.SliceImpl;
2828
import org.springframework.data.repository.query.QueryMethod;
29-
import org.springframework.data.repository.support.PageableExecutionUtils;
29+
import org.springframework.data.support.PageableExecutionUtils;
3030
import org.springframework.util.Assert;
3131

3232
/**

0 commit comments

Comments
 (0)