Repository: olingo-odata4 Updated Branches: refs/heads/master 096946a70 -> 35f24e98f
[OLINGO-422] type guessing in client deserializer also for collections Change-Id: Id5b6e6b6b41f310d2ed3a3227824a55d5497f18a Signed-off-by: Michael Bolz <[email protected]> Project: http://git-wip-us.apache.org/repos/asf/olingo-odata4/repo Commit: http://git-wip-us.apache.org/repos/asf/olingo-odata4/commit/35f24e98 Tree: http://git-wip-us.apache.org/repos/asf/olingo-odata4/tree/35f24e98 Diff: http://git-wip-us.apache.org/repos/asf/olingo-odata4/diff/35f24e98 Branch: refs/heads/master Commit: 35f24e98f07410756beb8c80aba97aac4eecc565 Parents: 096946a Author: Klaus Straubinger <[email protected]> Authored: Fri Oct 17 09:15:48 2014 +0200 Committer: Michael Bolz <[email protected]> Committed: Mon Oct 20 06:30:18 2014 +0200 ---------------------------------------------------------------------- .../olingo/fit/tecsvc/client/BasicITCase.java | 1 - .../core/serialization/JsonDeserializer.java | 42 ++++++++++---------- 2 files changed, 21 insertions(+), 22 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/35f24e98/fit/src/test/java/org/apache/olingo/fit/tecsvc/client/BasicITCase.java ---------------------------------------------------------------------- diff --git a/fit/src/test/java/org/apache/olingo/fit/tecsvc/client/BasicITCase.java b/fit/src/test/java/org/apache/olingo/fit/tecsvc/client/BasicITCase.java index dc34f65..4d55013 100644 --- a/fit/src/test/java/org/apache/olingo/fit/tecsvc/client/BasicITCase.java +++ b/fit/src/test/java/org/apache/olingo/fit/tecsvc/client/BasicITCase.java @@ -170,7 +170,6 @@ public class BasicITCase extends AbstractBaseTestITCase { } } - @Ignore("wrong value type!") @Test public void readEntity() throws IOException { final ODataEntityRequest<ODataEntity> request = getClient().getRetrieveRequestFactory() http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/35f24e98/lib/commons-core/src/main/java/org/apache/olingo/commons/core/serialization/JsonDeserializer.java ---------------------------------------------------------------------- diff --git a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/serialization/JsonDeserializer.java b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/serialization/JsonDeserializer.java index e1b8b1f..0258edc 100755 --- a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/serialization/JsonDeserializer.java +++ b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/serialization/JsonDeserializer.java @@ -25,6 +25,7 @@ import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.node.ArrayNode; import com.fasterxml.jackson.databind.node.ObjectNode; + import org.apache.commons.lang3.StringUtils; import org.apache.olingo.commons.api.Constants; import org.apache.olingo.commons.api.data.Annotatable; @@ -53,6 +54,7 @@ import org.apache.olingo.commons.core.data.LinkImpl; import org.apache.olingo.commons.core.data.LinkedComplexValueImpl; import org.apache.olingo.commons.core.data.PropertyImpl; import org.apache.olingo.commons.core.edm.EdmTypeInfo; + import java.io.IOException; import java.io.InputStream; import java.util.AbstractMap.SimpleEntry; @@ -243,35 +245,20 @@ public class JsonDeserializer implements ODataDeserializer { private Map.Entry<ODataPropertyType, EdmTypeInfo> guessPropertyType(final JsonNode node) { ODataPropertyType type; - EdmTypeInfo typeInfo = null; + String typeExpression = null; if (node.isValueNode() || node.isNull()) { type = ODataPropertyType.PRIMITIVE; - - EdmPrimitiveTypeKind kind = EdmPrimitiveTypeKind.String; - if (node.isShort()) { - kind = EdmPrimitiveTypeKind.Int16; - } else if (node.isInt()) { - kind = EdmPrimitiveTypeKind.Int32; - } else if (node.isLong()) { - kind = EdmPrimitiveTypeKind.Int64; - } else if (node.isBoolean()) { - kind = EdmPrimitiveTypeKind.Boolean; - } else if (node.isFloat()) { - kind = EdmPrimitiveTypeKind.Single; - } else if (node.isDouble()) { - kind = EdmPrimitiveTypeKind.Double; - } else if (node.isBigDecimal()) { - kind = EdmPrimitiveTypeKind.Decimal; - } - typeInfo = new EdmTypeInfo.Builder().setTypeExpression(kind.getFullQualifiedName().toString()).build(); + typeExpression = guessPrimitiveTypeKind(node).getFullQualifiedName().toString(); } else if (node.isArray()) { type = ODataPropertyType.COLLECTION; + if (node.has(0) && node.get(0).isValueNode()) { + typeExpression = "Collection(" + guessPrimitiveTypeKind(node.get(0)) + ')'; + } } else if (node.isObject()) { if (node.has(Constants.ATTR_TYPE)) { type = ODataPropertyType.PRIMITIVE; - typeInfo = new EdmTypeInfo.Builder(). - setTypeExpression("Edm.Geography" + node.get(Constants.ATTR_TYPE).asText()).build(); + typeExpression = "Edm.Geography" + node.get(Constants.ATTR_TYPE).asText(); } else { type = ODataPropertyType.COMPLEX; } @@ -279,9 +266,22 @@ public class JsonDeserializer implements ODataDeserializer { type = ODataPropertyType.EMPTY; } + final EdmTypeInfo typeInfo = typeExpression == null ? null : + new EdmTypeInfo.Builder().setTypeExpression(typeExpression).build(); return new SimpleEntry<ODataPropertyType, EdmTypeInfo>(type, typeInfo); } + private EdmPrimitiveTypeKind guessPrimitiveTypeKind(final JsonNode node) { + return node.isShort() ? EdmPrimitiveTypeKind.Int16 : + node.isInt() ? EdmPrimitiveTypeKind.Int32 : + node.isLong() ? EdmPrimitiveTypeKind.Int64 : + node.isBoolean() ? EdmPrimitiveTypeKind.Boolean : + node.isFloat() ? EdmPrimitiveTypeKind.Single : + node.isDouble() ? EdmPrimitiveTypeKind.Double : + node.isBigDecimal() ? EdmPrimitiveTypeKind.Decimal : + EdmPrimitiveTypeKind.String; + } + protected void populate(final Annotatable annotatable, final List<Property> properties, final ObjectNode tree, final ObjectCodec codec) throws IOException, EdmPrimitiveTypeException {
