Skip to content

Commit bc25570

Browse files
committed
JacksonSerde API refactoring
1 parent ca83009 commit bc25570

File tree

18 files changed

+130
-82
lines changed

18 files changed

+130
-82
lines changed

core/src/main/java/com/arangodb/internal/config/ArangoConfig.java

Lines changed: 15 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package com.arangodb.internal.config;
22

33
import com.arangodb.ArangoDBException;
4+
import com.arangodb.ContentType;
45
import com.arangodb.Protocol;
56
import com.arangodb.config.ArangoConfigProperties;
67
import com.arangodb.config.HostDescription;
@@ -43,19 +44,21 @@ public class ArangoConfig {
4344

4445
private static final Logger LOG = LoggerFactory.getLogger(ArangoConfig.class);
4546

46-
private static ArangoSerdeProvider serdeProvider() {
47+
private static ArangoSerdeProvider serdeProvider(ContentType contentType) {
4748
ServiceLoader<ArangoSerdeProvider> loader = ServiceLoader.load(ArangoSerdeProvider.class);
48-
Iterator<ArangoSerdeProvider> it = loader.iterator();
49-
ArangoSerdeProvider serdeProvider;
50-
if (!it.hasNext()) {
49+
ArangoSerdeProvider serdeProvider = null;
50+
for (ArangoSerdeProvider p : loader) {
51+
if (contentType.equals(p.getContentType())) {
52+
if (serdeProvider != null) {
53+
throw new ArangoDBException("Found multiple serde providers! Please set explicitly the one to use.");
54+
}
55+
serdeProvider = p;
56+
}
57+
}
58+
if (serdeProvider == null) {
5159
LOG.warn("No ArangoSerdeProvider found, using InternalSerdeProvider. Please consider registering a custom " +
5260
"ArangoSerdeProvider to avoid depending on internal classes which are not part of the public API.");
53-
serdeProvider = new InternalSerdeProvider();
54-
} else {
55-
serdeProvider = it.next();
56-
if (it.hasNext()) {
57-
throw new ArangoDBException("Found multiple serde providers! Please set explicitly the one to use.");
58-
}
61+
serdeProvider = new InternalSerdeProvider(contentType);
5962
}
6063
return serdeProvider;
6164
}
@@ -245,14 +248,14 @@ public void setLoadBalancingStrategy(LoadBalancingStrategy loadBalancingStrategy
245248

246249
public ArangoSerde getUserDataSerde() {
247250
if (userDataSerde == null) {
248-
userDataSerde = serdeProvider().of(ContentTypeFactory.of(getProtocol()));
251+
userDataSerde = serdeProvider(ContentTypeFactory.of(getProtocol())).create();
249252
}
250253
return userDataSerde;
251254
}
252255

253256
public InternalSerde getInternalSerde() {
254257
if (internalSerde == null) {
255-
internalSerde = InternalSerdeProvider.create(ContentTypeFactory.of(getProtocol()), getUserDataSerde(), protocolModule);
258+
internalSerde = new InternalSerdeProvider(ContentTypeFactory.of(getProtocol())).create(getUserDataSerde(), protocolModule);
256259
}
257260
return internalSerde;
258261
}

core/src/main/java/com/arangodb/internal/serde/InternalSerdeProvider.java

Lines changed: 20 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -7,27 +7,39 @@
77

88
public class InternalSerdeProvider implements ArangoSerdeProvider {
99

10+
private final ContentType contentType;
11+
1012
/**
11-
* Creates a new InternalSerde with default settings for the specified data type.
12-
*
1313
* @param contentType serialization target data type
14+
*/
15+
public InternalSerdeProvider(final ContentType contentType) {
16+
this.contentType = contentType;
17+
}
18+
19+
/**
20+
* Creates a new InternalSerde with default settings.
21+
*
1422
* @return the created InternalSerde
1523
*/
1624
@Override
17-
public InternalSerde of(final ContentType contentType) {
18-
return create(contentType, null, null);
25+
public InternalSerde create() {
26+
return create(null, null);
1927
}
2028

2129
/**
22-
* Creates a new InternalSerde with default settings for the specified data type.
30+
* Creates a new InternalSerde with default settings.
2331
*
24-
* @param contentType serialization target data type
25-
* @param userSerde user serde
32+
* @param userSerde user serde
2633
* @param protocolModule optional Jackson module to support protocol specific types
2734
* @return the created InternalSerde
2835
*/
29-
public static InternalSerde create(final ContentType contentType, ArangoSerde userSerde, Module protocolModule) {
36+
public InternalSerde create(ArangoSerde userSerde, Module protocolModule) {
3037
return new InternalSerdeImpl(InternalMapperProvider.of(contentType), userSerde, protocolModule);
3138
}
3239

40+
@Override
41+
public ContentType getContentType() {
42+
return contentType;
43+
}
44+
3345
}

core/src/main/java/com/arangodb/serde/ArangoSerdeProvider.java

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,12 @@
55
public interface ArangoSerdeProvider {
66

77
/**
8-
* Returns a serde instance for the given content type
9-
*
10-
* @param contentType content type
11-
* @return serde instance
8+
* @return a new serde instance
129
*/
13-
ArangoSerde of(final ContentType contentType);
10+
ArangoSerde create();
1411

12+
/**
13+
* @return the supported content type
14+
*/
15+
ContentType getContentType();
1516
}

docs/v7_java-reference-serialization.md

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ It supports both `JSON` and `VPACK` data formats. To use `VPACK`, the additional
4747
Create an instance of `JacksonSerde`, configure the underlying `ObjectMapper` and pass it to the driver:
4848

4949
```java
50-
JacksonSerde serde = new JacksonSerdeProvider().of(ContentType.JSON);
50+
JacksonSerde serde = JacksonSerde.of(ContentType.JSON);
5151
serde.configure((ObjectMapper mapper) -> {
5252
// ...
5353
});
@@ -132,7 +132,7 @@ public static class Person {
132132
}
133133

134134
// registering programmatically
135-
JacksonSerde serde = new JacksonSerdeProvider().of(ContentType.JSON);
135+
JacksonSerde serde = JacksonSerde.of(ContentType.JSON);
136136
serde.configure(mapper -> {
137137
SimpleModule module = new SimpleModule("PersonModule");
138138
module.addDeserializer(Person.class, new PersonDeserializer());
@@ -154,11 +154,11 @@ as well as [Jackson JVM Language modules](https://github.com/FasterXML/jackson#j
154154
like Kotlin or Scala module (see sections below).
155155

156156
To avoid automatic Jackson modules discovery and registration, an instance of `JacksonSerde` can be manually created
157-
using `JacksonSerdeProvider.create(ObjectMapper)` and registered using `ArangoDBBuilder.serde(ArangoSerde)`, e.g.:
157+
using `JacksonSerde.create(ObjectMapper)` and registered using `ArangoDBBuilder.serde(ArangoSerde)`, e.g.:
158158

159159
```java
160160
ArangoDB adb = new ArangoDB.Builder()
161-
.serde(new JacksonSerdeProvider().create(new ObjectMapper()))
161+
.serde(JacksonSerde.create(new ObjectMapper()))
162162
.build();
163163
```
164164

driver/src/test/java/com/arangodb/async/serde/CustomSerdeTest.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,6 @@
2929
import com.arangodb.model.DocumentCreateOptions;
3030
import com.arangodb.ContentType;
3131
import com.arangodb.serde.jackson.JacksonSerde;
32-
import com.arangodb.serde.jackson.JacksonSerdeProvider;
3332
import org.junit.jupiter.api.AfterEach;
3433
import org.junit.jupiter.api.BeforeEach;
3534
import org.junit.jupiter.api.Test;
@@ -58,7 +57,7 @@ class CustomSerdeTest {
5857

5958
@BeforeEach
6059
void init() throws ExecutionException, InterruptedException {
61-
JacksonSerde serde = new JacksonSerdeProvider().of(ContentType.VPACK);
60+
JacksonSerde serde = JacksonSerde.of(ContentType.VPACK);
6261
serde.configure((mapper) -> {
6362
mapper.configure(WRITE_SINGLE_ELEM_ARRAYS_UNWRAPPED, true);
6463
mapper.configure(USE_BIG_INTEGER_FOR_INTS, true);

driver/src/test/java/com/arangodb/mapping/annotations/ArangoAnnotationsTest.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222

2323
import com.arangodb.ContentType;
2424
import com.arangodb.serde.ArangoSerde;
25-
import com.arangodb.serde.jackson.JacksonSerdeProvider;
25+
import com.arangodb.serde.jackson.JacksonSerde;
2626
import org.junit.jupiter.params.ParameterizedTest;
2727
import org.junit.jupiter.params.provider.EnumSource;
2828

@@ -38,7 +38,7 @@ class ArangoAnnotationsTest {
3838
@ParameterizedTest
3939
@EnumSource(ContentType.class)
4040
void documentFieldAnnotations(ContentType contentType) {
41-
ArangoSerde mapper = new JacksonSerdeProvider().of(contentType);
41+
ArangoSerde mapper = JacksonSerde.of(contentType);
4242

4343
AnnotatedEntity e = new AnnotatedEntity();
4444
e.setId("Id");

driver/src/test/java/com/arangodb/serde/CustomSerdeTest.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,6 @@
2626
import com.arangodb.internal.serde.InternalSerde;
2727
import com.arangodb.model.DocumentCreateOptions;
2828
import com.arangodb.serde.jackson.JacksonSerde;
29-
import com.arangodb.serde.jackson.JacksonSerdeProvider;
3029
import com.fasterxml.jackson.core.JsonGenerator;
3130
import com.fasterxml.jackson.core.JsonParser;
3231
import com.fasterxml.jackson.databind.*;
@@ -63,7 +62,7 @@ class CustomSerdeTest {
6362

6463
@BeforeAll
6564
static void init() {
66-
JacksonSerde serde = new JacksonSerdeProvider().of(ContentType.VPACK);
65+
JacksonSerde serde = JacksonSerde.of(ContentType.VPACK);
6766
serde.configure((mapper) -> {
6867
mapper.configure(WRITE_SINGLE_ELEM_ARRAYS_UNWRAPPED, true);
6968
mapper.configure(USE_BIG_INTEGER_FOR_INTS, true);

driver/src/test/java/com/arangodb/serde/SerdeTest.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ class SerdeTest {
1919
@ParameterizedTest
2020
@EnumSource(ContentType.class)
2121
void rawJsonSerde(ContentType type) {
22-
InternalSerde s = new InternalSerdeProvider().of(type);
22+
InternalSerde s = new InternalSerdeProvider(type).create();
2323
ObjectNode node = JsonNodeFactory.instance.objectNode().put("foo", "bar");
2424
RawJson raw = RawJson.of(SerdeUtils.INSTANCE.writeJson(node));
2525
byte[] serialized = s.serialize(raw);
@@ -30,7 +30,7 @@ void rawJsonSerde(ContentType type) {
3030
@ParameterizedTest
3131
@EnumSource(ContentType.class)
3232
void rawBytesSerde(ContentType type) {
33-
InternalSerde s = new InternalSerdeProvider().of(type);
33+
InternalSerde s = new InternalSerdeProvider(type).create();
3434
ObjectNode node = JsonNodeFactory.instance.objectNode().put("foo", "bar");
3535
RawBytes raw = RawBytes.of(s.serialize(node));
3636
byte[] serialized = s.serialize(raw);

jackson-serde-json/src/main/java/com/arangodb/serde/jackson/JacksonSerde.java

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
package com.arangodb.serde.jackson;
22

3+
import com.arangodb.ContentType;
34
import com.arangodb.serde.ArangoSerde;
5+
import com.arangodb.serde.jackson.internal.JacksonMapperProvider;
6+
import com.arangodb.serde.jackson.internal.JacksonSerdeImpl;
47
import com.fasterxml.jackson.databind.ObjectMapper;
58

69
import java.util.function.Consumer;
@@ -10,6 +13,29 @@
1013
*/
1114
public interface JacksonSerde extends ArangoSerde {
1215

16+
/**
17+
* Creates a new JacksonSerde with default settings for the specified data type.
18+
* Registers all the Jackson modules ({@link com.fasterxml.jackson.databind.Module}) discovered via SPI.
19+
*
20+
* @param contentType serialization target data type
21+
* @return the created JacksonSerde
22+
*/
23+
static JacksonSerde of(final ContentType contentType) {
24+
JacksonSerde serde = create(JacksonMapperProvider.of(contentType));
25+
serde.configure(mapper -> mapper.registerModules(ObjectMapper.findModules()));
26+
return serde;
27+
}
28+
29+
/**
30+
* Creates a new JacksonSerde using the provided ObjectMapper.
31+
*
32+
* @param mapper Jackson ObjectMapper to use
33+
* @return the created JacksonSerde
34+
*/
35+
static JacksonSerde create(final ObjectMapper mapper) {
36+
return new JacksonSerdeImpl(mapper);
37+
}
38+
1339
/**
1440
* Allows configuring the underlying Jackson ObjectMapper
1541
*

jackson-serde-json/src/main/java/com/arangodb/serde/jackson/JacksonSerdeProvider.java

Lines changed: 0 additions & 35 deletions
This file was deleted.

0 commit comments

Comments
 (0)