Repository: olingo-odata4
Updated Branches:
  refs/heads/master 891421d7f -> 36e45f021


[OLINGO-1101] Casting Types to Derived Types


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

Branch: refs/heads/master
Commit: 36e45f021935469b77f373cd0db0edba743ae9ef
Parents: 891421d
Author: ramya vasanth <ramya.vasa...@sap.com>
Authored: Thu Jun 22 15:00:24 2017 +0530
Committer: ramya vasanth <ramya.vasa...@sap.com>
Committed: Thu Jun 22 15:00:24 2017 +0530

----------------------------------------------------------------------
 .../olingo/fit/tecsvc/http/BasicHttpITCase.java | 82 ++++++++++++++++++++
 .../serializer/json/ODataJsonSerializer.java    | 36 ++++++++-
 .../core/serializer/xml/ODataXmlSerializer.java | 15 +++-
 .../olingo/server/core/uri/parser/Parser.java   | 16 ++--
 .../TechnicalPrimitiveComplexProcessor.java     | 16 +++-
 .../tecsvc/processor/TechnicalProcessor.java    | 36 +++++++--
 .../json/ODataJsonSerializerTest.java           | 64 +++++++++++++++
 7 files changed, 245 insertions(+), 20 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/36e45f02/fit/src/test/java/org/apache/olingo/fit/tecsvc/http/BasicHttpITCase.java
----------------------------------------------------------------------
diff --git 
a/fit/src/test/java/org/apache/olingo/fit/tecsvc/http/BasicHttpITCase.java 
b/fit/src/test/java/org/apache/olingo/fit/tecsvc/http/BasicHttpITCase.java
index 775fd30..6d1bf78 100644
--- a/fit/src/test/java/org/apache/olingo/fit/tecsvc/http/BasicHttpITCase.java
+++ b/fit/src/test/java/org/apache/olingo/fit/tecsvc/http/BasicHttpITCase.java
@@ -206,4 +206,86 @@ public class BasicHttpITCase extends 
AbstractBaseTestITCase {
     assertTrue(IOUtils.toString(connection.getErrorStream()).
         contains("The system query option '$skip' has the not-allowed value 
''."));
   }
+  
+  @Test
+  public void testBaseTypeDerivedTypeCasting1() throws Exception {
+    URL url = new URL(SERVICE_URI + 
"ESTwoPrim(111)/olingo.odata.test1.ETBase");
+
+    HttpURLConnection connection = (HttpURLConnection) url.openConnection();
+    connection.setRequestMethod(HttpMethod.GET.name());
+    connection.setRequestProperty(HttpHeader.ACCEPT, 
"application/json;odata.metadata=full");
+    connection.connect();
+
+    assertEquals(HttpStatusCode.OK.getStatusCode(), 
connection.getResponseCode());
+    final String content = IOUtils.toString(connection.getInputStream());
+
+    assertTrue(content.contains("\"PropertyInt16\":111"));
+    assertTrue(content.contains("\"PropertyString\":\"TEST A\""));
+    assertTrue(content.contains("\"AdditionalPropertyString_5\":\"TEST A 
0815\""));
+    
assertTrue(content.contains("\"@odata.type\":\"#olingo.odata.test1.ETBase\""));
+  }
+  
+  @Test
+  public void testBaseTypeDerivedTypeCasting2() throws Exception {
+    URL url = new URL(SERVICE_URI + 
"ESTwoPrim(111)/olingo.odata.test1.ETBase/AdditionalPropertyString_5");
+
+    HttpURLConnection connection = (HttpURLConnection) url.openConnection();
+    connection.setRequestMethod(HttpMethod.GET.name());
+    connection.setRequestProperty(HttpHeader.ACCEPT, "application/json");
+    connection.connect();
+
+    assertEquals(HttpStatusCode.OK.getStatusCode(), 
connection.getResponseCode());
+    final String content = IOUtils.toString(connection.getInputStream());
+    assertTrue(content.contains("\"TEST A 0815\""));
+  }
+  
+  @Test
+  public void testBaseTypeDerivedTypeCasting3() throws Exception {
+    URL url = new URL(SERVICE_URI + 
"ESTwoPrim(32766)/olingo.odata.test1.ETTwoPrim");
+
+    HttpURLConnection connection = (HttpURLConnection) url.openConnection();
+    connection.setRequestMethod(HttpMethod.GET.name());
+    connection.setRequestProperty(HttpHeader.ACCEPT, 
"application/json;odata.metadata=full");
+    connection.connect();
+
+    assertEquals(HttpStatusCode.OK.getStatusCode(), 
connection.getResponseCode());
+    final String content = IOUtils.toString(connection.getInputStream());
+
+    assertTrue(content.contains("\"PropertyInt16\":32766"));
+    assertTrue(content.contains("\"PropertyString\":\"Test String1\""));
+    
assertTrue(content.contains("\"@odata.type\":\"#olingo.odata.test1.ETTwoPrim\""));
+  }
+  
+  @Test
+  public void testBaseTypeDerivedTypeCastingException() throws Exception {
+    URL url = new URL(SERVICE_URI + 
"ESBase(111)/olingo.odata.test1.ETTwoPrim");
+
+    HttpURLConnection connection = (HttpURLConnection) url.openConnection();
+    connection.setRequestMethod(HttpMethod.GET.name());
+    connection.setRequestProperty(HttpHeader.ACCEPT, 
"application/json;odata.metadata=full");
+    connection.connect();
+
+    assertEquals(HttpStatusCode.BAD_REQUEST.getStatusCode(), 
connection.getResponseCode());
+    final String content = IOUtils.toString(connection.getErrorStream());
+
+    assertTrue(content.contains("The type filter 
'olingo.odata.test1.ETTwoPrim' is incompatible."));
+  }
+  
+  @Test
+  public void testBaseTypeDerivedComplexTypeCasting1() throws Exception {
+    URL url = new URL(SERVICE_URI + 
"ESMixPrimCollComp(32767)/PropertyComp/olingo.odata.test1.CTBase");
+
+    HttpURLConnection connection = (HttpURLConnection) url.openConnection();
+    connection.setRequestMethod(HttpMethod.GET.name());
+    connection.setRequestProperty(HttpHeader.ACCEPT, 
"application/json;odata.metadata=full");
+    connection.connect();
+
+    assertEquals(HttpStatusCode.OK.getStatusCode(), 
connection.getResponseCode());
+    final String content = IOUtils.toString(connection.getInputStream());
+
+    assertTrue(content.contains("\"PropertyInt16\":111"));
+    assertTrue(content.contains("\"PropertyString\":\"TEST A\""));
+    assertTrue(content.contains("\"AdditionalPropString\":null"));
+    
assertTrue(content.contains("\"@odata.type\":\"#olingo.odata.test1.CTBase\""));
+  }
 }

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/36e45f02/lib/server-core/src/main/java/org/apache/olingo/server/core/serializer/json/ODataJsonSerializer.java
----------------------------------------------------------------------
diff --git 
a/lib/server-core/src/main/java/org/apache/olingo/server/core/serializer/json/ODataJsonSerializer.java
 
b/lib/server-core/src/main/java/org/apache/olingo/server/core/serializer/json/ODataJsonSerializer.java
index 518b5cc..d48c413 100644
--- 
a/lib/server-core/src/main/java/org/apache/olingo/server/core/serializer/json/ODataJsonSerializer.java
+++ 
b/lib/server-core/src/main/java/org/apache/olingo/server/core/serializer/json/ODataJsonSerializer.java
@@ -702,9 +702,23 @@ public class ODataJsonSerializer extends 
AbstractODataSerializer {
           throws IOException, SerializerException{
         json.writeStartObject();        
         String derivedName = property.getType();
-        final EdmComplexType resolvedType = resolveComplexType(metadata, type, 
derivedName);
+        EdmComplexType resolvedType = null;
+        if (!type.getFullQualifiedName().getFullQualifiedNameAsString().
+            equals(derivedName)) {
+          if (type.getBaseType() != null && 
+              
type.getBaseType().getFullQualifiedName().getFullQualifiedNameAsString().
+              equals(derivedName)) {
+            resolvedType = resolveComplexType(metadata, type.getBaseType(), 
+                type.getFullQualifiedName().getFullQualifiedNameAsString());
+          } else {
+            resolvedType = resolveComplexType(metadata, type, derivedName);
+          }
+        } else {
+          resolvedType = resolveComplexType(metadata, type, derivedName);
+        }
         if (!isODataMetadataNone && !resolvedType.equals(type) || 
isODataMetadataFull) {
-           json.writeStringField(Constants.JSON_TYPE, "#" + 
property.getType());
+           json.writeStringField(Constants.JSON_TYPE, "#" + 
+        resolvedType.getFullQualifiedName().getFullQualifiedNameAsString());
         }          
         writeComplexValue(metadata, resolvedType, 
property.asComplex().getValue(), selectedPaths,
              json);
@@ -1000,9 +1014,23 @@ public class ODataJsonSerializer extends 
AbstractODataSerializer {
       json.writeStartObject();
       writeContextURL(contextURL, json);
       writeMetadataETag(metadata, json);      
-      final EdmComplexType resolvedType = resolveComplexType(metadata, type, 
property.getType());
+      EdmComplexType resolvedType = null;
+      if (!type.getFullQualifiedName().getFullQualifiedNameAsString().
+          equals(property.getType())) {
+        if (type.getBaseType() != null && 
+            
type.getBaseType().getFullQualifiedName().getFullQualifiedNameAsString().
+            equals(property.getType())) {
+          resolvedType = resolveComplexType(metadata, type.getBaseType(), 
+              type.getFullQualifiedName().getFullQualifiedNameAsString());
+        } else {
+          resolvedType = resolveComplexType(metadata, type, 
property.getType());
+        }
+      } else {
+        resolvedType = resolveComplexType(metadata, type, property.getType());
+      }
       if (!isODataMetadataNone && !resolvedType.equals(type) || 
isODataMetadataFull) {
-        json.writeStringField(Constants.JSON_TYPE, "#" + property.getType());
+        json.writeStringField(Constants.JSON_TYPE, "#" + 
+      resolvedType.getFullQualifiedName().getFullQualifiedNameAsString());
       }
       writeOperations(property.getOperations(), json);      
       final List<Property> values =

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/36e45f02/lib/server-core/src/main/java/org/apache/olingo/server/core/serializer/xml/ODataXmlSerializer.java
----------------------------------------------------------------------
diff --git 
a/lib/server-core/src/main/java/org/apache/olingo/server/core/serializer/xml/ODataXmlSerializer.java
 
b/lib/server-core/src/main/java/org/apache/olingo/server/core/serializer/xml/ODataXmlSerializer.java
index b66c755..0555285 100644
--- 
a/lib/server-core/src/main/java/org/apache/olingo/server/core/serializer/xml/ODataXmlSerializer.java
+++ 
b/lib/server-core/src/main/java/org/apache/olingo/server/core/serializer/xml/ODataXmlSerializer.java
@@ -1041,7 +1041,20 @@ public class ODataXmlSerializer extends 
AbstractODataSerializer {
     OutputStream outputStream = null;
     SerializerException cachedException = null;
     try {
-      EdmComplexType resolvedType = resolveComplexType(metadata, type, 
property.getType());
+      EdmComplexType resolvedType = null;
+      if (!type.getFullQualifiedName().getFullQualifiedNameAsString().
+          equals(property.getType())) {
+        if (type.getBaseType() != null && 
+            
type.getBaseType().getFullQualifiedName().getFullQualifiedNameAsString().
+            equals(property.getType())) {
+          resolvedType = resolveComplexType(metadata, type.getBaseType(), 
+              type.getFullQualifiedName().getFullQualifiedNameAsString());
+        } else {
+          resolvedType = resolveComplexType(metadata, type, 
property.getType());
+        }
+      } else {
+        resolvedType = resolveComplexType(metadata, type, property.getType());
+      }
       CircleStreamBuffer buffer = new CircleStreamBuffer();
       outputStream = buffer.getOutputStream();
       XMLStreamWriter writer = 
XMLOutputFactory.newInstance().createXMLStreamWriter(outputStream, 
DEFAULT_CHARSET);

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/36e45f02/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/parser/Parser.java
----------------------------------------------------------------------
diff --git 
a/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/parser/Parser.java
 
b/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/parser/Parser.java
index 0ce8c75..087aec1 100644
--- 
a/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/parser/Parser.java
+++ 
b/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/parser/Parser.java
@@ -33,6 +33,7 @@ import org.apache.olingo.server.api.uri.UriInfoKind;
 import org.apache.olingo.server.api.uri.UriResource;
 import org.apache.olingo.server.api.uri.UriResourceAction;
 import org.apache.olingo.server.api.uri.UriResourceCount;
+import org.apache.olingo.server.api.uri.UriResourceEntitySet;
 import org.apache.olingo.server.api.uri.UriResourceFunction;
 import org.apache.olingo.server.api.uri.UriResourcePartTyped;
 import org.apache.olingo.server.api.uri.UriResourceRef;
@@ -255,11 +256,16 @@ public class Parser {
       if (lastSegment instanceof UriResourcePartTyped) {
         final UriResourcePartTyped typed = (UriResourcePartTyped) lastSegment;
         contextType = ParserHelper.getTypeInformation(typed);
-        if (contextUriInfo.getIdOption() != null && contextType != null) {
-          if (contextType instanceof EdmEntityType) {
-            contextUriInfo.setEntityTypeCast((EdmEntityType) contextType);
-          }
-        }
+        if (contextType != null) {
+          if ((lastSegment instanceof UriResourceEntitySet && 
+              (((UriResourceEntitySet) 
lastSegment).getTypeFilterOnCollection() != null 
+              || ((UriResourceEntitySet) lastSegment).getTypeFilterOnEntry() 
!= null)) 
+          || contextUriInfo.getIdOption() != null) {
+            if (contextType instanceof EdmEntityType) {
+              contextUriInfo.setEntityTypeCast((EdmEntityType) contextType);
+            }
+           }
+         }
         contextIsCollection = typed.isCollection();
       }
     }

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/36e45f02/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/processor/TechnicalPrimitiveComplexProcessor.java
----------------------------------------------------------------------
diff --git 
a/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/processor/TechnicalPrimitiveComplexProcessor.java
 
b/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/processor/TechnicalPrimitiveComplexProcessor.java
index f97b7eb..6930d07 100644
--- 
a/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/processor/TechnicalPrimitiveComplexProcessor.java
+++ 
b/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/processor/TechnicalPrimitiveComplexProcessor.java
@@ -68,6 +68,7 @@ import org.apache.olingo.server.api.uri.UriHelper;
 import org.apache.olingo.server.api.uri.UriInfo;
 import org.apache.olingo.server.api.uri.UriInfoResource;
 import org.apache.olingo.server.api.uri.UriResource;
+import org.apache.olingo.server.api.uri.UriResourceComplexProperty;
 import org.apache.olingo.server.api.uri.UriResourceFunction;
 import org.apache.olingo.server.api.uri.UriResourceKind;
 import org.apache.olingo.server.api.uri.UriResourceProperty;
@@ -246,9 +247,18 @@ public class TechnicalPrimitiveComplexProcessor extends 
TechnicalProcessor
         } else {
           final EdmProperty edmProperty = path.isEmpty() ? null :
               ((UriResourceProperty) resourceParts.get(resourceParts.size() - 
trailing - 1)).getProperty();
-          final EdmType type = edmProperty == null ?
-              ((UriResourceFunction) resourceParts.get(0)).getType() :
-              edmProperty.getType();
+          EdmType type = null;
+          if (resourceParts.get(resourceParts.size() - trailing - 1) 
+             instanceof UriResourceComplexProperty &&
+              
((UriResourceComplexProperty)resourceParts.get(resourceParts.size() - trailing 
- 1)).
+              getComplexTypeFilter() != null) {
+            type = 
((UriResourceComplexProperty)resourceParts.get(resourceParts.size() - trailing 
- 1)).
+                getComplexTypeFilter();
+          } else {
+            type = edmProperty == null ?
+                ((UriResourceFunction) resourceParts.get(0)).getType() :
+                edmProperty.getType();
+          }
           final EdmReturnType returnType = resourceParts.get(0) instanceof 
UriResourceFunction ?
               ((UriResourceFunction) 
resourceParts.get(0)).getFunction().getReturnType() : null;
 

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/36e45f02/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/processor/TechnicalProcessor.java
----------------------------------------------------------------------
diff --git 
a/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/processor/TechnicalProcessor.java
 
b/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/processor/TechnicalProcessor.java
index fc6991f..2a6f072 100644
--- 
a/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/processor/TechnicalProcessor.java
+++ 
b/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/processor/TechnicalProcessor.java
@@ -25,6 +25,7 @@ import org.apache.olingo.commons.api.data.Entity;
 import org.apache.olingo.commons.api.data.EntityCollection;
 import org.apache.olingo.commons.api.data.Link;
 import org.apache.olingo.commons.api.edm.EdmBindingTarget;
+import org.apache.olingo.commons.api.edm.EdmEntityContainer;
 import org.apache.olingo.commons.api.edm.EdmEntitySet;
 import org.apache.olingo.commons.api.edm.EdmEntityType;
 import org.apache.olingo.commons.api.edm.EdmFunction;
@@ -79,7 +80,7 @@ public abstract class TechnicalProcessor implements Processor 
{
     // First must be an entity, an entity collection, a function import, or an 
action import.
     blockTypeFilters(resourcePaths.get(0));
     if (resourcePaths.get(0) instanceof UriResourceEntitySet) {
-      entitySet = ((UriResourceEntitySet) resourcePaths.get(0)).getEntitySet();
+      entitySet = 
getEntitySetBasedOnTypeCast(((UriResourceEntitySet)resourcePaths.get(0)));
     } else if (resourcePaths.get(0) instanceof UriResourceFunction) {
       entitySet = ((UriResourceFunction) 
resourcePaths.get(0)).getFunctionImport().getReturnedEntitySet();
     } else if (resourcePaths.get(0) instanceof UriResourceAction) {
@@ -143,7 +144,8 @@ public abstract class TechnicalProcessor implements 
Processor {
     Entity entity = null;
     if (resourcePaths.get(0) instanceof UriResourceEntitySet) {
       final UriResourceEntitySet uriResource = (UriResourceEntitySet) 
resourcePaths.get(0);
-      entity = dataProvider.read(uriResource.getEntitySet(), 
uriResource.getKeyPredicates());
+      EdmEntitySet entitySet = getEntitySetBasedOnTypeCast(uriResource);
+      entity = dataProvider.read(entitySet, uriResource.getKeyPredicates());
     }else if (resourcePaths.get(0) instanceof UriResourceSingleton) {
       final UriResourceSingleton uriResource = (UriResourceSingleton) 
resourcePaths.get(0);
       entity = dataProvider.read( uriResource.getSingleton());
@@ -205,6 +207,28 @@ public abstract class TechnicalProcessor implements 
Processor {
     return entity;
   }
 
+  protected EdmEntitySet getEntitySetBasedOnTypeCast(UriResourceEntitySet 
uriResource) {
+    EdmEntitySet entitySet = null;
+    EdmEntityContainer container = 
this.serviceMetadata.getEdm().getEntityContainer();
+    if (uriResource.getTypeFilterOnEntry() != null ||
+        uriResource.getTypeFilterOnCollection() != null) {
+      List<EdmEntitySet> entitySets = container.getEntitySets();
+      for (EdmEntitySet entitySet1 : entitySets) {
+        EdmEntityType entityType = entitySet1.getEntityType();
+        if ((uriResource.getTypeFilterOnEntry() != null && 
+            
entityType.getName().equalsIgnoreCase(uriResource.getTypeFilterOnEntry().getName()))
 ||
+            (uriResource.getTypeFilterOnCollection() != null && 
+            
entityType.getName().equalsIgnoreCase(uriResource.getTypeFilterOnCollection().getName())))
 {
+          entitySet = entitySet1;
+          break;
+        }
+      }
+    } else {
+      entitySet = uriResource.getEntitySet();
+    }
+    return entitySet;
+  }
+  
   protected EntityCollection readEntityCollection(final UriInfoResource 
uriInfo) throws ODataApplicationException {
     final List<UriResource> resourcePaths = uriInfo.getUriResourceParts();
     if (resourcePaths.size() > 1 && resourcePaths.get(1) instanceof 
UriResourceNavigation) {
@@ -217,7 +241,8 @@ public abstract class TechnicalProcessor implements 
Processor {
         return 
dataProvider.readFunctionEntityCollection(uriResource.getFunction(), 
uriResource.getParameters(),
             uriInfo);
       } else {
-        return dataProvider.readAll(((UriResourceEntitySet) 
resourcePaths.get(0)).getEntitySet());
+        EdmEntitySet entitySet = 
getEntitySetBasedOnTypeCast(((UriResourceEntitySet)resourcePaths.get(0)));
+        return dataProvider.readAll(entitySet);
       }
     }
   }
@@ -235,10 +260,7 @@ public abstract class TechnicalProcessor implements 
Processor {
   }
 
   private void blockTypeFilters(final UriResource uriResource) throws 
ODataApplicationException {
-    if (uriResource instanceof UriResourceEntitySet
-        && (((UriResourceEntitySet) uriResource).getTypeFilterOnCollection() 
!= null
-        || ((UriResourceEntitySet) uriResource).getTypeFilterOnEntry() != null)
-        || uriResource instanceof UriResourceFunction
+    if (uriResource instanceof UriResourceFunction
         && (((UriResourceFunction) uriResource).getTypeFilterOnCollection() != 
null
         || ((UriResourceFunction) uriResource).getTypeFilterOnEntry() != null)
         || uriResource instanceof UriResourceNavigation

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/36e45f02/lib/server-test/src/test/java/org/apache/olingo/server/core/serializer/json/ODataJsonSerializerTest.java
----------------------------------------------------------------------
diff --git 
a/lib/server-test/src/test/java/org/apache/olingo/server/core/serializer/json/ODataJsonSerializerTest.java
 
b/lib/server-test/src/test/java/org/apache/olingo/server/core/serializer/json/ODataJsonSerializerTest.java
index 4ce1768..378cb51 100644
--- 
a/lib/server-test/src/test/java/org/apache/olingo/server/core/serializer/json/ODataJsonSerializerTest.java
+++ 
b/lib/server-test/src/test/java/org/apache/olingo/server/core/serializer/json/ODataJsonSerializerTest.java
@@ -49,6 +49,7 @@ import org.apache.olingo.commons.api.edm.EdmEntityType;
 import org.apache.olingo.commons.api.edm.EdmPrimitiveType;
 import org.apache.olingo.commons.api.edm.EdmPrimitiveTypeKind;
 import org.apache.olingo.commons.api.edm.EdmProperty;
+import org.apache.olingo.commons.api.edm.FullQualifiedName;
 import org.apache.olingo.commons.api.edm.geo.Point;
 import org.apache.olingo.commons.api.edm.geo.Polygon;
 import org.apache.olingo.commons.api.edm.geo.SRID;
@@ -2321,4 +2322,67 @@ public class ODataJsonSerializerTest {
        "}"; 
     Assert.assertEquals(expected, resultString);
   }
+  
+  @Test
+  public void deriveComplexProperty() throws Exception {
+    final EdmEntitySet edmEntitySet = 
entityContainer.getEntitySet("ESMixPrimCollComp");
+    EdmComplexType derivedComplexType = mockComplexType();
+    final EdmProperty edmProperty = (EdmProperty) 
edmEntitySet.getEntityType().getProperty("PropertyComp");
+    final Property property = 
data.readAll(edmEntitySet).getEntities().get(0).getProperty("PropertyComp");
+
+    final String resultString = IOUtils.toString(serializer
+        .complex(metadata, derivedComplexType, property,
+            ComplexSerializerOptions.with()
+                .contextURL(ContextURL.with()
+                    
.entitySet(edmEntitySet).keyPath("32767").navOrPropertyPath(edmProperty.getName()
 
+                        + "/olingo.odata.test1.CTBase")
+                    .build())
+                .build()).getContent());
+    
Assert.assertEquals("{\"@odata.context\":\"$metadata#ESMixPrimCollComp(32767)/"
+        + "PropertyComp/olingo.odata.test1.CTBase\","
+        + "\"@odata.metadataEtag\":\"W/\\\"metadataETag\\\"\","
+        + "\"@odata.type\":\"#olingo.odata.test1.CTBase\","
+        + "\"AdditionalPropertyString\":null,"
+        + "\"PropertyInt16\":111,"
+        + "\"PropertyString\":\"TEST A\"}",
+        resultString);
+  }
+
+  private EdmComplexType mockComplexType() {
+    EdmProperty property1 = Mockito.mock(EdmProperty.class);
+    final String name1 = "AdditionalPropertyString";
+    Mockito.when(property1.getName()).thenReturn(name1);
+    Mockito.when(property1.isNullable()).thenReturn(true);
+    
Mockito.when(property1.getType()).thenReturn(odata.createPrimitiveTypeInstance(EdmPrimitiveTypeKind.String));
+    Mockito.when(property1.isPrimitive()).thenReturn(true);
+    
+    EdmProperty property2 = Mockito.mock(EdmProperty.class);
+    final String name2 = "PropertyInt16";
+    Mockito.when(property2.getName()).thenReturn(name2);
+    Mockito.when(property2.isNullable()).thenReturn(false);
+    
Mockito.when(property2.getType()).thenReturn(odata.createPrimitiveTypeInstance(EdmPrimitiveTypeKind.Int16));
+    Mockito.when(property2.isPrimitive()).thenReturn(true);
+    
+    EdmProperty property3 = Mockito.mock(EdmProperty.class);
+    final String name3 = "PropertyString";
+    Mockito.when(property3.getName()).thenReturn(name3);
+    Mockito.when(property3.isNullable()).thenReturn(false);
+    Mockito.when(property3.getMaxLength()).thenReturn(50);
+    
Mockito.when(property3.getType()).thenReturn(odata.createPrimitiveTypeInstance(EdmPrimitiveTypeKind.String));
+    Mockito.when(property3.isPrimitive()).thenReturn(true);
+    
+    EdmComplexType complexType = Mockito.mock(EdmComplexType.class);
+    
Mockito.when(complexType.getPropertyNames()).thenReturn(Arrays.asList(name1, 
name2, name3));
+    
Mockito.when(complexType.getStructuralProperty(name1)).thenReturn(property1);
+    
Mockito.when(complexType.getStructuralProperty(name2)).thenReturn(property2);
+    
Mockito.when(complexType.getStructuralProperty(name3)).thenReturn(property3);
+    EdmComplexType baseComplexType = metadata.getEdm().getComplexType(
+        new FullQualifiedName("olingo.odata.test1.CTTwoPrim"));
+    Mockito.when(complexType.getBaseType()).thenReturn(baseComplexType);
+    Mockito.when(complexType.getFullQualifiedName()).thenReturn(
+        new FullQualifiedName("olingo.odata.test1.CTBase"));
+    Mockito.when(complexType.getName()).thenReturn("CTBase");
+    Mockito.when(complexType.getNamespace()).thenReturn("olingo.odata.test1");
+    return complexType;
+  }  
 }

Reply via email to