From 98096838aef03dd55d4a7352195d4bd0218590a5 Mon Sep 17 00:00:00 2001 From: ghillairet Date: Sat, 19 Dec 2015 21:17:22 +0100 Subject: [PATCH] Id field was not parsed when placed before the type field. This fix makes sure the id field is parsed when present before the type field by using the buffer parser. --- .../databind/deser/EObjectDeserializer.java | 12 +++- .../org/emfjson/jackson/junit/TestSuite.java | 3 +- .../emfjson/jackson/junit/tests/IdTest.java | 63 +++++++++++++++++++ src/test/resources/model/model.xcore | 11 +--- 4 files changed, 78 insertions(+), 11 deletions(-) create mode 100644 src/test/java/org/emfjson/jackson/junit/tests/IdTest.java diff --git a/src/main/java/org/emfjson/jackson/databind/deser/EObjectDeserializer.java b/src/main/java/org/emfjson/jackson/databind/deser/EObjectDeserializer.java index 48e5e085..995ae723 100644 --- a/src/main/java/org/emfjson/jackson/databind/deser/EObjectDeserializer.java +++ b/src/main/java/org/emfjson/jackson/databind/deser/EObjectDeserializer.java @@ -114,7 +114,11 @@ protected EObject doDeserialize(JsonParser jp, EClass defaultType, Deserializati } else if (options.idField.equalsIgnoreCase(fieldName)) { - options.idDeserializer.deserialize(jp, current, ctxt); + if (current != null) { + options.idDeserializer.deserialize(jp, current, ctxt); + } else { + buffer.copyCurrentStructure(jp); + } } else { @@ -145,7 +149,11 @@ protected EObject postDeserialize(TokenBuffer buffer, EObject object, EClass def final JsonParser bufferedParser = buffer.asParser(); while (bufferedParser.nextToken() != null) { - readFeature(bufferedParser, object, bufferedParser.getCurrentName(), ctxt, resource, entries); + if (options.idField.equals(bufferedParser.getCurrentName())) { + options.idDeserializer.deserialize(bufferedParser, object, ctxt); + } else { + readFeature(bufferedParser, object, bufferedParser.getCurrentName(), ctxt, resource, entries); + } } bufferedParser.close(); diff --git a/src/test/java/org/emfjson/jackson/junit/TestSuite.java b/src/test/java/org/emfjson/jackson/junit/TestSuite.java index 0d12d228..73cc7897 100644 --- a/src/test/java/org/emfjson/jackson/junit/TestSuite.java +++ b/src/test/java/org/emfjson/jackson/junit/TestSuite.java @@ -28,12 +28,13 @@ EnumTest.class, ExternalReferencesTest.class, FeatureMapTest.class, + GenericTest.class, + IdTest.class, JacksonOptionTest.class, MapTest.class, ModuleTest.class, NoTypeTest.class, PolymorphicTest.class, - GenericTest.class, ProxyAttributeTest.class, ReaderTest.class, ReferenceTest.class, diff --git a/src/test/java/org/emfjson/jackson/junit/tests/IdTest.java b/src/test/java/org/emfjson/jackson/junit/tests/IdTest.java new file mode 100644 index 00000000..cc98352b --- /dev/null +++ b/src/test/java/org/emfjson/jackson/junit/tests/IdTest.java @@ -0,0 +1,63 @@ +package org.emfjson.jackson.junit.tests; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.JsonNode; +import org.eclipse.emf.ecore.resource.Resource; +import org.emfjson.jackson.JacksonOptions; +import org.emfjson.jackson.junit.model.ModelFactory; +import org.emfjson.jackson.junit.model.User; +import org.emfjson.jackson.junit.support.TestSupport; +import org.emfjson.jackson.resource.JsonResource; +import org.junit.Test; + +import static org.junit.Assert.assertEquals; + +public class IdTest extends TestSupport { + + final JacksonOptions options = new JacksonOptions.Builder() + .withID(true) + .build(); + + @Test + public void testWriteId() { + JsonNode expected = mapper.createObjectNode() + .put("eClass", "http://www.emfjson.org/jackson/model#//User") + .put("_id", "1") + .put("name", "Joe"); + + JsonResource resource = new JsonResource(); + User user = ModelFactory.eINSTANCE.createUser(); + user.setName("Joe"); + resource.setID(user, "1"); + resource.getContents().add(user); + + assertEquals(expected, mapper(options).valueToTree(resource)); + } + + @Test + public void testReadId() throws JsonProcessingException { + JsonNode data = mapper.createObjectNode() + .put("eClass", "http://www.emfjson.org/jackson/model#//User") + .put("_id", "1") + .put("name", "Joe"); + + JsonResource resource = (JsonResource) mapper(options).treeToValue(data, Resource.class); + User user = (User) resource.getContents().get(0); + + assertEquals("1", resource.getID(user)); + } + + @Test + public void testReadId_WhenIdBeforeTypeField() throws JsonProcessingException { + JsonNode data = mapper.createObjectNode() + .put("_id", "1") + .put("eClass", "http://www.emfjson.org/jackson/model#//User") + .put("name", "Joe"); + + JsonResource resource = (JsonResource) mapper(options).treeToValue(data, Resource.class); + User user = (User) resource.getContents().get(0); + + assertEquals("1", resource.getID(user)); + } + +} diff --git a/src/test/resources/model/model.xcore b/src/test/resources/model/model.xcore index 9e1440be..7f13fa21 100644 --- a/src/test/resources/model/model.xcore +++ b/src/test/resources/model/model.xcore @@ -14,6 +14,7 @@ import org.eclipse.emf.ecore.EStringToStringMapEntry import java.util.Map annotation "JSON" as JSON @JSON(root="true") + class User { id String userId String name @@ -133,12 +134,6 @@ class Node { contains resolving Node uniqueChild } -class ObjectWithMap { - @JSON(dynamicMap="true") - contains resolving EStringToStringMapEntry[] entries - contains resolving EStringToStringMapEntry[] dependencies -} - enum SomeKind { one = 0 Two as "two" = 1 @@ -146,7 +141,7 @@ enum SomeKind { } class GenericContainer { - contains resolving GenericType < ? >[] values + contains resolving GenericType[] values } abstract class GenericType { @@ -155,4 +150,4 @@ abstract class GenericType { class SpecialTypeOne extends GenericType {} -class SpecialTypeTwo extends GenericType {} \ No newline at end of file +class SpecialTypeTwo extends GenericType {}