You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@olingo.apache.org by mi...@apache.org on 2014/10/20 06:38:11 UTC

git commit: [OLINGO-422] type guessing in client deserializer also for collections

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 <mi...@sap.com>


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 <kl...@sap.com>
Authored: Fri Oct 17 09:15:48 2014 +0200
Committer: Michael Bolz <mi...@sap.com>
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 {