From 73ff9ae127561f3be5b99d99c728050033cbecff Mon Sep 17 00:00:00 2001 From: Michele Rastelli Date: Wed, 8 Jan 2025 21:04:18 +0100 Subject: [PATCH 1/2] Serde: deserialization pass-through for RawJson and RawBytes --- .../internal/serde/InternalSerde.java | 9 ------ .../internal/serde/InternalSerdeImpl.java | 28 ++++++++----------- 2 files changed, 11 insertions(+), 26 deletions(-) diff --git a/core/src/main/java/com/arangodb/internal/serde/InternalSerde.java b/core/src/main/java/com/arangodb/internal/serde/InternalSerde.java index d9ca65ef1..4fa4a1a06 100644 --- a/core/src/main/java/com/arangodb/internal/serde/InternalSerde.java +++ b/core/src/main/java/com/arangodb/internal/serde/InternalSerde.java @@ -130,15 +130,6 @@ default T deserialize(byte[] content, String jsonPointer, Type type) { */ T deserializeUserData(byte[] content, JavaType clazz); - /** - * Deserializes the parsed json node and binds it to the target data type. - * The parser is not closed. - * - * @param parser json parser - * @param clazz class of target data type - * @return deserialized object - */ - T deserializeUserData(JsonParser parser, JavaType clazz); /** * @param content byte array to deserialize diff --git a/core/src/main/java/com/arangodb/internal/serde/InternalSerdeImpl.java b/core/src/main/java/com/arangodb/internal/serde/InternalSerdeImpl.java index 1cb1412b2..3696cbc20 100644 --- a/core/src/main/java/com/arangodb/internal/serde/InternalSerdeImpl.java +++ b/core/src/main/java/com/arangodb/internal/serde/InternalSerdeImpl.java @@ -180,19 +180,6 @@ public T deserializeUserData(byte[] content, JavaType clazz) { } } - @Override - public T deserializeUserData(JsonParser parser, JavaType clazz) { - try { - if (SerdeUtils.isManagedClass(clazz.getRawClass())) { - return mapper.readerFor(clazz).readValue(parser); - } else { - return deserializeUserData(extractBytes(parser), clazz); - } - } catch (IOException e) { - throw ArangoDBException.of(e); - } - } - @Override public boolean isDocument(byte[] content) { try (JsonParser p = mapper.getFactory().createParser(content)) { @@ -240,14 +227,21 @@ public T deserialize(final JsonNode node, final Type type) { } @Override + @SuppressWarnings("unchecked") public T deserialize(final byte[] content, final Type type) { if (content == null || content.length == 0) { return null; } - try { - return mapper.readerFor(mapper.constructType(type)).readValue(content); - } catch (IOException e) { - throw ArangoDBException.of(e); + if (RawBytes.class.equals(type)) { + return (T) RawBytes.of(content); + } else if (RawJson.class.equals(type) && JsonFactory.FORMAT_NAME_JSON.equals(mapper.getFactory().getFormatName())) { + return (T) RawJson.of(new String(content, StandardCharsets.UTF_8)); + } else { + try { + return mapper.readerFor(mapper.constructType(type)).readValue(content); + } catch (IOException e) { + throw ArangoDBException.of(e); + } } } From 6e137abfff76632189e7059308248a9d98cde715 Mon Sep 17 00:00:00 2001 From: Michele Rastelli Date: Wed, 8 Jan 2025 21:17:46 +0100 Subject: [PATCH 2/2] test x-arango-dump content-type --- .../test/java/resilience/mock/SerdeTest.java | 30 +++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/test-resilience/src/test/java/resilience/mock/SerdeTest.java b/test-resilience/src/test/java/resilience/mock/SerdeTest.java index 2d559c2aa..c0285b4be 100644 --- a/test-resilience/src/test/java/resilience/mock/SerdeTest.java +++ b/test-resilience/src/test/java/resilience/mock/SerdeTest.java @@ -2,7 +2,10 @@ import ch.qos.logback.classic.Level; import com.arangodb.ArangoDBException; +import com.arangodb.Request; +import com.arangodb.Response; import com.arangodb.entity.MultiDocumentEntity; +import com.arangodb.util.RawJson; import com.fasterxml.jackson.core.JsonParseException; import com.fasterxml.jackson.databind.JsonNode; import org.junit.jupiter.api.Test; @@ -133,4 +136,31 @@ void getDocumentsWithErrorField() { .anySatisfy(d -> assertThat(d.get("_key").textValue()).isEqualTo("2")) .anySatisfy(d -> assertThat(d.get("_key").textValue()).isEqualTo("3")); } + + @Test + void getXArangoDumpJsonLines() { + String resp = "{\"a\":1}\n" + + "{\"b\":2}\n" + + "{\"c\":3}"; + + mockServer + .when( + request() + .withMethod("GET") + .withPath("/_db/foo/_api/foo") + ) + .respond( + response() + .withStatusCode(200) + .withHeader("Content-Type", "application/x-arango-dump; charset=utf-8") + .withBody(resp.getBytes(StandardCharsets.UTF_8)) + ); + + Response res = arangoDB.execute(Request.builder() + .method(Request.Method.GET) + .db("foo") + .path("/_api/foo") + .build(), RawJson.class); + assertThat(res.getBody().get()).endsWith("{\"c\":3}"); + } }