You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@olingo.apache.org by il...@apache.org on 2014/07/31 17:41:07 UTC

git commit: ContextURLParser enhancement for deep contained URIs

Repository: olingo-odata4
Updated Branches:
  refs/heads/master 29d374740 -> bf4e34d87


ContextURLParser enhancement for deep contained URIs


Project: http://git-wip-us.apache.org/repos/asf/olingo-odata4/repo
Commit: http://git-wip-us.apache.org/repos/asf/olingo-odata4/commit/bf4e34d8
Tree: http://git-wip-us.apache.org/repos/asf/olingo-odata4/tree/bf4e34d8
Diff: http://git-wip-us.apache.org/repos/asf/olingo-odata4/diff/bf4e34d8

Branch: refs/heads/master
Commit: bf4e34d879ff1c2ee91d321c3a1197335438b5dc
Parents: 29d3747
Author: Francesco Chicchiriccò <--global>
Authored: Thu Jul 31 17:40:58 2014 +0200
Committer: Francesco Chicchiriccò <--global>
Committed: Thu Jul 31 17:40:58 2014 +0200

----------------------------------------------------------------------
 .../AbstractStructuredInvocationHandler.java    |  2 +-
 .../core/serialization/AbstractODataBinder.java | 59 +++++++++++---------
 .../core/serialization/ContextURLParser.java    | 14 ++++-
 .../serialization/ContextURLParserTest.java     | 32 +++++++----
 4 files changed, 64 insertions(+), 43 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/bf4e34d8/ext/client-proxy/src/main/java/org/apache/olingo/ext/proxy/commons/AbstractStructuredInvocationHandler.java
----------------------------------------------------------------------
diff --git a/ext/client-proxy/src/main/java/org/apache/olingo/ext/proxy/commons/AbstractStructuredInvocationHandler.java b/ext/client-proxy/src/main/java/org/apache/olingo/ext/proxy/commons/AbstractStructuredInvocationHandler.java
index 168bece..6b54f02 100644
--- a/ext/client-proxy/src/main/java/org/apache/olingo/ext/proxy/commons/AbstractStructuredInvocationHandler.java
+++ b/ext/client-proxy/src/main/java/org/apache/olingo/ext/proxy/commons/AbstractStructuredInvocationHandler.java
@@ -286,7 +286,7 @@ public abstract class AbstractStructuredInvocationHandler extends AbstractInvoca
   protected Object getPropertyValue(final String name, final Type type) {
     try {
       Object res;
-      Class<?> ref = ClassUtils.getTypeClass(type);
+      final Class<?> ref = ClassUtils.getTypeClass(type);
 
       if (ref == EdmStreamValue.class) {
         if (streamedPropertyCache.containsKey(name)) {

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/bf4e34d8/lib/client-core/src/main/java/org/apache/olingo/client/core/serialization/AbstractODataBinder.java
----------------------------------------------------------------------
diff --git a/lib/client-core/src/main/java/org/apache/olingo/client/core/serialization/AbstractODataBinder.java b/lib/client-core/src/main/java/org/apache/olingo/client/core/serialization/AbstractODataBinder.java
index d3e0277..46aead4 100644
--- a/lib/client-core/src/main/java/org/apache/olingo/client/core/serialization/AbstractODataBinder.java
+++ b/lib/client-core/src/main/java/org/apache/olingo/client/core/serialization/AbstractODataBinder.java
@@ -362,42 +362,47 @@ public abstract class AbstractODataBinder implements CommonODataBinder {
   /**
    * Infer type name from various sources of information including Edm and context URL, if available.
    *
+   * @param candidateTypeName type name as provided by the service
    * @param contextURL context URL
    * @param metadataETag metadata ETag
    * @return Edm type information
    */
-  private EdmType findType(final ContextURL contextURL, final String metadataETag) {
+  private EdmType findType(final String candidateTypeName, final ContextURL contextURL, final String metadataETag) {
     EdmType type = null;
 
-    if (client instanceof EdmEnabledODataClient && contextURL != null) {
+    if (client instanceof EdmEnabledODataClient) {
       final Edm edm = ((EdmEnabledODataClient) client).getEdm(metadataETag);
-
-      if (contextURL.getDerivedEntity() == null) {
-        for (EdmSchema schema : edm.getSchemas()) {
-          final EdmEntityContainer container = schema.getEntityContainer();
-          if (container != null) {
-            final EdmEntityType entityType = findEntityType(contextURL.getEntitySetOrSingletonOrType(), container);
-
-            if (entityType != null) {
-              if (contextURL.getNavOrPropertyPath() == null) {
-                type = entityType;
-              } else {
-                final EdmNavigationProperty navProp =
-                        entityType.getNavigationProperty(contextURL.getNavOrPropertyPath());
-
-                type = navProp == null
-                        ? entityType
-                        : navProp.getType();
+      if (StringUtils.isNotBlank(candidateTypeName)) {
+        type = edm.getEntityType(new FullQualifiedName(candidateTypeName));
+      }
+      if (type == null && contextURL != null) {
+        if (contextURL.getDerivedEntity() == null) {
+          for (EdmSchema schema : edm.getSchemas()) {
+            final EdmEntityContainer container = schema.getEntityContainer();
+            if (container != null) {
+              final EdmEntityType entityType = findEntityType(contextURL.getEntitySetOrSingletonOrType(), container);
+
+              if (entityType != null) {
+                if (contextURL.getNavOrPropertyPath() == null) {
+                  type = entityType;
+                } else {
+                  final EdmNavigationProperty navProp =
+                          entityType.getNavigationProperty(contextURL.getNavOrPropertyPath());
+
+                  type = navProp == null
+                          ? entityType
+                          : navProp.getType();
+                }
               }
             }
           }
+          if (type == null) {
+            type = new EdmTypeInfo.Builder().setEdm(edm).
+                    setTypeExpression(contextURL.getEntitySetOrSingletonOrType()).build().getType();
+          }
+        } else {
+          type = edm.getEntityType(new FullQualifiedName(contextURL.getDerivedEntity()));
         }
-        if (type == null) {
-          type = new EdmTypeInfo.Builder().setEdm(edm).
-                  setTypeExpression(contextURL.getEntitySetOrSingletonOrType()).build().getType();
-        }
-      } else {
-        type = edm.getEntityType(new FullQualifiedName(contextURL.getDerivedEntity()));
       }
     }
 
@@ -420,7 +425,7 @@ public abstract class AbstractODataBinder implements CommonODataBinder {
     final URI base = resource.getContextURL() == null
             ? resource.getPayload().getBaseURI()
             : contextURL.getServiceRoot();
-    final EdmType edmType = findType(contextURL, resource.getMetadataETag());
+    final EdmType edmType = findType(resource.getPayload().getType(), contextURL, resource.getMetadataETag());
     FullQualifiedName typeName = null;
     if (resource.getPayload().getType() == null) {
       if (edmType != null) {
@@ -485,7 +490,7 @@ public abstract class AbstractODataBinder implements CommonODataBinder {
           final String propertyName, final String propertyType) {
 
     FullQualifiedName typeName = null;
-    final EdmType type = findType(contextURL, metadataETag);
+    final EdmType type = findType(null, contextURL, metadataETag);
     if (type instanceof EdmStructuredType) {
       final EdmProperty edmProperty = ((EdmStructuredType) type).getStructuralProperty(propertyName);
       if (edmProperty != null) {

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/bf4e34d8/lib/commons-core/src/main/java/org/apache/olingo/commons/core/serialization/ContextURLParser.java
----------------------------------------------------------------------
diff --git a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/serialization/ContextURLParser.java b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/serialization/ContextURLParser.java
index baba109..c7f5ca5 100644
--- a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/serialization/ContextURLParser.java
+++ b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/serialization/ContextURLParser.java
@@ -19,6 +19,8 @@
 package org.apache.olingo.commons.core.serialization;
 
 import java.net.URI;
+import java.util.ArrayList;
+import java.util.List;
 
 import org.apache.commons.lang3.StringUtils;
 import org.apache.olingo.commons.api.Constants;
@@ -36,7 +38,9 @@ public class ContextURLParser {
 
     String contextURLasString = contextURL.toASCIIString();
 
+    boolean isEntity = false;
     if (contextURLasString.endsWith("/$entity") || contextURLasString.endsWith("/@Element")) {
+      isEntity = true;
       builder.suffix(Suffix.ENTITY);
       contextURLasString = contextURLasString.replace("/$entity", StringUtils.EMPTY).
               replace("/@Element", StringUtils.EMPTY);
@@ -69,13 +73,17 @@ public class ContextURLParser {
     } else {
       final int openParIdx = rest.indexOf('(');
       if (openParIdx == -1) {
-        firstToken = StringUtils.substringBefore(rest, "/");
+        firstToken = StringUtils.substringBeforeLast(rest, "/");
 
         entitySetOrSingletonOrType = firstToken;
       } else {
-        firstToken = StringUtils.substringBeforeLast(rest, ")") + ")";
+        firstToken = isEntity ? rest : StringUtils.substringBeforeLast(rest, ")") + ")";
 
-        entitySetOrSingletonOrType = firstToken.substring(0, openParIdx);
+        final List<String> parts = new ArrayList<String>();
+        for (String split : firstToken.split("\\)/")) {
+          parts.add(split.replaceAll("\\(.*", ""));
+        }
+        entitySetOrSingletonOrType = StringUtils.join(parts, '/');
         final int commaIdx = firstToken.indexOf(',');
         if (commaIdx != -1) {
           builder.selectList(firstToken.substring(openParIdx + 1, firstToken.length() - 1));

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/bf4e34d8/lib/commons-core/src/test/java/org/apache/olingo/commons/core/serialization/ContextURLParserTest.java
----------------------------------------------------------------------
diff --git a/lib/commons-core/src/test/java/org/apache/olingo/commons/core/serialization/ContextURLParserTest.java b/lib/commons-core/src/test/java/org/apache/olingo/commons/core/serialization/ContextURLParserTest.java
index 5a16da2..1375ab2 100644
--- a/lib/commons-core/src/test/java/org/apache/olingo/commons/core/serialization/ContextURLParserTest.java
+++ b/lib/commons-core/src/test/java/org/apache/olingo/commons/core/serialization/ContextURLParserTest.java
@@ -19,7 +19,6 @@
 package org.apache.olingo.commons.core.serialization;
 
 import org.apache.olingo.commons.api.data.ContextURL;
-import org.apache.olingo.commons.core.serialization.ContextURLParser;
 import org.junit.Test;
 
 import java.net.URI;
@@ -68,10 +67,19 @@ public class ContextURLParserTest {
 
     contextURL = ContextURLParser.parse(URI.create("http://host/service/$metadata#Orders(4711)/Items/$entity"));
 
-    assertEquals("Orders", contextURL.getEntitySetOrSingletonOrType());
+    assertEquals("Orders/Items", contextURL.getEntitySetOrSingletonOrType());
     assertNull(contextURL.getDerivedEntity());
     assertNull(contextURL.getSelectList());
-    assertEquals("Items", contextURL.getNavOrPropertyPath());
+    assertNull(contextURL.getNavOrPropertyPath());
+    assertTrue(contextURL.isEntity());
+
+    contextURL = ContextURLParser.parse(
+            URI.create("http://host/service/$metadata#Users('user')/Messages('message')/Attachments/$entity"));
+
+    assertEquals("Users/Messages/Attachments", contextURL.getEntitySetOrSingletonOrType());
+    assertNull(contextURL.getDerivedEntity());
+    assertNull(contextURL.getSelectList());
+    assertNull(contextURL.getNavOrPropertyPath());
     assertTrue(contextURL.isEntity());
 
     // v3
@@ -98,7 +106,7 @@ public class ContextURLParserTest {
   @Test
   public void collectionOfDerivedEntities() {
     final ContextURL contextURL = ContextURLParser.parse(
-        URI.create("http://host/service/$metadata#Customers/Model.VipCustomer"));
+            URI.create("http://host/service/$metadata#Customers/Model.VipCustomer"));
 
     assertEquals("Customers", contextURL.getEntitySetOrSingletonOrType());
     assertEquals("Model.VipCustomer", contextURL.getDerivedEntity());
@@ -110,7 +118,7 @@ public class ContextURLParserTest {
   @Test
   public void derivedEntity() {
     final ContextURL contextURL = ContextURLParser.parse(
-        URI.create("http://host/service/$metadata#Customers/Model.VipCustomer/$entity"));
+            URI.create("http://host/service/$metadata#Customers/Model.VipCustomer/$entity"));
 
     assertEquals("Customers", contextURL.getEntitySetOrSingletonOrType());
     assertEquals("Model.VipCustomer", contextURL.getDerivedEntity());
@@ -122,7 +130,7 @@ public class ContextURLParserTest {
   @Test
   public void collectionOfProjectedEntities() {
     final ContextURL contextURL = ContextURLParser.parse(
-        URI.create("http://host/service/$metadata#Customers(Address,Orders)"));
+            URI.create("http://host/service/$metadata#Customers(Address,Orders)"));
 
     assertEquals("Customers", contextURL.getEntitySetOrSingletonOrType());
     assertNull(contextURL.getDerivedEntity());
@@ -134,7 +142,7 @@ public class ContextURLParserTest {
   @Test
   public void projectedEntity() {
     ContextURL contextURL = ContextURLParser.parse(
-        URI.create("http://host/service/$metadata#Customers(Name,Rating)/$entity"));
+            URI.create("http://host/service/$metadata#Customers(Name,Rating)/$entity"));
 
     assertEquals("Customers", contextURL.getEntitySetOrSingletonOrType());
     assertNull(contextURL.getDerivedEntity());
@@ -143,7 +151,7 @@ public class ContextURLParserTest {
     assertTrue(contextURL.isEntity());
 
     contextURL = ContextURLParser.parse(
-        URI.create("http://host/service/$metadata#Customers(Name,Address/Country)"));
+            URI.create("http://host/service/$metadata#Customers(Name,Address/Country)"));
 
     assertEquals("Customers", contextURL.getEntitySetOrSingletonOrType());
     assertNull(contextURL.getDerivedEntity());
@@ -155,8 +163,8 @@ public class ContextURLParserTest {
   @Test
   public void collectionOfProjectedExpandedEntities() {
     final ContextURL contextURL = ContextURLParser.parse(
-        URI.create("http://host/service/$metadata#Employees/"
-            + "Sales.Manager(DirectReports,DirectReports+(FirstName,LastName))"));
+            URI.create("http://host/service/$metadata#Employees/"
+                    + "Sales.Manager(DirectReports,DirectReports+(FirstName,LastName))"));
 
     assertEquals("Employees", contextURL.getEntitySetOrSingletonOrType());
     assertEquals("Sales.Manager", contextURL.getDerivedEntity());
@@ -168,7 +176,7 @@ public class ContextURLParserTest {
   @Test
   public void propertyValue() {
     final ContextURL contextURL = ContextURLParser.parse(
-        URI.create("http://host/service/$metadata#Customers(1)/Addresses"));
+            URI.create("http://host/service/$metadata#Customers(1)/Addresses"));
 
     assertEquals("Customers", contextURL.getEntitySetOrSingletonOrType());
     assertNull(contextURL.getDerivedEntity());
@@ -180,7 +188,7 @@ public class ContextURLParserTest {
   @Test
   public void CollectionOfComplexOrPrimitiveTypes() {
     final ContextURL contextURL = ContextURLParser.parse(
-        URI.create("http://host/service/$metadata#Collection(Edm.String)"));
+            URI.create("http://host/service/$metadata#Collection(Edm.String)"));
 
     assertEquals("Collection(Edm.String)", contextURL.getEntitySetOrSingletonOrType());
     assertNull(contextURL.getDerivedEntity());