diff --git a/checkstyle-style.xml b/checkstyle-style.xml
index 4bf2726962..f201269d78 100644
--- a/checkstyle-style.xml
+++ b/checkstyle-style.xml
@@ -137,7 +137,7 @@
-
+
diff --git a/elide-async/pom.xml b/elide-async/pom.xml
index ab089006c1..654612ca4a 100644
--- a/elide-async/pom.xml
+++ b/elide-async/pom.xml
@@ -78,14 +78,9 @@
json-path
- com.fasterxml.jackson.core
+ tools.jackson.core
jackson-databind
-
- com.fasterxml.jackson.datatype
- jackson-datatype-jsr310
- test
-
org.apache.poi
poi-ooxml
diff --git a/elide-async/src/main/java/com/yahoo/elide/async/export/formatter/Attributes.java b/elide-async/src/main/java/com/yahoo/elide/async/export/formatter/Attributes.java
index e6ad09a6d8..aa65c2b518 100644
--- a/elide-async/src/main/java/com/yahoo/elide/async/export/formatter/Attributes.java
+++ b/elide-async/src/main/java/com/yahoo/elide/async/export/formatter/Attributes.java
@@ -8,12 +8,12 @@
import com.yahoo.elide.core.PersistentResource;
import com.yahoo.elide.core.request.Attribute;
-import com.fasterxml.jackson.databind.JsonMappingException;
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.fasterxml.jackson.databind.ser.PropertyWriter;
-
import org.apache.commons.lang3.StringUtils;
+import tools.jackson.core.JacksonException;
+import tools.jackson.databind.ObjectMapper;
+import tools.jackson.databind.ser.PropertyWriter;
+
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
@@ -62,12 +62,12 @@ public static Map getProperties(ObjectMapper objectMapper,
public static Map getProperties(ObjectMapper objectMapper, Class> propertyClass) {
Map result = new LinkedHashMap<>();
try {
- for (Iterator iterator = objectMapper.getSerializerProviderInstance()
+ for (Iterator iterator = objectMapper._serializationContext()
.findValueSerializer(propertyClass).properties(); iterator.hasNext();) {
PropertyWriter property = iterator.next();
result.put(property.getName(), getProperties(objectMapper, property.getType().getRawClass()));
}
- } catch (JsonMappingException e) {
+ } catch (JacksonException e) {
// Do nothing
}
if (result.isEmpty()) {
diff --git a/elide-async/src/main/java/com/yahoo/elide/async/export/formatter/CsvExportFormatter.java b/elide-async/src/main/java/com/yahoo/elide/async/export/formatter/CsvExportFormatter.java
index b3c41cf04e..bf378ff884 100644
--- a/elide-async/src/main/java/com/yahoo/elide/async/export/formatter/CsvExportFormatter.java
+++ b/elide-async/src/main/java/com/yahoo/elide/async/export/formatter/CsvExportFormatter.java
@@ -9,7 +9,7 @@
import com.yahoo.elide.async.models.TableExport;
import com.yahoo.elide.core.request.EntityProjection;
-import com.fasterxml.jackson.databind.ObjectMapper;
+import tools.jackson.databind.ObjectMapper;
import java.io.OutputStream;
diff --git a/elide-async/src/main/java/com/yahoo/elide/async/export/formatter/CsvResourceWriter.java b/elide-async/src/main/java/com/yahoo/elide/async/export/formatter/CsvResourceWriter.java
index 46cc2713d9..d991e8204b 100644
--- a/elide-async/src/main/java/com/yahoo/elide/async/export/formatter/CsvResourceWriter.java
+++ b/elide-async/src/main/java/com/yahoo/elide/async/export/formatter/CsvResourceWriter.java
@@ -10,15 +10,17 @@
import com.yahoo.elide.core.request.EntityProjection;
import com.yahoo.elide.core.utils.coerce.CoerceUtil;
-import com.fasterxml.jackson.core.type.TypeReference;
-import com.fasterxml.jackson.databind.ObjectMapper;
-
import org.apache.commons.lang3.StringUtils;
+import tools.jackson.core.type.TypeReference;
+import tools.jackson.databind.MapperFeature;
+import tools.jackson.databind.ObjectMapper;
+
import java.io.IOException;
import java.io.OutputStream;
import java.util.Collection;
import java.util.Collections;
+import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.function.Function;
@@ -64,9 +66,12 @@ public CsvResourceWriter(OutputStream outputStream, ObjectMapper objectMapper, b
EntityProjection entityProjection) {
super(outputStream);
this.writeHeader = writeHeader;
- this.objectMapper = objectMapper;
+ // Keep the declaration order
+ this.objectMapper = objectMapper.rebuild().configure(MapperFeature.SORT_PROPERTIES_ALPHABETICALLY, false)
+ .build();
this.entityProjection = entityProjection;
- this.headers = entityProjection != null ? Attributes.getHeaders(objectMapper, entityProjection.getAttributes())
+ this.headers = entityProjection != null
+ ? Attributes.getHeaders(this.objectMapper, entityProjection.getAttributes())
: Collections.emptyList();
}
@@ -138,8 +143,8 @@ protected String generateHeader(EntityProjection projection) {
return "";
}
- Map attributes = projection.getAttributes().stream()
- .collect(Collectors.toMap(Attribute::getName, Function.identity()));
+ Map attributes = projection.getAttributes().stream().collect(Collectors.toMap(
+ Attribute::getName, Function.identity(), (existing, replacement) -> existing, LinkedHashMap::new));
String result = headers.stream().map(header -> {
String headerValue = getHeader(header, attributes);
return quote(headerValue);
diff --git a/elide-async/src/main/java/com/yahoo/elide/async/export/formatter/JsonExportFormatter.java b/elide-async/src/main/java/com/yahoo/elide/async/export/formatter/JsonExportFormatter.java
index b8ac02408d..6f8a03f55d 100644
--- a/elide-async/src/main/java/com/yahoo/elide/async/export/formatter/JsonExportFormatter.java
+++ b/elide-async/src/main/java/com/yahoo/elide/async/export/formatter/JsonExportFormatter.java
@@ -9,7 +9,7 @@
import com.yahoo.elide.async.models.TableExport;
import com.yahoo.elide.core.request.EntityProjection;
-import com.fasterxml.jackson.databind.ObjectMapper;
+import tools.jackson.databind.ObjectMapper;
import java.io.OutputStream;
diff --git a/elide-async/src/main/java/com/yahoo/elide/async/export/formatter/JsonResourceWriter.java b/elide-async/src/main/java/com/yahoo/elide/async/export/formatter/JsonResourceWriter.java
index 4df86fad62..7cb16f8d57 100644
--- a/elide-async/src/main/java/com/yahoo/elide/async/export/formatter/JsonResourceWriter.java
+++ b/elide-async/src/main/java/com/yahoo/elide/async/export/formatter/JsonResourceWriter.java
@@ -7,11 +7,11 @@
import com.yahoo.elide.core.PersistentResource;
-import com.fasterxml.jackson.core.JsonProcessingException;
-import com.fasterxml.jackson.databind.ObjectMapper;
-
import lombok.extern.slf4j.Slf4j;
+import tools.jackson.core.JacksonException;
+import tools.jackson.databind.ObjectMapper;
+
import java.io.IOException;
import java.io.OutputStream;
import java.nio.charset.StandardCharsets;
@@ -79,7 +79,7 @@ protected String convert(ObjectMapper mapper, PersistentResource> resource) {
protected String convert(ObjectMapper mapper, Map attributes) {
try {
return mapper.writeValueAsString(attributes);
- } catch (JsonProcessingException e) {
+ } catch (JacksonException e) {
log.error("Exception when converting to JSON {}", e.getMessage());
throw new IllegalStateException(e);
}
diff --git a/elide-async/src/main/java/com/yahoo/elide/async/export/formatter/XlsxExportFormatter.java b/elide-async/src/main/java/com/yahoo/elide/async/export/formatter/XlsxExportFormatter.java
index bc62330572..aa9cf3c1c8 100644
--- a/elide-async/src/main/java/com/yahoo/elide/async/export/formatter/XlsxExportFormatter.java
+++ b/elide-async/src/main/java/com/yahoo/elide/async/export/formatter/XlsxExportFormatter.java
@@ -9,7 +9,7 @@
import com.yahoo.elide.async.models.TableExport;
import com.yahoo.elide.core.request.EntityProjection;
-import com.fasterxml.jackson.databind.ObjectMapper;
+import tools.jackson.databind.ObjectMapper;
import java.io.OutputStream;
diff --git a/elide-async/src/main/java/com/yahoo/elide/async/export/formatter/XlsxResourceWriter.java b/elide-async/src/main/java/com/yahoo/elide/async/export/formatter/XlsxResourceWriter.java
index df644bd1a2..c12b747233 100644
--- a/elide-async/src/main/java/com/yahoo/elide/async/export/formatter/XlsxResourceWriter.java
+++ b/elide-async/src/main/java/com/yahoo/elide/async/export/formatter/XlsxResourceWriter.java
@@ -11,8 +11,6 @@
import com.yahoo.elide.core.utils.ObjectProperties;
import com.yahoo.elide.core.utils.coerce.CoerceUtil;
-import com.fasterxml.jackson.databind.ObjectMapper;
-
import org.apache.commons.lang3.StringUtils;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.CreationHelper;
@@ -25,6 +23,9 @@
import org.apache.poi.xssf.streaming.SXSSFSheet;
import org.apache.poi.xssf.streaming.SXSSFWorkbook;
+import tools.jackson.databind.MapperFeature;
+import tools.jackson.databind.ObjectMapper;
+
import java.io.IOException;
import java.io.OutputStream;
import java.time.Instant;
@@ -78,7 +79,9 @@ public XlsxResourceWriter(OutputStream outputStream, ObjectMapper objectMapper,
// Rows exceeding the row access window size are flushed to disk
this.workbook = new SXSSFWorkbook(rowAccessWindowSize);
this.sheet = this.workbook.createSheet();
- this.headers = entityProjection != null ? Attributes.getHeaders(objectMapper, entityProjection.getAttributes())
+ ObjectMapper notSorted = objectMapper.rebuild().configure(MapperFeature.SORT_PROPERTIES_ALPHABETICALLY, false)
+ .build();
+ this.headers = entityProjection != null ? Attributes.getHeaders(notSorted, entityProjection.getAttributes())
: Collections.emptyList();
this.attributes = entityProjection != null && entityProjection.getAttributes() != null ? entityProjection
.getAttributes().stream().collect(Collectors.toMap(Attribute::getName, Function.identity()))
diff --git a/elide-async/src/main/java/com/yahoo/elide/async/operation/GraphQLTableExportOperation.java b/elide-async/src/main/java/com/yahoo/elide/async/operation/GraphQLTableExportOperation.java
index 776a134a98..6cb67e951a 100644
--- a/elide-async/src/main/java/com/yahoo/elide/async/operation/GraphQLTableExportOperation.java
+++ b/elide-async/src/main/java/com/yahoo/elide/async/operation/GraphQLTableExportOperation.java
@@ -23,10 +23,9 @@
import com.yahoo.elide.graphql.QueryRunner;
import com.yahoo.elide.graphql.parser.GraphQLEntityProjectionMaker;
import com.yahoo.elide.graphql.parser.GraphQLProjectionInfo;
-import com.fasterxml.jackson.databind.JsonNode;
-import com.fasterxml.jackson.databind.ObjectMapper;
-
import lombok.extern.slf4j.Slf4j;
+import tools.jackson.databind.JsonNode;
+import tools.jackson.databind.ObjectMapper;
import java.io.IOException;
import java.util.Arrays;
diff --git a/elide-async/src/test/java/com/yahoo/elide/async/export/formatter/CsvExportFormatterTest.java b/elide-async/src/test/java/com/yahoo/elide/async/export/formatter/CsvExportFormatterTest.java
index 09a0de346e..0a13208caf 100644
--- a/elide-async/src/test/java/com/yahoo/elide/async/export/formatter/CsvExportFormatterTest.java
+++ b/elide-async/src/test/java/com/yahoo/elide/async/export/formatter/CsvExportFormatterTest.java
@@ -47,7 +47,7 @@
import java.util.function.Consumer;
public class CsvExportFormatterTest {
- public static final String FORMAT = "yyyy-MM-dd'T'HH:mm'Z'";
+ public static final String FORMAT = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'";
private static final FastDateFormat FORMATTER = FastDateFormat.getInstance(FORMAT, TimeZone.getTimeZone("GMT"));
private HashMapDataStore dataStore;
private Elide elide;
diff --git a/elide-async/src/test/java/com/yahoo/elide/async/export/formatter/CsvResourceWriterTest.java b/elide-async/src/test/java/com/yahoo/elide/async/export/formatter/CsvResourceWriterTest.java
index c24201d3d8..ac9d2681f5 100644
--- a/elide-async/src/test/java/com/yahoo/elide/async/export/formatter/CsvResourceWriterTest.java
+++ b/elide-async/src/test/java/com/yahoo/elide/async/export/formatter/CsvResourceWriterTest.java
@@ -15,10 +15,6 @@
import com.yahoo.elide.core.RequestScope;
import com.yahoo.elide.core.request.Attribute;
import com.yahoo.elide.core.request.EntityProjection;
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.fasterxml.jackson.databind.SerializationFeature;
-import com.fasterxml.jackson.databind.json.JsonMapper;
-import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
import org.junit.jupiter.api.Test;
@@ -28,6 +24,10 @@
import jakarta.persistence.Id;
import lombok.Data;
+import tools.jackson.databind.ObjectMapper;
+import tools.jackson.databind.cfg.DateTimeFeature;
+import tools.jackson.databind.json.JsonMapper;
+
import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
@@ -149,7 +149,7 @@ void set() throws IOException {
""";
assertEquals(header, results.get(0));
String row = """
- "name","a;b;c","VALUE1","1.0","1.0","1","1","2023-12-25T12:30:30.000000010Z","2023-12-25T12:30:30.000+00:00","2023-12-25T12:30:30.00000001","2023-12-25","2023-12-25T12:30:30.00000001Z","2023-12-25T12:30:30.00000001Z"\
+ "name","a;b;c","VALUE1","1.0","1.0","1","1","2023-12-25T12:30:30.000000010Z","2023-12-25T12:30:30.000Z","2023-12-25T12:30:30.00000001","2023-12-25","2023-12-25T12:30:30.00000001Z","2023-12-25T12:30:30.00000001Z"\
""";
assertEquals(row, results.get(1));
}
@@ -166,8 +166,7 @@ List read(byte[] data) {
byte[] process(EntityProjection entityProjection, ResourceWriterProcessor processor) {
ObjectMapper objectMapper = JsonMapper.builder()
- .addModule(new JavaTimeModule())
- .disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS)
+ .disable(DateTimeFeature.WRITE_DATES_AS_TIMESTAMPS)
.build();
try (ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
ResourceWriter writer = new CsvResourceWriter(outputStream, objectMapper, true, entityProjection)) {
diff --git a/elide-async/src/test/java/com/yahoo/elide/async/export/formatter/JsonExportFormatterTest.java b/elide-async/src/test/java/com/yahoo/elide/async/export/formatter/JsonExportFormatterTest.java
index 851263b880..f28a7fbf98 100644
--- a/elide-async/src/test/java/com/yahoo/elide/async/export/formatter/JsonExportFormatterTest.java
+++ b/elide-async/src/test/java/com/yahoo/elide/async/export/formatter/JsonExportFormatterTest.java
@@ -45,7 +45,7 @@
import java.util.function.Consumer;
public class JsonExportFormatterTest {
- public static final String FORMAT = "yyyy-MM-dd'T'HH:mm'Z'";
+ public static final String FORMAT = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'";
private static final FastDateFormat FORMATTER = FastDateFormat.getInstance(FORMAT, TimeZone.getTimeZone("GMT"));
private HashMapDataStore dataStore;
private Elide elide;
diff --git a/elide-async/src/test/java/com/yahoo/elide/async/export/formatter/XlsxResourceWriterTest.java b/elide-async/src/test/java/com/yahoo/elide/async/export/formatter/XlsxResourceWriterTest.java
index d3132bf818..312c78d203 100644
--- a/elide-async/src/test/java/com/yahoo/elide/async/export/formatter/XlsxResourceWriterTest.java
+++ b/elide-async/src/test/java/com/yahoo/elide/async/export/formatter/XlsxResourceWriterTest.java
@@ -16,8 +16,6 @@
import com.yahoo.elide.core.request.Attribute;
import com.yahoo.elide.core.request.EntityProjection;
-import com.fasterxml.jackson.databind.ObjectMapper;
-
import org.junit.jupiter.api.Test;
import jakarta.persistence.AttributeConverter;
@@ -26,6 +24,8 @@
import jakarta.persistence.Id;
import lombok.Data;
+import tools.jackson.databind.ObjectMapper;
+
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.UncheckedIOException;
diff --git a/elide-core/pom.xml b/elide-core/pom.xml
index 7311cf72da..84ea4dcf94 100644
--- a/elide-core/pom.xml
+++ b/elide-core/pom.xml
@@ -85,7 +85,7 @@
jakarta.inject-api
- com.fasterxml.jackson.core
+ tools.jackson.core
jackson-databind
provided
diff --git a/elide-core/src/main/java/com/yahoo/elide/Elide.java b/elide-core/src/main/java/com/yahoo/elide/Elide.java
index c49f3db5a0..3359059c14 100644
--- a/elide-core/src/main/java/com/yahoo/elide/Elide.java
+++ b/elide-core/src/main/java/com/yahoo/elide/Elide.java
@@ -15,13 +15,13 @@
import com.yahoo.elide.core.utils.coerce.CoerceUtil;
import com.yahoo.elide.core.utils.coerce.converters.ElideTypeConverter;
import com.yahoo.elide.core.utils.coerce.converters.Serde;
-import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.Getter;
import lombok.extern.slf4j.Slf4j;
-import java.util.Set;
+import tools.jackson.databind.ObjectMapper;
+import java.util.Set;
/**
* Elide.
@@ -31,7 +31,6 @@ public class Elide {
@Getter private final ElideSettings elideSettings;
@Getter private final AuditLogger auditLogger;
@Getter private final DataStore dataStore;
- @Getter private final ObjectMapper objectMapper;
@Getter private final TransactionRegistry transactionRegistry;
@Getter private final ClassScanner scanner;
private boolean initialized = false;
@@ -78,7 +77,6 @@ public Elide(
this.scanner = scanner;
this.auditLogger = elideSettings.getAuditLogger();
this.dataStore = new InMemoryDataStore(elideSettings.getDataStore());
- this.objectMapper = elideSettings.getObjectMapper();
this.transactionRegistry = transactionRegistry;
if (doScans) {
@@ -136,7 +134,9 @@ protected void registerCustomSerde(Class type, Serde serde, Stri
}
protected void registerCustomSerdeInObjectMapper(Class type, Serde serde, String name) {
- SerdeRegistrations.register(objectMapper, type, serde, name);
+ elideSettings.getElideMapper().customizeObjectMapper(builder -> {
+ SerdeRegistrations.register(builder, type, serde, name);
+ });
}
protected Set> registerCustomSerdeScan() {
@@ -146,4 +146,8 @@ protected Set> registerCustomSerdeScan() {
public T getSettings(Class clazz) {
return this.elideSettings.getSettings(clazz);
}
+
+ public ObjectMapper getObjectMapper() {
+ return this.elideSettings.getElideMapper().getObjectMapper();
+ }
}
diff --git a/elide-core/src/main/java/com/yahoo/elide/ElideMapper.java b/elide-core/src/main/java/com/yahoo/elide/ElideMapper.java
index f761d20512..7f84dc4b90 100644
--- a/elide-core/src/main/java/com/yahoo/elide/ElideMapper.java
+++ b/elide-core/src/main/java/com/yahoo/elide/ElideMapper.java
@@ -5,16 +5,29 @@
*/
package com.yahoo.elide;
-import com.fasterxml.jackson.databind.ObjectMapper;
+import tools.jackson.databind.ObjectMapper;
+import tools.jackson.databind.cfg.MapperBuilder;
-import lombok.AllArgsConstructor;
-import lombok.Getter;
+import java.util.function.Consumer;
/**
- * Used to store the singleton shared {@link ObjectMapper} instance.
+ * Used to store the shared {@link ObjectMapper} instance.
*/
-@Getter
-@AllArgsConstructor
public class ElideMapper {
- private final ObjectMapper objectMapper;
+ private ObjectMapper objectMapper;
+
+ public ElideMapper(ObjectMapper objectMapper) {
+ this.objectMapper = objectMapper;
+ }
+
+ public ObjectMapper getObjectMapper() {
+ return objectMapper;
+ }
+
+ public ElideMapper customizeObjectMapper(Consumer customizer) {
+ MapperBuilder builder = objectMapper.rebuild();
+ customizer.accept(builder);
+ this.objectMapper = builder.build();
+ return this;
+ }
}
diff --git a/elide-core/src/main/java/com/yahoo/elide/ElideSettings.java b/elide-core/src/main/java/com/yahoo/elide/ElideSettings.java
index 537d8649ea..5451dc8abf 100644
--- a/elide-core/src/main/java/com/yahoo/elide/ElideSettings.java
+++ b/elide-core/src/main/java/com/yahoo/elide/ElideSettings.java
@@ -18,10 +18,12 @@
import com.yahoo.elide.core.security.executors.ActivePermissionExecutor;
import com.yahoo.elide.utils.HeaderProcessor;
import com.yahoo.elide.utils.Headers;
-import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.Getter;
+import tools.jackson.databind.ObjectMapper;
+import tools.jackson.databind.json.JsonMapper;
+
import java.util.Arrays;
import java.util.LinkedHashMap;
import java.util.Map;
@@ -38,7 +40,7 @@ public class ElideSettings {
private final AuditLogger auditLogger;
private final DataStore dataStore;
private final EntityDictionary entityDictionary;
- private final ObjectMapper objectMapper;
+ private final ElideMapper elideMapper;
private final Function permissionExecutor;
private final HeaderProcessor headerProcessor;
private final int maxPageSize;
@@ -49,14 +51,14 @@ public class ElideSettings {
private final Map, Settings> settings;
public ElideSettings(AuditLogger auditLogger, DataStore dataStore, EntityDictionary entityDictionary,
- ObjectMapper objectMapper, Function permissionExecutor,
+ ElideMapper elideMapper, Function permissionExecutor,
HeaderProcessor headerProcessor, int maxPageSize, int defaultPageSize, Serdes serdes, String baseUrl,
boolean verboseErrors, Map, Settings> settings) {
super();
this.auditLogger = auditLogger;
this.dataStore = dataStore;
this.entityDictionary = entityDictionary;
- this.objectMapper = objectMapper;
+ this.elideMapper = elideMapper;
this.permissionExecutor = permissionExecutor;
this.headerProcessor = headerProcessor;
this.maxPageSize = maxPageSize;
@@ -77,7 +79,7 @@ public ElideSettingsBuilder mutate() {
.auditLogger(this.auditLogger)
.dataStore(this.dataStore)
.entityDictionary(this.entityDictionary)
- .objectMapper(this.objectMapper)
+ .elideMapper(this.elideMapper)
.permissionExecutor(this.permissionExecutor)
.headerProcessor(this.headerProcessor)
.maxPageSize(this.maxPageSize)
@@ -130,7 +132,7 @@ public ElideSettings build() {
Settings result = value.build();
settings.put(result.getClass(), result);
});
- return new ElideSettings(this.auditLogger, this.dataStore, this.entityDictionary, this.objectMapper,
+ return new ElideSettings(this.auditLogger, this.dataStore, this.entityDictionary, this.elideMapper,
this.permissionExecutor, this.headerProcessor, this.maxPageSize,
this.defaultPageSize, this.serdes.build(), this.baseUrl, this.verboseErrors, settings);
}
@@ -141,7 +143,7 @@ public abstract static class ElideSettingsBuilderSupport {
protected String baseUrl = "";
protected AuditLogger auditLogger = new Slf4jLogger();
protected HeaderProcessor headerProcessor = Headers::removeAuthorizationHeaders;
- protected ObjectMapper objectMapper = new ObjectMapper();
+ protected ElideMapper elideMapper = new ElideMapper(JsonMapper.shared());
protected int maxPageSize = Pagination.MAX_PAGE_SIZE;
protected int defaultPageSize = Pagination.DEFAULT_PAGE_SIZE;
protected Function permissionExecutor = ActivePermissionExecutor::new;
@@ -241,11 +243,11 @@ public S headerProcessor(HeaderProcessor headerProcessor) {
/**
* Sets the Jackson {@link ObjectMapper} for serialization and deserialization.
*
- * @param objectMapper the object mapper
+ * @param elideMapper the object mapper
* @return the builder
*/
- public S objectMapper(ObjectMapper objectMapper) {
- this.objectMapper = objectMapper;
+ public S elideMapper(ElideMapper elideMapper) {
+ this.elideMapper = elideMapper;
return self();
}
diff --git a/elide-core/src/main/java/com/yahoo/elide/core/SerdeRegistrations.java b/elide-core/src/main/java/com/yahoo/elide/core/SerdeRegistrations.java
index 54b65fa76d..de328ee16c 100644
--- a/elide-core/src/main/java/com/yahoo/elide/core/SerdeRegistrations.java
+++ b/elide-core/src/main/java/com/yahoo/elide/core/SerdeRegistrations.java
@@ -7,14 +7,12 @@
import com.yahoo.elide.core.utils.coerce.converters.Serde;
-import com.fasterxml.jackson.core.JsonGenerator;
-import com.fasterxml.jackson.core.JsonProcessingException;
-import com.fasterxml.jackson.databind.JsonSerializer;
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.fasterxml.jackson.databind.SerializerProvider;
-import com.fasterxml.jackson.databind.module.SimpleModule;
-
-import java.io.IOException;
+import tools.jackson.core.JsonGenerator;
+import tools.jackson.databind.ObjectMapper;
+import tools.jackson.databind.SerializationContext;
+import tools.jackson.databind.ValueSerializer;
+import tools.jackson.databind.cfg.MapperBuilder;
+import tools.jackson.databind.module.SimpleModule;
/**
* Methods for operating on a {@link Serde}.
@@ -25,12 +23,12 @@ public class SerdeRegistrations {
*
* @param The serialized type
* @param The deserialized type
- * @param objectMapper the object mapper to register with
+ * @param builder the object mapper to register with
* @param type the deserialized type
* @param serde the serde
*/
- public static void register(ObjectMapper objectMapper, Class type, Serde serde) {
- register(objectMapper, type, serde, type.getSimpleName());
+ public static void register(MapperBuilder builder, Class type, Serde serde) {
+ register(builder, type, serde, type.getSimpleName());
}
/**
@@ -38,18 +36,17 @@ public static void register(ObjectMapper objectMapper, Class type, Ser
*
* @param The serialized type
* @param The deserialized type
- * @param objectMapper the object mapper to register with
+ * @param builder the object mapper to register with
* @param type the deserialized type
* @param serde the serde
* @param name the name to register with
*/
- public static void register(ObjectMapper objectMapper, Class type, Serde serde,
+ public static void register(MapperBuilder builder, Class type, Serde serde,
String name) {
- objectMapper.registerModule(new SimpleModule(name).addSerializer(type, new JsonSerializer() {
+ builder.addModule(new SimpleModule(name).addSerializer(type, new ValueSerializer() {
@Override
- public void serialize(T value, JsonGenerator jsonGenerator, SerializerProvider serializerProvider)
- throws IOException, JsonProcessingException {
- jsonGenerator.writeObject(serde.serialize(value));
+ public void serialize(T value, JsonGenerator jsonGenerator, SerializationContext serializationContext) {
+ jsonGenerator.writePOJO(serde.serialize(value));
}
}));
}
diff --git a/elide-core/src/main/java/com/yahoo/elide/core/exceptions/JsonApiAtomicOperationsException.java b/elide-core/src/main/java/com/yahoo/elide/core/exceptions/JsonApiAtomicOperationsException.java
index 7de085f838..eafa9db58f 100644
--- a/elide-core/src/main/java/com/yahoo/elide/core/exceptions/JsonApiAtomicOperationsException.java
+++ b/elide-core/src/main/java/com/yahoo/elide/core/exceptions/JsonApiAtomicOperationsException.java
@@ -7,7 +7,7 @@
import com.yahoo.elide.ElideErrorResponse;
-import com.fasterxml.jackson.databind.JsonNode;
+import tools.jackson.databind.JsonNode;
/**
* Exception describing error caused from JSON API Atomic Extension request.
diff --git a/elide-core/src/main/java/com/yahoo/elide/core/exceptions/JsonPatchExtensionException.java b/elide-core/src/main/java/com/yahoo/elide/core/exceptions/JsonPatchExtensionException.java
index 3f45bbcdd1..1eb44b6219 100644
--- a/elide-core/src/main/java/com/yahoo/elide/core/exceptions/JsonPatchExtensionException.java
+++ b/elide-core/src/main/java/com/yahoo/elide/core/exceptions/JsonPatchExtensionException.java
@@ -7,7 +7,7 @@
import com.yahoo.elide.ElideErrorResponse;
-import com.fasterxml.jackson.databind.JsonNode;
+import tools.jackson.databind.JsonNode;
/**
* Exception describing error caused from Json Patch Extension request.
diff --git a/elide-core/src/main/java/com/yahoo/elide/core/utils/coerce/CoerceUtil.java b/elide-core/src/main/java/com/yahoo/elide/core/utils/coerce/CoerceUtil.java
index 673abe155f..7d314d51ee 100644
--- a/elide-core/src/main/java/com/yahoo/elide/core/utils/coerce/CoerceUtil.java
+++ b/elide-core/src/main/java/com/yahoo/elide/core/utils/coerce/CoerceUtil.java
@@ -15,6 +15,7 @@
import com.yahoo.elide.core.utils.coerce.converters.Serde;
import com.yahoo.elide.core.utils.coerce.converters.ToEnumConverter;
import com.yahoo.elide.core.utils.coerce.converters.ToUUIDConverter;
+
import com.google.common.base.Preconditions;
import com.google.common.collect.MapMaker;
import org.apache.commons.beanutils.BeanUtilsBean;
@@ -22,6 +23,8 @@
import org.apache.commons.beanutils.ConvertUtils;
import org.apache.commons.beanutils.Converter;
+import tools.jackson.core.JacksonException;
+
import java.lang.reflect.Array;
import java.util.Collections;
import java.util.LinkedHashMap;
@@ -71,7 +74,7 @@ public static T coerce(Object value, Class cls) {
try {
return (T) ConvertUtils.convert(value, cls);
- } catch (ConversionException | InvalidAttributeException | IllegalArgumentException e) {
+ } catch (ConversionException | InvalidAttributeException | IllegalArgumentException | JacksonException e) {
throw new InvalidValueException(value, e.getMessage());
}
}
diff --git a/elide-core/src/main/java/com/yahoo/elide/core/utils/coerce/converters/FromMapConverter.java b/elide-core/src/main/java/com/yahoo/elide/core/utils/coerce/converters/FromMapConverter.java
index 095c996cf4..825d1d81f5 100644
--- a/elide-core/src/main/java/com/yahoo/elide/core/utils/coerce/converters/FromMapConverter.java
+++ b/elide-core/src/main/java/com/yahoo/elide/core/utils/coerce/converters/FromMapConverter.java
@@ -5,8 +5,8 @@
*/
package com.yahoo.elide.core.utils.coerce.converters;
-import com.fasterxml.jackson.databind.ObjectMapper;
import org.apache.commons.beanutils.Converter;
+import tools.jackson.databind.ObjectMapper;
/**
* Uses Jackson to Convert from Map to target object.
diff --git a/elide-core/src/main/java/com/yahoo/elide/jsonapi/DefaultJsonApiExceptionHandler.java b/elide-core/src/main/java/com/yahoo/elide/jsonapi/DefaultJsonApiExceptionHandler.java
index f853a92eb1..8968b67d00 100644
--- a/elide-core/src/main/java/com/yahoo/elide/jsonapi/DefaultJsonApiExceptionHandler.java
+++ b/elide-core/src/main/java/com/yahoo/elide/jsonapi/DefaultJsonApiExceptionHandler.java
@@ -22,14 +22,13 @@
import com.yahoo.elide.core.exceptions.TransactionException;
import com.yahoo.elide.jsonapi.models.JsonApiErrors;
-import com.fasterxml.jackson.core.JacksonException;
-
import org.antlr.v4.runtime.misc.ParseCancellationException;
import jakarta.validation.ConstraintViolation;
import jakarta.validation.ConstraintViolationException;
import lombok.extern.slf4j.Slf4j;
+import tools.jackson.core.JacksonException;
import java.io.IOException;
import java.io.UncheckedIOException;
@@ -55,6 +54,15 @@ public ElideResponse> handleException(Throwable exception, JsonApiErrorContext
@Override
protected ElideResponse> handleRuntimeException(RuntimeException exception, JsonApiErrorContext errorContext) {
+ if (exception instanceof JacksonException jacksonException) {
+ String message = (jacksonException.getLocation() != null
+ && jacksonException.getLocation().contentReference().getRawContent() != null)
+ ? exception.getMessage() //This will leak Java class info if the location isn't known.
+ : jacksonException.getOriginalMessage();
+
+ return buildResponse(new BadRequestException(message), errorContext);
+ }
+
if (exception instanceof ForbiddenAccessException e) {
return buildResponse(e, errorContext);
}
@@ -103,15 +111,6 @@ protected ElideResponse> handleRuntimeException(RuntimeException exception, Js
@Override
protected ElideResponse> handleNonRuntimeException(Exception exception, JsonApiErrorContext errorContext) {
- if (exception instanceof JacksonException jacksonException) {
- String message = (jacksonException.getLocation() != null
- && jacksonException.getLocation().contentReference().getRawContent() != null)
- ? exception.getMessage() //This will leak Java class info if the location isn't known.
- : jacksonException.getOriginalMessage();
-
- return buildResponse(new BadRequestException(message), errorContext);
- }
-
if (exception instanceof IOException) {
return buildResponse(new TransactionException(exception), errorContext);
}
diff --git a/elide-core/src/main/java/com/yahoo/elide/jsonapi/JsonApi.java b/elide-core/src/main/java/com/yahoo/elide/jsonapi/JsonApi.java
index db72ed9696..91b76d05b5 100644
--- a/elide-core/src/main/java/com/yahoo/elide/jsonapi/JsonApi.java
+++ b/elide-core/src/main/java/com/yahoo/elide/jsonapi/JsonApi.java
@@ -29,15 +29,15 @@
import com.yahoo.elide.jsonapi.parser.PatchVisitor;
import com.yahoo.elide.jsonapi.parser.PostVisitor;
-import com.fasterxml.jackson.core.JsonProcessingException;
-import com.fasterxml.jackson.databind.JsonNode;
-
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.tuple.Pair;
import lombok.Getter;
import lombok.extern.slf4j.Slf4j;
+import tools.jackson.core.JacksonException;
+import tools.jackson.databind.JsonNode;
+
import java.io.IOException;
import java.util.Collections;
import java.util.List;
@@ -314,7 +314,7 @@ protected ElideResponse toResponse(int status, Object body) {
} else {
try {
result = body != null ? this.mapper.writeJsonApiDocument(body) : null;
- } catch (JsonProcessingException e) {
+ } catch (JacksonException e) {
return ElideResponse.status(HttpStatus.SC_INTERNAL_SERVER_ERROR).body(e.toString());
}
}
diff --git a/elide-core/src/main/java/com/yahoo/elide/jsonapi/JsonApiMapper.java b/elide-core/src/main/java/com/yahoo/elide/jsonapi/JsonApiMapper.java
index 9dffb86be0..a61f5bfa3b 100644
--- a/elide-core/src/main/java/com/yahoo/elide/jsonapi/JsonApiMapper.java
+++ b/elide-core/src/main/java/com/yahoo/elide/jsonapi/JsonApiMapper.java
@@ -5,21 +5,21 @@
*/
package com.yahoo.elide.jsonapi;
+import com.yahoo.elide.ElideMapper;
import com.yahoo.elide.jsonapi.extensions.JsonApiAtomicOperationsMapper;
import com.yahoo.elide.jsonapi.extensions.JsonApiJsonPatchMapper;
import com.yahoo.elide.jsonapi.models.JsonApiDocument;
import com.yahoo.elide.jsonapi.serialization.JsonApiModule;
-import com.fasterxml.jackson.core.JsonProcessingException;
-import com.fasterxml.jackson.databind.JsonNode;
-import com.fasterxml.jackson.databind.ObjectMapper;
-import java.io.IOException;
+import tools.jackson.databind.JsonNode;
+import tools.jackson.databind.ObjectMapper;
+import tools.jackson.databind.json.JsonMapper;
/**
* Serializer/Deserializer for JSON API.
*/
public class JsonApiMapper {
- protected final ObjectMapper mapper;
+ protected final ElideMapper elideMapper;
protected final JsonApiJsonPatchMapper jsonPatchMapper;
protected final JsonApiAtomicOperationsMapper atomicOperationsMapper;
@@ -27,31 +27,29 @@ public class JsonApiMapper {
* Instantiates a new Json Api Mapper.
*/
public JsonApiMapper() {
- this(new ObjectMapper());
+ this(new ElideMapper(JsonMapper.shared()));
}
/**
* Instantiates a new Json Api Mapper.
- *
- * @param mapper Custom object mapper to use internally for serializing/deserializing
*/
- public JsonApiMapper(ObjectMapper mapper) {
- this(mapper, new JsonApiJsonPatchMapper(mapper), new JsonApiAtomicOperationsMapper(mapper));
+ public JsonApiMapper(ElideMapper elideMapper) {
+ this(elideMapper, new JsonApiJsonPatchMapper(elideMapper), new JsonApiAtomicOperationsMapper(elideMapper));
}
/**
* Instantiates a new Json Api Mapper.
*
- * @param mapper Custom object mapper to use internally for serializing/deserializing
+ * @param elideMapper Custom object mapper to use internally for serializing/deserializing
* @param jsonPatchMapper the mapper for the JSON Patch extension
* @param atomicOperationsMapper the mapper for the Atomic Operations extension
*/
- public JsonApiMapper(ObjectMapper mapper, JsonApiJsonPatchMapper jsonPatchMapper,
+ public JsonApiMapper(ElideMapper elideMapper, JsonApiJsonPatchMapper jsonPatchMapper,
JsonApiAtomicOperationsMapper atomicOperationsMapper) {
- this.mapper = mapper;
- this.mapper.registerModule(new JsonApiModule());
+ this.elideMapper = elideMapper;
this.jsonPatchMapper = jsonPatchMapper;
this.atomicOperationsMapper = atomicOperationsMapper;
+ this.elideMapper.customizeObjectMapper(builder -> builder.addModule(new JsonApiModule()));
}
/**
@@ -61,7 +59,7 @@ public JsonApiMapper(ObjectMapper mapper, JsonApiJsonPatchMapper jsonPatchMapper
* @return the json node
*/
public JsonNode toJsonObject(JsonApiDocument jsonApiDocument) {
- return mapper.convertValue(jsonApiDocument, JsonNode.class);
+ return elideMapper.getObjectMapper().convertValue(jsonApiDocument, JsonNode.class);
}
/**
@@ -70,10 +68,9 @@ public JsonNode toJsonObject(JsonApiDocument jsonApiDocument) {
* @param doc the document
* @param The type of document object so serialize
* @return the string
- * @throws JsonProcessingException the json processing exception
*/
- public String writeJsonApiDocument(T doc) throws JsonProcessingException {
- return mapper.writeValueAsString(doc);
+ public String writeJsonApiDocument(T doc) {
+ return elideMapper.getObjectMapper().writeValueAsString(doc);
}
/**
@@ -81,10 +78,9 @@ public String writeJsonApiDocument(T doc) throws JsonProcessingException {
*
* @param doc the doc
* @return the json api document
- * @throws IOException the iO exception
*/
- public JsonApiDocument readJsonApiDocument(String doc) throws IOException {
- JsonNode node = mapper.readTree(doc);
+ public JsonApiDocument readJsonApiDocument(String doc) {
+ JsonNode node = elideMapper.getObjectMapper().readTree(doc);
return readJsonApiDocument(node);
}
@@ -93,10 +89,9 @@ public JsonApiDocument readJsonApiDocument(String doc) throws IOException {
*
* @param node the node
* @return the json api document
- * @throws IOException the iO exception
*/
- public JsonApiDocument readJsonApiDocument(JsonNode node) throws IOException {
- return mapper.treeToValue(node, JsonApiDocument.class);
+ public JsonApiDocument readJsonApiDocument(JsonNode node) {
+ return elideMapper.getObjectMapper().treeToValue(node, JsonApiDocument.class);
}
/**
@@ -105,7 +100,7 @@ public JsonApiDocument readJsonApiDocument(JsonNode node) throws IOException {
* @return the Jackson ObjectMapper
*/
public ObjectMapper getObjectMapper() {
- return mapper;
+ return elideMapper.getObjectMapper();
}
/**
diff --git a/elide-core/src/main/java/com/yahoo/elide/jsonapi/extensions/JsonApiAtomicOperations.java b/elide-core/src/main/java/com/yahoo/elide/jsonapi/extensions/JsonApiAtomicOperations.java
index 115512d4b9..636c8bca00 100644
--- a/elide-core/src/main/java/com/yahoo/elide/jsonapi/extensions/JsonApiAtomicOperations.java
+++ b/elide-core/src/main/java/com/yahoo/elide/jsonapi/extensions/JsonApiAtomicOperations.java
@@ -25,18 +25,17 @@
import com.yahoo.elide.jsonapi.parser.JsonApiParser;
import com.yahoo.elide.jsonapi.parser.PatchVisitor;
import com.yahoo.elide.jsonapi.parser.PostVisitor;
-import com.fasterxml.jackson.core.JsonProcessingException;
-import com.fasterxml.jackson.databind.JsonNode;
-import com.fasterxml.jackson.databind.exc.InvalidFormatException;
-import com.fasterxml.jackson.databind.node.ArrayNode;
-import com.fasterxml.jackson.databind.node.JsonNodeFactory;
-import com.fasterxml.jackson.databind.node.ObjectNode;
import org.apache.commons.collections4.IterableUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.tuple.Pair;
import org.owasp.encoder.Encode;
+import tools.jackson.core.JacksonException;
+import tools.jackson.databind.JsonNode;
+import tools.jackson.databind.exc.InvalidFormatException;
+import tools.jackson.databind.node.ArrayNode;
+import tools.jackson.databind.node.JsonNodeFactory;
+import tools.jackson.databind.node.ObjectNode;
-import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
@@ -94,11 +93,11 @@ public void postProcess(JsonApiAtomicOperationsRequestScope requestScope) {
static {
ERR_NODE_OPERATION_NOT_RUN = JsonNodeFactory.instance.objectNode();
ERR_NODE_OPERATION_NOT_RUN.set("detail",
- JsonNodeFactory.instance.textNode("Operation not executed. Terminated by earlier failure."));
+ JsonNodeFactory.instance.stringNode("Operation not executed. Terminated by earlier failure."));
ERR_NODE_ERR_IN_SUBSEQUENT_OPERATION = JsonNodeFactory.instance.objectNode();
ERR_NODE_ERR_IN_SUBSEQUENT_OPERATION.set("detail",
- JsonNodeFactory.instance.textNode("Subsequent operation failed."));
+ JsonNodeFactory.instance.stringNode("Subsequent operation failed."));
}
/**
@@ -127,7 +126,7 @@ public static Supplier> processAtomicOperations(DataStor
} else {
throw new InvalidEntityBodyException(operationsDoc);
}
- } catch (IOException e) {
+ } catch (JacksonException e) {
throw new InvalidEntityBodyException(operationsDoc);
}
JsonApiAtomicOperations processor = new JsonApiAtomicOperations(dataStore, actions, uri, requestScope);
@@ -318,7 +317,7 @@ private Ref inferRef(JsonApiMapper mapper, Operation operation) {
}
}
}
- } catch (JsonProcessingException e) {
+ } catch (JacksonException e) {
// Do nothing as it will fall back on InvalidEntityBodyException
}
}
@@ -385,7 +384,7 @@ private Supplier> handleAddOp(
} catch (HttpStatusException e) {
action.cause = e;
throw e;
- } catch (IOException e) {
+ } catch (JacksonException e) {
throw new InvalidEntityBodyException("Could not parse Atomic Operations extension value: " + dataValue);
}
}
@@ -411,7 +410,7 @@ private Supplier> handleUpdateOp(
// Defer relationship updating until the end
PatchVisitor visitor = new PatchVisitor(new JsonApiAtomicOperationsRequestScope(path, value, requestScope));
return visitor.visit(JsonApiParser.parse(path));
- } catch (IOException e) {
+ } catch (JacksonException e) {
throw new InvalidEntityBodyException("Could not parse Atomic Operations extension value: " + dataValue);
}
}
@@ -440,7 +439,7 @@ private Supplier> handleRemoveOp(String path,
DeleteVisitor visitor = new DeleteVisitor(
new JsonApiAtomicOperationsRequestScope(path, value, requestScope));
return visitor.visit(JsonApiParser.parse(fullPath));
- } catch (IOException e) {
+ } catch (JacksonException e) {
throw new InvalidEntityBodyException("Could not parse Atomic Operations extension value: " + dataValue);
}
}
@@ -537,9 +536,9 @@ private static void clearAllExceptRelationships(Resource resource) {
*/
private static JsonNode toErrorNode(String detail, Integer status) {
ObjectNode formattedError = JsonNodeFactory.instance.objectNode();
- formattedError.set("detail", JsonNodeFactory.instance.textNode(Encode.forHtml(detail)));
+ formattedError.set("detail", JsonNodeFactory.instance.stringNode(Encode.forHtml(detail)));
if (status != null) {
- formattedError.set("status", JsonNodeFactory.instance.textNode(status.toString()));
+ formattedError.set("status", JsonNodeFactory.instance.stringNode(status.toString()));
}
return formattedError;
}
diff --git a/elide-core/src/main/java/com/yahoo/elide/jsonapi/extensions/JsonApiAtomicOperationsMapper.java b/elide-core/src/main/java/com/yahoo/elide/jsonapi/extensions/JsonApiAtomicOperationsMapper.java
index f993701dec..1a4b114ea8 100644
--- a/elide-core/src/main/java/com/yahoo/elide/jsonapi/extensions/JsonApiAtomicOperationsMapper.java
+++ b/elide-core/src/main/java/com/yahoo/elide/jsonapi/extensions/JsonApiAtomicOperationsMapper.java
@@ -5,14 +5,13 @@
*/
package com.yahoo.elide.jsonapi.extensions;
+import com.yahoo.elide.ElideMapper;
import com.yahoo.elide.jsonapi.models.Data;
import com.yahoo.elide.jsonapi.models.JsonApiDocument;
import com.yahoo.elide.jsonapi.models.Operations;
import com.yahoo.elide.jsonapi.models.Resource;
-import com.fasterxml.jackson.core.JsonProcessingException;
-import com.fasterxml.jackson.databind.JsonNode;
-import com.fasterxml.jackson.databind.ObjectMapper;
+import tools.jackson.databind.JsonNode;
import java.util.ArrayList;
import java.util.List;
@@ -21,21 +20,21 @@
* The mapper for the JSON API Atomic Operations extension.
*/
public class JsonApiAtomicOperationsMapper {
- protected final ObjectMapper objectMapper;
+ protected final ElideMapper elideMapper;
- public JsonApiAtomicOperationsMapper(ObjectMapper objectMapper) {
- this.objectMapper = objectMapper;
+ public JsonApiAtomicOperationsMapper(ElideMapper elideMapper) {
+ this.elideMapper = elideMapper;
}
- public Operations readDoc(String operationsDoc) throws JsonProcessingException {
- return this.objectMapper.readValue(operationsDoc, Operations.class);
+ public Operations readDoc(String operationsDoc) {
+ return this.elideMapper.getObjectMapper().readValue(operationsDoc, Operations.class);
}
- public Resource readResource(JsonNode resource) throws JsonProcessingException {
- return objectMapper.treeToValue(resource, Resource.class);
+ public Resource readResource(JsonNode resource) {
+ return elideMapper.getObjectMapper().treeToValue(resource, Resource.class);
}
- public JsonApiDocument readData(JsonNode data) throws JsonProcessingException {
+ public JsonApiDocument readData(JsonNode data) {
JsonApiDocument value = new JsonApiDocument();
if (data != null) {
if (data.isArray()) {
diff --git a/elide-core/src/main/java/com/yahoo/elide/jsonapi/extensions/JsonApiJsonPatch.java b/elide-core/src/main/java/com/yahoo/elide/jsonapi/extensions/JsonApiJsonPatch.java
index 31c75a34d1..133822f824 100644
--- a/elide-core/src/main/java/com/yahoo/elide/jsonapi/extensions/JsonApiJsonPatch.java
+++ b/elide-core/src/main/java/com/yahoo/elide/jsonapi/extensions/JsonApiJsonPatch.java
@@ -20,17 +20,19 @@
import com.yahoo.elide.jsonapi.parser.JsonApiParser;
import com.yahoo.elide.jsonapi.parser.PatchVisitor;
import com.yahoo.elide.jsonapi.parser.PostVisitor;
-import com.fasterxml.jackson.databind.JsonNode;
-import com.fasterxml.jackson.databind.node.ArrayNode;
-import com.fasterxml.jackson.databind.node.JsonNodeFactory;
-import com.fasterxml.jackson.databind.node.ObjectNode;
+
import org.apache.commons.collections4.IterableUtils;
import org.apache.commons.lang3.ArrayUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.tuple.Pair;
import org.owasp.encoder.Encode;
-import java.io.IOException;
+import tools.jackson.core.JacksonException;
+import tools.jackson.databind.JsonNode;
+import tools.jackson.databind.node.ArrayNode;
+import tools.jackson.databind.node.JsonNodeFactory;
+import tools.jackson.databind.node.ObjectNode;
+
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
@@ -87,11 +89,11 @@ public void postProcess(JsonApiJsonPatchRequestScope requestScope) {
static {
ERR_NODE_OPERATION_NOT_RUN = JsonNodeFactory.instance.objectNode();
ERR_NODE_OPERATION_NOT_RUN.set("detail",
- JsonNodeFactory.instance.textNode("Operation not executed. Terminated by earlier failure."));
+ JsonNodeFactory.instance.stringNode("Operation not executed. Terminated by earlier failure."));
ERR_NODE_ERR_IN_SUBSEQUENT_OPERATION = JsonNodeFactory.instance.objectNode();
ERR_NODE_ERR_IN_SUBSEQUENT_OPERATION.set("detail",
- JsonNodeFactory.instance.textNode("Subsequent operation failed."));
+ JsonNodeFactory.instance.stringNode("Subsequent operation failed."));
}
/**
@@ -110,7 +112,7 @@ public static Supplier> processJsonPatch(DataStore dataS
List actions;
try {
actions = requestScope.getMapper().forJsonPatch().readDoc(patchDoc);
- } catch (IOException e) {
+ } catch (JacksonException e) {
throw new InvalidEntityBodyException(patchDoc);
}
JsonApiJsonPatch processor = new JsonApiJsonPatch(dataStore, actions, uri, requestScope);
@@ -236,7 +238,7 @@ private Supplier> handleAddOp(
} catch (HttpStatusException e) {
action.cause = e;
throw e;
- } catch (IOException e) {
+ } catch (JacksonException e) {
throw new InvalidEntityBodyException("Could not parse patch extension value: " + patchValue);
}
}
@@ -262,7 +264,7 @@ private Supplier> handleReplaceOp(
// Defer relationship updating until the end
PatchVisitor visitor = new PatchVisitor(new JsonApiJsonPatchRequestScope(path, value, requestScope));
return visitor.visit(JsonApiParser.parse(path));
- } catch (IOException e) {
+ } catch (JacksonException e) {
throw new InvalidEntityBodyException("Could not parse patch extension value: " + patchVal);
}
}
@@ -291,7 +293,7 @@ private Supplier> handleRemoveOp(String path,
DeleteVisitor visitor = new DeleteVisitor(
new JsonApiJsonPatchRequestScope(path, value, requestScope));
return visitor.visit(JsonApiParser.parse(fullPath));
- } catch (IOException e) {
+ } catch (JacksonException e) {
throw new InvalidEntityBodyException("Could not parse patch extension value: " + patchValue);
}
}
@@ -384,9 +386,9 @@ private static void clearAllExceptRelationships(Resource resource) {
*/
private static JsonNode toErrorNode(String detail, Integer status) {
ObjectNode formattedError = JsonNodeFactory.instance.objectNode();
- formattedError.set("detail", JsonNodeFactory.instance.textNode(Encode.forHtml(detail)));
+ formattedError.set("detail", JsonNodeFactory.instance.stringNode(Encode.forHtml(detail)));
if (status != null) {
- formattedError.set("status", JsonNodeFactory.instance.textNode(status.toString()));
+ formattedError.set("status", JsonNodeFactory.instance.stringNode(status.toString()));
}
return formattedError;
}
diff --git a/elide-core/src/main/java/com/yahoo/elide/jsonapi/extensions/JsonApiJsonPatchMapper.java b/elide-core/src/main/java/com/yahoo/elide/jsonapi/extensions/JsonApiJsonPatchMapper.java
index 6d299f1058..fe24516f86 100644
--- a/elide-core/src/main/java/com/yahoo/elide/jsonapi/extensions/JsonApiJsonPatchMapper.java
+++ b/elide-core/src/main/java/com/yahoo/elide/jsonapi/extensions/JsonApiJsonPatchMapper.java
@@ -5,13 +5,13 @@
*/
package com.yahoo.elide.jsonapi.extensions;
+import com.yahoo.elide.ElideMapper;
import com.yahoo.elide.jsonapi.models.JsonApiDocument;
import com.yahoo.elide.jsonapi.models.Patch;
-import com.fasterxml.jackson.core.JsonProcessingException;
-import com.fasterxml.jackson.databind.JsonNode;
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.fasterxml.jackson.databind.node.JsonNodeFactory;
+import tools.jackson.databind.JsonNode;
+import tools.jackson.databind.ObjectMapper;
+import tools.jackson.databind.node.JsonNodeFactory;
import java.io.IOException;
import java.util.List;
@@ -20,10 +20,10 @@
* The mapper for the JSON API JSON Patch extension.
*/
public class JsonApiJsonPatchMapper {
- protected final ObjectMapper objectMapper;
+ protected final ElideMapper elideMapper;
- public JsonApiJsonPatchMapper(ObjectMapper objectMapper) {
- this.objectMapper = objectMapper;
+ public JsonApiJsonPatchMapper(ElideMapper elideMapper) {
+ this.elideMapper = elideMapper;
}
/**
@@ -31,11 +31,10 @@ public JsonApiJsonPatchMapper(ObjectMapper objectMapper) {
*
* @param value the value
* @return the json api document
- * @throws JsonProcessingException the json processing exception
*/
- public JsonApiDocument readValue(JsonNode value) throws JsonProcessingException {
+ public JsonApiDocument readValue(JsonNode value) {
JsonNode data = JsonNodeFactory.instance.objectNode().set("data", value);
- return this.objectMapper.treeToValue(data, JsonApiDocument.class);
+ return this.elideMapper.getObjectMapper().treeToValue(data, JsonApiDocument.class);
}
/**
@@ -45,8 +44,9 @@ public JsonApiDocument readValue(JsonNode value) throws JsonProcessingException
* @return the list
* @throws IOException the iO exception
*/
- public List readDoc(String doc) throws IOException {
- return this.objectMapper.readValue(doc,
- this.objectMapper.getTypeFactory().constructCollectionType(List.class, Patch.class));
+ public List readDoc(String doc) {
+ ObjectMapper objectMapper = elideMapper.getObjectMapper();
+ return objectMapper.readValue(doc,
+ objectMapper.getTypeFactory().constructCollectionType(List.class, Patch.class));
}
}
diff --git a/elide-core/src/main/java/com/yahoo/elide/jsonapi/models/Data.java b/elide-core/src/main/java/com/yahoo/elide/jsonapi/models/Data.java
index 454d8448e2..18f2bcf14b 100644
--- a/elide-core/src/main/java/com/yahoo/elide/jsonapi/models/Data.java
+++ b/elide-core/src/main/java/com/yahoo/elide/jsonapi/models/Data.java
@@ -8,15 +8,16 @@
import com.yahoo.elide.core.dictionary.RelationshipType;
import com.yahoo.elide.jsonapi.serialization.DataDeserializer;
import com.yahoo.elide.jsonapi.serialization.DataSerializer;
-import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
-import com.fasterxml.jackson.databind.annotation.JsonSerialize;
-
import lombok.ToString;
import reactor.core.publisher.Flux;
+import tools.jackson.databind.annotation.JsonDeserialize;
+import tools.jackson.databind.annotation.JsonSerialize;
+
import java.util.Collection;
import java.util.Comparator;
+
/**
* Container for different representations of top-level data in JSON API.
*
diff --git a/elide-core/src/main/java/com/yahoo/elide/jsonapi/models/JsonApiDocument.java b/elide-core/src/main/java/com/yahoo/elide/jsonapi/models/JsonApiDocument.java
index 210b35404c..dfc7462c0e 100644
--- a/elide-core/src/main/java/com/yahoo/elide/jsonapi/models/JsonApiDocument.java
+++ b/elide-core/src/main/java/com/yahoo/elide/jsonapi/models/JsonApiDocument.java
@@ -68,11 +68,21 @@ public void addLink(String key, String val) {
this.links.put(key, val);
}
+ public void setLinks(Map links) {
+ this.links.clear();
+ this.links.putAll(links);
+ }
+
@JsonInclude(Include.NON_NULL)
public List getIncluded() {
return included.isEmpty() ? null : included;
}
+ public void setIncluded(List included) {
+ this.included.clear();
+ this.included.addAll(included);
+ }
+
public void addIncluded(Resource resource) {
if (!includedRecs.contains(resource)) {
included.add(resource);
diff --git a/elide-core/src/main/java/com/yahoo/elide/jsonapi/models/Meta.java b/elide-core/src/main/java/com/yahoo/elide/jsonapi/models/Meta.java
index ba26533aad..f6fe1b8549 100644
--- a/elide-core/src/main/java/com/yahoo/elide/jsonapi/models/Meta.java
+++ b/elide-core/src/main/java/com/yahoo/elide/jsonapi/models/Meta.java
@@ -8,7 +8,7 @@
import com.yahoo.elide.jsonapi.serialization.MetaDeserializer;
import com.fasterxml.jackson.annotation.JsonAnyGetter;
import com.fasterxml.jackson.annotation.JsonAutoDetect;
-import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
+import tools.jackson.databind.annotation.JsonDeserialize;
import java.util.Map;
diff --git a/elide-core/src/main/java/com/yahoo/elide/jsonapi/models/Operation.java b/elide-core/src/main/java/com/yahoo/elide/jsonapi/models/Operation.java
index 9e57ae0d86..aca9a5dac8 100644
--- a/elide-core/src/main/java/com/yahoo/elide/jsonapi/models/Operation.java
+++ b/elide-core/src/main/java/com/yahoo/elide/jsonapi/models/Operation.java
@@ -11,8 +11,8 @@
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonPropertyOrder;
import com.fasterxml.jackson.annotation.JsonValue;
-import com.fasterxml.jackson.databind.JsonNode;
-import com.fasterxml.jackson.databind.exc.InvalidFormatException;
+import tools.jackson.databind.JsonNode;
+import tools.jackson.databind.exc.InvalidFormatException;
import java.io.IOException;
import java.util.Locale;
diff --git a/elide-core/src/main/java/com/yahoo/elide/jsonapi/models/Patch.java b/elide-core/src/main/java/com/yahoo/elide/jsonapi/models/Patch.java
index dbd1741d6a..ca6e2cfe03 100644
--- a/elide-core/src/main/java/com/yahoo/elide/jsonapi/models/Patch.java
+++ b/elide-core/src/main/java/com/yahoo/elide/jsonapi/models/Patch.java
@@ -9,8 +9,8 @@
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonPropertyOrder;
import com.fasterxml.jackson.annotation.JsonValue;
-import com.fasterxml.jackson.databind.JsonNode;
-import com.fasterxml.jackson.databind.exc.InvalidFormatException;
+import tools.jackson.databind.JsonNode;
+import tools.jackson.databind.exc.InvalidFormatException;
import java.io.IOException;
import java.util.Locale;
diff --git a/elide-core/src/main/java/com/yahoo/elide/jsonapi/models/Resource.java b/elide-core/src/main/java/com/yahoo/elide/jsonapi/models/Resource.java
index 089c16d957..73bb060c76 100644
--- a/elide-core/src/main/java/com/yahoo/elide/jsonapi/models/Resource.java
+++ b/elide-core/src/main/java/com/yahoo/elide/jsonapi/models/Resource.java
@@ -16,12 +16,13 @@
import com.yahoo.elide.jsonapi.serialization.KeySerializer;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonProperty;
-import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import org.apache.commons.collections4.MapUtils;
import org.apache.commons.lang3.builder.HashCodeBuilder;
import lombok.ToString;
+import tools.jackson.databind.annotation.JsonSerialize;
+
import java.util.Map;
import java.util.Objects;
diff --git a/elide-core/src/main/java/com/yahoo/elide/jsonapi/parser/state/CollectionTerminalState.java b/elide-core/src/main/java/com/yahoo/elide/jsonapi/parser/state/CollectionTerminalState.java
index e20ef772d9..87b80b9755 100644
--- a/elide-core/src/main/java/com/yahoo/elide/jsonapi/parser/state/CollectionTerminalState.java
+++ b/elide-core/src/main/java/com/yahoo/elide/jsonapi/parser/state/CollectionTerminalState.java
@@ -29,13 +29,13 @@
import com.yahoo.elide.jsonapi.models.Meta;
import com.yahoo.elide.jsonapi.models.Relationship;
import com.yahoo.elide.jsonapi.models.Resource;
-import com.fasterxml.jackson.core.JsonProcessingException;
import com.google.common.base.Preconditions;
import org.apache.commons.collections4.IterableUtils;
import org.apache.commons.lang3.tuple.Pair;
import lombok.ToString;
import reactor.core.publisher.Flux;
+import tools.jackson.core.JacksonException;
import java.util.Collection;
import java.util.Collections;
import java.util.LinkedHashMap;
@@ -200,7 +200,7 @@ private PersistentResource createObject(JsonApiRequestScope requestScope)
if (resource == null) {
try {
throw new InvalidEntityBodyException(mapper.writeJsonApiDocument(doc));
- } catch (JsonProcessingException e) {
+ } catch (JacksonException e) {
throw new InternalServerErrorException(e);
}
}
diff --git a/elide-core/src/main/java/com/yahoo/elide/jsonapi/parser/state/RecordTerminalState.java b/elide-core/src/main/java/com/yahoo/elide/jsonapi/parser/state/RecordTerminalState.java
index 43df1c68bd..3e45bbaea4 100644
--- a/elide-core/src/main/java/com/yahoo/elide/jsonapi/parser/state/RecordTerminalState.java
+++ b/elide-core/src/main/java/com/yahoo/elide/jsonapi/parser/state/RecordTerminalState.java
@@ -14,11 +14,11 @@
import com.yahoo.elide.jsonapi.models.JsonApiDocument;
import com.yahoo.elide.jsonapi.models.Relationship;
import com.yahoo.elide.jsonapi.models.Resource;
-import com.fasterxml.jackson.databind.ObjectMapper;
import org.apache.commons.lang3.tuple.Pair;
import lombok.ToString;
+import tools.jackson.databind.ObjectMapper;
import java.util.Map;
import java.util.Optional;
import java.util.Set;
diff --git a/elide-core/src/main/java/com/yahoo/elide/jsonapi/serialization/DataDeserializer.java b/elide-core/src/main/java/com/yahoo/elide/jsonapi/serialization/DataDeserializer.java
index b178dcdb41..abf76fc5f2 100644
--- a/elide-core/src/main/java/com/yahoo/elide/jsonapi/serialization/DataDeserializer.java
+++ b/elide-core/src/main/java/com/yahoo/elide/jsonapi/serialization/DataDeserializer.java
@@ -7,45 +7,39 @@
import com.yahoo.elide.jsonapi.models.Data;
import com.yahoo.elide.jsonapi.models.Resource;
-import com.fasterxml.jackson.core.JsonParser;
-import com.fasterxml.jackson.databind.DeserializationContext;
-import com.fasterxml.jackson.databind.JsonDeserializer;
-import com.fasterxml.jackson.databind.JsonMappingException;
-import com.fasterxml.jackson.databind.JsonNode;
-import com.fasterxml.jackson.databind.MappingJsonFactory;
-import com.fasterxml.jackson.databind.ObjectMapper;
+import tools.jackson.core.JsonParser;
+import tools.jackson.databind.DatabindException;
+import tools.jackson.databind.DeserializationContext;
+import tools.jackson.databind.JsonNode;
+import tools.jackson.databind.ValueDeserializer;
-import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
/**
* Custom deserializer for top-level data.
*/
-public class DataDeserializer extends JsonDeserializer> {
- private static final ObjectMapper MAPPER = new MappingJsonFactory().getCodec();
-
+public class DataDeserializer extends ValueDeserializer> {
@Override
- public Data deserialize(JsonParser jsonParser, DeserializationContext deserializationContext)
- throws IOException {
- JsonNode node = jsonParser.getCodec().readTree(jsonParser);
+ public Data deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) {
+ JsonNode node = deserializationContext.readTree(jsonParser);
if (node.isArray()) {
List resources = new ArrayList<>();
for (JsonNode n : node) {
- Resource r = MAPPER.convertValue(n, Resource.class);
+ Resource r = deserializationContext.readTreeAsValue(n, Resource.class);
validateResource(jsonParser, r);
resources.add(r);
}
return new Data<>(resources);
}
- Resource resource = MAPPER.convertValue(node, Resource.class);
+ Resource resource = deserializationContext.readTreeAsValue(node, Resource.class);
validateResource(jsonParser, resource);
return new Data<>(resource);
}
- private void validateResource(JsonParser jsonParser, Resource resource) throws IOException {
+ private void validateResource(JsonParser jsonParser, Resource resource) {
if (resource.getType() == null || resource.getType().isEmpty()) {
- throw JsonMappingException.from(jsonParser, "Resource 'type' field is missing or empty.");
+ throw DatabindException.from(jsonParser, "Resource 'type' field is missing or empty.");
}
}
}
diff --git a/elide-core/src/main/java/com/yahoo/elide/jsonapi/serialization/DataSerializer.java b/elide-core/src/main/java/com/yahoo/elide/jsonapi/serialization/DataSerializer.java
index 6ad2055a43..a10b072905 100644
--- a/elide-core/src/main/java/com/yahoo/elide/jsonapi/serialization/DataSerializer.java
+++ b/elide-core/src/main/java/com/yahoo/elide/jsonapi/serialization/DataSerializer.java
@@ -7,33 +7,31 @@
import com.yahoo.elide.jsonapi.models.Data;
import com.yahoo.elide.jsonapi.models.Resource;
-import com.fasterxml.jackson.core.JsonGenerator;
-import com.fasterxml.jackson.databind.JsonSerializer;
-import com.fasterxml.jackson.databind.SerializerProvider;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.collections4.IterableUtils;
+import tools.jackson.core.JsonGenerator;
+import tools.jackson.databind.SerializationContext;
+import tools.jackson.databind.ValueSerializer;
-import java.io.IOException;
import java.util.Collection;
import java.util.Collections;
/**
* Custom serializer for top-level data.
*/
-public class DataSerializer extends JsonSerializer> {
+public class DataSerializer extends ValueSerializer> {
@Override
- public void serialize(Data data, JsonGenerator jsonGenerator, SerializerProvider serializerProvider)
- throws IOException {
+ public void serialize(Data data, JsonGenerator jsonGenerator, SerializationContext serializerProvider) {
Collection list = data.get();
if (data.isToOne()) {
if (CollectionUtils.isEmpty(list)) {
- jsonGenerator.writeObject(null);
+ jsonGenerator.writePOJO(null);
return;
}
- jsonGenerator.writeObject(IterableUtils.first(list));
+ jsonGenerator.writePOJO(IterableUtils.first(list));
return;
}
- jsonGenerator.writeObject((list == null) ? Collections.emptyList() : list);
+ jsonGenerator.writePOJO((list == null) ? Collections.emptyList() : list);
}
}
diff --git a/elide-core/src/main/java/com/yahoo/elide/jsonapi/serialization/JsonApiErrorSerializer.java b/elide-core/src/main/java/com/yahoo/elide/jsonapi/serialization/JsonApiErrorSerializer.java
index 1cf2d408ae..f4495541a5 100644
--- a/elide-core/src/main/java/com/yahoo/elide/jsonapi/serialization/JsonApiErrorSerializer.java
+++ b/elide-core/src/main/java/com/yahoo/elide/jsonapi/serialization/JsonApiErrorSerializer.java
@@ -7,37 +7,36 @@
import com.yahoo.elide.jsonapi.models.JsonApiError;
-import com.fasterxml.jackson.core.JsonGenerator;
-import com.fasterxml.jackson.databind.SerializerProvider;
-import com.fasterxml.jackson.databind.ser.std.StdSerializer;
-
import org.owasp.encoder.Encode;
-import java.io.IOException;
+import tools.jackson.core.JsonGenerator;
+import tools.jackson.databind.SerializationContext;
+import tools.jackson.databind.ser.std.StdSerializer;
+
import java.util.Map;
/**
* JSON API Error Serializer.
*/
public class JsonApiErrorSerializer extends StdSerializer {
- private static final long serialVersionUID = 1L;
public JsonApiErrorSerializer() {
super(JsonApiError.class);
}
@Override
- public void serialize(JsonApiError jsonApiError, JsonGenerator jsonGenerator, SerializerProvider provider)
- throws IOException {
+ public void serialize(JsonApiError jsonApiError, JsonGenerator jsonGenerator, SerializationContext provider) {
jsonGenerator.writeStartObject();
writeStringField(jsonGenerator, "id", jsonApiError.getId());
if (jsonApiError.getLinks() != null) {
- jsonGenerator.writeObjectField("links", jsonApiError.getLinks());
+ jsonGenerator.writeName("links");
+ jsonGenerator.writePOJO(jsonApiError.getLinks());
}
writeStringField(jsonGenerator, "status", jsonApiError.getStatus());
writeStringField(jsonGenerator, "code", jsonApiError.getCode());
if (jsonApiError.getSource() != null) {
- jsonGenerator.writeObjectField("source", jsonApiError.getSource());
+ jsonGenerator.writeName("source");
+ jsonGenerator.writePOJO(jsonApiError.getSource());
}
writeStringField(jsonGenerator, "title", jsonApiError.getTitle());
if (jsonApiError.getDetail() != null && !jsonApiError.getDetail().isBlank()) {
@@ -45,18 +44,21 @@ public void serialize(JsonApiError jsonApiError, JsonGenerator jsonGenerator, Se
}
if (jsonApiError.getMeta() instanceof Map, ?> map) {
if (!map.isEmpty()) {
- jsonGenerator.writeObjectField("meta", jsonApiError.getMeta());
+ jsonGenerator.writeName("meta");
+ jsonGenerator.writePOJO(jsonApiError.getMeta());
}
} else if (jsonApiError.getMeta() != null) {
- jsonGenerator.writeObjectField("meta", jsonApiError.getMeta());
+ jsonGenerator.writeName("meta");
+ jsonGenerator.writePOJO(jsonApiError.getMeta());
}
jsonGenerator.writeEndObject();
}
- private void writeStringField(JsonGenerator jsonGenerator, String fieldName, String value) throws IOException {
+ private void writeStringField(JsonGenerator jsonGenerator, String fieldName, String value) {
if (value != null && !value.isBlank()) {
- jsonGenerator.writeStringField(fieldName, value);
+ jsonGenerator.writeName(fieldName);
+ jsonGenerator.writeString(value);
}
}
}
diff --git a/elide-core/src/main/java/com/yahoo/elide/jsonapi/serialization/JsonApiModule.java b/elide-core/src/main/java/com/yahoo/elide/jsonapi/serialization/JsonApiModule.java
index a76382df25..b6f33f34ce 100644
--- a/elide-core/src/main/java/com/yahoo/elide/jsonapi/serialization/JsonApiModule.java
+++ b/elide-core/src/main/java/com/yahoo/elide/jsonapi/serialization/JsonApiModule.java
@@ -5,8 +5,8 @@
*/
package com.yahoo.elide.jsonapi.serialization;
-import com.fasterxml.jackson.core.Version;
-import com.fasterxml.jackson.databind.module.SimpleModule;
+import tools.jackson.core.Version;
+import tools.jackson.databind.module.SimpleModule;
/**
* JSON API Module.
diff --git a/elide-core/src/main/java/com/yahoo/elide/jsonapi/serialization/JsonApiSetSerializer.java b/elide-core/src/main/java/com/yahoo/elide/jsonapi/serialization/JsonApiSetSerializer.java
index 26e26e5b09..627ff213d3 100644
--- a/elide-core/src/main/java/com/yahoo/elide/jsonapi/serialization/JsonApiSetSerializer.java
+++ b/elide-core/src/main/java/com/yahoo/elide/jsonapi/serialization/JsonApiSetSerializer.java
@@ -5,29 +5,25 @@
*/
package com.yahoo.elide.jsonapi.serialization;
-import com.fasterxml.jackson.core.JsonGenerator;
-import com.fasterxml.jackson.databind.SerializerProvider;
-import com.fasterxml.jackson.databind.ser.std.StdSerializer;
+import tools.jackson.core.JsonGenerator;
+import tools.jackson.databind.SerializationContext;
+import tools.jackson.databind.ser.std.StdSerializer;
-import java.io.IOException;
import java.util.Set;
/**
* JSON API Set Serializer.
*/
public class JsonApiSetSerializer extends StdSerializer {
- private static final long serialVersionUID = 1L;
-
JsonApiSetSerializer() {
super(Set.class);
}
@Override
- public void serialize(Set set, JsonGenerator jsonGenerator, SerializerProvider provider)
- throws IOException {
+ public void serialize(Set set, JsonGenerator jsonGenerator, SerializationContext provider) {
jsonGenerator.writeStartArray();
for (Object value : set) {
- jsonGenerator.writeObject(value);
+ jsonGenerator.writePOJO(value);
}
jsonGenerator.writeEndArray();
}
diff --git a/elide-core/src/main/java/com/yahoo/elide/jsonapi/serialization/KeySerializer.java b/elide-core/src/main/java/com/yahoo/elide/jsonapi/serialization/KeySerializer.java
index b73204d2aa..f58f3d9f26 100644
--- a/elide-core/src/main/java/com/yahoo/elide/jsonapi/serialization/KeySerializer.java
+++ b/elide-core/src/main/java/com/yahoo/elide/jsonapi/serialization/KeySerializer.java
@@ -5,11 +5,10 @@
*/
package com.yahoo.elide.jsonapi.serialization;
-import com.fasterxml.jackson.core.JsonGenerator;
-import com.fasterxml.jackson.databind.SerializerProvider;
-import com.fasterxml.jackson.databind.ser.std.StdKeySerializer;
+import tools.jackson.core.JsonGenerator;
+import tools.jackson.databind.SerializationContext;
+import tools.jackson.databind.ValueSerializer;
-import java.io.IOException;
import java.util.Date;
/**
@@ -17,10 +16,9 @@
* Change from StdKeySerializer - In cases of enum value it uses
* name() instead of defaulting to toString() since that may be overridden
*/
-public class KeySerializer extends StdKeySerializer {
+public class KeySerializer extends ValueSerializer