summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorOlli Virtanen <ovirtanen@gmail.com>2018-06-28 14:19:33 +0200
committerGitHub <noreply@github.com>2018-06-28 14:19:33 +0200
commitd9be160582d3488c944907f6958e09b9ab1555b8 (patch)
tree75a2f3a15b6a078d28ec0cb817fa14453620e6fe
parente0ec82acb6027a58f30cf8a56f944b217580957c (diff)
parent76282ba6b1964d4eb5f01afdbb47cef34a943e23 (diff)
Merge pull request #6295 from vespa-engine/ovirtanen/tojson-in-document
Include .toJson() in Document analogously to .toXml()
-rw-r--r--docproc/src/main/java/com/yahoo/docproc/proxy/ProxyDocument.java7
-rw-r--r--document/src/main/java/com/yahoo/document/Document.java34
-rw-r--r--document/src/test/java/com/yahoo/document/DocumentTestCase.java33
3 files changed, 67 insertions, 7 deletions
diff --git a/docproc/src/main/java/com/yahoo/docproc/proxy/ProxyDocument.java b/docproc/src/main/java/com/yahoo/docproc/proxy/ProxyDocument.java
index 2c2c8e853a3..23555efec50 100644
--- a/docproc/src/main/java/com/yahoo/docproc/proxy/ProxyDocument.java
+++ b/docproc/src/main/java/com/yahoo/docproc/proxy/ProxyDocument.java
@@ -1,4 +1,4 @@
-// Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+// Copyright 2018 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
package com.yahoo.docproc.proxy;
import com.yahoo.docproc.Accesses;
@@ -278,6 +278,11 @@ public class ProxyDocument extends Document implements DocumentOperationWrapper
}
@Override
+ public String toJson() {
+ return doc.toJson();
+ }
+
+ @Override
public void onSerialize(Serializer target) throws SerializationException {
doc.onSerialize(target);
}
diff --git a/document/src/main/java/com/yahoo/document/Document.java b/document/src/main/java/com/yahoo/document/Document.java
index 025166b5ef9..23beab7523e 100644
--- a/document/src/main/java/com/yahoo/document/Document.java
+++ b/document/src/main/java/com/yahoo/document/Document.java
@@ -1,17 +1,28 @@
-// Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+// Copyright 2018 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
package com.yahoo.document;
import com.yahoo.document.datatypes.FieldValue;
import com.yahoo.document.datatypes.Struct;
import com.yahoo.document.datatypes.StructuredFieldValue;
-import com.yahoo.document.serialization.*;
+import com.yahoo.document.json.JsonWriter;
+import com.yahoo.document.serialization.DocumentReader;
+import com.yahoo.document.serialization.DocumentSerializer;
+import com.yahoo.document.serialization.DocumentSerializerFactory;
+import com.yahoo.document.serialization.DocumentWriter;
+import com.yahoo.document.serialization.FieldReader;
+import com.yahoo.document.serialization.FieldWriter;
+import com.yahoo.document.serialization.SerializationException;
+import com.yahoo.document.serialization.XmlSerializationHelper;
+import com.yahoo.document.serialization.XmlStream;
import com.yahoo.io.GrowableByteBuffer;
import com.yahoo.vespa.objects.BufferSerializer;
import com.yahoo.vespa.objects.Ids;
import com.yahoo.vespa.objects.Serializer;
+import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.OutputStream;
+import java.io.UnsupportedEncodingException;
import java.util.Iterator;
import java.util.Map;
@@ -266,6 +277,21 @@ public class Document extends StructuredFieldValue {
XmlSerializationHelper.printDocumentXml(this, xml);
}
+ /**
+ * Get JSON representation of the document root and its children contained in a JSON object
+ * @return JSON representation of document
+ */
+ public String toJson() {
+ ByteArrayOutputStream buffer = new ByteArrayOutputStream();
+ JsonWriter writer = new JsonWriter(buffer);
+ writer.write(this);
+ try {
+ return buffer.toString("UTF-8");
+ } catch (UnsupportedEncodingException e) {
+ throw new RuntimeException(e);
+ }
+ }
+
/** Returns true if the argument is a document which has the same set of values */
@Override
public boolean equals(Object o) {
@@ -314,8 +340,8 @@ public class Document extends StructuredFieldValue {
@SuppressWarnings("deprecation")
public void serializeHeader(Serializer data) throws SerializationException {
if (data instanceof DocumentWriter) {
- if (data instanceof VespaDocumentSerializer42) {
- ((VespaDocumentSerializer42)data).setHeaderOnly(true);
+ if (data instanceof com.yahoo.document.serialization.VespaDocumentSerializer42) {
+ ((com.yahoo.document.serialization.VespaDocumentSerializer42)data).setHeaderOnly(true);
}
serialize((DocumentWriter)data);
} else if (data instanceof BufferSerializer) {
diff --git a/document/src/test/java/com/yahoo/document/DocumentTestCase.java b/document/src/test/java/com/yahoo/document/DocumentTestCase.java
index f7cc6974176..84b33b3881c 100644
--- a/document/src/test/java/com/yahoo/document/DocumentTestCase.java
+++ b/document/src/test/java/com/yahoo/document/DocumentTestCase.java
@@ -1,6 +1,8 @@
// Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
package com.yahoo.document;
+import com.fasterxml.jackson.core.type.TypeReference;
+import com.fasterxml.jackson.databind.ObjectMapper;
import com.yahoo.compress.CompressionType;
import com.yahoo.document.datatypes.Array;
import com.yahoo.document.datatypes.ByteFieldValue;
@@ -15,7 +17,12 @@ import com.yahoo.document.datatypes.Raw;
import com.yahoo.document.datatypes.StringFieldValue;
import com.yahoo.document.datatypes.Struct;
import com.yahoo.document.datatypes.WeightedSet;
-import com.yahoo.document.serialization.*;
+import com.yahoo.document.serialization.DocumentDeserializer;
+import com.yahoo.document.serialization.DocumentDeserializerFactory;
+import com.yahoo.document.serialization.DocumentReader;
+import com.yahoo.document.serialization.DocumentSerializer;
+import com.yahoo.document.serialization.DocumentSerializerFactory;
+import com.yahoo.document.serialization.XmlDocumentWriter;
import com.yahoo.io.GrowableByteBuffer;
import com.yahoo.vespa.objects.BufferSerializer;
import org.junit.Test;
@@ -27,10 +34,13 @@ import java.io.UnsupportedEncodingException;
import java.nio.ByteBuffer;
import java.util.Map;
+import static org.hamcrest.Matchers.containsInAnyOrder;
+import static org.hamcrest.Matchers.instanceOf;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertThat;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
@@ -40,7 +50,6 @@ import static org.junit.Assert.fail;
* @author <a href="thomasg@yahoo-inc.com>Thomas Gundersen</a>
* @author bratseth
*/
-@SuppressWarnings("deprecation")
public class DocumentTestCase extends DocumentTestCaseBase {
private static final String SERTEST_DOC_AS_XML_HEAD =
@@ -1202,6 +1211,26 @@ public class DocumentTestCase extends DocumentTestCaseBase {
}
@Test
+ public void testSerializationToJson() throws Exception {
+ setUpSertestDocType();
+ Document doc = getSertestDocument();
+ String json = doc.toJson();
+ Map<String, Object> parsed = new ObjectMapper().readValue(json, new TypeReference<Map<String, Object>>() {
+ });
+ assertEquals(parsed.get("id"), "doc:sertest:foobar");
+ assertThat(parsed.get("fields"), instanceOf(Map.class));
+ Object fieldMap = parsed.get("fields");
+ if (fieldMap instanceof Map) {
+ Map<?, ?> fields = (Map<?, ?>) fieldMap;
+ assertEquals(fields.get("mailid"), "emailfromalicetobob");
+ assertEquals(fields.get("date"), -2013512400);
+ assertThat(fields.get("docindoc"), instanceOf(Map.class));
+ assertThat(fields.keySet(),
+ containsInAnyOrder("mailid", "date", "attachmentcount", "rawfield", "weightedfield", "docindoc", "mapfield"));
+ }
+ }
+
+ @Test
public void testEmptyStringsSerialization() {
docMan = new DocumentTypeManager();
DocumentType docType = new DocumentType("emptystrings");