You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@olingo.apache.org by ch...@apache.org on 2014/04/01 16:47:21 UTC

[1/9] [OLINGO-168] Refactor Tech Provider

Repository: olingo-odata4
Updated Branches:
  refs/heads/olingo168 6fdfc458b -> 6a3a4a1d7


http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/59ef14f4/lib/server-core/src/test/java/org/apache/olingo/server/core/uri/antlr/TestUriParserImpl.java
----------------------------------------------------------------------
diff --git a/lib/server-core/src/test/java/org/apache/olingo/server/core/uri/antlr/TestUriParserImpl.java b/lib/server-core/src/test/java/org/apache/olingo/server/core/uri/antlr/TestUriParserImpl.java
index 64ac50e..ab0b1d3 100644
--- a/lib/server-core/src/test/java/org/apache/olingo/server/core/uri/antlr/TestUriParserImpl.java
+++ b/lib/server-core/src/test/java/org/apache/olingo/server/core/uri/antlr/TestUriParserImpl.java
@@ -28,8 +28,10 @@ import org.apache.olingo.server.api.uri.UriInfoKind;
 import org.apache.olingo.server.api.uri.UriResourceKind;
 import org.apache.olingo.server.api.uri.queryoption.expression.MethodKind;
 import org.apache.olingo.server.core.edm.provider.EdmProviderImpl;
-import org.apache.olingo.server.core.testutil.EdmTechProvider;
 import org.apache.olingo.server.core.testutil.EdmTechTestProvider;
+import org.apache.olingo.server.core.testutil.techprovider.ComplexTypeProvider;
+import org.apache.olingo.server.core.testutil.techprovider.EntityTypeProvider;
+import org.apache.olingo.server.core.testutil.techprovider.PropertyProvider;
 import org.apache.olingo.server.core.uri.parser.UriParserException;
 import org.apache.olingo.server.core.uri.testutil.FilterValidator;
 import org.apache.olingo.server.core.uri.testutil.ResourceValidator;
@@ -104,57 +106,57 @@ public class TestUriParserImpl {
     testRes.run("ESTwoKeyNav/com.sap.odata.test1.BFCESTwoKeyNavRTString()")
         .at(0)
         .isUriPathInfoKind(UriResourceKind.entitySet)
-        .isType(EdmTechProvider.nameETTwoKeyNav, true)
+        .isType(EntityTypeProvider.nameETTwoKeyNav, true)
         .at(1)
         .isUriPathInfoKind(UriResourceKind.function)
-        .isType(EdmTechProvider.nameString, false);
+        .isType(PropertyProvider.nameString, false);
 
     // returning collection of primitive
     testRes.run("ESTwoKeyNav/com.sap.odata.test1.BFCESTwoKeyNavRTCollString()")
         .at(0)
         .isUriPathInfoKind(UriResourceKind.entitySet)
-        .isType(EdmTechProvider.nameETTwoKeyNav, true)
+        .isType(EntityTypeProvider.nameETTwoKeyNav, true)
         .at(1)
         .isUriPathInfoKind(UriResourceKind.function)
-        .isType(EdmTechProvider.nameString, true);
+        .isType(PropertyProvider.nameString, true);
 
     // returning single complex
     testRes.run("ESTwoKeyNav/com.sap.odata.test1.BFCESTwoKeyNavRTCTTwoPrim()")
         .at(0)
         .isUriPathInfoKind(UriResourceKind.entitySet)
-        .isType(EdmTechProvider.nameETTwoKeyNav, true)
+        .isType(EntityTypeProvider.nameETTwoKeyNav, true)
         .at(1)
         .isUriPathInfoKind(UriResourceKind.function)
-        .isType(EdmTechProvider.nameCTTwoPrim, false);
+        .isType(ComplexTypeProvider.nameCTTwoPrim, false);
 
     // returning collection of complex
     testRes.run("ESTwoKeyNav/com.sap.odata.test1.BFCESTwoKeyNavRTCollCTTwoPrim()")
         .at(0)
         .isUriPathInfoKind(UriResourceKind.entitySet)
-        .isType(EdmTechProvider.nameETTwoKeyNav, true)
+        .isType(EntityTypeProvider.nameETTwoKeyNav, true)
         .at(1)
         .isUriPathInfoKind(UriResourceKind.function)
-        .isType(EdmTechProvider.nameCTTwoPrim, true);
+        .isType(ComplexTypeProvider.nameCTTwoPrim, true);
 
     // returning single entity
     testRes.run(
         esTwoKeyNav + "/com.sap.odata.test1.ETBaseTwoKeyNav/com.sap.odata.test1.BFCETBaseTwoKeyNavRTETTwoKeyNav()")
         .at(0)
         .isUriPathInfoKind(UriResourceKind.entitySet)
-        .isType(EdmTechProvider.nameETTwoKeyNav, false)
-        .isTypeFilterOnEntry(EdmTechProvider.nameETBaseTwoKeyNav)
+        .isType(EntityTypeProvider.nameETTwoKeyNav, false)
+        .isTypeFilterOnEntry(EntityTypeProvider.nameETBaseTwoKeyNav)
         .at(1)
         .isUriPathInfoKind(UriResourceKind.function)
-        .isType(EdmTechProvider.nameETTwoKeyNav, false);
+        .isType(EntityTypeProvider.nameETTwoKeyNav, false);
 
     // returning collection of entity (aka entitySet)
     testRes.run(esTwoKeyNav + "/com.sap.odata.test1.BFCSINavRTESTwoKeyNav()")
         .at(0)
         .isUriPathInfoKind(UriResourceKind.entitySet)
-        .isType(EdmTechProvider.nameETTwoKeyNav, false)
+        .isType(EntityTypeProvider.nameETTwoKeyNav, false)
         .at(1)
         .isUriPathInfoKind(UriResourceKind.function)
-        .isType(EdmTechProvider.nameETTwoKeyNav, true);
+        .isType(EntityTypeProvider.nameETTwoKeyNav, true);
   }
 
   @Test
@@ -164,31 +166,31 @@ public class TestUriParserImpl {
         .first()
         .isActionImport("AIRTPrimParam")
         .isAction("UARTPrimParam")
-        .isType(EdmTechProvider.nameString, false);
+        .isType(PropertyProvider.nameString, false);
 
     testRes.run("AIRTPrimCollParam").isKind(UriInfoKind.resource)
         .first()
         .isActionImport("AIRTPrimCollParam")
         .isAction("UARTPrimCollParam")
-        .isType(EdmTechProvider.nameString, true);
+        .isType(PropertyProvider.nameString, true);
 
     testRes.run("AIRTCompParam").isKind(UriInfoKind.resource)
         .first()
         .isActionImport("AIRTCompParam")
         .isAction("UARTCompParam")
-        .isType(EdmTechProvider.nameCTTwoPrim, false);
+        .isType(ComplexTypeProvider.nameCTTwoPrim, false);
 
     testRes.run("AIRTCompCollParam").isKind(UriInfoKind.resource)
         .first()
         .isActionImport("AIRTCompCollParam")
         .isAction("UARTCompCollParam")
-        .isType(EdmTechProvider.nameCTTwoPrim, true);
+        .isType(ComplexTypeProvider.nameCTTwoPrim, true);
 
     testRes.run("AIRTETParam").isKind(UriInfoKind.resource)
         .first()
         .isActionImport("AIRTETParam")
         .isAction("UARTETParam")
-        .isType(EdmTechProvider.nameETTwoKeyTwoPrim, false);
+        .isType(EntityTypeProvider.nameETTwoKeyTwoPrim, false);
 
     testUri.runEx("AIRTPrimParam/invalidElement").isExSemantic(0);
   }
@@ -200,23 +202,23 @@ public class TestUriParserImpl {
     testRes.run("ESAllPrim/$count")
         .at(0)
         .isUriPathInfoKind(UriResourceKind.entitySet)
-        .isType(EdmTechProvider.nameETAllPrim, true)
+        .isType(EntityTypeProvider.nameETAllPrim, true)
         .at(1)
         .isUriPathInfoKind(UriResourceKind.count);
 
     // count on collection of complex
     testRes.run("ESKeyNav(1)/CollPropertyComplex/$count")
         .at(0)
-        .isType(EdmTechProvider.nameETKeyNav)
+        .isType(EntityTypeProvider.nameETKeyNav)
         .at(1)
-        .isType(EdmTechProvider.nameCTPrimComp, true)
+        .isType(ComplexTypeProvider.nameCTPrimComp, true)
         .at(2)
         .isUriPathInfoKind(UriResourceKind.count);
 
     // count on collection of primitive
     testRes.run("ESCollAllPrim(1)/CollPropertyString/$count")
         .at(1)
-        .isType(EdmTechProvider.nameString, true)
+        .isType(PropertyProvider.nameString, true)
         .at(2)
         .isUriPathInfoKind(UriResourceKind.count);
   }
@@ -269,7 +271,7 @@ public class TestUriParserImpl {
 
     // simple entity set; with qualifiedentityTypeName
     testUri.run("$entity/com.sap.odata.test1.ETTwoPrim?$id=ESBase")
-        .isEntityType(EdmTechProvider.nameETTwoPrim)
+        .isEntityType(EntityTypeProvider.nameETTwoPrim)
         .isIdText("ESBase");
 
     // simple entity set; with qualifiedentityTypeName; with filter
@@ -279,28 +281,28 @@ public class TestUriParserImpl {
 
     // simple entity set; with qualifiedentityTypeName;
     testUri.run("$entity/com.sap.odata.test1.ETBase?$id=ESTwoPrim")
-        .isEntityType(EdmTechProvider.nameETBase)
+        .isEntityType(EntityTypeProvider.nameETBase)
         .isKind(UriInfoKind.entityId)
         .isIdText("ESTwoPrim");
 
     // simple entity set; with qualifiedentityTypeName; with format
     testUri.run("$entity/com.sap.odata.test1.ETBase?$id=ESTwoPrim&$format=atom")
         .isKind(UriInfoKind.entityId)
-        .isEntityType(EdmTechProvider.nameETBase)
+        .isEntityType(EntityTypeProvider.nameETBase)
         .isIdText("ESTwoPrim")
         .isFormatText("atom");
 
     // simple entity set; with qualifiedentityTypeName; with select
     testUri.run("$entity/com.sap.odata.test1.ETBase?$id=ESTwoPrim&$select=*")
         .isKind(UriInfoKind.entityId)
-        .isEntityType(EdmTechProvider.nameETBase)
+        .isEntityType(EntityTypeProvider.nameETBase)
         .isIdText("ESTwoPrim")
         .isSelectItemStar(0);
 
     // simple entity set; with qualifiedentityTypeName; with expand
     testUri.run("$entity/com.sap.odata.test1.ETBase?$id=ESTwoPrim&$expand=*")
         .isKind(UriInfoKind.entityId)
-        .isEntityType(EdmTechProvider.nameETBase)
+        .isEntityType(EntityTypeProvider.nameETBase)
         .isIdText("ESTwoPrim")
         .isExpandText("*")
         .goExpand().first().isSegmentStar(0);
@@ -321,12 +323,12 @@ public class TestUriParserImpl {
     // plain entity set
     testRes.run("ESAllPrim")
         .isEntitySet("ESAllPrim")
-        .isType(EdmTechProvider.nameETAllPrim);
+        .isType(EntityTypeProvider.nameETAllPrim);
 
     // with one key; simple key notation
     testRes.run("ESAllPrim(1)")
         .isEntitySet("ESAllPrim")
-        .isType(EdmTechProvider.nameETAllPrim)
+        .isType(EntityTypeProvider.nameETAllPrim)
         .isKeyPredicate(0, "PropertyInt16", "1");
 
     // with one key; name value key notation
@@ -367,42 +369,42 @@ public class TestUriParserImpl {
     testRes.run("ESKeyNav(1)/NavPropertyETTwoKeyNavOne")
         .at(0)
         .isEntitySet("ESKeyNav")
-        .isType(EdmTechProvider.nameETKeyNav)
+        .isType(EntityTypeProvider.nameETKeyNav)
         .isKeyPredicate(0, "PropertyInt16", "1")
         .at(1)
-        .isNavProperty("NavPropertyETTwoKeyNavOne", EdmTechProvider.nameETTwoKeyNav, false)
-        .isType(EdmTechProvider.nameETTwoKeyNav);
+        .isNavProperty("NavPropertyETTwoKeyNavOne", EntityTypeProvider.nameETTwoKeyNav, false)
+        .isType(EntityTypeProvider.nameETTwoKeyNav);
 
     // with navigation property -> property
     testRes.run("ESKeyNav(1)/NavPropertyETTwoKeyNavOne/PropertyString")
         .at(0)
         .isEntitySet("ESKeyNav")
-        .isType(EdmTechProvider.nameETKeyNav, false)
+        .isType(EntityTypeProvider.nameETKeyNav, false)
         .isKeyPredicate(0, "PropertyInt16", "1")
         .at(1)
-        .isNavProperty("NavPropertyETTwoKeyNavOne", EdmTechProvider.nameETTwoKeyNav, false)
+        .isNavProperty("NavPropertyETTwoKeyNavOne", EntityTypeProvider.nameETTwoKeyNav, false)
         .at(2)
-        .isPrimitiveProperty("PropertyString", EdmTechProvider.nameString, false);
+        .isPrimitiveProperty("PropertyString", PropertyProvider.nameString, false);
 
     // with navigation property -> navigation property -> navigation property
     testRes.run("ESKeyNav(1)/NavPropertyETTwoKeyNavOne/NavPropertyETKeyNavOne")
         .at(0)
         .isEntitySet("ESKeyNav")
-        .isType(EdmTechProvider.nameETKeyNav)
+        .isType(EntityTypeProvider.nameETKeyNav)
         .isKeyPredicate(0, "PropertyInt16", "1")
         .at(1)
-        .isNavProperty("NavPropertyETTwoKeyNavOne", EdmTechProvider.nameETTwoKeyNav, false)
-        .isType(EdmTechProvider.nameETTwoKeyNav)
+        .isNavProperty("NavPropertyETTwoKeyNavOne", EntityTypeProvider.nameETTwoKeyNav, false)
+        .isType(EntityTypeProvider.nameETTwoKeyNav)
         .at(2)
-        .isNavProperty("NavPropertyETKeyNavOne", EdmTechProvider.nameETKeyNav, false)
-        .isType(EdmTechProvider.nameETKeyNav);
+        .isNavProperty("NavPropertyETKeyNavOne", EntityTypeProvider.nameETKeyNav, false)
+        .isType(EntityTypeProvider.nameETKeyNav);
 
     // with navigation property(key)
     testRes.run("ESKeyNav(1)/NavPropertyETKeyNavMany(1)")
         .at(0)
         .isEntitySet("ESKeyNav")
         .at(1)
-        .isNavProperty("NavPropertyETKeyNavMany", EdmTechProvider.nameETKeyNav, false)
+        .isNavProperty("NavPropertyETKeyNavMany", EntityTypeProvider.nameETKeyNav, false)
         .isKeyPredicate(0, "PropertyInt16", "1");
 
     // with navigation property(key) -> property
@@ -410,58 +412,58 @@ public class TestUriParserImpl {
         .at(0)
         .isEntitySet("ESKeyNav")
         .at(1)
-        .isNavProperty("NavPropertyETKeyNavMany", EdmTechProvider.nameETKeyNav, false)
+        .isNavProperty("NavPropertyETKeyNavMany", EntityTypeProvider.nameETKeyNav, false)
         .isKeyPredicate(0, "PropertyInt16", "1")
         .at(2)
-        .isPrimitiveProperty("PropertyString", EdmTechProvider.nameString, false);
+        .isPrimitiveProperty("PropertyString", PropertyProvider.nameString, false);
 
     // with navigation property(key) -> navigation property
     testRes.run("ESKeyNav(1)/NavPropertyETKeyNavMany(1)/NavPropertyETKeyNavOne")
         .isEntitySet("ESKeyNav")
         .at(1)
-        .isNavProperty("NavPropertyETKeyNavMany", EdmTechProvider.nameETKeyNav, false)
+        .isNavProperty("NavPropertyETKeyNavMany", EntityTypeProvider.nameETKeyNav, false)
         .isKeyPredicate(0, "PropertyInt16", "1")
         .at(2)
-        .isNavProperty("NavPropertyETKeyNavOne", EdmTechProvider.nameETKeyNav, false);
+        .isNavProperty("NavPropertyETKeyNavOne", EntityTypeProvider.nameETKeyNav, false);
 
     // with navigation property(key) -> navigation property(key)
     testRes.run("ESKeyNav(1)/NavPropertyETKeyNavMany(1)/NavPropertyETKeyNavMany(1)")
         .isEntitySet("ESKeyNav")
-        .isType(EdmTechProvider.nameETKeyNav)
+        .isType(EntityTypeProvider.nameETKeyNav)
         .at(1)
-        .isNavProperty("NavPropertyETKeyNavMany", EdmTechProvider.nameETKeyNav, false)
+        .isNavProperty("NavPropertyETKeyNavMany", EntityTypeProvider.nameETKeyNav, false)
         .isKeyPredicate(0, "PropertyInt16", "1")
         .at(2)
-        .isNavProperty("NavPropertyETKeyNavMany", EdmTechProvider.nameETKeyNav, false)
+        .isNavProperty("NavPropertyETKeyNavMany", EntityTypeProvider.nameETKeyNav, false)
         .isKeyPredicate(0, "PropertyInt16", "1");
 
     // with navigation property(key) -> navigation property -> property
     testRes.run("ESKeyNav(1)/NavPropertyETKeyNavMany(1)/NavPropertyETKeyNavOne/PropertyString")
         .at(0)
         .isEntitySet("ESKeyNav")
-        .isType(EdmTechProvider.nameETKeyNav)
+        .isType(EntityTypeProvider.nameETKeyNav)
         .at(1)
-        .isNavProperty("NavPropertyETKeyNavMany", EdmTechProvider.nameETKeyNav, false)
+        .isNavProperty("NavPropertyETKeyNavMany", EntityTypeProvider.nameETKeyNav, false)
         .isKeyPredicate(0, "PropertyInt16", "1")
         .at(2)
-        .isNavProperty("NavPropertyETKeyNavOne", EdmTechProvider.nameETKeyNav, false)
-        .isType(EdmTechProvider.nameETKeyNav)
+        .isNavProperty("NavPropertyETKeyNavOne", EntityTypeProvider.nameETKeyNav, false)
+        .isType(EntityTypeProvider.nameETKeyNav)
         .at(3)
-        .isPrimitiveProperty("PropertyString", EdmTechProvider.nameString, false);
+        .isPrimitiveProperty("PropertyString", PropertyProvider.nameString, false);
 
     // with navigation property(key) -> navigation property(key) -> property
     testRes.run("ESKeyNav(1)/NavPropertyETKeyNavMany(1)/NavPropertyETKeyNavMany(1)/PropertyString")
         .at(0)
         .isEntitySet("ESKeyNav")
-        .isType(EdmTechProvider.nameETKeyNav)
+        .isType(EntityTypeProvider.nameETKeyNav)
         .at(1)
-        .isNavProperty("NavPropertyETKeyNavMany", EdmTechProvider.nameETKeyNav, false)
+        .isNavProperty("NavPropertyETKeyNavMany", EntityTypeProvider.nameETKeyNav, false)
         .isKeyPredicate(0, "PropertyInt16", "1")
         .at(2)
-        .isNavProperty("NavPropertyETKeyNavMany", EdmTechProvider.nameETKeyNav, false)
+        .isNavProperty("NavPropertyETKeyNavMany", EntityTypeProvider.nameETKeyNav, false)
         .isKeyPredicate(0, "PropertyInt16", "1")
         .at(3)
-        .isPrimitiveProperty("PropertyString", EdmTechProvider.nameString, false);
+        .isPrimitiveProperty("PropertyString", PropertyProvider.nameString, false);
 
   }
 
@@ -476,7 +478,7 @@ public class TestUriParserImpl {
         .isEntitySet("ESAllPrim")
         .isKeyPredicate(0, "PropertyInt16", "1")
         .at(1)
-        .isPrimitiveProperty("PropertyString", EdmTechProvider.nameString, false);
+        .isPrimitiveProperty("PropertyString", PropertyProvider.nameString, false);
 
     // with complex property
     testRes.run("ESCompAllPrim(1)/PropertyComplex")
@@ -484,7 +486,7 @@ public class TestUriParserImpl {
         .isEntitySet("ESCompAllPrim")
         .isKeyPredicate(0, "PropertyInt16", "1")
         .at(1)
-        .isComplexProperty("PropertyComplex", EdmTechProvider.nameCTAllPrim, false);
+        .isComplexProperty("PropertyComplex", ComplexTypeProvider.nameCTAllPrim, false);
 
     // with two properties
     testRes.run("ESCompAllPrim(1)/PropertyComplex/PropertyString")
@@ -492,9 +494,9 @@ public class TestUriParserImpl {
         .isEntitySet("ESCompAllPrim")
         .isKeyPredicate(0, "PropertyInt16", "1")
         .at(1)
-        .isComplexProperty("PropertyComplex", EdmTechProvider.nameCTAllPrim, false)
+        .isComplexProperty("PropertyComplex", ComplexTypeProvider.nameCTAllPrim, false)
         .at(2)
-        .isPrimitiveProperty("PropertyString", EdmTechProvider.nameString, false);
+        .isPrimitiveProperty("PropertyString", PropertyProvider.nameString, false);
   }
 
   @Test
@@ -504,8 +506,8 @@ public class TestUriParserImpl {
     testRes.run("ESTwoPrim/com.sap.odata.test1.ETBase")
         .at(0)
         .isEntitySet("ESTwoPrim")
-        .isType(EdmTechProvider.nameETTwoPrim, true)
-        .isTypeFilterOnCollection(EdmTechProvider.nameETBase)
+        .isType(EntityTypeProvider.nameETTwoPrim, true)
+        .isTypeFilterOnCollection(EntityTypeProvider.nameETBase)
         .isTypeFilterOnEntry(null);
 
     // filter before key predicate
@@ -513,11 +515,11 @@ public class TestUriParserImpl {
         .at(0)
         .isEntitySet("ESTwoPrim")
         .isUriPathInfoKind(UriResourceKind.entitySet)
-        .isType(EdmTechProvider.nameETTwoPrim)
-        .isTypeFilterOnCollection(EdmTechProvider.nameETBase)
+        .isType(EntityTypeProvider.nameETTwoPrim)
+        .isTypeFilterOnCollection(EntityTypeProvider.nameETBase)
         .isTypeFilterOnEntry(null)
         .at(0)
-        .isType(EdmTechProvider.nameETTwoPrim, false)
+        .isType(EntityTypeProvider.nameETTwoPrim, false)
         .isKeyPredicate(0, "PropertyInt16", "1");
 
     // filter before key predicate; property of sub type
@@ -525,22 +527,22 @@ public class TestUriParserImpl {
         .at(0)
         .isEntitySet("ESTwoPrim")
         .isUriPathInfoKind(UriResourceKind.entitySet)
-        .isType(EdmTechProvider.nameETTwoPrim)
-        .isTypeFilterOnCollection(EdmTechProvider.nameETBase)
+        .isType(EntityTypeProvider.nameETTwoPrim)
+        .isTypeFilterOnCollection(EntityTypeProvider.nameETBase)
         .isTypeFilterOnEntry(null)
         .isKeyPredicate(0, "PropertyInt16", "1")
         .at(1)
-        .isType(EdmTechProvider.nameString)
-        .isPrimitiveProperty("AdditionalPropertyString_5", EdmTechProvider.nameString, false);
+        .isType(PropertyProvider.nameString)
+        .isPrimitiveProperty("AdditionalPropertyString_5", PropertyProvider.nameString, false);
 
     // filter after key predicate
     testRes.run("ESTwoPrim(PropertyInt16=1)/com.sap.odata.test1.ETBase")
         .at(0)
         .isEntitySet("ESTwoPrim")
         .isUriPathInfoKind(UriResourceKind.entitySet)
-        .isType(EdmTechProvider.nameETTwoPrim, false)
+        .isType(EntityTypeProvider.nameETTwoPrim, false)
         .isTypeFilterOnCollection(null)
-        .isTypeFilterOnEntry(EdmTechProvider.nameETBase)
+        .isTypeFilterOnEntry(EntityTypeProvider.nameETBase)
         .isKeyPredicate(0, "PropertyInt16", "1");
 
     // filter after key predicate; property of sub type
@@ -548,13 +550,13 @@ public class TestUriParserImpl {
         .at(0)
         .isEntitySet("ESTwoPrim")
         .isUriPathInfoKind(UriResourceKind.entitySet)
-        .isType(EdmTechProvider.nameETTwoPrim)
+        .isType(EntityTypeProvider.nameETTwoPrim)
         .isTypeFilterOnCollection(null)
-        .isTypeFilterOnEntry(EdmTechProvider.nameETBase)
+        .isTypeFilterOnEntry(EntityTypeProvider.nameETBase)
         .isKeyPredicate(0, "PropertyInt16", "1")
         .at(1)
-        .isPrimitiveProperty("AdditionalPropertyString_5", EdmTechProvider.nameString, false)
-        .isType(EdmTechProvider.nameString);
+        .isPrimitiveProperty("AdditionalPropertyString_5", PropertyProvider.nameString, false)
+        .isType(PropertyProvider.nameString);
 
   }
 
@@ -591,19 +593,19 @@ public class TestUriParserImpl {
     testRes.run("FINRTInt16()")
         .isFunctionImport("FINRTInt16")
         .isFunction("UFNRTInt16")
-        .isType(EdmTechProvider.nameString);
+        .isType(PropertyProvider.nameString);
 
     // one input
     testRes.run("FICRTETTwoKeyNavParam(ParameterInt16=1)")
         .isFunctionImport("FICRTETTwoKeyNavParam")
         .isFunction("UFCRTETTwoKeyNavParam")
-        .isType(EdmTechProvider.nameETTwoKeyNav);
+        .isType(EntityTypeProvider.nameETTwoKeyNav);
 
     // two input
     testRes.run("FICRTStringTwoParam(ParameterString='ABC',ParameterInt16=1)")
         .isFunctionImport("FICRTStringTwoParam")
         .isFunction("UFCRTStringTwoParam")
-        .isType(EdmTechProvider.nameString);
+        .isType(PropertyProvider.nameString);
   }
 
   @Test
@@ -612,37 +614,37 @@ public class TestUriParserImpl {
     testRes.run("FINRTInt16()")
         .isFunctionImport("FINRTInt16")
         .isFunction("UFNRTInt16")
-        .isType(EdmTechProvider.nameString, false);
+        .isType(PropertyProvider.nameString, false);
 
     // returning collection of primitive
     testRes.run("FICRTCollStringTwoParam(ParameterString='ABC',ParameterInt16=1)")
         .isFunctionImport("FICRTCollStringTwoParam")
         .isFunction("UFCRTCollStringTwoParam")
-        .isType(EdmTechProvider.nameString, true);
+        .isType(PropertyProvider.nameString, true);
 
     // returning single complex
     testRes.run("FICRTCTAllPrimTwoParam(ParameterString='ABC',ParameterInt16=1)")
         .isFunctionImport("FICRTCTAllPrimTwoParam")
         .isFunction("UFCRTCTAllPrimTwoParam")
-        .isType(EdmTechProvider.nameCTAllPrim, false);
+        .isType(ComplexTypeProvider.nameCTAllPrim, false);
 
     // returning collection of complex
     testRes.run("FICRTCollCTTwoPrim()")
         .isFunctionImport("FICRTCollCTTwoPrim")
         .isFunction("UFCRTCollCTTwoPrim")
-        .isType(EdmTechProvider.nameCTTwoPrim, true);
+        .isType(ComplexTypeProvider.nameCTTwoPrim, true);
 
     // returning single entity
     testRes.run("FICRTETTwoKeyNavParam(ParameterInt16=1)")
         .isFunctionImport("FICRTETTwoKeyNavParam")
         .isFunction("UFCRTETTwoKeyNavParam")
-        .isType(EdmTechProvider.nameETTwoKeyNav, false);
+        .isType(EntityTypeProvider.nameETTwoKeyNav, false);
 
     // returning collection of entity (aka entitySet)
     testRes.run("FICRTESTwoKeyNavParam(ParameterInt16=1)")
         .isFunctionImport("FICRTESTwoKeyNavParam")
         .isFunction("UFCRTESTwoKeyNavParam")
-        .isType(EdmTechProvider.nameETTwoKeyNav, true);
+        .isType(EntityTypeProvider.nameETTwoKeyNav, true);
   }
 
   @Test
@@ -653,28 +655,28 @@ public class TestUriParserImpl {
         .at(0)
         .isFunctionImport("FICRTCTAllPrimTwoParam")
         .isFunction("UFCRTCTAllPrimTwoParam")
-        .isType(EdmTechProvider.nameCTAllPrim, false)
+        .isType(ComplexTypeProvider.nameCTAllPrim, false)
         .isParameter(0, "ParameterString", "'ABC'")
         .isParameter(1, "ParameterInt16", "1")
         .at(1)
-        .isPrimitiveProperty("PropertyInt16", EdmTechProvider.nameInt16, false);
+        .isPrimitiveProperty("PropertyInt16", PropertyProvider.nameInt16, false);
 
     // test chains; returning single entity
     testRes.run("FICRTETTwoKeyNavParam(ParameterInt16=1)/PropertyInt16")
         .at(0)
         .isFunctionImport("FICRTETTwoKeyNavParam")
         .isFunction("UFCRTETTwoKeyNavParam")
-        .isType(EdmTechProvider.nameETTwoKeyNav, false)
+        .isType(EntityTypeProvider.nameETTwoKeyNav, false)
         .isParameter(0, "ParameterInt16", "1")
         .at(1)
-        .isPrimitiveProperty("PropertyInt16", EdmTechProvider.nameInt16, false);
+        .isPrimitiveProperty("PropertyInt16", PropertyProvider.nameInt16, false);
 
     // test chains; returning collection of entity (aka entitySet)
     testRes.run("FICRTESTwoKeyNavParam(ParameterInt16=1)(PropertyInt16=1,PropertyString='ABC')")
         .at(0)
         .isFunctionImport("FICRTESTwoKeyNavParam")
         .isFunction("UFCRTESTwoKeyNavParam")
-        .isType(EdmTechProvider.nameETTwoKeyNav, false)
+        .isType(EntityTypeProvider.nameETTwoKeyNav, false)
         .isParameter(0, "ParameterInt16", "1")
         .isKeyPredicate(0, "PropertyInt16", "1")
         .isKeyPredicate(1, "PropertyString", "'ABC'");
@@ -684,12 +686,12 @@ public class TestUriParserImpl {
         .at(0)
         .isFunctionImport("FICRTESTwoKeyNavParam")
         .isFunction("UFCRTESTwoKeyNavParam")
-        .isType(EdmTechProvider.nameETTwoKeyNav, false)
+        .isType(EntityTypeProvider.nameETTwoKeyNav, false)
         .isParameter(0, "ParameterInt16", "1")
         .isKeyPredicate(0, "PropertyInt16", "1")
         .isKeyPredicate(1, "PropertyString", "'ABC'")
         .at(1)
-        .isPrimitiveProperty("PropertyInt16", EdmTechProvider.nameInt16, false);
+        .isPrimitiveProperty("PropertyInt16", PropertyProvider.nameInt16, false);
 
   }
 
@@ -866,7 +868,7 @@ public class TestUriParserImpl {
     // plain singleton
     testRes.run("SINav")
         .isSingleton("SINav")
-        .isType(EdmTechProvider.nameETTwoKeyNav);
+        .isType(EntityTypeProvider.nameETTwoKeyNav);
   }
 
   @Test
@@ -877,73 +879,73 @@ public class TestUriParserImpl {
     // with navigation property
     testRes.run("ESKeyNav(1)/NavPropertyETTwoKeyNavOne")
         .at(0).isEntitySet("ESKeyNav")
-        .at(1).isNavProperty("NavPropertyETTwoKeyNavOne", EdmTechProvider.nameETTwoKeyNav, false);
+        .at(1).isNavProperty("NavPropertyETTwoKeyNavOne", EntityTypeProvider.nameETTwoKeyNav, false);
 
     // with navigation property -> property
     testRes.run("ESKeyNav(1)/NavPropertyETTwoKeyNavOne/PropertyString")
         .at(0).isEntitySet("ESKeyNav")
-        .at(1).isNavProperty("NavPropertyETTwoKeyNavOne", EdmTechProvider.nameETTwoKeyNav, false)
-        .at(2).isPrimitiveProperty("PropertyString", EdmTechProvider.nameString, false);
+        .at(1).isNavProperty("NavPropertyETTwoKeyNavOne", EntityTypeProvider.nameETTwoKeyNav, false)
+        .at(2).isPrimitiveProperty("PropertyString", PropertyProvider.nameString, false);
 
     // with navigation property -> navigation property -> navigation property
     testRes.run("ESKeyNav(1)/NavPropertyETTwoKeyNavOne/NavPropertyETKeyNavOne")
         .at(0).isEntitySet("ESKeyNav")
-        .at(1).isNavProperty("NavPropertyETTwoKeyNavOne", EdmTechProvider.nameETTwoKeyNav, false)
-        .at(2).isNavProperty("NavPropertyETKeyNavOne", EdmTechProvider.nameETKeyNav, false);
+        .at(1).isNavProperty("NavPropertyETTwoKeyNavOne", EntityTypeProvider.nameETTwoKeyNav, false)
+        .at(2).isNavProperty("NavPropertyETKeyNavOne", EntityTypeProvider.nameETKeyNav, false);
 
     // with navigation property(key)
     testRes.run("ESKeyNav(1)/NavPropertyETTwoKeyNavMany(PropertyInt16=1,PropertyString='1')")
         .at(0).isEntitySet("ESKeyNav")
-        .at(1).isNavProperty("NavPropertyETTwoKeyNavMany", EdmTechProvider.nameETTwoKeyNav, false)
+        .at(1).isNavProperty("NavPropertyETTwoKeyNavMany", EntityTypeProvider.nameETTwoKeyNav, false)
         .isKeyPredicate(0, "PropertyInt16", "1")
         .isKeyPredicate(1, "PropertyString", "'1'");
 
     // with navigation property(key) -> property
     testRes.run("ESKeyNav(1)/NavPropertyETTwoKeyNavMany(PropertyInt16=1,PropertyString='1')/PropertyString")
         .at(0).isEntitySet("ESKeyNav")
-        .at(1).isNavProperty("NavPropertyETTwoKeyNavMany", EdmTechProvider.nameETTwoKeyNav, false)
+        .at(1).isNavProperty("NavPropertyETTwoKeyNavMany", EntityTypeProvider.nameETTwoKeyNav, false)
         .isKeyPredicate(0, "PropertyInt16", "1")
         .isKeyPredicate(1, "PropertyString", "'1'")
-        .at(2).isPrimitiveProperty("PropertyString", EdmTechProvider.nameString, false);
+        .at(2).isPrimitiveProperty("PropertyString", PropertyProvider.nameString, false);
 
     // with navigation property(key) -> navigation property
     testRes.run("ESKeyNav(1)/NavPropertyETTwoKeyNavMany(PropertyInt16=1,PropertyString='1')/NavPropertyETKeyNavOne")
         .at(0).isEntitySet("ESKeyNav")
-        .at(1).isNavProperty("NavPropertyETTwoKeyNavMany", EdmTechProvider.nameETTwoKeyNav, false)
+        .at(1).isNavProperty("NavPropertyETTwoKeyNavMany", EntityTypeProvider.nameETTwoKeyNav, false)
         .isKeyPredicate(0, "PropertyInt16", "1")
         .isKeyPredicate(1, "PropertyString", "'1'")
-        .at(2).isNavProperty("NavPropertyETKeyNavOne", EdmTechProvider.nameETKeyNav, false);
+        .at(2).isNavProperty("NavPropertyETKeyNavOne", EntityTypeProvider.nameETKeyNav, false);
 
     // with navigation property(key) -> navigation property(key)
     testRes.run("ESKeyNav(1)/NavPropertyETTwoKeyNavMany(PropertyInt16=1,PropertyString='1')"
         + "/NavPropertyETKeyNavMany(1)")
         .at(0).isEntitySet("ESKeyNav")
-        .at(1).isNavProperty("NavPropertyETTwoKeyNavMany", EdmTechProvider.nameETTwoKeyNav, false)
+        .at(1).isNavProperty("NavPropertyETTwoKeyNavMany", EntityTypeProvider.nameETTwoKeyNav, false)
         .isKeyPredicate(0, "PropertyInt16", "1")
         .isKeyPredicate(1, "PropertyString", "'1'")
-        .at(2).isNavProperty("NavPropertyETKeyNavMany", EdmTechProvider.nameETKeyNav, false)
+        .at(2).isNavProperty("NavPropertyETKeyNavMany", EntityTypeProvider.nameETKeyNav, false)
         .isKeyPredicate(0, "PropertyInt16", "1");
 
     // with navigation property(key) -> navigation property -> property
     testRes.run("ESKeyNav(1)/NavPropertyETTwoKeyNavMany(PropertyInt16=1,PropertyString='1')"
         + "/NavPropertyETKeyNavOne/PropertyString")
         .at(0).isEntitySet("ESKeyNav")
-        .at(1).isNavProperty("NavPropertyETTwoKeyNavMany", EdmTechProvider.nameETTwoKeyNav, false)
+        .at(1).isNavProperty("NavPropertyETTwoKeyNavMany", EntityTypeProvider.nameETTwoKeyNav, false)
         .isKeyPredicate(0, "PropertyInt16", "1")
         .isKeyPredicate(1, "PropertyString", "'1'")
-        .at(2).isNavProperty("NavPropertyETKeyNavOne", EdmTechProvider.nameETKeyNav, false)
-        .at(3).isPrimitiveProperty("PropertyString", EdmTechProvider.nameString, false);
+        .at(2).isNavProperty("NavPropertyETKeyNavOne", EntityTypeProvider.nameETKeyNav, false)
+        .at(3).isPrimitiveProperty("PropertyString", PropertyProvider.nameString, false);
 
     // with navigation property(key) -> navigation property(key) -> property
     testRes.run("ESKeyNav(1)/NavPropertyETTwoKeyNavMany(PropertyInt16=1,PropertyString='1')"
         + "/NavPropertyETKeyNavMany(1)/PropertyString")
         .at(0).isEntitySet("ESKeyNav")
-        .at(1).isNavProperty("NavPropertyETTwoKeyNavMany", EdmTechProvider.nameETTwoKeyNav, false)
+        .at(1).isNavProperty("NavPropertyETTwoKeyNavMany", EntityTypeProvider.nameETTwoKeyNav, false)
         .isKeyPredicate(0, "PropertyInt16", "1")
         .isKeyPredicate(1, "PropertyString", "'1'")
-        .at(2).isNavProperty("NavPropertyETKeyNavMany", EdmTechProvider.nameETKeyNav, false)
+        .at(2).isNavProperty("NavPropertyETKeyNavMany", EntityTypeProvider.nameETKeyNav, false)
         .isKeyPredicate(0, "PropertyInt16", "1")
-        .at(3).isPrimitiveProperty("PropertyString", EdmTechProvider.nameString, false);
+        .at(3).isPrimitiveProperty("PropertyString", PropertyProvider.nameString, false);
   }
 
   @Test
@@ -955,27 +957,27 @@ public class TestUriParserImpl {
     testRes.run("SINav/PropertyInt16")
         .at(0)
         .isSingleton("SINav")
-        .isType(EdmTechProvider.nameETTwoKeyNav)
+        .isType(EntityTypeProvider.nameETTwoKeyNav)
         .at(1)
-        .isPrimitiveProperty("PropertyInt16", EdmTechProvider.nameInt16, false);
+        .isPrimitiveProperty("PropertyInt16", PropertyProvider.nameInt16, false);
 
     // with complex property
     testRes.run("SINav/PropertyComplex")
         .at(0)
         .isSingleton("SINav")
-        .isType(EdmTechProvider.nameETTwoKeyNav)
+        .isType(EntityTypeProvider.nameETTwoKeyNav)
         .at(1)
-        .isComplexProperty("PropertyComplex", EdmTechProvider.nameCTPrimComp, false);
+        .isComplexProperty("PropertyComplex", ComplexTypeProvider.nameCTPrimComp, false);
 
     // with two properties
     testRes.run("SINav/PropertyComplex/PropertyInt16")
         .at(0)
         .isSingleton("SINav")
-        .isType(EdmTechProvider.nameETTwoKeyNav)
+        .isType(EntityTypeProvider.nameETTwoKeyNav)
         .at(1)
-        .isComplexProperty("PropertyComplex", EdmTechProvider.nameCTPrimComp, false)
+        .isComplexProperty("PropertyComplex", ComplexTypeProvider.nameCTPrimComp, false)
         .at(2)
-        .isPrimitiveProperty("PropertyInt16", EdmTechProvider.nameInt16, false);
+        .isPrimitiveProperty("PropertyInt16", PropertyProvider.nameInt16, false);
 
   }
 
@@ -990,43 +992,43 @@ public class TestUriParserImpl {
     testUri.run("ESTwoKeyNav(ParameterInt16=1,PropertyString='ABC')?"
         + "$filter=com.sap.odata.test1.ETBaseTwoKeyNav/PropertyDate")
         .goFilter().root().isMember()
-        .isMemberStartType(EdmTechProvider.nameETBaseTwoKeyNav).goPath()
+        .isMemberStartType(EntityTypeProvider.nameETBaseTwoKeyNav).goPath()
         // .at(0)
         // .isUriPathInfoKind(UriResourceKind.startingTypeFilter)
-        // .isType(EdmTechProvider.nameETTwoKeyNav, false)
-        // .isTypeFilterOnEntry(EdmTechProvider.nameETBaseTwoKeyNav)
-        .at(0).isType(EdmTechProvider.nameDate);
+        // .isType(EntityTypeProvider.nameETTwoKeyNav, false)
+        // .isTypeFilterOnEntry(EntityTypeProvider.nameETBaseTwoKeyNav)
+        .at(0).isType(PropertyProvider.nameDate);
 
     // on EntityType collection
     testUri.run("ESTwoKeyNav?$filter=com.sap.odata.test1.ETBaseTwoKeyNav/PropertyDate")
         .goFilter().root().isMember()
-        .isMemberStartType(EdmTechProvider.nameETBaseTwoKeyNav).goPath()
+        .isMemberStartType(EntityTypeProvider.nameETBaseTwoKeyNav).goPath()
         // .at(0)
         // .isUriPathInfoKind(UriResourceKind.startingTypeFilter)
-        // .isType(EdmTechProvider.nameETTwoKeyNav, true)
-        // .isTypeFilterOnCollection(EdmTechProvider.nameETBaseTwoKeyNav)
-        .at(0).isType(EdmTechProvider.nameDate);
+        // .isType(EntityTypeProvider.nameETTwoKeyNav, true)
+        // .isTypeFilterOnCollection(EntityTypeProvider.nameETBaseTwoKeyNav)
+        .at(0).isType(PropertyProvider.nameDate);
 
     testUri.run("FICRTCTTwoPrimParam(ParameterInt16=1,ParameterString='2')?"
         + "$filter=com.sap.odata.test1.CTBase/AdditionalPropString")
         .goFilter().root().isMember()
-        .isMemberStartType(EdmTechProvider.nameCTBase).goPath()
+        .isMemberStartType(ComplexTypeProvider.nameCTBase).goPath()
         // .at(0)
         // .isUriPathInfoKind(UriResourceKind.startingTypeFilter)
-        // .isType(EdmTechProvider.nameCTTwoPrim, false)
-        // .isTypeFilterOnEntry(EdmTechProvider.nameCTBase)
-        .at(0).isType(EdmTechProvider.nameString);
+        // .isType(ComplexTypeProvider.nameCTTwoPrim, false)
+        // .isTypeFilterOnEntry(ComplexTypeProvider.nameCTBase)
+        .at(0).isType(PropertyProvider.nameString);
 
     // on Complex collection
     testUri.run("FICRTCollCTTwoPrimParam(ParameterInt16=1,ParameterString='2')?"
         + "$filter=com.sap.odata.test1.CTBase/AdditionalPropString")
         .goFilter().root().isMember()
-        .isMemberStartType(EdmTechProvider.nameCTBase).goPath()
+        .isMemberStartType(ComplexTypeProvider.nameCTBase).goPath()
         // .at(0)
         // .isUriPathInfoKind(UriResourceKind.startingTypeFilter)
-        // .isType(EdmTechProvider.nameCTTwoPrim, true)
-        // .isTypeFilterOnCollection(EdmTechProvider.nameCTBase)
-        .at(0).isType(EdmTechProvider.nameString);
+        // .isType(ComplexTypeProvider.nameCTTwoPrim, true)
+        // .isTypeFilterOnCollection(ComplexTypeProvider.nameCTBase)
+        .at(0).isType(PropertyProvider.nameString);
 
   }
 
@@ -1084,37 +1086,37 @@ public class TestUriParserImpl {
         .isSelectItemAllOp(0, new FullQualifiedName("com.sap.odata.test1", "*"));
 
     testUri.run("ESTwoKeyNav?$select=PropertyString")
-        .goSelectItemPath(0).isPrimitiveProperty("PropertyString", EdmTechProvider.nameString, false);
+        .goSelectItemPath(0).isPrimitiveProperty("PropertyString", PropertyProvider.nameString, false);
 
     testUri.run("ESTwoKeyNav?$select=PropertyComplex")
-        .goSelectItemPath(0).isComplexProperty("PropertyComplex", EdmTechProvider.nameCTPrimComp, false);
+        .goSelectItemPath(0).isComplexProperty("PropertyComplex", ComplexTypeProvider.nameCTPrimComp, false);
 
     testUri.run("ESTwoKeyNav?$select=PropertyComplex/PropertyInt16")
         .goSelectItemPath(0)
         .first()
-        .isComplexProperty("PropertyComplex", EdmTechProvider.nameCTPrimComp, false)
+        .isComplexProperty("PropertyComplex", ComplexTypeProvider.nameCTPrimComp, false)
         .n()
-        .isPrimitiveProperty("PropertyInt16", EdmTechProvider.nameInt16, false);
+        .isPrimitiveProperty("PropertyInt16", PropertyProvider.nameInt16, false);
 
     testUri.run("ESTwoKeyNav?$select=PropertyComplex/PropertyComplex")
         .goSelectItemPath(0)
         .first()
-        .isComplexProperty("PropertyComplex", EdmTechProvider.nameCTPrimComp, false)
+        .isComplexProperty("PropertyComplex", ComplexTypeProvider.nameCTPrimComp, false)
         .n()
-        .isComplexProperty("PropertyComplex", EdmTechProvider.nameCTAllPrim, false);
+        .isComplexProperty("PropertyComplex", ComplexTypeProvider.nameCTAllPrim, false);
 
     testUri.run("ESTwoKeyNav?$select=com.sap.odata.test1.ETBaseTwoKeyNav")
-        .isSelectStartType(0, EdmTechProvider.nameETBaseTwoKeyNav);
+        .isSelectStartType(0, EntityTypeProvider.nameETBaseTwoKeyNav);
 
     testUri.run("ESTwoKeyNav/PropertyComplexNav?$select=com.sap.odata.test1.CTTwoBasePrimCompNav")
-        .isSelectStartType(0, EdmTechProvider.nameCTTwoBasePrimCompNav);
+        .isSelectStartType(0, ComplexTypeProvider.nameCTTwoBasePrimCompNav);
 
     testUri.run("ESTwoKeyNav?$select=PropertyComplexNav/com.sap.odata.test1.CTTwoBasePrimCompNav")
         .goSelectItemPath(0)
         .first()
-        .isComplexProperty("PropertyComplexNav", EdmTechProvider.nameCTBasePrimCompNav, false)
+        .isComplexProperty("PropertyComplexNav", ComplexTypeProvider.nameCTBasePrimCompNav, false)
         .n()
-        .isTypeFilterOnCollection(EdmTechProvider.nameCTTwoBasePrimCompNav);
+        .isTypeFilterOnCollection(ComplexTypeProvider.nameCTTwoBasePrimCompNav);
     ;
 
   }

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/59ef14f4/lib/server-core/src/test/java/org/apache/olingo/server/core/uri/queryoption/expression/ExpressionTest.java
----------------------------------------------------------------------
diff --git a/lib/server-core/src/test/java/org/apache/olingo/server/core/uri/queryoption/expression/ExpressionTest.java b/lib/server-core/src/test/java/org/apache/olingo/server/core/uri/queryoption/expression/ExpressionTest.java
index 161a0fd..91f3ad9 100644
--- a/lib/server-core/src/test/java/org/apache/olingo/server/core/uri/queryoption/expression/ExpressionTest.java
+++ b/lib/server-core/src/test/java/org/apache/olingo/server/core/uri/queryoption/expression/ExpressionTest.java
@@ -36,8 +36,11 @@ import org.apache.olingo.server.api.uri.queryoption.expression.ExpressionVisitEx
 import org.apache.olingo.server.api.uri.queryoption.expression.MethodKind;
 import org.apache.olingo.server.api.uri.queryoption.expression.UnaryOperatorKind;
 import org.apache.olingo.server.core.edm.provider.EdmProviderImpl;
-import org.apache.olingo.server.core.testutil.EdmTechProvider;
 import org.apache.olingo.server.core.testutil.EdmTechTestProvider;
+import org.apache.olingo.server.core.testutil.techprovider.ActionProvider;
+import org.apache.olingo.server.core.testutil.techprovider.EntityTypeProvider;
+import org.apache.olingo.server.core.testutil.techprovider.EnumTypeProvider;
+import org.apache.olingo.server.core.testutil.techprovider.FunctionProvider;
 import org.apache.olingo.server.core.uri.UriInfoImpl;
 import org.apache.olingo.server.core.uri.UriResourceActionImpl;
 import org.apache.olingo.server.core.uri.UriResourceFunctionImpl;
@@ -94,7 +97,7 @@ public class ExpressionTest {
   @Test
   public void testEnumerationExpression() throws ExpressionVisitException, ODataApplicationException {
     EnumerationImpl expression = new EnumerationImpl();
-    EdmEnumType type = (EdmEnumType) edm.getEnumType(EdmTechProvider.nameENString);
+    EdmEnumType type = (EdmEnumType) edm.getEnumType(EnumTypeProvider.nameENString);
     assertNotNull(type);
     expression.setType(type);
 
@@ -129,10 +132,10 @@ public class ExpressionTest {
   @Test
   public void testMemberExpression() throws ExpressionVisitException, ODataApplicationException {
     MemberImpl expression = new MemberImpl();
-    EdmEntityType entityType = edm.getEntityType(EdmTechProvider.nameETKeyNav);
+    EdmEntityType entityType = edm.getEntityType(EntityTypeProvider.nameETKeyNav);
 
     // UriResourceImplTyped
-    EdmAction action = edm.getAction(EdmTechProvider.nameUARTPrimParam, null, null);
+    EdmAction action = edm.getAction(ActionProvider.nameUARTPrimParam, null, null);
     UriInfoResource uriInfo = new UriInfoImpl().setKind(UriInfoKind.resource).addResourcePart(
         new UriResourceActionImpl().setAction(action)).asUriInfoResource();
     expression.setResourcePath(uriInfo);
@@ -146,29 +149,29 @@ public class ExpressionTest {
     assertEquals(false, expression.isCollection());
 
     // UriResourceImplTyped check collection = true case
-    action = edm.getAction(EdmTechProvider.nameUARTPrimCollParam, null, null);
+    action = edm.getAction(ActionProvider.nameUARTPrimCollParam, null, null);
     expression.setResourcePath(new UriInfoImpl().setKind(UriInfoKind.resource).addResourcePart(
         new UriResourceActionImpl().setAction(action))
         .asUriInfoResource());
     assertEquals(true, expression.isCollection());
 
     // UriResourceImplTyped with filter
-    action = edm.getAction(EdmTechProvider.nameUARTPrimParam, null, null);
+    action = edm.getAction(ActionProvider.nameUARTPrimParam, null, null);
     expression.setResourcePath(new UriInfoImpl().setKind(UriInfoKind.resource).addResourcePart(
         new UriResourceActionImpl().setAction(action).setTypeFilter(entityType))
         .asUriInfoResource());
     assertEquals(entityType, expression.getType());
 
     // UriResourceImplKeyPred
-    EdmFunction function = edm.getFunction(EdmTechProvider.nameUFCRTETKeyNav, null, null, null);
+    EdmFunction function = edm.getFunction(FunctionProvider.nameUFCRTETKeyNav, null, null, null);
     expression.setResourcePath(new UriInfoImpl().setKind(UriInfoKind.resource).addResourcePart(
         new UriResourceFunctionImpl().setFunction(function))
         .asUriInfoResource());
     assertEquals(function.getReturnType().getType(), expression.getType());
 
     // UriResourceImplKeyPred typeFilter on entry
-    EdmEntityType entityBaseType = edm.getEntityType(EdmTechProvider.nameETBaseTwoKeyNav);
-    function = edm.getFunction(EdmTechProvider.nameUFCRTESTwoKeyNavParam, null, null,
+    EdmEntityType entityBaseType = edm.getEntityType(EntityTypeProvider.nameETBaseTwoKeyNav);
+    function = edm.getFunction(FunctionProvider.nameUFCRTESTwoKeyNavParam, null, null,
         Arrays.asList(("ParameterInt16")));
     expression.setResourcePath(new UriInfoImpl().setKind(UriInfoKind.resource).addResourcePart(
         new UriResourceFunctionImpl().setFunction(function).setEntryTypeFilter(entityBaseType))
@@ -176,8 +179,8 @@ public class ExpressionTest {
     assertEquals(entityBaseType, expression.getType());
 
     // UriResourceImplKeyPred typeFilter on entry
-    entityBaseType = edm.getEntityType(EdmTechProvider.nameETBaseTwoKeyNav);
-    function = edm.getFunction(EdmTechProvider.nameUFCRTESTwoKeyNavParam, null, null,
+    entityBaseType = edm.getEntityType(EntityTypeProvider.nameETBaseTwoKeyNav);
+    function = edm.getFunction(FunctionProvider.nameUFCRTESTwoKeyNavParam, null, null,
         Arrays.asList(("ParameterInt16")));
     expression.setResourcePath(new UriInfoImpl().setKind(UriInfoKind.resource).addResourcePart(
         new UriResourceFunctionImpl().setFunction(function).setCollectionTypeFilter(entityBaseType))
@@ -185,8 +188,8 @@ public class ExpressionTest {
     assertEquals(entityBaseType, expression.getType());
 
     // no typed
-    entityBaseType = edm.getEntityType(EdmTechProvider.nameETBaseTwoKeyNav);
-    function = edm.getFunction(EdmTechProvider.nameUFCRTESTwoKeyNavParam, null, null,
+    entityBaseType = edm.getEntityType(EntityTypeProvider.nameETBaseTwoKeyNav);
+    function = edm.getFunction(FunctionProvider.nameUFCRTESTwoKeyNavParam, null, null,
         Arrays.asList(("ParameterInt16")));
     expression.setResourcePath(new UriInfoImpl().setKind(UriInfoKind.all));
     assertEquals(null, expression.getType());
@@ -215,7 +218,7 @@ public class ExpressionTest {
   @Test
   public void testTypeLiteralExpression() throws ExpressionVisitException, ODataApplicationException {
     TypeLiteralImpl expression = new TypeLiteralImpl();
-    EdmEntityType entityBaseType = edm.getEntityType(EdmTechProvider.nameETBaseTwoKeyNav);
+    EdmEntityType entityBaseType = edm.getEntityType(EntityTypeProvider.nameETBaseTwoKeyNav);
     expression.setType(entityBaseType);
 
     assertEquals(entityBaseType, expression.getType());


[7/9] [OLINGO-168] More TechProvider Refactoring

Posted by ch...@apache.org.
http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/6a3a4a1d/lib/server-core/src/test/java/org/apache/olingo/server/core/testutil/techprovider/SchemaProvider.java
----------------------------------------------------------------------
diff --git a/lib/server-core/src/test/java/org/apache/olingo/server/core/testutil/techprovider/SchemaProvider.java b/lib/server-core/src/test/java/org/apache/olingo/server/core/testutil/techprovider/SchemaProvider.java
index 6a0708f..81f638d 100644
--- a/lib/server-core/src/test/java/org/apache/olingo/server/core/testutil/techprovider/SchemaProvider.java
+++ b/lib/server-core/src/test/java/org/apache/olingo/server/core/testutil/techprovider/SchemaProvider.java
@@ -40,7 +40,7 @@ public class SchemaProvider {
 
   public static final String nameSpace = "com.sap.odata.test1";
 
-  public SchemaProvider(EdmTechProvider prov) {
+  public SchemaProvider(final EdmTechProvider prov) {
     this.prov = prov;
   }
 
@@ -105,17 +105,17 @@ public class SchemaProvider {
     // Actions
     List<Action> actions = new ArrayList<Action>();
     schema.setActions(actions);
-    actions.addAll(prov.getActions(ActionProvider.nameUARTPrimParam));
-    actions.addAll(prov.getActions(ActionProvider.nameUARTPrimCollParam));
-    actions.addAll(prov.getActions(ActionProvider.nameUARTCompParam));
-    actions.addAll(prov.getActions(ActionProvider.nameUARTCompCollParam));
-    actions.addAll(prov.getActions(ActionProvider.nameUARTETParam));
-    actions.addAll(prov.getActions(ActionProvider.nameUARTETCollAllPrimParam));
     actions.addAll(prov.getActions(ActionProvider.nameBAETTwoKeyNavRTETTwoKeyNav));
     actions.addAll(prov.getActions(ActionProvider.nameBAESAllPrimRTETAllPrim));
     actions.addAll(prov.getActions(ActionProvider.nameBAESTwoKeyNavRTESTwoKeyNav));
     actions.addAll(prov.getActions(ActionProvider.nameBAETBaseTwoKeyNavRTETBaseTwoKeyNav));
     actions.addAll(prov.getActions(ActionProvider.nameBAETTwoBaseTwoKeyNavRTETBaseTwoKeyNav));
+    actions.addAll(prov.getActions(ActionProvider.nameUARTPrimParam));
+    actions.addAll(prov.getActions(ActionProvider.nameUARTPrimCollParam));
+    actions.addAll(prov.getActions(ActionProvider.nameUARTCompParam));
+    actions.addAll(prov.getActions(ActionProvider.nameUARTCompCollParam));
+    actions.addAll(prov.getActions(ActionProvider.nameUARTETParam));
+    actions.addAll(prov.getActions(ActionProvider.nameUARTESParam));
 
     // Functions
     List<Function> functions = new ArrayList<Function>();
@@ -127,7 +127,6 @@ public class SchemaProvider {
     functions.addAll(prov.getFunctions(FunctionProvider.nameUFCRTETTwoKeyNavParamCTTwoPrim));
     functions.addAll(prov.getFunctions(FunctionProvider.nameUFCRTStringTwoParam));
     functions.addAll(prov.getFunctions(FunctionProvider.nameUFCRTESTwoKeyNavParam));
-    // TODO: check why it exists twice
     functions.addAll(prov.getFunctions(FunctionProvider.nameUFCRTString));
     functions.addAll(prov.getFunctions(FunctionProvider.nameUFCRTCollStringTwoParam));
     functions.addAll(prov.getFunctions(FunctionProvider.nameUFCRTCollString));
@@ -140,6 +139,7 @@ public class SchemaProvider {
     functions.addAll(prov.getFunctions(FunctionProvider.nameUFNRTESMixPrimCollCompTwoParam));
     functions.addAll(prov.getFunctions(FunctionProvider.nameUFCRTETAllPrimTwoParam));
     functions.addAll(prov.getFunctions(FunctionProvider.nameUFCRTESMixPrimCollCompTwoParam));
+    functions.addAll(prov.getFunctions(FunctionProvider.nameUFNRTCollCTNavFiveProp));
     functions.addAll(prov.getFunctions(FunctionProvider.nameBFCESTwoKeyNavRTESTwoKeyNav));
     functions.addAll(prov.getFunctions(FunctionProvider.nameBFCStringRTESTwoKeyNav));
     functions.addAll(prov.getFunctions(FunctionProvider.nameBFCETBaseTwoKeyNavRTETTwoKeyNav));
@@ -163,11 +163,14 @@ public class SchemaProvider {
     functions.addAll(prov.getFunctions(FunctionProvider.nameBFESTwoKeyNavRTESTwoKeyNav));
     functions.addAll(prov.getFunctions(FunctionProvider.nameBFCETTwoKeyNavRTETTwoKeyNav));
     functions.addAll(prov.getFunctions(FunctionProvider.nameBFCETTwoKeyNavRTCTTwoPrim));
+
+    functions.addAll(prov.getFunctions(FunctionProvider.nameBFCESTwoKeyNavRTCTNavFiveProp));
+    functions.addAll(prov.getFunctions(FunctionProvider.nameBFCESTwoKeyNavRTCollCTNavFiveProp));
+    
     functions.addAll(prov.getFunctions(FunctionProvider.nameBFCESTwoKeyNavRTStringParam));
     functions.addAll(prov.getFunctions(FunctionProvider.nameBFCESKeyNavRTETKeyNavParam));
     functions.addAll(prov.getFunctions(FunctionProvider.nameBFCCTPrimCompRTETTwoKeyNavParam));
-    functions.addAll(prov.getFunctions(FunctionProvider.nameBAETTwoKeyNavRTETTwoKeyNav));
-    functions.addAll(prov.getFunctions(FunctionProvider.nameBFCCTPrimCompRTESTwoKeyNavParam));
+    //functions.addAll(prov.getFunctions(FunctionProvider.nameBFCCTPrimCompRTESTwoKeyNavParam));
 
     // EntityContainer
     EntityContainer container = new EntityContainer();

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/6a3a4a1d/lib/server-core/src/test/java/org/apache/olingo/server/core/testutil/techprovider/TypeDefinitionProvider.java
----------------------------------------------------------------------
diff --git a/lib/server-core/src/test/java/org/apache/olingo/server/core/testutil/techprovider/TypeDefinitionProvider.java b/lib/server-core/src/test/java/org/apache/olingo/server/core/testutil/techprovider/TypeDefinitionProvider.java
index 879affd..dc34b31 100644
--- a/lib/server-core/src/test/java/org/apache/olingo/server/core/testutil/techprovider/TypeDefinitionProvider.java
+++ b/lib/server-core/src/test/java/org/apache/olingo/server/core/testutil/techprovider/TypeDefinitionProvider.java
@@ -23,7 +23,7 @@ import org.apache.olingo.server.api.edm.provider.TypeDefinition;
 
 public class TypeDefinitionProvider {
 
-  public TypeDefinition getTypeDefinition(FullQualifiedName typeDefinitionName) {
+  public TypeDefinition getTypeDefinition(final FullQualifiedName typeDefinitionName) {
     return null;
   }
 

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/6a3a4a1d/lib/server-core/src/test/java/org/apache/olingo/server/core/uri/antlr/TestUriParserImpl.java
----------------------------------------------------------------------
diff --git a/lib/server-core/src/test/java/org/apache/olingo/server/core/uri/antlr/TestUriParserImpl.java b/lib/server-core/src/test/java/org/apache/olingo/server/core/uri/antlr/TestUriParserImpl.java
index ab0b1d3..50b7a5d 100644
--- a/lib/server-core/src/test/java/org/apache/olingo/server/core/uri/antlr/TestUriParserImpl.java
+++ b/lib/server-core/src/test/java/org/apache/olingo/server/core/uri/antlr/TestUriParserImpl.java
@@ -593,7 +593,7 @@ public class TestUriParserImpl {
     testRes.run("FINRTInt16()")
         .isFunctionImport("FINRTInt16")
         .isFunction("UFNRTInt16")
-        .isType(PropertyProvider.nameString);
+        .isType(PropertyProvider.nameInt16);
 
     // one input
     testRes.run("FICRTETTwoKeyNavParam(ParameterInt16=1)")
@@ -614,7 +614,7 @@ public class TestUriParserImpl {
     testRes.run("FINRTInt16()")
         .isFunctionImport("FINRTInt16")
         .isFunction("UFNRTInt16")
-        .isType(PropertyProvider.nameString, false);
+        .isType(PropertyProvider.nameInt16, false);
 
     // returning collection of primitive
     testRes.run("FICRTCollStringTwoParam(ParameterString='ABC',ParameterInt16=1)")


[8/9] [OLINGO-168] More TechProvider Refactoring

Posted by ch...@apache.org.
http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/6a3a4a1d/lib/server-core/src/test/java/org/apache/olingo/server/core/testutil/techprovider/EntityTypeProvider.java
----------------------------------------------------------------------
diff --git a/lib/server-core/src/test/java/org/apache/olingo/server/core/testutil/techprovider/EntityTypeProvider.java b/lib/server-core/src/test/java/org/apache/olingo/server/core/testutil/techprovider/EntityTypeProvider.java
index fd93d5d..291d893 100644
--- a/lib/server-core/src/test/java/org/apache/olingo/server/core/testutil/techprovider/EntityTypeProvider.java
+++ b/lib/server-core/src/test/java/org/apache/olingo/server/core/testutil/techprovider/EntityTypeProvider.java
@@ -31,25 +31,35 @@ import org.apache.olingo.server.api.edm.provider.ReferentialConstraint;
 public class EntityTypeProvider {
 
   public static final FullQualifiedName nameETAllKey = new FullQualifiedName(SchemaProvider.nameSpace, "ETAllKey");
-  public static final FullQualifiedName nameETAllNullable = new FullQualifiedName(SchemaProvider.nameSpace, "ETAllNullable");
+  public static final FullQualifiedName nameETAllNullable = new FullQualifiedName(SchemaProvider.nameSpace,
+      "ETAllNullable");
   public static final FullQualifiedName nameETAllPrim = new FullQualifiedName(SchemaProvider.nameSpace, "ETAllPrim");
   public static final FullQualifiedName nameETBase = new FullQualifiedName(SchemaProvider.nameSpace, "ETBase");
-  public static final FullQualifiedName nameETBaseTwoKeyNav = new FullQualifiedName(SchemaProvider.nameSpace, "ETBaseTwoKeyNav");
+  public static final FullQualifiedName nameETBaseTwoKeyNav = new FullQualifiedName(SchemaProvider.nameSpace,
+      "ETBaseTwoKeyNav");
   public static final FullQualifiedName nameETBaseTwoKeyTwoPrim =
       new FullQualifiedName(SchemaProvider.nameSpace, "ETBaseTwoKeyTwoPrim");
-  public static final FullQualifiedName nameETCollAllPrim = new FullQualifiedName(SchemaProvider.nameSpace, "ETCollAllPrim");
-  public static final FullQualifiedName nameETCompAllPrim = new FullQualifiedName(SchemaProvider.nameSpace, "ETCompAllPrim");
-  public static final FullQualifiedName nameETCompCollAllPrim = new FullQualifiedName(SchemaProvider.nameSpace, "ETCompCollAllPrim");
-  public static final FullQualifiedName nameETCompCollComp = new FullQualifiedName(SchemaProvider.nameSpace, "ETCompCollComp");
+  public static final FullQualifiedName nameETCollAllPrim = new FullQualifiedName(SchemaProvider.nameSpace,
+      "ETCollAllPrim");
+  public static final FullQualifiedName nameETCompAllPrim = new FullQualifiedName(SchemaProvider.nameSpace,
+      "ETCompAllPrim");
+  public static final FullQualifiedName nameETCompCollAllPrim = new FullQualifiedName(SchemaProvider.nameSpace,
+      "ETCompCollAllPrim");
+  public static final FullQualifiedName nameETCompCollComp = new FullQualifiedName(SchemaProvider.nameSpace,
+      "ETCompCollComp");
   public static final FullQualifiedName nameETCompComp = new FullQualifiedName(SchemaProvider.nameSpace, "ETCompComp");
   public static final FullQualifiedName nameETCompMixPrimCollComp =
       new FullQualifiedName(SchemaProvider.nameSpace, "ETCompMixPrimCollComp");
-  public static final FullQualifiedName nameETFourKeyAlias = new FullQualifiedName(SchemaProvider.nameSpace, "ETFourKeyAlias");
+  public static final FullQualifiedName nameETFourKeyAlias = new FullQualifiedName(SchemaProvider.nameSpace,
+      "ETFourKeyAlias");
   public static final FullQualifiedName nameETKeyNav = new FullQualifiedName(SchemaProvider.nameSpace, "ETKeyNav");
-  public static final FullQualifiedName nameETKeyPrimNav = new FullQualifiedName(SchemaProvider.nameSpace, "ETKeyPrimNav");
-  public static final FullQualifiedName nameETKeyTwoKeyComp = new FullQualifiedName(SchemaProvider.nameSpace, "ETKeyTwoKeyComp");
+  public static final FullQualifiedName nameETKeyPrimNav = new FullQualifiedName(SchemaProvider.nameSpace,
+      "ETKeyPrimNav");
+  public static final FullQualifiedName nameETKeyTwoKeyComp = new FullQualifiedName(SchemaProvider.nameSpace,
+      "ETKeyTwoKeyComp");
   public static final FullQualifiedName nameETMedia = new FullQualifiedName(SchemaProvider.nameSpace, "ETMedia");
-  public static final FullQualifiedName nameETMixPrimCollComp = new FullQualifiedName(SchemaProvider.nameSpace, "ETMixPrimCollComp");
+  public static final FullQualifiedName nameETMixPrimCollComp = new FullQualifiedName(SchemaProvider.nameSpace,
+      "ETMixPrimCollComp");
   public static final FullQualifiedName nameETServerSidePaging =
       new FullQualifiedName(SchemaProvider.nameSpace, "ETServerSidePaging");
   public static final FullQualifiedName nameETTwoBase = new FullQualifiedName(SchemaProvider.nameSpace, "ETTwoBase");
@@ -57,8 +67,10 @@ public class EntityTypeProvider {
       new FullQualifiedName(SchemaProvider.nameSpace, "ETTwoBaseTwoKeyNav");
   public static final FullQualifiedName nameETTwoBaseTwoKeyTwoPrim =
       new FullQualifiedName(SchemaProvider.nameSpace, "ETTwoBaseTwoKeyTwoPrim");
-  public static final FullQualifiedName nameETTwoKeyNav = new FullQualifiedName(SchemaProvider.nameSpace, "ETTwoKeyNav");
-  public static final FullQualifiedName nameETTwoKeyTwoPrim = new FullQualifiedName(SchemaProvider.nameSpace, "ETTwoKeyTwoPrim");
+  public static final FullQualifiedName nameETTwoKeyNav =
+      new FullQualifiedName(SchemaProvider.nameSpace, "ETTwoKeyNav");
+  public static final FullQualifiedName nameETTwoKeyTwoPrim = new FullQualifiedName(SchemaProvider.nameSpace,
+      "ETTwoKeyTwoPrim");
   public static final FullQualifiedName nameETTwoPrim = new FullQualifiedName(SchemaProvider.nameSpace, "ETTwoPrim");
 
   public EntityType getEntityType(final FullQualifiedName entityTypeName) throws ODataException {
@@ -74,7 +86,9 @@ public class EntityTypeProvider {
               PropertyProvider.propertySingle, PropertyProvider.propertyDouble, PropertyProvider.propertyDecimal,
               PropertyProvider.propertyBinary, PropertyProvider.propertyDate, PropertyProvider.propertyDateTimeOffset,
               PropertyProvider.propertyDuration, PropertyProvider.propertyGuid, PropertyProvider.propertyTimeOfDay
-              /* TODO add propertyStream */));
+              /* TODO add propertyStream */))
+          .setNavigationProperties(Arrays.asList(PropertyProvider.navPropertyETTwoPrimOne_ETTwoPrim,
+              PropertyProvider.collectionNavPropertyETTwoPrimMany_ETTwoPrim));
 
     } else if (entityTypeName.equals(nameETCollAllPrim)) {
       return new EntityType()
@@ -98,7 +112,10 @@ public class EntityTypeProvider {
           .setName("ETTwoPrim")
           .setKey(Arrays.asList(new PropertyRef().setPropertyName("PropertyInt16")))
           .setProperties(Arrays.asList(
-              PropertyProvider.propertyInt16_NotNullable, PropertyProvider.propertyString));
+              PropertyProvider.propertyInt16_NotNullable, PropertyProvider.propertyString))
+          .setNavigationProperties(
+              Arrays.asList(PropertyProvider.navPropertyETAllPrimOne_ETAllPrim,
+                  PropertyProvider.collectionNavPropertyETAllPrimMany_ETAllPrim));
 
     } else if (entityTypeName.equals(nameETMixPrimCollComp)) {
       return new EntityType()
@@ -163,14 +180,14 @@ public class EntityTypeProvider {
               new PropertyRef().setPropertyName("PropertyTimeOfDay")))
           .setProperties(
               Arrays.asList(
-                  PropertyProvider.propertyString, PropertyProvider.propertyBoolean,
-                  PropertyProvider.propertyByte, PropertyProvider.propertySByte,
-                  PropertyProvider.propertyInt16, PropertyProvider.propertyInt32, PropertyProvider.propertyInt64,
-                  PropertyProvider.propertyDecimal, PropertyProvider.propertyDate,
-                  PropertyProvider.propertySingle, PropertyProvider.propertyDouble,
-                  PropertyProvider.propertyDateTimeOffset,
-                  PropertyProvider.propertyDuration, PropertyProvider.propertyGuid,
-                  PropertyProvider.propertyTimeOfDay /* TODO add propertyStream */));
+                  PropertyProvider.propertyString_NotNullable, PropertyProvider.propertyBoolean_NotNullable,
+                  PropertyProvider.propertyByte_NotNullable, PropertyProvider.propertySByte_NotNullable,
+                  PropertyProvider.propertyInt16_NotNullable, PropertyProvider.propertyInt32_NotNullable,
+                  PropertyProvider.propertyInt64_NotNullable,
+                  PropertyProvider.propertyDecimal_NotNullable, PropertyProvider.propertyDate_NotNullable,
+                  PropertyProvider.propertyDateTimeOffset_NotNullable,
+                  PropertyProvider.propertyDuration_NotNullable, PropertyProvider.propertyGuid_NotNullable,
+                  PropertyProvider.propertyTimeOfDay_NotNullable /* TODO add propertyStream */));
 
     } else if (entityTypeName.equals(nameETCompAllPrim)) {
       return new EntityType()
@@ -181,11 +198,11 @@ public class EntityTypeProvider {
 
     } else if (entityTypeName.equals(nameETCompCollAllPrim)) {
       return new EntityType()
-          .setName("ETCompAllPrim")
+          .setName("ETCompCollAllPrim")
           .setKey(Arrays.asList(new PropertyRef().setPropertyName("PropertyInt16")))
 
           .setProperties(
-              Arrays.asList(PropertyProvider.propertyInt16_NotNullable, 
+              Arrays.asList(PropertyProvider.propertyInt16_NotNullable,
                   PropertyProvider.propertyComplex_CTCollAllPrim));
 
     } else if (entityTypeName.equals(nameETCompComp)) {
@@ -205,7 +222,7 @@ public class EntityTypeProvider {
 
     } else if (entityTypeName.equals(nameETMedia)) {
       return new EntityType()
-          .setName("ETCompCollComp")
+          .setName("ETMedia")
           .setKey(Arrays.asList(new PropertyRef().setPropertyName("PropertyInt16")))
           .setProperties(Arrays.asList(PropertyProvider.propertyInt16_NotNullable))
           .setHasStream(true);
@@ -232,9 +249,10 @@ public class EntityTypeProvider {
 
     } else if (entityTypeName.equals(nameETServerSidePaging)) {
       return new EntityType()
-          .setName("ETKeyTwoKeyComp")
+          .setName(nameETServerSidePaging.getName())
           .setKey(Arrays.asList(new PropertyRef().setPropertyName("PropertyInt16")))
-          .setProperties(Arrays.asList(PropertyProvider.propertyInt16_NotNullable, PropertyProvider.propertyString));
+          .setProperties(Arrays.asList(PropertyProvider.propertyInt16_NotNullable,
+              PropertyProvider.propertyString_NotNullable));
 
     } else if (entityTypeName.equals(nameETAllNullable)) {
       return new EntityType()
@@ -243,26 +261,32 @@ public class EntityTypeProvider {
           .setProperties(
               Arrays.asList(
                   new Property()
-                      .setName("PropertyKey").setType(PropertyProvider.nameInt16),
-                  PropertyProvider.propertyInt16,
-                  PropertyProvider.propertyString, PropertyProvider.propertyBoolean,
-                  PropertyProvider.propertyByte, PropertyProvider.propertySByte,
-                  PropertyProvider.propertyInt32, PropertyProvider.propertyInt64,
-                  PropertyProvider.propertySingle, PropertyProvider.propertyDouble,
-                  PropertyProvider.propertyDecimal, PropertyProvider.propertyBinary, PropertyProvider.propertyDate,
-                  PropertyProvider.propertyDateTimeOffset,
-                  PropertyProvider.propertyDuration, PropertyProvider.propertyGuid,
-                  PropertyProvider.propertyTimeOfDay /* TODO add propertyStream */,
-                  PropertyProvider.collPropertyString, PropertyProvider.collPropertyBoolean,
-                  PropertyProvider.collPropertyByte, PropertyProvider.collPropertySByte,
-                  PropertyProvider.collPropertyInt16,
-                  PropertyProvider.collPropertyInt32, PropertyProvider.collPropertyInt64,
-                  PropertyProvider.collPropertySingle, PropertyProvider.collPropertyDouble,
-                  PropertyProvider.collPropertyDecimal, PropertyProvider.collPropertyBinary,
-                  PropertyProvider.collPropertyDate,
-                  PropertyProvider.collPropertyDateTimeOffset,
-                  PropertyProvider.collPropertyDuration, PropertyProvider.collPropertyGuid,
-                  PropertyProvider.collPropertyTimeOfDay /* TODO add propertyStream */));
+                      .setName("PropertyKey").setType(PropertyProvider.nameInt16).setNullable(false),
+                  PropertyProvider.propertyInt16_ExplicitNullable, PropertyProvider.propertyString_ExplicitNullable,
+                  PropertyProvider.propertyBoolean_ExplicitNullable, PropertyProvider.propertyByte_ExplicitNullable,
+                  PropertyProvider.propertySByte_ExplicitNullable, PropertyProvider.propertyInt32_ExplicitNullable,
+                  PropertyProvider.propertyInt64_ExplicitNullable, PropertyProvider.propertySingle_ExplicitNullable,
+                  PropertyProvider.propertyDouble_ExplicitNullable, PropertyProvider.propertyDecimal_ExplicitNullable,
+                  PropertyProvider.propertyBinary_ExplicitNullable, PropertyProvider.propertyDate_ExplicitNullable,
+                  PropertyProvider.propertyDateTimeOffset_ExplicitNullable,
+                  PropertyProvider.propertyDuration_ExplicitNullable, PropertyProvider.propertyGuid_ExplicitNullable,
+                  PropertyProvider.propertyTimeOfDay_ExplicitNullable /* TODO add propertyStream */,
+                  PropertyProvider.collPropertyString_ExplicitNullable,
+                  PropertyProvider.collPropertyBoolean_ExplicitNullable,
+                  PropertyProvider.collPropertyByte_ExplicitNullable,
+                  PropertyProvider.collPropertySByte_ExplicitNullable,
+                  PropertyProvider.collPropertyInt16_ExplicitNullable,
+                  PropertyProvider.collPropertyInt32_ExplicitNullable,
+                  PropertyProvider.collPropertyInt64_ExplicitNullable,
+                  PropertyProvider.collPropertySingle_ExplicitNullable,
+                  PropertyProvider.collPropertyDouble_ExplicitNullable,
+                  PropertyProvider.collPropertyDecimal_ExplicitNullable,
+                  PropertyProvider.collPropertyBinary_ExplicitNullable,
+                  PropertyProvider.collPropertyDate_ExplicitNullable,
+                  PropertyProvider.collPropertyDateTimeOffset_ExplicitNullable,
+                  PropertyProvider.collPropertyDuration_ExplicitNullable,
+                  PropertyProvider.collPropertyGuid_ExplicitNullable,
+                  PropertyProvider.collPropertyTimeOfDay_ExplicitNullable /* TODO add propertyStream */));
 
     } else if (entityTypeName.equals(nameETKeyNav)) {
       return new EntityType()
@@ -280,7 +304,7 @@ public class EntityTypeProvider {
                   ))
           .setNavigationProperties(
               Arrays.asList(
-                  PropertyProvider.navPropertyETTwoKeyNavOne_ETTwoKeyNav,
+                  PropertyProvider.navPropertyETTwoKeyNavOne_ETTwoKeyNav_NotNullable,
                   PropertyProvider.collectionNavPropertyETTwoKeyNavMany_ETTwoKeyNav,
                   PropertyProvider.navPropertyETKeyNavOne_ETKeyNav,
                   PropertyProvider.collectionNavPropertyETKeyNavMany_ETKeyNav,
@@ -289,19 +313,13 @@ public class EntityTypeProvider {
                   ));
     } else if (entityTypeName.equals(nameETKeyPrimNav)) {
       return new EntityType()
-          .setName("ETKeyNav")
+          .setName("ETKeyPrimNav")
           .setKey(Arrays.asList(new PropertyRef().setPropertyName("PropertyInt16")))
           .setProperties(Arrays.asList(
-              PropertyProvider.propertyInt16_NotNullable, PropertyProvider.propertyString_NotNullable))
+              PropertyProvider.propertyInt16_NotNullable, PropertyProvider.propertyString_ExplicitNullable))
           .setNavigationProperties(
               Arrays.asList(
-                  PropertyProvider.navPropertyETTwoKeyNavOne_ETTwoKeyNav,
-                  PropertyProvider.collectionNavPropertyETTwoKeyNavMany_ETTwoKeyNav,
-                  PropertyProvider.navPropertyETKeyNavOne_ETKeyNav,
-                  PropertyProvider.collectionNavPropertyETKeyNavMany_ETKeyNav,
-                  PropertyProvider.navPropertyETMediaOne_ETMedia,
-                  PropertyProvider.collectionNavPropertyETMediaMany_ETMedia
-                  ));
+                  PropertyProvider.navPropertyETKeyPrimNavOne_ETKeyPrimNav));
 
     } else if (entityTypeName.equals(nameETTwoKeyNav)) {
       return new EntityType()
@@ -311,9 +329,10 @@ public class EntityTypeProvider {
               new PropertyRef().setPropertyName("PropertyString")))
           .setProperties(
               Arrays.asList(
-                  PropertyProvider.propertyInt16, PropertyProvider.propertyString,
+                  PropertyProvider.propertyInt16_NotNullable, PropertyProvider.propertyString_NotNullable,
                   PropertyProvider.propertyComplex_CTPrimComp_NotNullable,
-                  new Property().setName("PropertyComplexNav").setType(ComplexTypeProvider.nameCTBasePrimCompNav),
+                  new Property().setName("PropertyComplexNav").setType(ComplexTypeProvider.nameCTBasePrimCompNav)
+                      .setNullable(false),
                   PropertyProvider.propertyComplexEnum_CTPrimEnum_NotNullable,
                   PropertyProvider.collPropertyComplex_CTPrimComp,
                   new Property().setName("CollPropertyComplexNav").setType(ComplexTypeProvider.nameCTNavFiveProp)
@@ -337,27 +356,23 @@ public class EntityTypeProvider {
       return new EntityType()
           .setName("ETBaseTwoKeyNav")
           .setBaseType(nameETTwoKeyNav)
-          .setProperties(Arrays.asList(PropertyProvider.propertyDate))
+          .setProperties(Arrays.asList(PropertyProvider.propertyDate_ExplicitNullable))
           .setNavigationProperties(Arrays.asList(
               new NavigationProperty()
-                  .setName("NavPropertyETBaseTwoKeyNav")
+                  .setName("NavPropertyETBaseTwoKeyNavOne")
                   .setType(nameETBaseTwoKeyNav),
               new NavigationProperty()
-                  .setName("NavPropertyETTwoBaseTwoKeyNav")
-                  .setType(nameETTwoBaseTwoKeyNav)))
-          .setHasStream(true);
+                  .setName("NavPropertyETTwoBaseTwoKeyNavOne")
+                  .setType(nameETTwoBaseTwoKeyNav)));
 
     } else if (entityTypeName.equals(nameETTwoBaseTwoKeyNav)) {
       return new EntityType()
           .setName("ETTwoBaseTwoKeyNav")
           .setBaseType(nameETBaseTwoKeyNav)
           .setKey(Arrays.asList(new PropertyRef().setPropertyName("PropertyInt16")))
-          .setProperties(Arrays.asList(PropertyProvider.propertyGuid))
+          .setProperties(Arrays.asList(PropertyProvider.propertyGuid_ExplicitNullable))
           .setNavigationProperties(Arrays.asList(
               new NavigationProperty()
-                  .setName("NavPropertyETBaseTwoKeyNavOne")
-                  .setType(nameETBaseTwoKeyNav),
-              new NavigationProperty()
                   .setName("NavPropertyETBaseTwoKeyNavMany")
                   .setType(nameETBaseTwoKeyNav)
                   .setCollection(true)
@@ -377,7 +392,7 @@ public class EntityTypeProvider {
                   .setPropertyName("PropertyComplexComplex/PropertyComplex/PropertyString")
                   .setAlias("KeyAlias3")))
           .setProperties(
-              Arrays.asList(PropertyProvider.propertyGuid, PropertyProvider.propertyComplex_CTTwoPrim,
+              Arrays.asList(PropertyProvider.propertyInt16_NotNullable, PropertyProvider.propertyComplex_CTTwoPrim,
                   PropertyProvider.propertyComplexComplex_CTCompComp));
     } else if (entityTypeName.equals(nameETCompMixPrimCollComp)) {
       return new EntityType()

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/6a3a4a1d/lib/server-core/src/test/java/org/apache/olingo/server/core/testutil/techprovider/EnumTypeProvider.java
----------------------------------------------------------------------
diff --git a/lib/server-core/src/test/java/org/apache/olingo/server/core/testutil/techprovider/EnumTypeProvider.java b/lib/server-core/src/test/java/org/apache/olingo/server/core/testutil/techprovider/EnumTypeProvider.java
index 0640a99..e843955 100644
--- a/lib/server-core/src/test/java/org/apache/olingo/server/core/testutil/techprovider/EnumTypeProvider.java
+++ b/lib/server-core/src/test/java/org/apache/olingo/server/core/testutil/techprovider/EnumTypeProvider.java
@@ -22,6 +22,7 @@ import java.util.Arrays;
 
 import org.apache.olingo.commons.api.ODataException;
 import org.apache.olingo.commons.api.edm.FullQualifiedName;
+import org.apache.olingo.commons.core.edm.primitivetype.EdmPrimitiveTypeKind;
 import org.apache.olingo.server.api.edm.provider.EnumMember;
 import org.apache.olingo.server.api.edm.provider.EnumType;
 
@@ -33,6 +34,8 @@ public class EnumTypeProvider {
     if (enumTypeName.equals(nameENString)) {
       return new EnumType()
           .setName("ENString")
+          .setFlags(true)
+          .setUnderlyingType(EdmPrimitiveTypeKind.Int16.getFullQualifiedName())
           .setMembers(Arrays.asList(
               new EnumMember().setName("String1").setValue("1"),
               new EnumMember().setName("String2").setValue("2"),

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/6a3a4a1d/lib/server-core/src/test/java/org/apache/olingo/server/core/testutil/techprovider/FunctionProvider.java
----------------------------------------------------------------------
diff --git a/lib/server-core/src/test/java/org/apache/olingo/server/core/testutil/techprovider/FunctionProvider.java b/lib/server-core/src/test/java/org/apache/olingo/server/core/testutil/techprovider/FunctionProvider.java
index f9e15ec..fe6fefb 100644
--- a/lib/server-core/src/test/java/org/apache/olingo/server/core/testutil/techprovider/FunctionProvider.java
+++ b/lib/server-core/src/test/java/org/apache/olingo/server/core/testutil/techprovider/FunctionProvider.java
@@ -112,21 +112,19 @@ public class FunctionProvider {
   public static final FullQualifiedName nameBFESTwoKeyNavRTESTwoKeyNav =
       new FullQualifiedName(SchemaProvider.nameSpace, "BFESTwoKeyNavRTESTwoKeyNav");
 
-  // TODO: warum BAET?
-  public static final FullQualifiedName nameBAETTwoKeyNavRTETTwoKeyNav =
-      new FullQualifiedName(SchemaProvider.nameSpace, "BAETTwoKeyNavRTETTwoKeyNav");
-
   // Unbound Functions
   public static final FullQualifiedName nameUFCRTCollCTTwoPrim =
       new FullQualifiedName(SchemaProvider.nameSpace, "UFCRTCollCTTwoPrim");
   public static final FullQualifiedName nameUFCRTCollCTTwoPrimParam =
       new FullQualifiedName(SchemaProvider.nameSpace, "UFCRTCollCTTwoPrimParam");
-  public static final FullQualifiedName nameUFCRTCollString = new FullQualifiedName(SchemaProvider.nameSpace, "UFCRTCollString");
+  public static final FullQualifiedName nameUFCRTCollString = new FullQualifiedName(SchemaProvider.nameSpace,
+      "UFCRTCollString");
   public static final FullQualifiedName nameUFCRTCollStringTwoParam =
       new FullQualifiedName(SchemaProvider.nameSpace, "UFCRTCollStringTwoParam");
   public static final FullQualifiedName nameUFCRTCTAllPrimTwoParam =
       new FullQualifiedName(SchemaProvider.nameSpace, "UFCRTCTAllPrimTwoParam");
-  public static final FullQualifiedName nameUFCRTCTTwoPrim = new FullQualifiedName(SchemaProvider.nameSpace, "UFCRTCTTwoPrim");
+  public static final FullQualifiedName nameUFCRTCTTwoPrim = new FullQualifiedName(SchemaProvider.nameSpace,
+      "UFCRTCTTwoPrim");
   public static final FullQualifiedName nameUFCRTCTTwoPrimParam =
       new FullQualifiedName(SchemaProvider.nameSpace, "UFCRTCTTwoPrimParam");
   public static final FullQualifiedName nameUFCRTESMixPrimCollCompTwoParam =
@@ -135,8 +133,10 @@ public class FunctionProvider {
       new FullQualifiedName(SchemaProvider.nameSpace, "UFCRTESTwoKeyNavParam");
   public static final FullQualifiedName nameUFCRTETAllPrimTwoParam =
       new FullQualifiedName(SchemaProvider.nameSpace, "UFCRTETAllPrimTwoParam");
-  public static final FullQualifiedName nameUFCRTETKeyNav = new FullQualifiedName(SchemaProvider.nameSpace, "UFCRTETKeyNav");
-  public static final FullQualifiedName nameUFCRTETMedia = new FullQualifiedName(SchemaProvider.nameSpace, "UFCRTETMedia");
+  public static final FullQualifiedName nameUFCRTETKeyNav = new FullQualifiedName(SchemaProvider.nameSpace,
+      "UFCRTETKeyNav");
+  public static final FullQualifiedName nameUFCRTETMedia = new FullQualifiedName(SchemaProvider.nameSpace,
+      "UFCRTETMedia");
 
   public static final FullQualifiedName nameUFCRTETTwoKeyNavParam =
       new FullQualifiedName(SchemaProvider.nameSpace, "UFCRTETTwoKeyNavParam");
@@ -144,7 +144,8 @@ public class FunctionProvider {
   public static final FullQualifiedName nameUFCRTETTwoKeyNavParamCTTwoPrim =
       new FullQualifiedName(SchemaProvider.nameSpace, "UFCRTETTwoKeyNavParamCTTwoPrim");
 
-  public static final FullQualifiedName nameUFCRTString = new FullQualifiedName(SchemaProvider.nameSpace, "UFCRTString");
+  public static final FullQualifiedName nameUFCRTString =
+      new FullQualifiedName(SchemaProvider.nameSpace, "UFCRTString");
 
   public static final FullQualifiedName nameUFCRTStringTwoParam =
       new FullQualifiedName(SchemaProvider.nameSpace, "UFCRTStringTwoParam");
@@ -154,6 +155,15 @@ public class FunctionProvider {
   public static final FullQualifiedName nameUFNRTInt16 =
       new FullQualifiedName(SchemaProvider.nameSpace, "UFNRTInt16");
 
+  public static final FullQualifiedName nameUFNRTCollCTNavFiveProp = new FullQualifiedName(SchemaProvider.nameSpace,
+      "UFNRTCollCTNavFiveProp");
+
+  public static final FullQualifiedName nameBFCESTwoKeyNavRTCTNavFiveProp = new FullQualifiedName(
+      SchemaProvider.nameSpace, "BFCESTwoKeyNavRTCTNavFiveProp");
+
+  public static final FullQualifiedName nameBFCESTwoKeyNavRTCollCTNavFiveProp = new FullQualifiedName(
+      SchemaProvider.nameSpace, "BFCESTwoKeyNavRTCollCTNavFiveProp");
+
   public List<Function> getFunctions(final FullQualifiedName functionName) throws ODataException {
 
     if (functionName.equals(nameUFNRTInt16)) {
@@ -162,7 +172,7 @@ public class FunctionProvider {
               .setName("UFNRTInt16")
               .setParameters(new ArrayList<Parameter>())
               .setReturnType(
-                  new ReturnType().setType(PropertyProvider.nameString))
+                  new ReturnType().setType(PropertyProvider.nameInt16))
           );
 
     } else if (functionName.equals(nameUFCRTETKeyNav)) {
@@ -172,7 +182,7 @@ public class FunctionProvider {
               .setParameters(new ArrayList<Parameter>())
               .setComposable(true)
               .setReturnType(
-                  new ReturnType().setType(EntityTypeProvider.nameETKeyNav))
+                  new ReturnType().setType(EntityTypeProvider.nameETKeyNav).setNullable(false))
           );
 
     } else if (functionName.equals(nameUFCRTETTwoKeyNavParam)) {
@@ -180,10 +190,10 @@ public class FunctionProvider {
           new Function()
               .setName("UFCRTETTwoKeyNavParam")
               .setParameters(Arrays.asList(
-                  new Parameter().setName("ParameterInt16").setType(PropertyProvider.nameInt16)))
+                  new Parameter().setName("ParameterInt16").setType(PropertyProvider.nameInt16).setNullable(false)))
               .setComposable(true)
               .setReturnType(
-                  new ReturnType().setType(EntityTypeProvider.nameETTwoKeyNav)
+                  new ReturnType().setType(EntityTypeProvider.nameETTwoKeyNav).setNullable(false)
               )
           );
 
@@ -192,10 +202,11 @@ public class FunctionProvider {
           new Function()
               .setName("UFCRTETTwoKeyNavParamCTTwoPrim")
               .setParameters(Arrays.asList(
-                  new Parameter().setName("ParameterCTTwoPrim").setType(ComplexTypeProvider.nameCTTwoPrim)))
+                  new Parameter().setName("ParameterCTTwoPrim").setType(ComplexTypeProvider.nameCTTwoPrim)
+                      .setNullable(false)))
               .setComposable(true)
               .setReturnType(
-                  new ReturnType().setType(EntityTypeProvider.nameETTwoKeyNav)
+                  new ReturnType().setType(EntityTypeProvider.nameETTwoKeyNav).setNullable(false)
               )
           );
 
@@ -206,22 +217,24 @@ public class FunctionProvider {
               .setParameters(Arrays.asList(
                   new Parameter()
                       .setName("ParameterInt16")
-                      .setType(PropertyProvider.nameInt16)))
+                      .setType(PropertyProvider.nameInt16)
+                      .setNullable(false)))
               .setComposable(true)
               .setReturnType(
-                  new ReturnType().setType(PropertyProvider.nameString)),
+                  new ReturnType().setType(PropertyProvider.nameString).setNullable(false)),
           new Function()
               .setName("UFCRTStringTwoParam")
               .setParameters(Arrays.asList(
                   new Parameter()
                       .setName("ParameterString")
-                      .setType(PropertyProvider.nameString),
+                      .setType(PropertyProvider.nameString)
+                      .setNullable(false),
                   new Parameter()
                       .setName("ParameterInt16")
-                      .setType(PropertyProvider.nameInt16)))
+                      .setType(PropertyProvider.nameInt16)
+                      .setNullable(false)))
               .setComposable(true)
-              .setReturnType(
-                  new ReturnType().setType(PropertyProvider.nameString))
+              .setReturnType(new ReturnType().setType(PropertyProvider.nameString).setNullable(false))
 
           );
 
@@ -232,10 +245,11 @@ public class FunctionProvider {
               .setParameters(Arrays.asList(
                   new Parameter()
                       .setName("ParameterInt16")
-                      .setType(PropertyProvider.nameInt16)))
+                      .setType(PropertyProvider.nameInt16)
+                      .setNullable(false)))
               .setComposable(true)
               .setReturnType(
-                  new ReturnType().setType(EntityTypeProvider.nameETTwoKeyNav).setCollection(true))
+                  new ReturnType().setType(EntityTypeProvider.nameETTwoKeyNav).setCollection(true).setNullable(false))
           );
 
     } else if (functionName.equals(nameUFCRTString)) {
@@ -247,7 +261,7 @@ public class FunctionProvider {
               .setParameters(new ArrayList<Parameter>())
               .setComposable(true)
               .setReturnType(
-                  new ReturnType().setType(PropertyProvider.nameString)
+                  new ReturnType().setType(PropertyProvider.nameString).setNullable(false)
               )
           );
 
@@ -256,11 +270,11 @@ public class FunctionProvider {
           new Function()
               .setName("UFCRTCollStringTwoParam")
               .setParameters(Arrays.asList(
-                  new Parameter().setName("ParameterString").setType(PropertyProvider.nameString),
-                  new Parameter().setName("ParameterInt16").setType(PropertyProvider.nameInt16)))
+                  new Parameter().setName("ParameterString").setType(PropertyProvider.nameString).setNullable(false),
+                  new Parameter().setName("ParameterInt16").setType(PropertyProvider.nameInt16).setNullable(false)))
               .setComposable(true)
               .setReturnType(
-                  new ReturnType().setType(PropertyProvider.nameString).setCollection(true))
+                  new ReturnType().setType(PropertyProvider.nameString).setCollection(true).setNullable(false))
           );
 
     } else if (functionName.equals(nameUFCRTCollString)) {
@@ -270,7 +284,7 @@ public class FunctionProvider {
               .setParameters(new ArrayList<Parameter>())
               .setComposable(true)
               .setReturnType(
-                  new ReturnType().setType(PropertyProvider.nameString).setCollection(true))
+                  new ReturnType().setType(PropertyProvider.nameString).setCollection(true).setNullable(false))
           );
 
     } else if (functionName.equals(nameUFCRTCTAllPrimTwoParam)) {
@@ -278,11 +292,11 @@ public class FunctionProvider {
           new Function()
               .setName("UFCRTCTAllPrimTwoParam")
               .setParameters(Arrays.asList(
-                  new Parameter().setName("ParameterString").setType(PropertyProvider.nameString),
-                  new Parameter().setName("ParameterInt16").setType(PropertyProvider.nameInt16)))
+                  new Parameter().setName("ParameterString").setType(PropertyProvider.nameString).setNullable(false),
+                  new Parameter().setName("ParameterInt16").setType(PropertyProvider.nameInt16).setNullable(false)))
               .setComposable(true)
               .setReturnType(
-                  new ReturnType().setType(ComplexTypeProvider.nameCTAllPrim))
+                  new ReturnType().setType(ComplexTypeProvider.nameCTAllPrim).setNullable(false))
           );
 
     } else if (functionName.equals(nameUFCRTCTTwoPrimParam)) {
@@ -290,22 +304,22 @@ public class FunctionProvider {
           new Function()
               .setName("UFCRTCTTwoPrimParam")
               .setParameters(Arrays.asList(
-                  new Parameter().setName("ParameterString").setType(PropertyProvider.nameString),
-                  new Parameter().setName("ParameterInt16").setType(PropertyProvider.nameInt16)))
+                  new Parameter().setName("ParameterInt16").setType(PropertyProvider.nameInt16).setNullable(false),
+                  new Parameter().setName("ParameterString").setType(PropertyProvider.nameString).setNullable(true)))
               .setComposable(true)
               .setReturnType(
-                  new ReturnType().setType(ComplexTypeProvider.nameCTTwoPrim))
+                  new ReturnType().setType(ComplexTypeProvider.nameCTTwoPrim).setNullable(false))
           );
     } else if (functionName.equals(nameUFCRTCollCTTwoPrimParam)) {
       return Arrays.asList(
           new Function()
               .setName("UFCRTCollCTTwoPrimParam")
               .setParameters(Arrays.asList(
-                  new Parameter().setName("ParameterString").setType(PropertyProvider.nameString),
-                  new Parameter().setName("ParameterInt16").setType(PropertyProvider.nameInt16)))
+                  new Parameter().setName("ParameterInt16").setType(PropertyProvider.nameInt16).setNullable(false),
+                  new Parameter().setName("ParameterString").setType(PropertyProvider.nameString).setNullable(true)))
               .setComposable(true)
               .setReturnType(
-                  new ReturnType().setType(ComplexTypeProvider.nameCTTwoPrim).setCollection(true))
+                  new ReturnType().setType(ComplexTypeProvider.nameCTTwoPrim).setCollection(true).setNullable(false))
           );
 
     } else if (functionName.equals(nameUFCRTCTTwoPrim)) {
@@ -315,17 +329,17 @@ public class FunctionProvider {
               .setParameters(new ArrayList<Parameter>())
               .setComposable(true)
               .setReturnType(
-                  new ReturnType().setType(ComplexTypeProvider.nameCTTwoPrim))
+                  new ReturnType().setType(ComplexTypeProvider.nameCTTwoPrim).setNullable(false))
           );
 
     } else if (functionName.equals(nameUFCRTCollCTTwoPrim)) {
       return Arrays.asList(
           new Function()
-              .setName("UFCRTCTTwoPrim")
-
+              .setName("UFCRTCollCTTwoPrim")
+              .setComposable(true)
               .setParameters(new ArrayList<Parameter>())
               .setReturnType(
-                  new ReturnType().setType(ComplexTypeProvider.nameCTTwoPrim).setCollection(true))
+                  new ReturnType().setType(ComplexTypeProvider.nameCTTwoPrim).setCollection(true).setNullable(false))
           );
 
     } else if (functionName.equals(nameUFCRTETMedia)) {
@@ -333,28 +347,9 @@ public class FunctionProvider {
           new Function()
               .setName("UFCRTETMedia")
               .setParameters(new ArrayList<Parameter>())
-              .setReturnType(
-                  new ReturnType().setType(EntityTypeProvider.nameETMedia))
-          );
-
-    } else if (functionName.equals(nameUFCRTString)) {
-      return Arrays.asList(
-          new Function()
-              .setName("UFCRTString")
-              .setParameters(new ArrayList<Parameter>())
-              .setReturnType(new ReturnType()
-                  .setType(PropertyProvider.nameString)
-              )
-          );
-
-    } else if (functionName.equals(nameUFCRTCollCTTwoPrim)) {
-      return Arrays.asList(
-          new Function()
-              .setName("UFCRTCollCTTwoPrim")
               .setComposable(true)
-              .setParameters(new ArrayList<Parameter>())
               .setReturnType(
-                  new ReturnType().setType(ComplexTypeProvider.nameCTTwoPrim).setCollection(true))
+                  new ReturnType().setType(EntityTypeProvider.nameETMedia).setNullable(false))
           );
 
     } else if (functionName.equals(nameUFNRTESMixPrimCollCompTwoParam)) {
@@ -362,11 +357,12 @@ public class FunctionProvider {
           new Function()
               .setName("UFNRTESMixPrimCollCompTwoParam")
               .setParameters(Arrays.asList(
-                  new Parameter().setName("ParameterString").setType(PropertyProvider.nameString),
-                  new Parameter().setName("ParameterInt16").setType(PropertyProvider.nameInt16)))
+                  new Parameter().setName("ParameterString").setType(PropertyProvider.nameString).setNullable(false),
+                  new Parameter().setName("ParameterInt16").setType(PropertyProvider.nameInt16).setNullable(false)))
               .setComposable(false)
               .setReturnType(
-                  new ReturnType().setType(EntityTypeProvider.nameETMixPrimCollComp).setCollection(true))
+                  new ReturnType().setType(EntityTypeProvider.nameETMixPrimCollComp).setCollection(true)
+                      .setNullable(false))
           );
 
     } else if (functionName.equals(nameUFCRTETAllPrimTwoParam)) {
@@ -374,11 +370,11 @@ public class FunctionProvider {
           new Function()
               .setName("UFCRTETAllPrimTwoParam")
               .setParameters(Arrays.asList(
-                  new Parameter().setName("ParameterString").setType(PropertyProvider.nameString),
-                  new Parameter().setName("ParameterInt16").setType(PropertyProvider.nameInt16)))
+                  new Parameter().setName("ParameterString").setType(PropertyProvider.nameString).setNullable(false),
+                  new Parameter().setName("ParameterInt16").setType(PropertyProvider.nameInt16).setNullable(false)))
               .setComposable(true)
               .setReturnType(
-                  new ReturnType().setType(EntityTypeProvider.nameETAllPrim))
+                  new ReturnType().setType(EntityTypeProvider.nameETAllPrim).setNullable(false))
           );
 
     } else if (functionName.equals(nameUFCRTESMixPrimCollCompTwoParam)) {
@@ -386,14 +382,22 @@ public class FunctionProvider {
           new Function()
               .setName("UFCRTESMixPrimCollCompTwoParam")
               .setParameters(Arrays.asList(
-                  new Parameter().setName("ParameterString").setType(PropertyProvider.nameString),
-                  new Parameter().setName("ParameterInt16").setType(PropertyProvider.nameInt16)
+                  new Parameter().setName("ParameterString").setType(PropertyProvider.nameString).setNullable(false),
+                  new Parameter().setName("ParameterInt16").setType(PropertyProvider.nameInt16).setNullable(false)
                   ))
               .setComposable(true)
               .setReturnType(
-                  new ReturnType().setType(EntityTypeProvider.nameETMixPrimCollComp).setCollection(true))
+                  new ReturnType().setType(EntityTypeProvider.nameETMixPrimCollComp).setCollection(true)
+                      .setNullable(false))
           );
 
+    } else if (functionName.equals(nameUFNRTCollCTNavFiveProp)) {
+      return Arrays.asList(
+          new Function()
+              .setName("UFNRTCollCTNavFiveProp")
+              .setReturnType(
+                  new ReturnType().setType(ComplexTypeProvider.nameCTNavFiveProp).setCollection(true))
+          );
     } else if (functionName.equals(nameBFCESTwoKeyNavRTESTwoKeyNav)) {
       return Arrays
           .asList(
@@ -403,10 +407,11 @@ public class FunctionProvider {
                   .setParameters(
                       Arrays.asList(
                           new Parameter().setName("BindingParam").setType(EntityTypeProvider.nameETTwoKeyNav)
-                              .setCollection(true)))
+                              .setCollection(true).setNullable(false)))
                   .setComposable(true)
                   .setReturnType(
-                      new ReturnType().setType(EntityTypeProvider.nameETTwoKeyNav).setCollection(true)),
+                      new ReturnType().setType(EntityTypeProvider.nameETTwoKeyNav).setCollection(true)
+                          .setNullable(false)),
 
               new Function()
                   .setName("BFCESTwoKeyNavRTESTwoKeyNav")
@@ -414,33 +419,36 @@ public class FunctionProvider {
                   .setParameters(
                       Arrays.asList(
                           new Parameter().setName("BindingParam").setType(EntityTypeProvider.nameETTwoKeyNav)
-                              .setCollection(true),
+                              .setCollection(true).setNullable(false),
                           new Parameter().setName("ParameterString").setType(PropertyProvider.nameString)
-                              .setCollection(false)))
+                              .setCollection(false).setNullable(false)))
                   .setComposable(true)
                   .setReturnType(
-                      new ReturnType().setType(EntityTypeProvider.nameETTwoKeyNav).setCollection(true)),
+                      new ReturnType().setType(EntityTypeProvider.nameETTwoKeyNav).setCollection(true)
+                          .setNullable(false)),
               new Function()
                   .setName("BFCESTwoKeyNavRTESTwoKeyNav")
                   .setBound(true)
                   .setParameters(
                       Arrays.asList(
                           new Parameter().setName("BindingParam").setType(EntityTypeProvider.nameETKeyNav)
-                              .setCollection(true)))
+                              .setCollection(true).setNullable(false)))
                   .setComposable(true)
                   .setReturnType(
-                      new ReturnType().setType(EntityTypeProvider.nameETTwoKeyNav).setCollection(true)),
+                      new ReturnType().setType(EntityTypeProvider.nameETTwoKeyNav).setCollection(true)
+                          .setNullable(false)),
               new Function()
                   .setName("BFCESTwoKeyNavRTESTwoKeyNav")
                   .setBound(true)
                   .setParameters(
                       Arrays.asList(new Parameter().setName("BindingParam").setType(EntityTypeProvider.nameETKeyNav)
-                          .setCollection(true),
+                          .setCollection(true).setNullable(false),
                           new Parameter().setName("ParameterString").setType(PropertyProvider.nameString)
-                              .setCollection(false)))
+                              .setCollection(false).setNullable(false)))
                   .setComposable(true)
                   .setReturnType(
-                      new ReturnType().setType(EntityTypeProvider.nameETTwoKeyNav).setCollection(true))
+                      new ReturnType().setType(EntityTypeProvider.nameETTwoKeyNav).setCollection(true)
+                          .setNullable(false))
           );
 
     } else if (functionName.equals(nameBFCStringRTESTwoKeyNav)) {
@@ -448,10 +456,10 @@ public class FunctionProvider {
           new Function().setName("BFCStringRTESTwoKeyNav")
               .setBound(true)
               .setParameters(Arrays.asList(
-                  new Parameter().setName("BindingParam").setType(PropertyProvider.nameString)))
+                  new Parameter().setName("BindingParam").setType(PropertyProvider.nameString).setNullable(false)))
               .setComposable(true)
               .setReturnType(
-                  new ReturnType().setType(EntityTypeProvider.nameETTwoKeyNav).setCollection(true))
+                  new ReturnType().setType(EntityTypeProvider.nameETTwoKeyNav).setCollection(true).setNullable(false))
           );
 
     } else if (functionName.equals(nameBFCETBaseTwoKeyNavRTETTwoKeyNav)) {
@@ -460,10 +468,11 @@ public class FunctionProvider {
               .setName("BFCETBaseTwoKeyNavRTETTwoKeyNav")
               .setBound(true)
               .setParameters(Arrays.asList(
-                  new Parameter().setName("BindingParam").setType(EntityTypeProvider.nameETBaseTwoKeyNav)))
+                  new Parameter().setName("BindingParam").setType(EntityTypeProvider.nameETBaseTwoKeyNav)
+                      .setNullable(false)))
               .setComposable(true)
               .setReturnType(
-                  new ReturnType().setType(EntityTypeProvider.nameETTwoKeyNav)
+                  new ReturnType().setType(EntityTypeProvider.nameETTwoKeyNav).setNullable(false)
               )
           );
 
@@ -474,10 +483,11 @@ public class FunctionProvider {
               .setBound(true)
               .setParameters(Arrays.asList(
                   new Parameter().setName("BindingParam").setType(EntityTypeProvider.nameETBaseTwoKeyNav)
-                      .setCollection(true)))
+                      .setCollection(true).setNullable(false)))
               .setComposable(true)
               .setReturnType(
-                  new ReturnType().setType(EntityTypeProvider.nameETBaseTwoKeyNav).setCollection(true))
+                  new ReturnType().setType(EntityTypeProvider.nameETBaseTwoKeyNav).setCollection(true)
+                      .setNullable(false))
           );
 
     } else if (functionName.equals(nameBFCESAllPrimRTCTAllPrim)) {
@@ -487,11 +497,11 @@ public class FunctionProvider {
               .setBound(true)
               .setParameters(
                   Arrays.asList(
-                      new Parameter().setName("BindingParam").setType(EntityTypeProvider.nameETAllPrim).setCollection(
-                          true)))
+                      new Parameter().setName("BindingParam").setType(EntityTypeProvider.nameETAllPrim)
+                          .setCollection(true).setNullable(false)))
               .setComposable(true)
               .setReturnType(
-                  new ReturnType().setType(ComplexTypeProvider.nameCTAllPrim))
+                  new ReturnType().setType(ComplexTypeProvider.nameCTAllPrim).setNullable(false))
           );
 
     } else if (functionName.equals(nameBFCESTwoKeyNavRTCTTwoPrim)) {
@@ -502,10 +512,10 @@ public class FunctionProvider {
               .setParameters(
                   Arrays.asList(
                       new Parameter().setName("BindingParam").setType(EntityTypeProvider.nameETTwoKeyNav)
-                          .setCollection(true)))
+                          .setCollection(true).setNullable(false)))
               .setComposable(true)
               .setReturnType(
-                  new ReturnType().setType(ComplexTypeProvider.nameCTTwoPrim))
+                  new ReturnType().setType(ComplexTypeProvider.nameCTTwoPrim).setNullable(false))
           );
 
     } else if (functionName.equals(nameBFCESTwoKeyNavRTCollCTTwoPrim)) {
@@ -516,10 +526,10 @@ public class FunctionProvider {
               .setParameters(
                   Arrays.asList(
                       new Parameter().setName("BindingParam").setType(EntityTypeProvider.nameETTwoKeyNav)
-                          .setCollection(true)))
+                          .setCollection(true).setNullable(false)))
               .setComposable(true)
               .setReturnType(
-                  new ReturnType().setType(ComplexTypeProvider.nameCTTwoPrim).setCollection(true))
+                  new ReturnType().setType(ComplexTypeProvider.nameCTTwoPrim).setCollection(true).setNullable(false))
           );
 
     } else if (functionName.equals(nameBFCESTwoKeyNavRTString)) {
@@ -530,10 +540,10 @@ public class FunctionProvider {
               .setParameters(
                   Arrays.asList(
                       new Parameter().setName("BindingParam").setType(EntityTypeProvider.nameETTwoKeyNav)
-                          .setCollection(true)))
+                          .setCollection(true).setNullable(false)))
               .setComposable(true)
               .setReturnType(
-                  new ReturnType().setType(PropertyProvider.nameString))
+                  new ReturnType().setType(PropertyProvider.nameString).setNullable(false))
           );
 
     } else if (functionName.equals(nameBFCESTwoKeyNavRTCollString)) {
@@ -544,10 +554,10 @@ public class FunctionProvider {
               .setParameters(
                   Arrays.asList(
                       new Parameter().setName("BindingParam").setType(EntityTypeProvider.nameETTwoKeyNav)
-                          .setCollection(true)))
+                          .setCollection(true).setNullable(false)))
               .setComposable(true)
               .setReturnType(
-                  new ReturnType().setType(PropertyProvider.nameString).setCollection(true))
+                  new ReturnType().setType(PropertyProvider.nameString).setCollection(true).setNullable(false))
           );
 
     } else if (functionName.equals(nameBFCETTwoKeyNavRTESTwoKeyNav)) {
@@ -556,10 +566,11 @@ public class FunctionProvider {
               .setName("BFCETTwoKeyNavRTESTwoKeyNav")
               .setBound(true)
               .setParameters(Arrays.asList(
-                  new Parameter().setName("BindingParam").setType(EntityTypeProvider.nameETTwoKeyNav)))
+                  new Parameter().setName("BindingParam").setType(EntityTypeProvider.nameETTwoKeyNav)
+                      .setNullable(false)))
               .setComposable(true)
               .setReturnType(
-                  new ReturnType().setType(EntityTypeProvider.nameETTwoKeyNav).setCollection(true))
+                  new ReturnType().setType(EntityTypeProvider.nameETTwoKeyNav).setCollection(true).setNullable(false))
           );
 
     } else if (functionName.equals(nameBFCETBaseTwoKeyNavRTESTwoKeyNav)) {
@@ -567,11 +578,13 @@ public class FunctionProvider {
           new Function()
               .setName("BFCETBaseTwoKeyNavRTESTwoKeyNav")
               .setBound(true)
-              .setParameters(Arrays.asList(
-                  new Parameter().setName("BindingParam").setType(EntityTypeProvider.nameETBaseTwoKeyNav)))
+              .setParameters(
+                  Arrays.asList(
+                      new Parameter().setName("BindingParam").setType(EntityTypeProvider.nameETBaseTwoKeyNav)
+                          .setNullable(false)))
               .setComposable(true)
               .setReturnType(
-                  new ReturnType().setType(EntityTypeProvider.nameETTwoKeyNav).setCollection(true))
+                  new ReturnType().setType(EntityTypeProvider.nameETTwoKeyNav).setCollection(true).setNullable(false))
           );
 
     } else if (functionName.equals(nameBFCSINavRTESTwoKeyNav)) {
@@ -579,11 +592,13 @@ public class FunctionProvider {
           new Function()
               .setName("BFCSINavRTESTwoKeyNav")
               .setBound(true)
-              .setParameters(Arrays.asList(
-                  new Parameter().setName("BindingParam").setType(EntityTypeProvider.nameETTwoKeyNav)))
+              .setParameters(
+                  Arrays.asList(
+                      new Parameter().setName("BindingParam").setType(EntityTypeProvider.nameETTwoKeyNav).setNullable(
+                          false)))
               .setComposable(true)
               .setReturnType(
-                  new ReturnType().setType(EntityTypeProvider.nameETTwoKeyNav).setCollection(true))
+                  new ReturnType().setType(EntityTypeProvider.nameETTwoKeyNav).setCollection(true).setNullable(false))
           );
 
     } else if (functionName.equals(nameBFCETBaseTwoKeyNavRTESBaseTwoKey)) {
@@ -591,11 +606,14 @@ public class FunctionProvider {
           new Function()
               .setName("BFCETBaseTwoKeyNavRTESBaseTwoKey")
               .setBound(true)
-              .setParameters(Arrays.asList(
-                  new Parameter().setName("BindingParam").setType(EntityTypeProvider.nameETBaseTwoKeyNav)))
+              .setParameters(
+                  Arrays.asList(
+                      new Parameter().setName("BindingParam").setType(EntityTypeProvider.nameETBaseTwoKeyNav)
+                          .setNullable(false)))
               .setComposable(true)
               .setReturnType(
-                  new ReturnType().setType(EntityTypeProvider.nameETBaseTwoKeyNav).setCollection(true))
+                  new ReturnType().setType(EntityTypeProvider.nameETBaseTwoKeyNav).setCollection(true).setNullable(
+                      false))
           );
 
     } else if (functionName.equals(nameBFCCollStringRTESTwoKeyNav)) {
@@ -603,10 +621,13 @@ public class FunctionProvider {
           new Function()
               .setName("BFCCollStringRTESTwoKeyNav")
               .setBound(true)
-              .setParameters(Arrays.asList(
-                  new Parameter().setName("BindingParam").setType(PropertyProvider.nameString).setCollection(true)))
+              .setParameters(
+                  Arrays.asList(
+                      new Parameter().setName("BindingParam").setType(PropertyProvider.nameString).setCollection(true)
+                          .setNullable(false)))
               .setComposable(true)
-              .setReturnType(new ReturnType().setType(EntityTypeProvider.nameETTwoKeyNav).setCollection(true))
+              .setReturnType(
+                  new ReturnType().setType(EntityTypeProvider.nameETTwoKeyNav).setCollection(true).setNullable(false))
           );
 
     } else if (functionName.equals(nameBFCCTPrimCompRTESTwoKeyNav)) {
@@ -614,11 +635,13 @@ public class FunctionProvider {
           new Function()
               .setName("BFCCTPrimCompRTESTwoKeyNav")
               .setBound(true)
-              .setParameters(Arrays.asList(
-                  new Parameter().setName("BindingParam").setType(ComplexTypeProvider.nameCTPrimComp)))
+              .setParameters(
+                  Arrays.asList(
+                      new Parameter().setName("BindingParam").setType(ComplexTypeProvider.nameCTPrimComp).setNullable(
+                          false)))
               .setComposable(true)
               .setReturnType(
-                  new ReturnType().setType(EntityTypeProvider.nameETTwoKeyNav).setCollection(true))
+                  new ReturnType().setType(EntityTypeProvider.nameETTwoKeyNav).setCollection(true).setNullable(false))
           );
 
     } else if (functionName.equals(nameBFCCTPrimCompRTESBaseTwoKeyNav)) {
@@ -626,11 +649,14 @@ public class FunctionProvider {
           new Function()
               .setName("BFCCTPrimCompRTESBaseTwoKeyNav")
               .setBound(true)
-              .setParameters(Arrays.asList(
-                  new Parameter().setName("BindingParam").setType(ComplexTypeProvider.nameCTPrimComp)))
+              .setParameters(
+                  Arrays.asList(
+                      new Parameter().setName("BindingParam").setType(ComplexTypeProvider.nameCTPrimComp).setNullable(
+                          false)))
               .setComposable(true)
               .setReturnType(
-                  new ReturnType().setType(EntityTypeProvider.nameETBaseTwoKeyNav).setCollection(true))
+                  new ReturnType().setType(EntityTypeProvider.nameETBaseTwoKeyNav).setCollection(true).setNullable(
+                      false))
           );
 
     } else if (functionName.equals(nameBFCCollCTPrimCompRTESAllPrim)) {
@@ -641,10 +667,10 @@ public class FunctionProvider {
               .setParameters(
                   Arrays.asList(
                       new Parameter().setName("BindingParam").setType(ComplexTypeProvider.nameCTPrimComp)
-                          .setCollection(true)))
+                          .setCollection(true).setNullable(false)))
               .setComposable(true)
               .setReturnType(
-                  new ReturnType().setType(EntityTypeProvider.nameETAllPrim).setCollection(true))
+                  new ReturnType().setType(EntityTypeProvider.nameETAllPrim).setCollection(true).setNullable(false))
           );
 
     } else if (functionName.equals(nameBFCESTwoKeyNavRTTwoKeyNav)) {
@@ -655,10 +681,10 @@ public class FunctionProvider {
               .setParameters(
                   Arrays.asList(
                       new Parameter().setName("BindingParam").setType(EntityTypeProvider.nameETTwoKeyNav)
-                          .setCollection(true)))
+                          .setCollection(true).setNullable(false)))
               .setComposable(true)
               .setReturnType(
-                  new ReturnType().setType(EntityTypeProvider.nameETTwoKeyNav))
+                  new ReturnType().setType(EntityTypeProvider.nameETTwoKeyNav).setNullable(false))
           );
 
     } else if (functionName.equals(nameBFCESKeyNavRTETKeyNav)) {
@@ -667,11 +693,13 @@ public class FunctionProvider {
           new Function()
               .setName("BFCESKeyNavRTETKeyNav")
               .setBound(true)
-              .setParameters(Arrays.asList(
-                  new Parameter().setName("BindingParam").setType(EntityTypeProvider.nameETKeyNav).setCollection(true)))
+              .setParameters(
+                  Arrays.asList(
+                      new Parameter().setName("BindingParam").setType(EntityTypeProvider.nameETKeyNav).setCollection(
+                          true).setNullable(false)))
               .setComposable(true)
               .setReturnType(
-                  new ReturnType().setType(EntityTypeProvider.nameETKeyNav))
+                  new ReturnType().setType(EntityTypeProvider.nameETKeyNav).setNullable(false))
           );
 
     } else if (functionName.equals(nameBFCETKeyNavRTETKeyNav)) {
@@ -680,10 +708,10 @@ public class FunctionProvider {
               .setName("BFCETKeyNavRTETKeyNav")
               .setBound(true)
               .setParameters(Arrays.asList(
-                  new Parameter().setName("BindingParam").setType(EntityTypeProvider.nameETKeyNav)))
+                  new Parameter().setName("BindingParam").setType(EntityTypeProvider.nameETKeyNav).setNullable(false)))
               .setComposable(true)
               .setReturnType(
-                  new ReturnType().setType(EntityTypeProvider.nameETKeyNav))
+                  new ReturnType().setType(EntityTypeProvider.nameETKeyNav).setNullable(false))
           );
     } else if (functionName.equals(nameBFESTwoKeyNavRTESTwoKeyNav)) {
       return Arrays.asList(
@@ -693,9 +721,10 @@ public class FunctionProvider {
               .setParameters(
                   Arrays.asList(
                       new Parameter().setName("BindingParam").setType(EntityTypeProvider.nameETTwoKeyNav)
-                          .setCollection(true)))
+                          .setCollection(true).setNullable(false)))
               .setComposable(true)
-              .setReturnType(new ReturnType().setType(EntityTypeProvider.nameETTwoKeyNav).setCollection(true))
+              .setReturnType(
+                  new ReturnType().setType(EntityTypeProvider.nameETTwoKeyNav).setCollection(true).setNullable(false))
 
           );
 
@@ -704,11 +733,13 @@ public class FunctionProvider {
           new Function()
               .setName("BFCETTwoKeyNavRTETTwoKeyNav")
               .setBound(true)
-              .setParameters(Arrays.asList(
-                  new Parameter().setName("BindingParam").setType(EntityTypeProvider.nameETTwoKeyNav)))
+              .setParameters(
+                  Arrays.asList(
+                      new Parameter().setName("BindingParam").setType(EntityTypeProvider.nameETTwoKeyNav).setNullable(
+                          false)))
               .setComposable(true)
               .setReturnType(
-                  new ReturnType().setType(EntityTypeProvider.nameETTwoKeyNav))
+                  new ReturnType().setType(EntityTypeProvider.nameETTwoKeyNav).setNullable(false))
           );
 
     } else if (functionName.equals(nameBFCETTwoKeyNavRTCTTwoPrim)) {
@@ -716,11 +747,40 @@ public class FunctionProvider {
           new Function()
               .setName("BFCETTwoKeyNavRTCTTwoPrim")
               .setBound(true)
-              .setParameters(Arrays.asList(
-                  new Parameter().setName("BindingParam").setType(EntityTypeProvider.nameETTwoKeyNav)))
+              .setParameters(
+                  Arrays.asList(
+                      new Parameter().setName("BindingParam").setType(EntityTypeProvider.nameETTwoKeyNav).setNullable(
+                          false)))
+              .setComposable(true)
+              .setReturnType(
+                  new ReturnType().setType(ComplexTypeProvider.nameCTTwoPrim).setNullable(false))
+          );
+    } else if (functionName.equals(nameBFCESTwoKeyNavRTCTNavFiveProp)) {
+      return Arrays.asList(
+          new Function()
+              .setName("BFCESTwoKeyNavRTCTNavFiveProp")
+              .setBound(true)
+              .setParameters(
+                  Arrays.asList(
+                      new Parameter().setName("BindingParam").setType(EntityTypeProvider.nameETTwoKeyNav)
+                          .setCollection(true).setNullable(false)))
+              .setComposable(true)
+              .setReturnType(
+                  new ReturnType().setType(ComplexTypeProvider.nameCTNavFiveProp).setNullable(false))
+          );
+    } else if (functionName.equals(nameBFCESTwoKeyNavRTCollCTNavFiveProp)) {
+      return Arrays.asList(
+          new Function()
+              .setName("BFCESTwoKeyNavRTCollCTNavFiveProp")
+              .setBound(true)
+              .setParameters(
+                  Arrays.asList(
+                      new Parameter().setName("BindingParam").setType(EntityTypeProvider.nameETTwoKeyNav)
+                          .setCollection(true).setNullable(false)))
               .setComposable(true)
               .setReturnType(
-                  new ReturnType().setType(ComplexTypeProvider.nameCTTwoPrim))
+                  new ReturnType().setType(ComplexTypeProvider.nameCTNavFiveProp).setCollection(true)
+                      .setNullable(false))
           );
     } else if (functionName.equals(nameBFCESTwoKeyNavRTStringParam)) {
       return Arrays.asList(
@@ -730,11 +790,12 @@ public class FunctionProvider {
               .setParameters(
                   Arrays.asList(
                       new Parameter().setName("BindingParam").setType(EntityTypeProvider.nameETTwoKeyNav)
-                          .setCollection(true),
-                      new Parameter().setName("ParameterComplex").setType(ComplexTypeProvider.nameCTTwoPrim)))
+                          .setCollection(true).setNullable(false),
+                      new Parameter().setName("ParameterComplex").setType(ComplexTypeProvider.nameCTTwoPrim)
+                          .setNullable(false)))
               .setComposable(true)
               .setReturnType(
-                  new ReturnType().setType(PropertyProvider.nameString))
+                  new ReturnType().setType(PropertyProvider.nameString).setNullable(false))
           );
 
     } else if (functionName.equals(nameBFCESKeyNavRTETKeyNavParam)) {
@@ -742,49 +803,46 @@ public class FunctionProvider {
           new Function()
               .setName("BFCESKeyNavRTETKeyNavParam")
               .setBound(true)
-              .setParameters(Arrays.asList(
-                  new Parameter().setName("BindingParam").setType(EntityTypeProvider.nameETKeyNav).setCollection(true),
-                  new Parameter().setName("ParameterString").setType(PropertyProvider.nameString)))
+              .setParameters(
+                  Arrays.asList(
+                      new Parameter().setName("BindingParam").setType(EntityTypeProvider.nameETKeyNav).setCollection(
+                          true).setNullable(false),
+                      new Parameter().setName("ParameterString").setType(PropertyProvider.nameString)
+                          .setNullable(false)))
               .setComposable(true)
               .setReturnType(
-                  new ReturnType().setType(EntityTypeProvider.nameETKeyNav))
+                  new ReturnType().setType(EntityTypeProvider.nameETKeyNav).setNullable(false))
           );
     } else if (functionName.equals(nameBFCCTPrimCompRTETTwoKeyNavParam)) {
       return Arrays.asList(
           new Function()
               .setName("BFCCTPrimCompRTETTwoKeyNavParam")
               .setBound(true)
-              .setParameters(Arrays.asList(
-                  new Parameter().setName("BindingParam").setType(ComplexTypeProvider.nameCTPrimComp),
-                  new Parameter().setName("ParameterString").setType(PropertyProvider.nameString)))
+              .setParameters(
+                  Arrays.asList(
+                      new Parameter().setName("BindingParam").setType(ComplexTypeProvider.nameCTPrimComp).setNullable(
+                          false),
+                      new Parameter().setName("ParameterString").setType(PropertyProvider.nameString)
+                          .setNullable(false)))
               .setComposable(true)
               .setReturnType(new ReturnType()
-                  .setType(EntityTypeProvider.nameETTwoKeyNav)
+                  .setType(EntityTypeProvider.nameETTwoKeyNav).setNullable(false)
               )
           );
-    } else if (functionName.equals(nameBAETTwoKeyNavRTETTwoKeyNav)) {
-      return Arrays.asList(
-          new Function()
-              .setName("BAETTwoKeyNavRTETTwoKeyNav")
-              .setBound(true)
-              .setParameters(Arrays.asList(
-                  new Parameter().setName("BindingParam").setType(PropertyProvider.nameInt16).setCollection(true),
-                  new Parameter().setName("ParameterString").setType(PropertyProvider.nameString).setNullable(true)))
-              .setComposable(true)
-              .setReturnType(
-                  new ReturnType().setType(ComplexTypeProvider.nameCTTwoPrim).setCollection(true))
-          );
     } else if (functionName.equals(nameBFCCTPrimCompRTESTwoKeyNavParam)) {
       return Arrays.asList(
           new Function()
               .setName("BFCCTPrimCompRTESTwoKeyNavParam")
               .setBound(true)
-              .setParameters(Arrays.asList(
-                  new Parameter().setName("BindingParam").setType(ComplexTypeProvider.nameCTPrimComp),
-                  new Parameter().setName("ParameterString").setType(PropertyProvider.nameString)))
+              .setParameters(
+                  Arrays.asList(
+                      new Parameter().setName("BindingParam").setType(ComplexTypeProvider.nameCTPrimComp).setNullable(
+                          false),
+                      new Parameter().setName("ParameterString").setType(PropertyProvider.nameString)
+                          .setNullable(false)))
               .setComposable(true)
               .setReturnType(
-                  new ReturnType().setType(EntityTypeProvider.nameETTwoKeyNav).setCollection(true))
+                  new ReturnType().setType(EntityTypeProvider.nameETTwoKeyNav).setCollection(true).setNullable(false))
           );
     }
 

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/6a3a4a1d/lib/server-core/src/test/java/org/apache/olingo/server/core/testutil/techprovider/PropertyProvider.java
----------------------------------------------------------------------
diff --git a/lib/server-core/src/test/java/org/apache/olingo/server/core/testutil/techprovider/PropertyProvider.java b/lib/server-core/src/test/java/org/apache/olingo/server/core/testutil/techprovider/PropertyProvider.java
index a237ebd..6dc2399 100644
--- a/lib/server-core/src/test/java/org/apache/olingo/server/core/testutil/techprovider/PropertyProvider.java
+++ b/lib/server-core/src/test/java/org/apache/olingo/server/core/testutil/techprovider/PropertyProvider.java
@@ -54,112 +54,304 @@ public class PropertyProvider {
       .setName("CollPropertyBinary")
       .setType(nameBinary)
       .setCollection(true);
+  
+  public static final Property collPropertyBinary_ExplicitNullable = new Property()
+  .setName("CollPropertyBinary")
+  .setType(nameBinary)
+  .setNullable(true)
+  .setCollection(true);
 
   public static final Property collPropertyBoolean = new Property()
       .setName("CollPropertyBoolean")
       .setType(nameBoolean)
       .setCollection(true);
+  
+  public static final Property collPropertyBoolean_ExplicitNullable = new Property()
+  .setName("CollPropertyBoolean")
+  .setType(nameBoolean)
+  .setNullable(true)
+  .setCollection(true);
 
   public static final Property collPropertyByte = new Property()
       .setName("CollPropertyByte")
       .setType(nameByte)
       .setCollection(true);
 
+  public static final Property collPropertyByte_ExplicitNullable = new Property()
+  .setName("CollPropertyByte")
+  .setType(nameByte)
+  .setNullable(true)
+  .setCollection(true);
+  
   public static final Property collPropertyDate = new Property()
       .setName("CollPropertyDate")
       .setType(nameDate)
       .setCollection(true);
+  
+  public static final Property collPropertyDate_ExplicitNullable = new Property()
+  .setName("CollPropertyDate")
+  .setType(nameDate)
+  .setNullable(true)
+  .setCollection(true);
 
   public static final Property collPropertyDateTimeOffset = new Property()
       .setName("CollPropertyDateTimeOffset")
       .setType(nameDateTimeOffset)
       .setCollection(true);
+  
+  public static final Property collPropertyDateTimeOffset_ExplicitNullable = new Property()
+  .setName("CollPropertyDateTimeOffset")
+  .setType(nameDateTimeOffset)
+  .setNullable(true)
+  .setCollection(true);
 
   public static final Property collPropertyDecimal = new Property()
       .setName("CollPropertyDecimal")
       .setType(nameDecimal)
       .setCollection(true);
+  
+  public static final Property collPropertyDecimal_ExplicitNullable = new Property()
+  .setName("CollPropertyDecimal")
+  .setType(nameDecimal)
+  .setNullable(true)
+  .setCollection(true);
 
   public static final Property collPropertyDouble = new Property()
       .setName("CollPropertyDouble")
       .setType(nameDouble)
       .setCollection(true);
+  
+  public static final Property collPropertyDouble_ExplicitNullable = new Property()
+  .setName("CollPropertyDouble")
+  .setType(nameDouble)
+  .setNullable(true)
+  .setCollection(true);
 
   public static final Property collPropertyDuration = new Property()
       .setName("CollPropertyDuration")
       .setType(nameDuration)
       .setCollection(true);
+  
+  public static final Property collPropertyDuration_ExplicitNullable = new Property()
+  .setName("CollPropertyDuration")
+  .setType(nameDuration)
+  .setNullable(true)
+  .setCollection(true);
+  
   public static final Property collPropertyGuid = new Property()
       .setName("CollPropertyGuid")
       .setType(nameGuid)
       .setCollection(true);
+  
+  public static final Property collPropertyGuid_ExplicitNullable = new Property()
+  .setName("CollPropertyGuid")
+  .setType(nameGuid)
+  .setNullable(true)
+  .setCollection(true);
+  
   public static final Property collPropertyInt16 = new Property()
       .setName("CollPropertyInt16")
       .setType(nameInt16)
       .setCollection(true);
+  
+  public static final Property collPropertyInt16_ExplicitNullable = new Property()
+  .setName("CollPropertyInt16")
+  .setType(nameInt16)
+  .setNullable(true)
+  .setCollection(true);
+  
   public static final Property collPropertyInt32 = new Property()
       .setName("CollPropertyInt32")
       .setType(nameInt32)
       .setCollection(true);
+  
+  public static final Property collPropertyInt32_ExplicitNullable = new Property()
+  .setName("CollPropertyInt32")
+  .setType(nameInt32)
+  .setNullable(true)
+  .setCollection(true);
+  
   public static final Property collPropertyInt64 = new Property()
       .setName("CollPropertyInt64")
       .setType(nameInt64)
       .setCollection(true);
+  
+  public static final Property collPropertyInt64_ExplicitNullable = new Property()
+  .setName("CollPropertyInt64")
+  .setType(nameInt64)
+  .setNullable(true)
+  .setCollection(true);
 
   public static final Property collPropertySByte = new Property()
       .setName("CollPropertySByte")
       .setType(nameSByte)
       .setCollection(true);
 
+  public static final Property collPropertySByte_ExplicitNullable = new Property()
+  .setName("CollPropertySByte")
+  .setType(nameSByte)
+  .setNullable(true)
+  .setCollection(true);
+  
   public static final Property collPropertySingle = new Property()
       .setName("CollPropertySingle")
       .setType(nameSingle)
       .setCollection(true);
+  
+  public static final Property collPropertySingle_ExplicitNullable = new Property()
+  .setName("CollPropertySingle")
+  .setType(nameSingle)
+  .setNullable(true)
+  .setCollection(true);
 
   public static final Property collPropertyString = new Property()
       .setName("CollPropertyString")
       .setType(nameString)
       .setCollection(true);
+  
+  public static final Property collPropertyString_ExplicitNullable = new Property()
+  .setName("CollPropertyString")
+  .setType(nameString)
+  .setNullable(true)
+  .setCollection(true);
 
   public static final Property collPropertyTimeOfDay = new Property()
-      .setName("CollPropertyTimeOfDay")
-      .setType(nameTimeOfDay)
-      .setCollection(true);
+  .setName("CollPropertyTimeOfDay")
+  .setType(nameTimeOfDay)
+  .setCollection(true);
+  
+  public static final Property collPropertyTimeOfDay_ExplicitNullable = new Property()
+  .setName("CollPropertyTimeOfDay")
+  .setType(nameTimeOfDay)
+  .setNullable(true)
+  .setCollection(true);
 
   public static final Property propertyBinary = new Property()
       .setName("PropertyBinary")
       .setType(nameBinary);
+
+  public static final Property propertyBinary_NotNullable = new Property()
+      .setName("PropertyBinary")
+      .setType(nameBinary)
+      .setNullable(false);
+
+  public static final Property propertyBinary_ExplicitNullable = new Property()
+      .setName("PropertyBinary")
+      .setType(nameBinary)
+      .setNullable(true);
+
   public static final Property propertyBoolean = new Property()
       .setName("PropertyBoolean")
       .setType(nameBoolean);
+
+  public static final Property propertyBoolean_NotNullable = new Property()
+      .setName("PropertyBoolean")
+      .setType(nameBoolean)
+      .setNullable(false);
+
+  public static final Property propertyBoolean_ExplicitNullable = new Property()
+      .setName("PropertyBoolean")
+      .setType(nameBoolean)
+      .setNullable(true);
+
   public static final Property propertyByte = new Property()
       .setName("PropertyByte")
       .setType(nameByte);
 
+  public static final Property propertyByte_NotNullable = new Property()
+      .setName("PropertyByte")
+      .setType(nameByte)
+      .setNullable(false);
+
+  public static final Property propertyByte_ExplicitNullable = new Property()
+      .setName("PropertyByte")
+      .setType(nameByte)
+      .setNullable(true);
+
   public static final Property propertyDate = new Property()
       .setName("PropertyDate")
       .setType(nameDate);
 
+  public static final Property propertyDate_NotNullable = new Property()
+      .setName("PropertyDate")
+      .setType(nameDate)
+      .setNullable(false);
+
+  public static final Property propertyDate_ExplicitNullable = new Property()
+      .setName("PropertyDate")
+      .setType(nameDate)
+      .setNullable(true);
+
   public static final Property propertyDateTimeOffset = new Property()
       .setName("PropertyDateTimeOffset")
       .setType(nameDateTimeOffset);
 
+  public static final Property propertyDateTimeOffset_NotNullable = new Property()
+      .setName("PropertyDateTimeOffset")
+      .setType(nameDateTimeOffset)
+      .setNullable(false);
+
+  public static final Property propertyDateTimeOffset_ExplicitNullable = new Property()
+      .setName("PropertyDateTimeOffset")
+      .setType(nameDateTimeOffset)
+      .setNullable(true);
+
   public static final Property propertyDecimal = new Property()
       .setName("PropertyDecimal")
       .setType(nameDecimal);
 
+  public static final Property propertyDecimal_NotNullable = new Property()
+      .setName("PropertyDecimal")
+      .setType(nameDecimal)
+      .setNullable(false);
+
+  public static final Property propertyDecimal_ExplicitNullable = new Property()
+      .setName("PropertyDecimal")
+      .setType(nameDecimal)
+      .setNullable(true);
+
   public static final Property propertyDouble = new Property()
       .setName("PropertyDouble")
       .setType(nameDouble);
 
+  public static final Property propertyDouble_NotNullable = new Property()
+      .setName("PropertyDouble")
+      .setType(nameDouble)
+      .setNullable(false);
+
+  public static final Property propertyDouble_ExplicitNullable = new Property()
+      .setName("PropertyDouble")
+      .setType(nameDouble)
+      .setNullable(true);
+
   public static final Property propertyDuration = new Property()
       .setName("PropertyDuration")
       .setType(nameDuration);
 
+  public static final Property propertyDuration_NotNullable = new Property()
+      .setName("PropertyDuration")
+      .setType(nameDuration)
+      .setNullable(false);
+
+  public static final Property propertyDuration_ExplicitNullable = new Property()
+      .setName("PropertyDuration")
+      .setType(nameDuration)
+      .setNullable(true);
+
   public static final Property propertyGuid = new Property()
       .setName("PropertyGuid")
       .setType(nameGuid);
 
+  public static final Property propertyGuid_NotNullable = new Property()
+      .setName("PropertyGuid")
+      .setType(nameGuid)
+      .setNullable(false);
+
+  public static final Property propertyGuid_ExplicitNullable = new Property()
+      .setName("PropertyGuid")
+      .setType(nameGuid)
+      .setNullable(true);
+
   public static final Property propertyInt16 = new Property()
       .setName("PropertyInt16")
       .setType(nameInt16);
@@ -168,33 +360,96 @@ public class PropertyProvider {
       .setName("PropertyInt16")
       .setType(nameInt16)
       .setNullable(false);
+
+  public static final Property propertyInt16_ExplicitNullable = new Property()
+      .setName("PropertyInt16")
+      .setType(nameInt16)
+      .setNullable(true);
+
   public static final Property propertyInt32 = new Property()
       .setName("PropertyInt32")
       .setType(nameInt32);
 
+  public static final Property propertyInt32_NotNullable = new Property()
+      .setName("PropertyInt32")
+      .setType(nameInt32)
+      .setNullable(false);
+
+  public static final Property propertyInt32_ExplicitNullable = new Property()
+      .setName("PropertyInt32")
+      .setType(nameInt32)
+      .setNullable(true);
+
   public static final Property propertyInt64 = new Property()
       .setName("PropertyInt64")
       .setType(nameInt64);
 
+  public static final Property propertyInt64_NotNullable = new Property()
+      .setName("PropertyInt64")
+      .setType(nameInt64)
+      .setNullable(false);
+
+  public static final Property propertyInt64_ExplicitNullable = new Property()
+      .setName("PropertyInt64")
+      .setType(nameInt64)
+      .setNullable(true);
+
   public static final Property propertySByte = new Property()
       .setName("PropertySByte")
       .setType(nameSByte);
 
+  public static final Property propertySByte_NotNullable = new Property()
+      .setName("PropertySByte")
+      .setType(nameSByte)
+      .setNullable(false);
+
+  public static final Property propertySByte_ExplicitNullable = new Property()
+      .setName("PropertySByte")
+      .setType(nameSByte)
+      .setNullable(true);
+
   public static final Property propertySingle = new Property()
       .setName("PropertySingle")
       .setType(nameSingle);
 
+  public static final Property propertySingle_NotNullable = new Property()
+      .setName("PropertySingle")
+      .setType(nameSingle)
+      .setNullable(false);
+
+  public static final Property propertySingle_ExplicitNullable = new Property()
+      .setName("PropertySingle")
+      .setType(nameSingle)
+      .setNullable(true);
+
   public static final Property propertyString = new Property()
       .setName("PropertyString")
       .setType(nameString);
 
   public static final Property propertyString_NotNullable = new Property()
       .setName("PropertyString")
-      .setType(nameString);
+      .setType(nameString)
+      .setNullable(false);
+
+  public static final Property propertyString_ExplicitNullable = new Property()
+      .setName("PropertyString")
+      .setType(nameString)
+      .setNullable(true);
 
-  public static final Property propertyTimeOfDay = new Property().setName("PropertyTimeOfDay")
+  public static final Property propertyTimeOfDay = new Property()
+      .setName("PropertyTimeOfDay")
       .setType(nameTimeOfDay);
 
+  public static final Property propertyTimeOfDay_NotNullable = new Property()
+      .setName("PropertyTimeOfDay")
+      .setType(nameTimeOfDay)
+      .setNullable(false);
+
+  public static final Property propertyTimeOfDay_ExplicitNullable = new Property()
+      .setName("PropertyTimeOfDay")
+      .setType(nameTimeOfDay)
+      .setNullable(true);
+
   /*
    * TODO add propertyStream
    * Property propertyStream = new Property()
@@ -235,7 +490,8 @@ public class PropertyProvider {
 
   public static final Property propertyComplex_CTPrimComp_NotNullable = new Property()
       .setName("PropertyComplex")
-      .setType(ComplexTypeProvider.nameCTPrimComp);
+      .setType(ComplexTypeProvider.nameCTPrimComp)
+      .setNullable(false);
 
   public static final Property propertyComplex_CTTwoPrim = new Property()
       .setName("PropertyComplex")
@@ -251,7 +507,8 @@ public class PropertyProvider {
 
   public static final Property propertyComplexEnum_CTPrimEnum_NotNullable = new Property()
       .setName("PropertyComplexEnum")
-      .setType(ComplexTypeProvider.nameCTPrimEnum);
+      .setType(ComplexTypeProvider.nameCTPrimEnum)
+      .setNullable(false);
 
   public static final Property propertyComplexTwoPrim_CTTwoPrim = new Property()
       .setName("PropertyComplexTwoPrim")
@@ -259,8 +516,7 @@ public class PropertyProvider {
 
   public static final Property propertyMixedPrimCollComp_CTMixPrimCollComp = new Property()
       .setName("PropertyMixedPrimCollComp")
-      .setType(ComplexTypeProvider.nameCTMixPrimCollComp)
-      .setCollection(true);
+      .setType(ComplexTypeProvider.nameCTMixPrimCollComp);
 
   // Navigation Properties -------------------------------------------------------------------------------------------
   public static final NavigationProperty collectionNavPropertyETKeyNavMany_ETKeyNav = new NavigationProperty()
@@ -283,21 +539,47 @@ public class PropertyProvider {
       .setName("NavPropertyETTwoKeyNavOne")
       .setType(EntityTypeProvider.nameETTwoKeyNav);
 
+  public static final NavigationProperty collectionNavPropertyETTwoPrimMany_ETTwoPrim = new NavigationProperty()
+      .setName("NavPropertyETTwoPrimMany")
+      .setType(EntityTypeProvider.nameETTwoPrim)
+      .setCollection(true)
+      .setNullable(false);
+
+  public static final NavigationProperty collectionNavPropertyETAllPrimMany_ETAllPrim = new NavigationProperty()
+      .setName("NavPropertyETAllPrimMany")
+      .setType(EntityTypeProvider.nameETAllPrim)
+      .setCollection(true);
+
   public static final NavigationProperty navPropertyETKeyNavOne_ETKeyNav = new NavigationProperty()
       .setName("NavPropertyETKeyNavOne")
       .setType(EntityTypeProvider.nameETKeyNav);
+
   public static final NavigationProperty navPropertyETMediaOne_ETMedia = new NavigationProperty()
       .setName("NavPropertyETMediaOne")
       .setType(EntityTypeProvider.nameETMedia);
 
-  public static final NavigationProperty navPropertyETKeyPrimNavOne = new NavigationProperty()
+  public static final NavigationProperty navPropertyETKeyPrimNavOne_ETKeyPrimNav = new NavigationProperty()
       .setName("NavPropertyETKeyPrimNavOne")
       .setType(EntityTypeProvider.nameETKeyPrimNav);
 
+  public static final NavigationProperty navPropertyETTwoKeyNavOne_ETTwoKeyNav_NotNullable = new NavigationProperty()
+      .setName("NavPropertyETTwoKeyNavOne")
+      .setType(EntityTypeProvider.nameETTwoKeyNav)
+      .setNullable(false);
+
   public static final NavigationProperty navPropertyETTwoKeyNavOne_ETTwoKeyNav = new NavigationProperty()
       .setName("NavPropertyETTwoKeyNavOne")
       .setType(EntityTypeProvider.nameETTwoKeyNav);
 
+  public static final NavigationProperty navPropertyETTwoPrimOne_ETTwoPrim = new NavigationProperty()
+      .setName("NavPropertyETTwoPrimOne")
+      .setType(EntityTypeProvider.nameETTwoPrim)
+      .setNullable(false);
+
+  public static final NavigationProperty navPropertyETAllPrimOne_ETAllPrim = new NavigationProperty()
+      .setName("NavPropertyETAllPrimOne")
+      .setType(EntityTypeProvider.nameETAllPrim);
+
   // EnumProperties --------------------------------------------------------------------------------------------------
   public static final Property propertyEnumString_ENString = new Property()
       .setName("PropertyEnumString")


[9/9] git commit: [OLINGO-168] More TechProvider Refactoring

Posted by ch...@apache.org.
[OLINGO-168] More TechProvider Refactoring


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

Branch: refs/heads/olingo168
Commit: 6a3a4a1d7227198575822eb30bb237701583b061
Parents: 59ef14f
Author: Christian Amend <ch...@apache.org>
Authored: Tue Apr 1 16:43:10 2014 +0200
Committer: Christian Amend <ch...@apache.org>
Committed: Tue Apr 1 16:46:50 2014 +0200

----------------------------------------------------------------------
 .../client/core/edm/EdmBindingTargetImpl.java   |  39 +-
 .../client/core/edm/EdmEntityContainerImpl.java |   9 +-
 .../core/edm/EdmNavigationPropertyImpl.java     |  33 +-
 .../client/core/edm/EdmOperationImpl.java       |   2 +-
 .../client/core/edm/v3/EdmEntitySetProxy.java   |   7 +
 .../commons/api/edm/EdmBindingTarget.java       |   7 +
 .../commons/api/edm/EdmEntityContainer.java     |   5 +
 .../commons/api/edm/EdmNavigationProperty.java  |  27 +-
 .../api/edm/EdmNavigationPropertyBinding.java   |  28 ++
 .../api/edm/EdmReferentialConstraint.java       |  28 ++
 .../core/edm/AbstractEdmEntityContainer.java    |  11 +-
 .../edm/EdmNavigationPropertyBindingImpl.java   |  43 +++
 .../core/edm/EdmReferentialConstraintImpl.java  |  42 ++
 .../core/edm/provider/EdmBindingTargetImpl.java |  24 ++
 .../edm/provider/EdmEntityContainerImpl.java    |   5 +-
 .../edm/provider/EdmNavigationPropertyImpl.java |  18 +
 .../core/serializer/ODataXmlSerializerImpl.java |   6 +-
 .../xml/MetadataDocumentXmlSerializer.java      | 323 +++++++++++-----
 .../serializer/xml/MetadataDocumentTest.java    |   6 +-
 .../core/testutil/EdmTechTestProvider.java      |   4 +-
 .../testutil/techprovider/ActionProvider.java   |  64 ++--
 .../techprovider/ComplexTypeProvider.java       |  26 +-
 .../techprovider/ContainerProvider.java         |   2 +-
 .../testutil/techprovider/EdmTechProvider.java  |  12 +
 .../techprovider/EntityTypeProvider.java        | 153 ++++----
 .../testutil/techprovider/EnumTypeProvider.java |   3 +
 .../testutil/techprovider/FunctionProvider.java | 380 +++++++++++--------
 .../testutil/techprovider/PropertyProvider.java | 302 ++++++++++++++-
 .../testutil/techprovider/SchemaProvider.java   |  23 +-
 .../techprovider/TypeDefinitionProvider.java    |   2 +-
 .../core/uri/antlr/TestUriParserImpl.java       |   4 +-
 31 files changed, 1210 insertions(+), 428 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/6a3a4a1d/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/EdmBindingTargetImpl.java
----------------------------------------------------------------------
diff --git a/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/EdmBindingTargetImpl.java b/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/EdmBindingTargetImpl.java
index 6f1990e..452c880 100644
--- a/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/EdmBindingTargetImpl.java
+++ b/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/EdmBindingTargetImpl.java
@@ -1,23 +1,24 @@
 /*
  * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
+ * or more contributor license agreements. See the NOTICE file
  * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
+ * regarding copyright ownership. The ASF licenses this file
  * to you under the Apache License, Version 2.0 (the
  * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
+ * with the License. You may obtain a copy of the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
  * Unless required by applicable law or agreed to in writing,
  * software distributed under the License is distributed on an
  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
+ * KIND, either express or implied. See the License for the
  * specific language governing permissions and limitations
  * under the License.
  */
 package org.apache.olingo.client.core.edm;
 
+import java.util.ArrayList;
 import java.util.Iterator;
 import java.util.List;
 
@@ -27,16 +28,19 @@ import org.apache.olingo.commons.api.edm.Edm;
 import org.apache.olingo.commons.api.edm.EdmBindingTarget;
 import org.apache.olingo.commons.api.edm.EdmEntityContainer;
 import org.apache.olingo.commons.api.edm.EdmException;
+import org.apache.olingo.commons.api.edm.EdmNavigationPropertyBinding;
 import org.apache.olingo.commons.api.edm.FullQualifiedName;
 import org.apache.olingo.commons.api.edm.Target;
 import org.apache.olingo.commons.core.edm.AbstractEdmBindingTarget;
+import org.apache.olingo.commons.core.edm.EdmNavigationPropertyBindingImpl;
 
 public abstract class EdmBindingTargetImpl extends AbstractEdmBindingTarget {
 
   private final BindingTarget target;
+  private List<EdmNavigationPropertyBinding> navigationPropertyBindings;
 
   public EdmBindingTargetImpl(final Edm edm, final EdmEntityContainer container,
-          final String name, final FullQualifiedName type, final BindingTarget target) {
+      final String name, final FullQualifiedName type, final BindingTarget target) {
 
     super(edm, container, name, type);
     this.target = target;
@@ -48,8 +52,9 @@ public abstract class EdmBindingTargetImpl extends AbstractEdmBindingTarget {
 
     final List<? extends NavigationPropertyBinding> navigationPropertyBindings = target.getNavigationPropertyBindings();
     boolean found = false;
-    for (final Iterator<? extends NavigationPropertyBinding> itor = navigationPropertyBindings.iterator();
-            itor.hasNext() && !found;) {
+    for (final Iterator<? extends NavigationPropertyBinding> itor = navigationPropertyBindings.iterator(); itor
+        .hasNext()
+        && !found;) {
 
       final NavigationPropertyBinding binding = itor.next();
       if (binding.getPath().equals(path)) {
@@ -76,4 +81,18 @@ public abstract class EdmBindingTargetImpl extends AbstractEdmBindingTarget {
     return bindingTarget;
   }
 
+  @Override
+  public List<EdmNavigationPropertyBinding> getNavigationPropertyBindings() {
+    if (navigationPropertyBindings == null) {
+      List<? extends NavigationPropertyBinding> providerBindings = target.getNavigationPropertyBindings();
+      navigationPropertyBindings = new ArrayList<EdmNavigationPropertyBinding>();
+      if (providerBindings != null) {
+        for (NavigationPropertyBinding binding : providerBindings) {
+          navigationPropertyBindings.add(new EdmNavigationPropertyBindingImpl(binding.getPath(), binding.getTarget()));
+        }
+      }
+    }
+    return navigationPropertyBindings;
+  }
+
 }

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/6a3a4a1d/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/EdmEntityContainerImpl.java
----------------------------------------------------------------------
diff --git a/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/EdmEntityContainerImpl.java b/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/EdmEntityContainerImpl.java
index 169aaf9..6a962e3 100644
--- a/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/EdmEntityContainerImpl.java
+++ b/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/EdmEntityContainerImpl.java
@@ -49,12 +49,19 @@ public class EdmEntityContainerImpl extends AbstractEdmEntityContainer {
   public EdmEntityContainerImpl(final Edm edm, final FullQualifiedName entityContainerName,
       final EntityContainer xmlEntityContainer, final XMLMetadata xmlMetadata) {
 
-    super(edm, entityContainerName);
+    super(edm, entityContainerName, getFullQualifiedName(xmlEntityContainer.getExtends()));
 
     this.xmlEntityContainer = xmlEntityContainer;
     this.xmlMetadata = xmlMetadata;
   }
 
+  private static FullQualifiedName getFullQualifiedName(String parent) {
+    if (parent != null) {
+      return new FullQualifiedName(parent);
+    }
+    return null;
+  }
+
   @Override
   protected EdmSingleton createSingleton(final String singletonName) {
     if (!(xmlEntityContainer instanceof org.apache.olingo.client.api.edm.xml.v4.EntityContainer)) {

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/6a3a4a1d/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/EdmNavigationPropertyImpl.java
----------------------------------------------------------------------
diff --git a/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/EdmNavigationPropertyImpl.java b/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/EdmNavigationPropertyImpl.java
index 19df620..953da5b 100644
--- a/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/EdmNavigationPropertyImpl.java
+++ b/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/EdmNavigationPropertyImpl.java
@@ -1,36 +1,40 @@
 /*
  * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
+ * or more contributor license agreements. See the NOTICE file
  * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
+ * regarding copyright ownership. The ASF licenses this file
  * to you under the Apache License, Version 2.0 (the
  * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
+ * with the License. You may obtain a copy of the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
  * Unless required by applicable law or agreed to in writing,
  * software distributed under the License is distributed on an
  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
+ * KIND, either express or implied. See the License for the
  * specific language governing permissions and limitations
  * under the License.
  */
 package org.apache.olingo.client.core.edm;
 
+import java.util.ArrayList;
 import java.util.List;
 
 import org.apache.olingo.client.api.edm.xml.v4.NavigationProperty;
 import org.apache.olingo.client.api.edm.xml.v4.ReferentialConstraint;
 import org.apache.olingo.commons.api.edm.Edm;
+import org.apache.olingo.commons.api.edm.EdmReferentialConstraint;
 import org.apache.olingo.commons.api.edm.FullQualifiedName;
 import org.apache.olingo.commons.core.edm.AbstractEdmNavigationProperty;
+import org.apache.olingo.commons.core.edm.EdmReferentialConstraintImpl;
 
 public class EdmNavigationPropertyImpl extends AbstractEdmNavigationProperty {
 
   private final NavigationProperty navigationProperty;
 
   private final EdmTypeInfo edmTypeInfo;
+  private List<EdmReferentialConstraint> referentialConstraints;
 
   public EdmNavigationPropertyImpl(final Edm edm, final NavigationProperty navigationProperty) {
     super(edm, navigationProperty.getName());
@@ -71,4 +75,19 @@ public class EdmNavigationPropertyImpl extends AbstractEdmNavigationProperty {
     return null;
   }
 
+  @Override
+  public List<EdmReferentialConstraint> getReferentialConstraints() {
+    if (referentialConstraints == null) {
+      final List<ReferentialConstraint> providerConstraints = navigationProperty.getReferentialConstraints();
+      referentialConstraints = new ArrayList<EdmReferentialConstraint>();
+      if (providerConstraints != null) {
+        for (ReferentialConstraint constraint : providerConstraints) {
+          referentialConstraints.add(new EdmReferentialConstraintImpl(constraint.getProperty(), constraint
+              .getReferencedProperty()));
+        }
+      }
+    }
+    return referentialConstraints;
+  }
+
 }

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/6a3a4a1d/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/EdmOperationImpl.java
----------------------------------------------------------------------
diff --git a/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/EdmOperationImpl.java b/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/EdmOperationImpl.java
index f54d6c1..a38602a 100644
--- a/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/EdmOperationImpl.java
+++ b/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/EdmOperationImpl.java
@@ -85,6 +85,6 @@ public abstract class EdmOperationImpl extends AbstractEdmOperation {
     if (bindingParam != null) {
       result = bindingParam.isCollection();
     }
-    return null;
+    return result;
   }
 }

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/6a3a4a1d/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/v3/EdmEntitySetProxy.java
----------------------------------------------------------------------
diff --git a/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/v3/EdmEntitySetProxy.java b/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/v3/EdmEntitySetProxy.java
index 0cc0ff8..2624860 100644
--- a/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/v3/EdmEntitySetProxy.java
+++ b/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/v3/EdmEntitySetProxy.java
@@ -33,6 +33,7 @@ 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.EdmException;
+import org.apache.olingo.commons.api.edm.EdmNavigationPropertyBinding;
 import org.apache.olingo.commons.api.edm.FullQualifiedName;
 import org.apache.olingo.commons.core.edm.AbstractEdmBindingTarget;
 
@@ -105,4 +106,10 @@ public class EdmEntitySetProxy extends AbstractEdmBindingTarget implements EdmEn
     return true;
   }
 
+  @Override
+  public List<EdmNavigationPropertyBinding> getNavigationPropertyBindings() {
+    //There are no navigation property bindings in V3 so we will deliver an empty list
+    return new ArrayList<EdmNavigationPropertyBinding>();
+  }
+
 }

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/6a3a4a1d/lib/commons-api/src/main/java/org/apache/olingo/commons/api/edm/EdmBindingTarget.java
----------------------------------------------------------------------
diff --git a/lib/commons-api/src/main/java/org/apache/olingo/commons/api/edm/EdmBindingTarget.java b/lib/commons-api/src/main/java/org/apache/olingo/commons/api/edm/EdmBindingTarget.java
index 87c9d34..1c66b80 100644
--- a/lib/commons-api/src/main/java/org/apache/olingo/commons/api/edm/EdmBindingTarget.java
+++ b/lib/commons-api/src/main/java/org/apache/olingo/commons/api/edm/EdmBindingTarget.java
@@ -18,6 +18,8 @@
  */
 package org.apache.olingo.commons.api.edm;
 
+import java.util.List;
+
 /**
  * Entity Sets or Singletons can be bound to each other using a navigation property binding so an
  * {@link EdmBindingTarget} can either be an {@link EdmEntitySet} or an {@link EdmSingleton}.
@@ -33,6 +35,11 @@ public interface EdmBindingTarget extends EdmNamed {
   EdmBindingTarget getRelatedBindingTarget(String path);
 
   /**
+   * @return all navigation property bindings
+   */
+  List<EdmNavigationPropertyBinding> getNavigationPropertyBindings();
+  
+  /**
    * Returns the entity container this target is contained in.
    *
    * @return {@link EdmEntityContainer}

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/6a3a4a1d/lib/commons-api/src/main/java/org/apache/olingo/commons/api/edm/EdmEntityContainer.java
----------------------------------------------------------------------
diff --git a/lib/commons-api/src/main/java/org/apache/olingo/commons/api/edm/EdmEntityContainer.java b/lib/commons-api/src/main/java/org/apache/olingo/commons/api/edm/EdmEntityContainer.java
index 00afbc8..84dfea4 100644
--- a/lib/commons-api/src/main/java/org/apache/olingo/commons/api/edm/EdmEntityContainer.java
+++ b/lib/commons-api/src/main/java/org/apache/olingo/commons/api/edm/EdmEntityContainer.java
@@ -89,4 +89,9 @@ public interface EdmEntityContainer extends EdmNamed {
    */
   List<EdmActionImport> getActionImports();
 
+  /**
+   * @return the {@link FullQualifiedName} of the parentContainer or null if no parent is specified
+   */
+  FullQualifiedName getParentContainerName();
+
 }

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/6a3a4a1d/lib/commons-api/src/main/java/org/apache/olingo/commons/api/edm/EdmNavigationProperty.java
----------------------------------------------------------------------
diff --git a/lib/commons-api/src/main/java/org/apache/olingo/commons/api/edm/EdmNavigationProperty.java b/lib/commons-api/src/main/java/org/apache/olingo/commons/api/edm/EdmNavigationProperty.java
index 52c645f..5f54154 100644
--- a/lib/commons-api/src/main/java/org/apache/olingo/commons/api/edm/EdmNavigationProperty.java
+++ b/lib/commons-api/src/main/java/org/apache/olingo/commons/api/edm/EdmNavigationProperty.java
@@ -1,23 +1,25 @@
-/* 
+/*
  * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
+ * or more contributor license agreements. See the NOTICE file
  * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
+ * regarding copyright ownership. The ASF licenses this file
  * to you under the Apache License, Version 2.0 (the
  * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
+ * with the License. You may obtain a copy of the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
  * Unless required by applicable law or agreed to in writing,
  * software distributed under the License is distributed on an
  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
+ * KIND, either express or implied. See the License for the
  * specific language governing permissions and limitations
  * under the License.
  */
 package org.apache.olingo.commons.api.edm;
 
+import java.util.List;
+
 /**
  * A CSDL NavigationProperty element
  * <br/>
@@ -35,6 +37,15 @@ public interface EdmNavigationProperty extends EdmElement {
    */
   EdmNavigationProperty getPartner();
 
+  /**
+   * @param referencedPropertyName
+   * @return propertyName for this referenced property
+   */
   String getReferencingPropertyName(String referencedPropertyName);
 
+  /**
+   * @return all referential constraints for this navigation property.
+   */
+  List<EdmReferentialConstraint> getReferentialConstraints();
+
 }

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/6a3a4a1d/lib/commons-api/src/main/java/org/apache/olingo/commons/api/edm/EdmNavigationPropertyBinding.java
----------------------------------------------------------------------
diff --git a/lib/commons-api/src/main/java/org/apache/olingo/commons/api/edm/EdmNavigationPropertyBinding.java b/lib/commons-api/src/main/java/org/apache/olingo/commons/api/edm/EdmNavigationPropertyBinding.java
new file mode 100644
index 0000000..2ebcf2b
--- /dev/null
+++ b/lib/commons-api/src/main/java/org/apache/olingo/commons/api/edm/EdmNavigationPropertyBinding.java
@@ -0,0 +1,28 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.olingo.commons.api.edm;
+
+//TODO: JavaDoc
+public interface EdmNavigationPropertyBinding {
+
+  String getPath();
+  
+  String getTarget();
+  
+}

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/6a3a4a1d/lib/commons-api/src/main/java/org/apache/olingo/commons/api/edm/EdmReferentialConstraint.java
----------------------------------------------------------------------
diff --git a/lib/commons-api/src/main/java/org/apache/olingo/commons/api/edm/EdmReferentialConstraint.java b/lib/commons-api/src/main/java/org/apache/olingo/commons/api/edm/EdmReferentialConstraint.java
new file mode 100644
index 0000000..e479efb
--- /dev/null
+++ b/lib/commons-api/src/main/java/org/apache/olingo/commons/api/edm/EdmReferentialConstraint.java
@@ -0,0 +1,28 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.olingo.commons.api.edm;
+
+//TODO: Document
+public interface EdmReferentialConstraint {
+
+  String getPropertyName();
+
+  String getReferencedPropertyName();
+
+}

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/6a3a4a1d/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/AbstractEdmEntityContainer.java
----------------------------------------------------------------------
diff --git a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/AbstractEdmEntityContainer.java b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/AbstractEdmEntityContainer.java
index aba62ba..853d21f 100644
--- a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/AbstractEdmEntityContainer.java
+++ b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/AbstractEdmEntityContainer.java
@@ -47,9 +47,13 @@ public abstract class AbstractEdmEntityContainer extends EdmNamedImpl implements
   protected final Map<String, EdmFunctionImport> functionImports = new HashMap<String, EdmFunctionImport>();
   private boolean allFunctionImportsLoaded = false;
 
-  public AbstractEdmEntityContainer(final Edm edm, final FullQualifiedName entityContainerName) {
+  private final FullQualifiedName parentContainerName;
+
+  public AbstractEdmEntityContainer(final Edm edm, final FullQualifiedName entityContainerName,
+      final FullQualifiedName parentContainerName) {
     super(edm, entityContainerName.getName());
     this.entityContainerName = entityContainerName;
+    this.parentContainerName = parentContainerName;
   }
 
   @Override
@@ -148,4 +152,9 @@ public abstract class AbstractEdmEntityContainer extends EdmNamedImpl implements
   }
 
   protected abstract void loadAllActionImports();
+
+  @Override
+  public FullQualifiedName getParentContainerName() {
+    return parentContainerName;
+  }
 }

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/6a3a4a1d/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/EdmNavigationPropertyBindingImpl.java
----------------------------------------------------------------------
diff --git a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/EdmNavigationPropertyBindingImpl.java b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/EdmNavigationPropertyBindingImpl.java
new file mode 100644
index 0000000..233e5d2
--- /dev/null
+++ b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/EdmNavigationPropertyBindingImpl.java
@@ -0,0 +1,43 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.olingo.commons.core.edm;
+
+import org.apache.olingo.commons.api.edm.EdmNavigationPropertyBinding;
+
+public class EdmNavigationPropertyBindingImpl implements EdmNavigationPropertyBinding {
+
+  private final String path;
+  private final String target;
+
+  public EdmNavigationPropertyBindingImpl(String path, String target){
+    this.path = path;
+    this.target = target;
+  }
+
+  @Override
+  public String getPath() {
+    return path;
+  }
+
+  @Override
+  public String getTarget() {
+    return target;
+  }
+  
+}

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/6a3a4a1d/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/EdmReferentialConstraintImpl.java
----------------------------------------------------------------------
diff --git a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/EdmReferentialConstraintImpl.java b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/EdmReferentialConstraintImpl.java
new file mode 100644
index 0000000..93e1519
--- /dev/null
+++ b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/EdmReferentialConstraintImpl.java
@@ -0,0 +1,42 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.olingo.commons.core.edm;
+
+import org.apache.olingo.commons.api.edm.EdmReferentialConstraint;
+
+public class EdmReferentialConstraintImpl implements EdmReferentialConstraint {
+
+  private final String property;
+  private final String referencedProperty;
+
+  public EdmReferentialConstraintImpl(String property, String referencedProperty) {
+    this.property = property;
+    this.referencedProperty = referencedProperty;
+  }
+
+  @Override
+  public String getPropertyName() {
+    return property;
+  }
+
+  @Override
+  public String getReferencedPropertyName() {
+    return referencedProperty;
+  }
+}

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/6a3a4a1d/lib/server-core/src/main/java/org/apache/olingo/server/core/edm/provider/EdmBindingTargetImpl.java
----------------------------------------------------------------------
diff --git a/lib/server-core/src/main/java/org/apache/olingo/server/core/edm/provider/EdmBindingTargetImpl.java b/lib/server-core/src/main/java/org/apache/olingo/server/core/edm/provider/EdmBindingTargetImpl.java
index c1aacb1..78651bc 100644
--- a/lib/server-core/src/main/java/org/apache/olingo/server/core/edm/provider/EdmBindingTargetImpl.java
+++ b/lib/server-core/src/main/java/org/apache/olingo/server/core/edm/provider/EdmBindingTargetImpl.java
@@ -18,6 +18,7 @@
  */
 package org.apache.olingo.server.core.edm.provider;
 
+import java.util.ArrayList;
 import java.util.Iterator;
 import java.util.List;
 
@@ -25,14 +26,17 @@ import org.apache.olingo.commons.api.edm.Edm;
 import org.apache.olingo.commons.api.edm.EdmBindingTarget;
 import org.apache.olingo.commons.api.edm.EdmEntityContainer;
 import org.apache.olingo.commons.api.edm.EdmException;
+import org.apache.olingo.commons.api.edm.EdmNavigationPropertyBinding;
 import org.apache.olingo.commons.api.edm.Target;
 import org.apache.olingo.commons.core.edm.AbstractEdmBindingTarget;
+import org.apache.olingo.commons.core.edm.EdmNavigationPropertyBindingImpl;
 import org.apache.olingo.server.api.edm.provider.BindingTarget;
 import org.apache.olingo.server.api.edm.provider.NavigationPropertyBinding;
 
 public abstract class EdmBindingTargetImpl extends AbstractEdmBindingTarget {
 
   private final BindingTarget target;
+  private List<EdmNavigationPropertyBinding> navigationPropertyBindings;
 
   public EdmBindingTargetImpl(final Edm edm, final EdmEntityContainer container, final BindingTarget target) {
     super(edm, container, target.getName(), target.getType());
@@ -74,4 +78,24 @@ public abstract class EdmBindingTargetImpl extends AbstractEdmBindingTarget {
 
     return bindingTarget;
   }
+
+  @Override
+  public List<EdmNavigationPropertyBinding> getNavigationPropertyBindings() {
+    if (navigationPropertyBindings == null) {
+      List<NavigationPropertyBinding> providerBindings = target.getNavigationPropertyBindings();
+      navigationPropertyBindings = new ArrayList<EdmNavigationPropertyBinding>();
+      if (providerBindings != null) {
+        for (NavigationPropertyBinding binding : providerBindings) {
+          Target providerTarget = binding.getTarget();
+          String targetString = "";
+          if (providerTarget.getEntityContainer() != null) {
+            targetString = targetString + providerTarget.getEntityContainer().getFullQualifiedNameAsString() + "/";
+          }
+          targetString = targetString + providerTarget.getTargetName();
+          navigationPropertyBindings.add(new EdmNavigationPropertyBindingImpl(binding.getPath(), targetString));
+        }
+      }
+    }
+    return navigationPropertyBindings;
+  }
 }

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/6a3a4a1d/lib/server-core/src/main/java/org/apache/olingo/server/core/edm/provider/EdmEntityContainerImpl.java
----------------------------------------------------------------------
diff --git a/lib/server-core/src/main/java/org/apache/olingo/server/core/edm/provider/EdmEntityContainerImpl.java b/lib/server-core/src/main/java/org/apache/olingo/server/core/edm/provider/EdmEntityContainerImpl.java
index 7c81980..1a1012a 100644
--- a/lib/server-core/src/main/java/org/apache/olingo/server/core/edm/provider/EdmEntityContainerImpl.java
+++ b/lib/server-core/src/main/java/org/apache/olingo/server/core/edm/provider/EdmEntityContainerImpl.java
@@ -44,14 +44,13 @@ public class EdmEntityContainerImpl extends AbstractEdmEntityContainer {
 
   public EdmEntityContainerImpl(final Edm edm, final EdmProvider provider,
       final EntityContainerInfo entityContainerInfo) {
-
-    super(edm, entityContainerInfo.getContainerName());
+    super(edm, entityContainerInfo.getContainerName(), entityContainerInfo.getExtendsContainer());
     this.provider = provider;
   }
 
   public EdmEntityContainerImpl(final Edm edm, final EdmProvider provider, final FullQualifiedName containerFQN,
       final EntityContainer entityContainer) {
-    super(edm, containerFQN);
+    super(edm, containerFQN, entityContainer.getExtendsContainer());
     this.provider = provider;
     container = entityContainer;
   }

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/6a3a4a1d/lib/server-core/src/main/java/org/apache/olingo/server/core/edm/provider/EdmNavigationPropertyImpl.java
----------------------------------------------------------------------
diff --git a/lib/server-core/src/main/java/org/apache/olingo/server/core/edm/provider/EdmNavigationPropertyImpl.java b/lib/server-core/src/main/java/org/apache/olingo/server/core/edm/provider/EdmNavigationPropertyImpl.java
index 7f570da..4c7e0cb 100644
--- a/lib/server-core/src/main/java/org/apache/olingo/server/core/edm/provider/EdmNavigationPropertyImpl.java
+++ b/lib/server-core/src/main/java/org/apache/olingo/server/core/edm/provider/EdmNavigationPropertyImpl.java
@@ -18,17 +18,21 @@
  */
 package org.apache.olingo.server.core.edm.provider;
 
+import java.util.ArrayList;
 import java.util.List;
 
 import org.apache.olingo.commons.api.edm.Edm;
+import org.apache.olingo.commons.api.edm.EdmReferentialConstraint;
 import org.apache.olingo.commons.api.edm.FullQualifiedName;
 import org.apache.olingo.commons.core.edm.AbstractEdmNavigationProperty;
+import org.apache.olingo.commons.core.edm.EdmReferentialConstraintImpl;
 import org.apache.olingo.server.api.edm.provider.NavigationProperty;
 import org.apache.olingo.server.api.edm.provider.ReferentialConstraint;
 
 public class EdmNavigationPropertyImpl extends AbstractEdmNavigationProperty {
 
   private final NavigationProperty navigationProperty;
+  private List<EdmReferentialConstraint> referentialConstraints;
 
   public EdmNavigationPropertyImpl(final Edm edm, final NavigationProperty navigationProperty) {
     super(edm, navigationProperty.getName());
@@ -68,4 +72,18 @@ public class EdmNavigationPropertyImpl extends AbstractEdmNavigationProperty {
     return null;
   }
 
+  @Override
+  public List<EdmReferentialConstraint> getReferentialConstraints() {
+    if (referentialConstraints == null) {
+      final List<ReferentialConstraint> providerConstraints = navigationProperty.getReferentialConstraints();
+      referentialConstraints = new ArrayList<EdmReferentialConstraint>();
+      if (providerConstraints != null) {
+        for (ReferentialConstraint constraint : providerConstraints) {
+          referentialConstraints.add(new EdmReferentialConstraintImpl(constraint.getProperty(), constraint
+              .getReferencedProperty()));
+        }
+      }
+    }
+    return referentialConstraints;
+  }
 }

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/6a3a4a1d/lib/server-core/src/main/java/org/apache/olingo/server/core/serializer/ODataXmlSerializerImpl.java
----------------------------------------------------------------------
diff --git a/lib/server-core/src/main/java/org/apache/olingo/server/core/serializer/ODataXmlSerializerImpl.java b/lib/server-core/src/main/java/org/apache/olingo/server/core/serializer/ODataXmlSerializerImpl.java
index 4790446..49f8831 100644
--- a/lib/server-core/src/main/java/org/apache/olingo/server/core/serializer/ODataXmlSerializerImpl.java
+++ b/lib/server-core/src/main/java/org/apache/olingo/server/core/serializer/ODataXmlSerializerImpl.java
@@ -18,9 +18,7 @@
  */
 package org.apache.olingo.server.core.serializer;
 
-import java.io.BufferedWriter;
 import java.io.InputStream;
-import java.io.OutputStreamWriter;
 
 import javax.xml.stream.XMLOutputFactory;
 import javax.xml.stream.XMLStreamException;
@@ -46,14 +44,12 @@ public class ODataXmlSerializerImpl implements ODataSerializer {
   @Override
   public InputStream metadataDocument(final Edm edm) {
     CircleStreamBuffer buffer;
-    BufferedWriter writer;
     XMLStreamWriter xmlStreamWriter = null;
 
     // TODO: move stream initialization into separate method
     try {
       buffer = new CircleStreamBuffer();
-      writer = new BufferedWriter(new OutputStreamWriter(buffer.getOutputStream(), DEFAULT_CHARSET));
-      xmlStreamWriter = XMLOutputFactory.newInstance().createXMLStreamWriter(writer);
+      xmlStreamWriter = XMLOutputFactory.newInstance().createXMLStreamWriter(buffer.getOutputStream(), DEFAULT_CHARSET);
       MetadataDocumentXmlSerializer serializer = new MetadataDocumentXmlSerializer(edm);
       serializer.writeMetadataDocument(xmlStreamWriter);
       xmlStreamWriter.close();

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/6a3a4a1d/lib/server-core/src/main/java/org/apache/olingo/server/core/serializer/xml/MetadataDocumentXmlSerializer.java
----------------------------------------------------------------------
diff --git a/lib/server-core/src/main/java/org/apache/olingo/server/core/serializer/xml/MetadataDocumentXmlSerializer.java b/lib/server-core/src/main/java/org/apache/olingo/server/core/serializer/xml/MetadataDocumentXmlSerializer.java
index b7f6015..2313a3a 100644
--- a/lib/server-core/src/main/java/org/apache/olingo/server/core/serializer/xml/MetadataDocumentXmlSerializer.java
+++ b/lib/server-core/src/main/java/org/apache/olingo/server/core/serializer/xml/MetadataDocumentXmlSerializer.java
@@ -26,6 +26,7 @@ import javax.xml.stream.XMLStreamWriter;
 import org.apache.olingo.commons.api.edm.Edm;
 import org.apache.olingo.commons.api.edm.EdmAction;
 import org.apache.olingo.commons.api.edm.EdmActionImport;
+import org.apache.olingo.commons.api.edm.EdmBindingTarget;
 import org.apache.olingo.commons.api.edm.EdmComplexType;
 import org.apache.olingo.commons.api.edm.EdmEntityContainer;
 import org.apache.olingo.commons.api.edm.EdmEntitySet;
@@ -35,16 +36,64 @@ import org.apache.olingo.commons.api.edm.EdmFunction;
 import org.apache.olingo.commons.api.edm.EdmFunctionImport;
 import org.apache.olingo.commons.api.edm.EdmKeyPropertyRef;
 import org.apache.olingo.commons.api.edm.EdmNavigationProperty;
+import org.apache.olingo.commons.api.edm.EdmNavigationPropertyBinding;
+import org.apache.olingo.commons.api.edm.EdmOperation;
 import org.apache.olingo.commons.api.edm.EdmParameter;
 import org.apache.olingo.commons.api.edm.EdmProperty;
+import org.apache.olingo.commons.api.edm.EdmReferentialConstraint;
 import org.apache.olingo.commons.api.edm.EdmReturnType;
 import org.apache.olingo.commons.api.edm.EdmSchema;
 import org.apache.olingo.commons.api.edm.EdmSingleton;
 import org.apache.olingo.commons.api.edm.EdmStructuredType;
 import org.apache.olingo.commons.api.edm.EdmType;
+import org.apache.olingo.commons.api.edm.EdmTypeDefinition;
+import org.apache.olingo.commons.api.edm.FullQualifiedName;
+import org.apache.olingo.server.api.serializer.ODataSerializer;
 
 public class MetadataDocumentXmlSerializer {
 
+  private static final String XML_EXTENDS = "Extends";
+  private static final String XML_TARGET = "Target";
+  private static final String XML_PATH = "Path";
+  private static final String XML_NAVIGATION_PROPERTY_BINDING = "NavigationPropertyBinding";
+  private static final String XML_VALUE = "Value";
+  private static final String XML_MEMBER = "Member";
+  private static final String XML_UNDERLYING_TYPE = "UnderlyingType";
+  private static final String XML_IS_FLAGS = "IsFlags";
+  private static final String XML_ENUM_TYPE = "EnumType";
+  private static final String XML_PROPERTY_REF = "PropertyRef";
+  private static final String XML_KEY = "Key";
+  private static final String XML_SCALE = "Scale";
+  private static final String XML_PRECISION = "Precision";
+  private static final String XML_MAX_LENGTH = "MaxLength";
+  private static final String XML_DEFAULT_VALUE = "DefaultValue";
+  private static final String XML_UNICODE = "Unicode";
+  private static final String XML_PROPERTY = "Property";
+  private static final String XML_PARTNER = "Partner";
+  private static final String XML_NULLABLE = "Nullable";
+  private static final String XML_NAVIGATION_PROPERTY = "NavigationProperty";
+  private static final String XML_HAS_STREAM = "HasStream";
+  private static final String XML_BASE_TYPE = "BaseType";
+  private static final String XML_COMPLEX_TYPE = "ComplexType";
+  private static final String XML_RETURN_TYPE = "ReturnType";
+  private static final String XML_TYPE = "Type";
+  private static final String XML_PARAMETER = "Parameter";
+  private static final String XML_IS_COMPOSABLE = "IsComposable";
+  private static final String XML_IS_BOUND = "IsBound";
+  private static final String XML_ENTITY_TYPE = "EntityType";
+  private static final String XML_SINGLETON = "Singleton";
+  private static final String XML_ACTION = "Action";
+  private static final String XML_ACTION_IMPORT = "ActionImport";
+  private static final String XML_INCLUDE_IN_SERVICE_DOCUMENT = "IncludeInServiceDocument";
+  private static final String XML_ENTITY_SET = "EntitySet";
+  private static final String XML_FUNCTION = "Function";
+  private static final String XML_FUNCTION_IMPORT = "FunctionImport";
+  private static final String XML_NAME = "Name";
+  private static final String XML_ENTITY_CONTAINER = "EntityContainer";
+  private static final String XML_ALIAS = "Alias";
+  private static final String XML_NAMESPACE = "Namespace";
+  private static final String XML_TYPE_DEFINITION = "TypeDefinition";
+
   private final Edm edm;
 
   private final static String EDMX = "Edmx";
@@ -58,7 +107,7 @@ public class MetadataDocumentXmlSerializer {
   }
 
   public void writeMetadataDocument(final XMLStreamWriter writer) throws XMLStreamException {
-    writer.writeStartDocument();
+    writer.writeStartDocument(ODataSerializer.DEFAULT_CHARSET, "1.0");
     writer.setPrefix(PREFIX_EDMX, NS_EDMX);
     writer.setDefaultNamespace(NS_EDMX);
     writer.writeStartElement(PREFIX_EDMX, EDMX, NS_EDMX);
@@ -74,7 +123,6 @@ public class MetadataDocumentXmlSerializer {
 
   private void appendDataServices(final XMLStreamWriter writer) throws XMLStreamException {
     writer.setDefaultNamespace(NS_EDM);
-//    writer.writeStartElement(PREFIX_EDM, "DataServices", NS_EDMX);
     writer.writeStartElement(NS_EDMX, "DataServices");
     for (EdmSchema schema : edm.getSchemas()) {
       appendSchema(writer, schema);
@@ -85,8 +133,8 @@ public class MetadataDocumentXmlSerializer {
   private void appendSchema(final XMLStreamWriter writer, final EdmSchema schema) throws XMLStreamException {
     writer.writeStartElement(NS_EDM, "Schema");
     writer.writeDefaultNamespace(NS_EDM);
-    writer.writeAttribute("Namespace", schema.getNamespace());
-    writer.writeAttribute("Alias", schema.getAlias());
+    writer.writeAttribute(XML_NAMESPACE, schema.getNamespace());
+    writer.writeAttribute(XML_ALIAS, schema.getAlias());
 
     // EnumTypes
     appendEnumTypes(writer, schema.getEnumTypes());
@@ -98,7 +146,7 @@ public class MetadataDocumentXmlSerializer {
     appendComplexTypes(writer, schema.getComplexTypes());
 
     // TypeDefinitions
-    // TODO: TypeDefinitions
+    appendTypeDefinitions(writer, schema.getTypeDefinitions());
 
     // Actions
     appendActions(writer, schema.getActions());
@@ -112,13 +160,38 @@ public class MetadataDocumentXmlSerializer {
     writer.writeEndElement();
   }
 
+  private void appendTypeDefinitions(XMLStreamWriter writer, List<EdmTypeDefinition> typeDefinitions)
+      throws XMLStreamException {
+    for (EdmTypeDefinition definition : typeDefinitions) {
+      writer.writeEmptyElement(XML_TYPE_DEFINITION);
+      writer.writeAttribute(XML_NAME, definition.getName());
+      writer.writeAttribute(XML_TYPE, getFullQualifiedName(definition.getUnderlyingType(), false));
+
+      // Facets
+      if (definition.getMaxLength() != null) {
+        writer.writeAttribute(XML_MAX_LENGTH, "" + definition.getMaxLength());
+      }
+
+      if (definition.getPrecision() != null) {
+        writer.writeAttribute(XML_PRECISION, "" + definition.getPrecision());
+      }
+
+      if (definition.getScale() != null) {
+        writer.writeAttribute(XML_SCALE, "" + definition.getScale());
+      }
+    }
+  }
+
   private void appendEntityContainer(final XMLStreamWriter writer, final EdmEntityContainer container)
       throws XMLStreamException {
     if (container != null) {
-      writer.writeStartElement("EntityContainer");
+      writer.writeStartElement(XML_ENTITY_CONTAINER);
 
-      writer.writeAttribute("Name", container.getName());
-      // TODO: extends attribute
+      writer.writeAttribute(XML_NAME, container.getName());
+      FullQualifiedName parentContainerName = container.getParentContainerName();
+      if (parentContainerName != null) {
+        writer.writeAttribute(XML_EXTENDS, parentContainerName.getFullQualifiedNameAsString());
+      }
 
       // EntitySets
       appendEntitySets(writer, container.getEntitySets());
@@ -139,14 +212,14 @@ public class MetadataDocumentXmlSerializer {
   private void appendFunctionImports(final XMLStreamWriter writer, final List<EdmFunctionImport> functionImports,
       final String containerNamespace) throws XMLStreamException {
     for (EdmFunctionImport functionImport : functionImports) {
-      writer.writeStartElement("FunctionImport");
-      writer.writeAttribute("Name", functionImport.getName());
-      writer.writeAttribute("Function", functionImport.getFunctionFqn().getFullQualifiedNameAsString());
+      writer.writeStartElement(XML_FUNCTION_IMPORT);
+      writer.writeAttribute(XML_NAME, functionImport.getName());
+      writer.writeAttribute(XML_FUNCTION, functionImport.getFunctionFqn().getFullQualifiedNameAsString());
       EdmEntitySet returnedEntitySet = functionImport.getReturnedEntitySet();
       if (returnedEntitySet != null) {
-        writer.writeAttribute("EntitySet", containerNamespace + "." + returnedEntitySet.getName());
+        writer.writeAttribute(XML_ENTITY_SET, containerNamespace + "." + returnedEntitySet.getName());
       }
-      writer.writeAttribute("IncludeInServiceDocument", "" + functionImport.isIncludeInServiceDocument());
+      writer.writeAttribute(XML_INCLUDE_IN_SERVICE_DOCUMENT, "" + functionImport.isIncludeInServiceDocument());
 
       // TODO: Annotations
       writer.writeEndElement();
@@ -156,9 +229,9 @@ public class MetadataDocumentXmlSerializer {
   private void appendActionImports(final XMLStreamWriter writer, final List<EdmActionImport> actionImports)
       throws XMLStreamException {
     for (EdmActionImport actionImport : actionImports) {
-      writer.writeStartElement("ActionImport");
-      writer.writeAttribute("Name", actionImport.getName());
-      writer.writeAttribute("Action", getFullQualifiedName(actionImport.getAction(), false));
+      writer.writeStartElement(XML_ACTION_IMPORT);
+      writer.writeAttribute(XML_NAME, actionImport.getName());
+      writer.writeAttribute(XML_ACTION, getFullQualifiedName(actionImport.getAction(), false));
       // TODO: Annotations
       writer.writeEndElement();
     }
@@ -166,29 +239,37 @@ public class MetadataDocumentXmlSerializer {
 
   private void appendSingletons(final XMLStreamWriter writer, final List<EdmSingleton> singletons)
       throws XMLStreamException {
-    // TODO: Merge with entity set method
     for (EdmSingleton singleton : singletons) {
-      writer.writeStartElement("Singleton");
-      writer.writeAttribute("Name", singleton.getName());
-      writer.writeAttribute("EntityType", getFullQualifiedName(singleton.getEntityType(), false));
-
-      // TODO: NavigationProperty Bindigs at edm api level
+      writer.writeStartElement(XML_SINGLETON);
+      writer.writeAttribute(XML_NAME, singleton.getName());
+      writer.writeAttribute(XML_ENTITY_TYPE, getFullQualifiedName(singleton.getEntityType(), false));
 
+      appendNavigationPropertyBindings(writer, singleton);
       // TODO: Annotations
       writer.writeEndElement();
     }
 
   }
 
+  private void appendNavigationPropertyBindings(final XMLStreamWriter writer, EdmBindingTarget bindingTarget)
+      throws XMLStreamException {
+    if (bindingTarget.getNavigationPropertyBindings() != null) {
+      for (EdmNavigationPropertyBinding binding : bindingTarget.getNavigationPropertyBindings()) {
+        writer.writeEmptyElement(XML_NAVIGATION_PROPERTY_BINDING);
+        writer.writeAttribute(XML_PATH, binding.getPath());
+        writer.writeAttribute(XML_TARGET, binding.getTarget());
+      }
+    }
+  }
+
   private void appendEntitySets(final XMLStreamWriter writer, final List<EdmEntitySet> entitySets)
       throws XMLStreamException {
     for (EdmEntitySet entitySet : entitySets) {
-      writer.writeStartElement("EntitySet");
-      writer.writeAttribute("Name", entitySet.getName());
-      writer.writeAttribute("EntityType", getFullQualifiedName(entitySet.getEntityType(), false));
-
-      // TODO: NavigationProperty Bindigs at edm api level
+      writer.writeStartElement(XML_ENTITY_SET);
+      writer.writeAttribute(XML_NAME, entitySet.getName());
+      writer.writeAttribute(XML_ENTITY_TYPE, getFullQualifiedName(entitySet.getEntityType(), false));
 
+      appendNavigationPropertyBindings(writer, entitySet);
       // TODO: Annotations
       writer.writeEndElement();
     }
@@ -197,64 +278,95 @@ public class MetadataDocumentXmlSerializer {
   private void appendFunctions(final XMLStreamWriter writer, final List<EdmFunction> functions)
       throws XMLStreamException {
     for (EdmFunction function : functions) {
-      writer.writeStartElement("Function");
-      writer.writeAttribute("Name", function.getName());
-      writer.writeAttribute("IsBound", "" + function.isBound());
-      writer.writeAttribute("IsComposable", "" + function.isComposable());
-
-      // TODO: move to separate method like for actions
-      for (String parameterName : function.getParameterNames()) {
-        EdmParameter parameter = function.getParameter(parameterName);
-        writer.writeEmptyElement("Parameter");
-        writer.writeAttribute("Name", parameterName);
-        writer.writeAttribute("Type", getFullQualifiedName(parameter.getType(), parameter.isCollection()));
-        // TODO: Parameter facets
-      }
+      writer.writeStartElement(XML_FUNCTION);
+      writer.writeAttribute(XML_NAME, function.getName());
+      // TODO: EntitySetPath
+      writer.writeAttribute(XML_IS_BOUND, "" + function.isBound());
+      writer.writeAttribute(XML_IS_COMPOSABLE, "" + function.isComposable());
 
-      EdmReturnType returnType = function.getReturnType();
-      if (returnType != null) {
-        writer.writeEmptyElement("ReturnType");
-        writer.writeAttribute("Type", getFullQualifiedName(returnType.getType(), returnType.isCollection()));
-        // TODO: Return type facets
-      }
+      appendOperationParameters(writer, function);
+
+      appendOperationReturnType(writer, function);
 
       writer.writeEndElement();
     }
   }
 
+  private void appendOperationReturnType(final XMLStreamWriter writer, EdmOperation operation)
+      throws XMLStreamException {
+    EdmReturnType returnType = operation.getReturnType();
+    if (returnType != null) {
+      writer.writeEmptyElement(XML_RETURN_TYPE);
+      writer.writeAttribute(XML_TYPE, getFullQualifiedName(returnType.getType(), returnType.isCollection()));
+
+      appendReturnTypeFacets(writer, returnType);
+    }
+  }
+
+  private void appendOperationParameters(final XMLStreamWriter writer, EdmOperation operation)
+      throws XMLStreamException {
+    for (String parameterName : operation.getParameterNames()) {
+      EdmParameter parameter = operation.getParameter(parameterName);
+      writer.writeEmptyElement(XML_PARAMETER);
+      writer.writeAttribute(XML_NAME, parameterName);
+      writer.writeAttribute(XML_TYPE, getFullQualifiedName(parameter.getType(), parameter.isCollection()));
+
+      appendParameterFacets(writer, parameter);
+    }
+  }
+
   private void appendActions(final XMLStreamWriter writer, final List<EdmAction> actions) throws XMLStreamException {
     for (EdmAction action : actions) {
-      writer.writeStartElement("Action");
-      writer.writeAttribute("Name", action.getName());
-      writer.writeAttribute("IsBound", "" + action.isBound());
-
-      for (String parameterName : action.getParameterNames()) {
-        EdmParameter parameter = action.getParameter(parameterName);
-        writer.writeEmptyElement("Parameter");
-        writer.writeAttribute("Name", parameterName);
-        writer.writeAttribute("Type", getFullQualifiedName(parameter.getType(), parameter.isCollection()));
-        // TODO: Parameter facets
-      }
+      writer.writeStartElement(XML_ACTION);
+      writer.writeAttribute(XML_NAME, action.getName());
+      writer.writeAttribute(XML_IS_BOUND, "" + action.isBound());
 
-      EdmReturnType returnType = action.getReturnType();
-      if (returnType != null) {
-        writer.writeEmptyElement("ReturnType");
-        writer.writeAttribute("Type", getFullQualifiedName(returnType.getType(), returnType.isCollection()));
-        // TODO: Return type facets
-      }
+      appendOperationParameters(writer, action);
+
+      appendOperationReturnType(writer, action);
 
       writer.writeEndElement();
     }
   }
 
+  private void appendReturnTypeFacets(XMLStreamWriter writer, EdmReturnType returnType) throws XMLStreamException {
+    if (returnType.isNullable() != null) {
+      writer.writeAttribute(XML_NULLABLE, "" + returnType.isNullable());
+    }
+    if (returnType.getMaxLength() != null) {
+      writer.writeAttribute(XML_MAX_LENGTH, "" + returnType.getMaxLength());
+    }
+    if (returnType.getPrecision() != null) {
+      writer.writeAttribute(XML_PRECISION, "" + returnType.getPrecision());
+    }
+    if (returnType.getScale() != null) {
+      writer.writeAttribute(XML_SCALE, "" + returnType.getScale());
+    }
+  }
+
+  private void appendParameterFacets(XMLStreamWriter writer, EdmParameter parameter) throws XMLStreamException {
+    if (parameter.isNullable() != null) {
+      writer.writeAttribute(XML_NULLABLE, "" + parameter.isNullable());
+    }
+    if (parameter.getMaxLength() != null) {
+      writer.writeAttribute(XML_MAX_LENGTH, "" + parameter.getMaxLength());
+    }
+    if (parameter.getPrecision() != null) {
+      writer.writeAttribute(XML_PRECISION, "" + parameter.getPrecision());
+    }
+    if (parameter.getScale() != null) {
+      writer.writeAttribute(XML_SCALE, "" + parameter.getScale());
+    }
+  }
+
   private void appendComplexTypes(final XMLStreamWriter writer, final List<EdmComplexType> complexTypes)
       throws XMLStreamException {
     for (EdmComplexType complexType : complexTypes) {
-      writer.writeStartElement("ComplexType");
-      writer.writeAttribute("Name", complexType.getName());
+      writer.writeStartElement(XML_COMPLEX_TYPE);
+      writer.writeAttribute(XML_NAME, complexType.getName());
 
       if (complexType.getBaseType() != null) {
-        writer.writeAttribute("BaseType", getFullQualifiedName(complexType.getBaseType(), false));
+        writer.writeAttribute(XML_BASE_TYPE, getFullQualifiedName(complexType.getBaseType(), false));
       }
 
       appendProperties(writer, complexType);
@@ -268,15 +380,15 @@ public class MetadataDocumentXmlSerializer {
   private void appendEntityTypes(final XMLStreamWriter writer, final List<EdmEntityType> entityTypes)
       throws XMLStreamException {
     for (EdmEntityType entityType : entityTypes) {
-      writer.writeStartElement("EntityType");
-      writer.writeAttribute("Name", entityType.getName());
+      writer.writeStartElement(XML_ENTITY_TYPE);
+      writer.writeAttribute(XML_NAME, entityType.getName());
 
       if (entityType.hasStream()) {
-        writer.writeAttribute("HasStream", "" + entityType.hasStream());
+        writer.writeAttribute(XML_HAS_STREAM, "" + entityType.hasStream());
       }
 
       if (entityType.getBaseType() != null) {
-        writer.writeAttribute("BaseType", getFullQualifiedName(entityType.getBaseType(), false));
+        writer.writeAttribute(XML_BASE_TYPE, getFullQualifiedName(entityType.getBaseType(), false));
       }
 
       appendKey(writer, entityType);
@@ -298,18 +410,28 @@ public class MetadataDocumentXmlSerializer {
     for (String navigationPropertyName : navigationPropertyNames) {
       EdmNavigationProperty navigationProperty = type.getNavigationProperty(navigationPropertyName);
 
-      writer.writeEmptyElement("NavigationProperty");
-      writer.writeAttribute("Name", navigationPropertyName);
-      writer.writeAttribute("Type", getFullQualifiedName(navigationProperty.getType(), navigationProperty
+      writer.writeStartElement(XML_NAVIGATION_PROPERTY);
+      writer.writeAttribute(XML_NAME, navigationPropertyName);
+      writer.writeAttribute(XML_TYPE, getFullQualifiedName(navigationProperty.getType(), navigationProperty
           .isCollection()));
       if (navigationProperty.isNullable() != null) {
-        writer.writeAttribute("Nullable", "" + navigationProperty.isNullable());
+        writer.writeAttribute(XML_NULLABLE, "" + navigationProperty.isNullable());
       }
 
       if (navigationProperty.getPartner() != null) {
         EdmNavigationProperty partner = navigationProperty.getPartner();
-        writer.writeAttribute("Partner", partner.getName());
+        writer.writeAttribute(XML_PARTNER, partner.getName());
+      }
+
+      if (navigationProperty.getReferentialConstraints() != null) {
+        for (EdmReferentialConstraint constraint : navigationProperty.getReferentialConstraints()) {
+          writer.writeEmptyElement("ReferentialConstraint");
+          writer.writeAttribute(XML_PROPERTY, constraint.getPropertyName());
+          writer.writeAttribute("ReferencedProperty", constraint.getReferencedPropertyName());
+        }
       }
+
+      writer.writeEndElement();
     }
   }
 
@@ -320,33 +442,33 @@ public class MetadataDocumentXmlSerializer {
     }
     for (String propertyName : propertyNames) {
       EdmProperty property = type.getStructuralProperty(propertyName);
-      writer.writeEmptyElement("Property");
-      writer.writeAttribute("Name", propertyName);
-      writer.writeAttribute("Type", getFullQualifiedName(property.getType(), property.isCollection()));
+      writer.writeEmptyElement(XML_PROPERTY);
+      writer.writeAttribute(XML_NAME, propertyName);
+      writer.writeAttribute(XML_TYPE, getFullQualifiedName(property.getType(), property.isCollection()));
 
       // Facets
       if (property.isNullable() != null) {
-        writer.writeAttribute("Nullable", "" + property.isNullable());
+        writer.writeAttribute(XML_NULLABLE, "" + property.isNullable());
       }
 
       if (property.isUnicode() != null) {
-        writer.writeAttribute("Unicode", "" + property.isUnicode());
+        writer.writeAttribute(XML_UNICODE, "" + property.isUnicode());
       }
 
       if (property.getDefaultValue() != null) {
-        writer.writeAttribute("DefaultValue", property.getDefaultValue());
+        writer.writeAttribute(XML_DEFAULT_VALUE, property.getDefaultValue());
       }
 
       if (property.getMaxLength() != null) {
-        writer.writeAttribute("MaxLength", "" + property.getMaxLength());
+        writer.writeAttribute(XML_MAX_LENGTH, "" + property.getMaxLength());
       }
 
       if (property.getPrecision() != null) {
-        writer.writeAttribute("Precision", "" + property.getPrecision());
+        writer.writeAttribute(XML_PRECISION, "" + property.getPrecision());
       }
 
       if (property.getScale() != null) {
-        writer.writeAttribute("Scale", "" + property.getScale());
+        writer.writeAttribute(XML_SCALE, "" + property.getScale());
       }
     }
   }
@@ -354,19 +476,25 @@ public class MetadataDocumentXmlSerializer {
   private void appendKey(final XMLStreamWriter writer, final EdmEntityType entityType) throws XMLStreamException {
     List<EdmKeyPropertyRef> keyPropertyRefs = entityType.getKeyPropertyRefs();
     if (keyPropertyRefs != null && !keyPropertyRefs.isEmpty()) {
-      writer.writeStartElement("Key");
+      // Resolve Base Type key as it is shown in derived type
+      EdmEntityType baseType = entityType.getBaseType();
+      if (baseType != null && baseType.getKeyPropertyRefs() != null && !(baseType.getKeyPropertyRefs().isEmpty())) {
+        return;
+      }
+
+      writer.writeStartElement(XML_KEY);
       for (EdmKeyPropertyRef keyRef : keyPropertyRefs) {
-        writer.writeEmptyElement("PropertyRef");
+        writer.writeEmptyElement(XML_PROPERTY_REF);
         String keyName = null;
         if (keyRef.getPath() != null) {
           keyName = keyRef.getPath() + "/" + keyRef.getKeyPropertyName();
         } else {
           keyName = keyRef.getKeyPropertyName();
         }
-        writer.writeAttribute("Name", keyName);
+        writer.writeAttribute(XML_NAME, keyName);
 
         if (keyRef.getAlias() != null) {
-          writer.writeAttribute("Alias", keyRef.getAlias());
+          writer.writeAttribute(XML_ALIAS, keyRef.getAlias());
         }
       }
       writer.writeEndElement();
@@ -376,15 +504,15 @@ public class MetadataDocumentXmlSerializer {
   private void appendEnumTypes(final XMLStreamWriter writer, final List<EdmEnumType> enumTypes)
       throws XMLStreamException {
     for (EdmEnumType enumType : enumTypes) {
-      writer.writeStartElement("EnumType");
-      writer.writeAttribute("Name", enumType.getName());
-      writer.writeAttribute("isFlags", "" + enumType.isFlags());
-      writer.writeAttribute("UnderlyingType", getFullQualifiedName(enumType.getUnderlyingType(), false));
+      writer.writeStartElement(XML_ENUM_TYPE);
+      writer.writeAttribute(XML_NAME, enumType.getName());
+      writer.writeAttribute(XML_IS_FLAGS, "" + enumType.isFlags());
+      writer.writeAttribute(XML_UNDERLYING_TYPE, getFullQualifiedName(enumType.getUnderlyingType(), false));
 
       for (String memberName : enumType.getMemberNames()) {
-        writer.writeEmptyElement("Member");
-        writer.writeAttribute("Name", memberName);
-        writer.writeAttribute("Value", enumType.getMember(memberName).getValue());
+        writer.writeEmptyElement(XML_MEMBER);
+        writer.writeAttribute(XML_NAME, memberName);
+        writer.writeAttribute(XML_VALUE, enumType.getMember(memberName).getValue());
       }
 
       writer.writeEndElement();
@@ -405,10 +533,9 @@ public class MetadataDocumentXmlSerializer {
     writer.writeAttribute("Uri", "http://docs.oasis-open.org/odata/odata/v4.0/cs02/vocabularies/Org.OData.Core.V1.xml");
     writer.writeEmptyElement(NS_EDMX, "Include");
     // TODO: Where is this value comming from?
-    writer.writeAttribute("Namespace", "Org.OData.Core.V1");
+    writer.writeAttribute(XML_NAMESPACE, "Org.OData.Core.V1");
     // TODO: Where is this value comming from?
-    writer.writeAttribute("Alias", "Core");
+    writer.writeAttribute(XML_ALIAS, "Core");
     writer.writeEndElement();
   }
-
 }

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/6a3a4a1d/lib/server-core/src/test/java/org/apache/olingo/server/core/serializer/xml/MetadataDocumentTest.java
----------------------------------------------------------------------
diff --git a/lib/server-core/src/test/java/org/apache/olingo/server/core/serializer/xml/MetadataDocumentTest.java b/lib/server-core/src/test/java/org/apache/olingo/server/core/serializer/xml/MetadataDocumentTest.java
index 40868df..88f84ec 100644
--- a/lib/server-core/src/test/java/org/apache/olingo/server/core/serializer/xml/MetadataDocumentTest.java
+++ b/lib/server-core/src/test/java/org/apache/olingo/server/core/serializer/xml/MetadataDocumentTest.java
@@ -41,7 +41,7 @@ public class MetadataDocumentTest {
   }
 
   @Test
-  public void writeMetadataWithMockedEdm() {
+  public void writeMetadataWithEmptyMockedEdm() {
     ODataSerializer serializer = ODataServer.newInstance().getSerializer(ODataFormat.XML);
     Edm edm = mock(Edm.class);
     serializer.metadataDocument(edm);
@@ -52,7 +52,7 @@ public class MetadataDocumentTest {
     ODataSerializer serializer = ODataServer.newInstance().getSerializer(ODataFormat.XML);
     EdmProviderImpl edm = new EdmProviderImpl(new EdmTechProvider());
     InputStream metadata = serializer.metadataDocument(edm);
-    System.out.println(StringUtils.inputStreamToString(metadata, true));
+    String metadataString = StringUtils.inputStreamToString(metadata, false);
+    //System.out.println(metadataString);
   }
-
 }

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/6a3a4a1d/lib/server-core/src/test/java/org/apache/olingo/server/core/testutil/EdmTechTestProvider.java
----------------------------------------------------------------------
diff --git a/lib/server-core/src/test/java/org/apache/olingo/server/core/testutil/EdmTechTestProvider.java b/lib/server-core/src/test/java/org/apache/olingo/server/core/testutil/EdmTechTestProvider.java
index f3cc85c..8e6fc1f 100644
--- a/lib/server-core/src/test/java/org/apache/olingo/server/core/testutil/EdmTechTestProvider.java
+++ b/lib/server-core/src/test/java/org/apache/olingo/server/core/testutil/EdmTechTestProvider.java
@@ -42,7 +42,7 @@ public class EdmTechTestProvider extends EdmTechProvider {
   private static final FullQualifiedName nameInt16 = EdmPrimitiveTypeKind.Int16.getFullQualifiedName();
   public static final String nameSpace = "com.sap.odata.test1";
   public static final FullQualifiedName nameContainer = new FullQualifiedName(nameSpace, "Container");
-  
+
   Property propertyAInt16 = new Property().setName("a").setType(nameInt16);
   Property propertyBInt16 = new Property().setName("b").setType(nameInt16);
   Property propertyCInt16 = new Property().setName("c").setType(nameInt16);
@@ -70,7 +70,7 @@ public class EdmTechTestProvider extends EdmTechProvider {
 
   @Override
   public EntitySet getEntitySet(final FullQualifiedName entityContainer, final String name) throws ODataException {
-    if (entityContainer == nameContainer) {
+    if (nameContainer.equals(entityContainer)) {
       if (name.equals("ESabc")) {
         return new EntitySet()
             .setName("ESabc")

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/6a3a4a1d/lib/server-core/src/test/java/org/apache/olingo/server/core/testutil/techprovider/ActionProvider.java
----------------------------------------------------------------------
diff --git a/lib/server-core/src/test/java/org/apache/olingo/server/core/testutil/techprovider/ActionProvider.java b/lib/server-core/src/test/java/org/apache/olingo/server/core/testutil/techprovider/ActionProvider.java
index 3ddc6d9..ef3cb19 100644
--- a/lib/server-core/src/test/java/org/apache/olingo/server/core/testutil/techprovider/ActionProvider.java
+++ b/lib/server-core/src/test/java/org/apache/olingo/server/core/testutil/techprovider/ActionProvider.java
@@ -29,7 +29,7 @@ import org.apache.olingo.server.api.edm.provider.ReturnType;
 
 public class ActionProvider {
 
-  //Bound Actions
+  // Bound Actions
   public static final FullQualifiedName nameBAESAllPrimRTETAllPrim =
       new FullQualifiedName(SchemaProvider.nameSpace, "BAESAllPrimRTETAllPrim");
 
@@ -45,18 +45,22 @@ public class ActionProvider {
   public static final FullQualifiedName nameBAETTwoKeyNavRTETTwoKeyNav =
       new FullQualifiedName(SchemaProvider.nameSpace, "BAETTwoKeyNavRTETTwoKeyNav");
 
+  // Unbound Actions
+  public static final FullQualifiedName nameUARTCompCollParam = new FullQualifiedName(SchemaProvider.nameSpace,
+      "UARTCompCollParam");
+  public static final FullQualifiedName nameUARTCompParam = new FullQualifiedName(SchemaProvider.nameSpace,
+      "UARTCompParam");
+  public static final FullQualifiedName nameUARTESParam =
+      new FullQualifiedName(SchemaProvider.nameSpace, "UARTESParam");
+
+  public static final FullQualifiedName nameUARTETParam =
+      new FullQualifiedName(SchemaProvider.nameSpace, "UARTETParam");
   
-  //Unbound Actions
-  public static final FullQualifiedName nameUARTCompCollParam = new FullQualifiedName(SchemaProvider.nameSpace, "UARTCompCollParam");
-  public static final FullQualifiedName nameUARTCompParam = new FullQualifiedName(SchemaProvider.nameSpace, "UARTCompParam");
-  public static final FullQualifiedName nameUARTETCollAllPrimParam =
-      new FullQualifiedName(SchemaProvider.nameSpace, "UARTETCollAllPrimParam");
-
-  public static final FullQualifiedName nameUARTETParam = new FullQualifiedName(SchemaProvider.nameSpace, "UARTETParam");
-  public static final FullQualifiedName nameUARTPrimParam = new FullQualifiedName(SchemaProvider.nameSpace, "UARTPrimParam");
-  public static final FullQualifiedName nameUARTPrimCollParam = new FullQualifiedName(SchemaProvider.nameSpace, "UARTPrimCollParam");
-  
-  
+  public static final FullQualifiedName nameUARTPrimParam = new FullQualifiedName(SchemaProvider.nameSpace,
+      "UARTPrimParam");
+  public static final FullQualifiedName nameUARTPrimCollParam = new FullQualifiedName(SchemaProvider.nameSpace,
+      "UARTPrimCollParam");
+
   public List<Action> getActions(final FullQualifiedName actionName) throws ODataException {
     if (actionName.equals(nameUARTPrimParam)) {
       return Arrays.asList(
@@ -99,35 +103,36 @@ public class ActionProvider {
 
     } else if (actionName.equals(nameUARTETParam)) {
       return Arrays.asList(
-          new Action().setName("UARTCompCollParam")
+          new Action().setName("UARTETParam")
               .setParameters(Arrays.asList(
                   new Parameter().setName("ParameterInt16").setType(PropertyProvider.nameInt16)))
               .setReturnType(
                   new ReturnType().setType(EntityTypeProvider.nameETTwoKeyTwoPrim))
           );
 
-    } else if (actionName.equals(nameUARTETCollAllPrimParam)) {
+    } else if (actionName.equals(nameUARTESParam)) {
       return Arrays.asList(
-          new Action().setName("UARTETCollAllPrimParam")
+          new Action().setName("UARTESParam")
               .setParameters(Arrays.asList(
                   new Parameter().setName("ParameterInt16").setType(PropertyProvider.nameInt16)))
-
               .setReturnType(
-                  new ReturnType().setType(EntityTypeProvider.nameETCollAllPrim).setCollection(true))
+                  new ReturnType().setType(EntityTypeProvider.nameETKeyNav).setCollection(true))
           );
 
     } else if (actionName.equals(nameBAETTwoKeyNavRTETTwoKeyNav)) {
       return Arrays.asList(
           new Action().setName("BAETTwoKeyNavRTETTwoKeyNav")
               .setParameters(Arrays.asList(
-                  new Parameter().setName("ParameterETTwoKeyNav").setType(EntityTypeProvider.nameETTwoKeyNav)))
+                  new Parameter().setName("ParameterETTwoKeyNav").setType(EntityTypeProvider.nameETTwoKeyNav)
+                  .setNullable(false)))
               .setBound(true)
               .setReturnType(
                   new ReturnType().setType(EntityTypeProvider.nameETTwoKeyNav))
           ,
           new Action().setName("BAETTwoKeyNavRTETTwoKeyNav")
               .setParameters(Arrays.asList(
-                  new Parameter().setName("ParameterETKeyNav").setType(EntityTypeProvider.nameETKeyNav)))
+                  new Parameter().setName("ParameterETKeyNav").setType(EntityTypeProvider.nameETKeyNav)
+                  .setNullable(false)))
               .setBound(true)
               .setReturnType(
                   new ReturnType().setType(EntityTypeProvider.nameETTwoKeyNav))
@@ -136,8 +141,10 @@ public class ActionProvider {
     } else if (actionName.equals(nameBAESAllPrimRTETAllPrim)) {
       return Arrays.asList(
           new Action().setName("BAESAllPrimRTETAllPrim")
-              .setParameters(Arrays.asList(
-                  new Parameter().setName("ParameterESAllPrim").setType(EntityTypeProvider.nameETAllPrim).setCollection(true)))
+              .setParameters(
+                  Arrays.asList(
+                      new Parameter().setName("ParameterESAllPrim").setType(EntityTypeProvider.nameETAllPrim)
+                          .setCollection(true).setNullable(false)))
               .setBound(true)
               .setReturnType(
                   new ReturnType().setType(EntityTypeProvider.nameETAllPrim))
@@ -146,8 +153,10 @@ public class ActionProvider {
     } else if (actionName.equals(nameBAESTwoKeyNavRTESTwoKeyNav)) {
       return Arrays.asList(
           new Action().setName("BAESTwoKeyNavRTESTwoKeyNav")
-              .setParameters(Arrays.asList(
-                  new Parameter().setName("ParameterETTwoKeyNav").setType(EntityTypeProvider.nameETTwoKeyNav).setCollection(true)))
+              .setParameters(
+                  Arrays.asList(
+                      new Parameter().setName("ParameterETTwoKeyNav").setType(EntityTypeProvider.nameETTwoKeyNav)
+                          .setCollection(true).setNullable(false)))
               .setBound(true)
               .setReturnType(
                   new ReturnType().setType(EntityTypeProvider.nameETTwoKeyNav).setCollection(true))
@@ -157,7 +166,8 @@ public class ActionProvider {
       return Arrays.asList(
           new Action().setName("BAETBaseTwoKeyNavRTETBaseTwoKeyNav")
               .setParameters(Arrays.asList(
-                  new Parameter().setName("ParameterETTwoKeyNav").setType(EntityTypeProvider.nameETBaseTwoKeyNav)))
+                  new Parameter().setName("ParameterETTwoKeyNav").setType(EntityTypeProvider.nameETBaseTwoKeyNav)
+                  .setNullable(false)))
               .setBound(true)
               .setReturnType(
                   new ReturnType().setType(EntityTypeProvider.nameETTwoKeyNav))
@@ -166,8 +176,10 @@ public class ActionProvider {
     } else if (actionName.equals(nameBAETTwoBaseTwoKeyNavRTETBaseTwoKeyNav)) {
       return Arrays.asList(
           new Action().setName("BAETTwoBaseTwoKeyNavRTETBaseTwoKeyNav")
-              .setParameters(Arrays.asList(
-                  new Parameter().setName("ParameterETTwoBaseTwoKeyNav").setType(EntityTypeProvider.nameETTwoBaseTwoKeyNav)))
+              .setParameters(
+                  Arrays.asList(
+                      new Parameter().setName("ParameterETTwoBaseTwoKeyNav").setType(
+                          EntityTypeProvider.nameETTwoBaseTwoKeyNav).setNullable(false)))
               .setBound(true)
               .setReturnType(
                   new ReturnType().setType(EntityTypeProvider.nameETBaseTwoKeyNav))

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/6a3a4a1d/lib/server-core/src/test/java/org/apache/olingo/server/core/testutil/techprovider/ComplexTypeProvider.java
----------------------------------------------------------------------
diff --git a/lib/server-core/src/test/java/org/apache/olingo/server/core/testutil/techprovider/ComplexTypeProvider.java b/lib/server-core/src/test/java/org/apache/olingo/server/core/testutil/techprovider/ComplexTypeProvider.java
index 3eaf86f..2fcbec2 100644
--- a/lib/server-core/src/test/java/org/apache/olingo/server/core/testutil/techprovider/ComplexTypeProvider.java
+++ b/lib/server-core/src/test/java/org/apache/olingo/server/core/testutil/techprovider/ComplexTypeProvider.java
@@ -30,14 +30,19 @@ public class ComplexTypeProvider {
 
   public static final FullQualifiedName nameCTAllPrim = new FullQualifiedName(SchemaProvider.nameSpace, "CTAllPrim");
   public static final FullQualifiedName nameCTBase = new FullQualifiedName(SchemaProvider.nameSpace, "CTBase");
-  public static final FullQualifiedName nameCTBasePrimCompNav = new FullQualifiedName(SchemaProvider.nameSpace, "CTBasePrimCompNav");
-  public static final FullQualifiedName nameCTCollAllPrim = new FullQualifiedName(SchemaProvider.nameSpace, "CTCollAllPrim");
-  public static final FullQualifiedName nameCTCompCollComp = new FullQualifiedName(SchemaProvider.nameSpace, "CTCompCollComp");
+  public static final FullQualifiedName nameCTBasePrimCompNav = new FullQualifiedName(SchemaProvider.nameSpace,
+      "CTBasePrimCompNav");
+  public static final FullQualifiedName nameCTCollAllPrim = new FullQualifiedName(SchemaProvider.nameSpace,
+      "CTCollAllPrim");
+  public static final FullQualifiedName nameCTCompCollComp = new FullQualifiedName(SchemaProvider.nameSpace,
+      "CTCompCollComp");
   public static final FullQualifiedName nameCTCompComp = new FullQualifiedName(SchemaProvider.nameSpace, "CTCompComp");
   public static final FullQualifiedName nameCTCompNav = new FullQualifiedName(SchemaProvider.nameSpace, "CTCompNav");
 
-  public static final FullQualifiedName nameCTMixPrimCollComp = new FullQualifiedName(SchemaProvider.nameSpace, "CTMixPrimCollComp");
-  public static final FullQualifiedName nameCTNavFiveProp = new FullQualifiedName(SchemaProvider.nameSpace, "CTNavFiveProp");
+  public static final FullQualifiedName nameCTMixPrimCollComp = new FullQualifiedName(SchemaProvider.nameSpace,
+      "CTMixPrimCollComp");
+  public static final FullQualifiedName nameCTNavFiveProp = new FullQualifiedName(SchemaProvider.nameSpace,
+      "CTNavFiveProp");
   public static final FullQualifiedName nameCTPrim = new FullQualifiedName(SchemaProvider.nameSpace, "CTPrim");
   public static final FullQualifiedName nameCTPrimComp = new FullQualifiedName(SchemaProvider.nameSpace, "CTPrimComp");
   public static final FullQualifiedName nameCTPrimEnum = new FullQualifiedName(SchemaProvider.nameSpace, "CTPrimEnum");
@@ -88,7 +93,8 @@ public class ComplexTypeProvider {
     } else if (complexTypeName.equals(nameCTCompNav)) {
       return new ComplexType()
           .setName("CTCompNav")
-          .setProperties(Arrays.asList(PropertyProvider.propertyInt16, PropertyProvider.propertyComplex_CTNavFiveProp));
+          .setProperties(Arrays.asList(PropertyProvider.propertyString, 
+              PropertyProvider.propertyComplex_CTNavFiveProp));
 
     } else if (complexTypeName.equals(nameCTMixPrimCollComp)) {
       return new ComplexType()
@@ -112,7 +118,7 @@ public class ComplexTypeProvider {
           .setBaseType(nameCTBase)
           .setProperties(Arrays.asList(
               new Property()
-                  .setName("AdditionalPropString")
+                  .setName("AdditionalPropString2")
                   .setType(new FullQualifiedName("Edm", "String"))));
 
     } else if (complexTypeName.equals(nameCTCompComp)) {
@@ -122,7 +128,7 @@ public class ComplexTypeProvider {
 
     } else if (complexTypeName.equals(nameCTCompCollComp)) {
       return new ComplexType()
-          .setName("CTCompComp")
+          .setName("CTCompCollComp")
           .setProperties(Arrays.asList(PropertyProvider.collPropertyComplex_CTTwoPrim));
 
     } else if (complexTypeName.equals(nameCTPrimComp)) {
@@ -151,7 +157,9 @@ public class ComplexTypeProvider {
           .setBaseType(nameCTPrimComp)
           .setNavigationProperties(Arrays.asList(
               PropertyProvider.collectionNavPropertyETTwoKeyNavMany_ETTwoKeyNav,
-              PropertyProvider.collectionNavPropertyETTwoKeyNavOne_ETTwoKeyNav));
+              PropertyProvider.collectionNavPropertyETTwoKeyNavOne_ETTwoKeyNav,
+              PropertyProvider.navPropertyETKeyNavOne_ETKeyNav,
+              PropertyProvider.collectionNavPropertyETKeyNavMany_ETKeyNav));
 
     } else if (complexTypeName.equals(nameCTPrimEnum)) {
       return new ComplexType()

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/6a3a4a1d/lib/server-core/src/test/java/org/apache/olingo/server/core/testutil/techprovider/ContainerProvider.java
----------------------------------------------------------------------
diff --git a/lib/server-core/src/test/java/org/apache/olingo/server/core/testutil/techprovider/ContainerProvider.java b/lib/server-core/src/test/java/org/apache/olingo/server/core/testutil/techprovider/ContainerProvider.java
index 62b11e2..5b92317 100644
--- a/lib/server-core/src/test/java/org/apache/olingo/server/core/testutil/techprovider/ContainerProvider.java
+++ b/lib/server-core/src/test/java/org/apache/olingo/server/core/testutil/techprovider/ContainerProvider.java
@@ -211,7 +211,7 @@ public class ContainerProvider {
       } else if (name.equals("AIRTETCollAllPrimParam")) {
         return new ActionImport()
             .setName("AIRTETCollAllPrimParam")
-            .setAction(ActionProvider.nameUARTETCollAllPrimParam);
+            .setAction(ActionProvider.nameUARTESParam);
       }
     }
 

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/6a3a4a1d/lib/server-core/src/test/java/org/apache/olingo/server/core/testutil/techprovider/EdmTechProvider.java
----------------------------------------------------------------------
diff --git a/lib/server-core/src/test/java/org/apache/olingo/server/core/testutil/techprovider/EdmTechProvider.java b/lib/server-core/src/test/java/org/apache/olingo/server/core/testutil/techprovider/EdmTechProvider.java
index 45a35c8..93e9c9d 100644
--- a/lib/server-core/src/test/java/org/apache/olingo/server/core/testutil/techprovider/EdmTechProvider.java
+++ b/lib/server-core/src/test/java/org/apache/olingo/server/core/testutil/techprovider/EdmTechProvider.java
@@ -71,54 +71,66 @@ public class EdmTechProvider extends EdmProvider {
         );
   }
 
+  @Override
   public EnumType getEnumType(final FullQualifiedName enumTypeName) throws ODataException {
     return enumTypeProvider.getEnumType(enumTypeName);
   }
 
+  @Override
   public TypeDefinition getTypeDefinition(final FullQualifiedName typeDefinitionName) throws ODataException {
     return typeDefinitionProvider.getTypeDefinition(typeDefinitionName);
   }
 
+  @Override
   public EntityType getEntityType(final FullQualifiedName entityTypeName) throws ODataException {
     return entityTypeProvider.getEntityType(entityTypeName);
   }
 
+  @Override
   public ComplexType getComplexType(final FullQualifiedName complexTypeName) throws ODataException {
     return complexTypeProvider.getComplexType(complexTypeName);
   }
 
+  @Override
   public List<Action> getActions(final FullQualifiedName actionName) throws ODataException {
     return actionProvider.getActions(actionName);
   }
 
+  @Override
   public List<Function> getFunctions(final FullQualifiedName functionName) throws ODataException {
     return functionProvider.getFunctions(functionName);
   }
 
+  @Override
   public Term getTerm(final FullQualifiedName termName) throws ODataException {
     return null;
   }
 
+  @Override
   public EntitySet getEntitySet(final FullQualifiedName entityContainer, final String entitySetName)
       throws ODataException {
     return containerProvider.getEntitySet(entityContainer, entitySetName);
   }
 
+  @Override
   public Singleton getSingleton(final FullQualifiedName entityContainer, final String singletonName)
       throws ODataException {
     return containerProvider.getSingleton(entityContainer, singletonName);
   }
 
+  @Override
   public ActionImport getActionImport(final FullQualifiedName entityContainer, final String actionImportName)
       throws ODataException {
     return containerProvider.getActionImport(entityContainer, actionImportName);
   }
 
+  @Override
   public FunctionImport getFunctionImport(final FullQualifiedName entityContainer, final String functionImportName)
       throws ODataException {
     return containerProvider.getFunctionImport(entityContainer, functionImportName);
   }
 
+  @Override
   public List<Schema> getSchemas() throws ODataException {
     return schemaProvider.getSchemas();
   }


[6/9] git commit: [OLINGO-168] Refactor Tech Provider

Posted by ch...@apache.org.
[OLINGO-168] Refactor Tech Provider


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

Branch: refs/heads/olingo168
Commit: 59ef14f4cffeca9fdd7c8f2911a9218d57d77038
Parents: 6fdfc45
Author: Christian Amend <ch...@apache.org>
Authored: Tue Mar 25 12:58:15 2014 +0100
Committer: Christian Amend <ch...@apache.org>
Committed: Tue Mar 25 12:58:15 2014 +0100

----------------------------------------------------------------------
 .../serializer/xml/MetadataDocumentTest.java    |    2 +-
 .../server/core/testutil/EdmTechProvider.java   | 2200 ------------------
 .../core/testutil/EdmTechTestProvider.java      |    6 +
 .../testutil/techprovider/ActionProvider.java   |  179 ++
 .../techprovider/ComplexTypeProvider.java       |  171 ++
 .../techprovider/ContainerProvider.java         |  361 +++
 .../testutil/techprovider/EdmTechProvider.java  |  135 ++
 .../techprovider/EntityTypeProvider.java        |  395 ++++
 .../testutil/techprovider/EnumTypeProvider.java |   44 +
 .../testutil/techprovider/FunctionProvider.java |  794 +++++++
 .../testutil/techprovider/PropertyProvider.java |  308 +++
 .../testutil/techprovider/SchemaProvider.java   |  247 ++
 .../techprovider/TypeDefinitionProvider.java    |   30 +
 .../olingo/server/core/uri/UriInfoImplTest.java |    4 +-
 .../server/core/uri/UriResourceImplTest.java    |   38 +-
 .../core/uri/antlr/TestFullResourcePath.java    | 1515 ++++++------
 .../core/uri/antlr/TestUriParserImpl.java       |  292 +--
 .../queryoption/expression/ExpressionTest.java  |   31 +-
 18 files changed, 3616 insertions(+), 3136 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/59ef14f4/lib/server-core/src/test/java/org/apache/olingo/server/core/serializer/xml/MetadataDocumentTest.java
----------------------------------------------------------------------
diff --git a/lib/server-core/src/test/java/org/apache/olingo/server/core/serializer/xml/MetadataDocumentTest.java b/lib/server-core/src/test/java/org/apache/olingo/server/core/serializer/xml/MetadataDocumentTest.java
index 0a8cd0e..40868df 100644
--- a/lib/server-core/src/test/java/org/apache/olingo/server/core/serializer/xml/MetadataDocumentTest.java
+++ b/lib/server-core/src/test/java/org/apache/olingo/server/core/serializer/xml/MetadataDocumentTest.java
@@ -28,8 +28,8 @@ import org.apache.olingo.server.api.ODataServer;
 import org.apache.olingo.server.api.serializer.ODataFormat;
 import org.apache.olingo.server.api.serializer.ODataSerializer;
 import org.apache.olingo.server.core.edm.provider.EdmProviderImpl;
-import org.apache.olingo.server.core.testutil.EdmTechProvider;
 import org.apache.olingo.server.core.testutil.StringUtils;
+import org.apache.olingo.server.core.testutil.techprovider.EdmTechProvider;
 import org.junit.Test;
 
 public class MetadataDocumentTest {


[2/9] [OLINGO-168] Refactor Tech Provider

Posted by ch...@apache.org.
http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/59ef14f4/lib/server-core/src/test/java/org/apache/olingo/server/core/uri/antlr/TestFullResourcePath.java
----------------------------------------------------------------------
diff --git a/lib/server-core/src/test/java/org/apache/olingo/server/core/uri/antlr/TestFullResourcePath.java b/lib/server-core/src/test/java/org/apache/olingo/server/core/uri/antlr/TestFullResourcePath.java
index 351fd54..ec78def 100644
--- a/lib/server-core/src/test/java/org/apache/olingo/server/core/uri/antlr/TestFullResourcePath.java
+++ b/lib/server-core/src/test/java/org/apache/olingo/server/core/uri/antlr/TestFullResourcePath.java
@@ -30,8 +30,11 @@ import org.apache.olingo.server.api.uri.queryoption.expression.BinaryOperatorKin
 import org.apache.olingo.server.api.uri.queryoption.expression.ExpressionVisitException;
 import org.apache.olingo.server.api.uri.queryoption.expression.MethodKind;
 import org.apache.olingo.server.core.edm.provider.EdmProviderImpl;
-import org.apache.olingo.server.core.testutil.EdmTechProvider;
 import org.apache.olingo.server.core.testutil.EdmTechTestProvider;
+import org.apache.olingo.server.core.testutil.techprovider.ComplexTypeProvider;
+import org.apache.olingo.server.core.testutil.techprovider.EntityTypeProvider;
+import org.apache.olingo.server.core.testutil.techprovider.EnumTypeProvider;
+import org.apache.olingo.server.core.testutil.techprovider.PropertyProvider;
 import org.apache.olingo.server.core.uri.parser.UriParserException;
 import org.apache.olingo.server.core.uri.testutil.FilterValidator;
 import org.apache.olingo.server.core.uri.testutil.ResourceValidator;
@@ -62,28 +65,28 @@ public class TestFullResourcePath {
     testUri.run("ESTwoKeyNav/com.sap.odata.test1.BFCESTwoKeyNavRTESTwoKeyNav()").goPath()
         .at(0)
         .isUriPathInfoKind(UriResourceKind.entitySet)
-        .isType(EdmTechProvider.nameETTwoKeyNav, true)
+        .isType(EntityTypeProvider.nameETTwoKeyNav, true)
         .at(1)
         .isUriPathInfoKind(UriResourceKind.function)
-        .isType(EdmTechProvider.nameETTwoKeyNav);
+        .isType(EntityTypeProvider.nameETTwoKeyNav);
 
     // with string parameter
     testUri.run("ESTwoKeyNav/com.sap.odata.test1.BFCESTwoKeyNavRTESTwoKeyNav(ParameterString='ABC')").goPath()
         .at(0)
         .isUriPathInfoKind(UriResourceKind.entitySet)
-        .isType(EdmTechProvider.nameETTwoKeyNav, true)
+        .isType(EntityTypeProvider.nameETTwoKeyNav, true)
         .at(1)
         .isUriPathInfoKind(UriResourceKind.function)
-        .isType(EdmTechProvider.nameETTwoKeyNav);
+        .isType(EntityTypeProvider.nameETTwoKeyNav);
 
     // with string parameter
     testUri.run("ESTwoKeyNav/com.sap.odata.test1.BFCESTwoKeyNavRTESTwoKeyNav()").goPath()
         .at(0)
         .isUriPathInfoKind(UriResourceKind.entitySet)
-        .isType(EdmTechProvider.nameETTwoKeyNav, true)
+        .isType(EntityTypeProvider.nameETTwoKeyNav, true)
         .at(1)
         .isUriPathInfoKind(UriResourceKind.function)
-        .isType(EdmTechProvider.nameETTwoKeyNav);
+        .isType(EntityTypeProvider.nameETTwoKeyNav);
   }
 
   @Test
@@ -94,13 +97,13 @@ public class TestFullResourcePath {
         .isKind(UriInfoKind.resource).goPath()
         .first()
         .isEntitySet("ESTwoKeyNav")
-        .isType(EdmTechProvider.nameETTwoKeyNav, false)
+        .isType(EntityTypeProvider.nameETTwoKeyNav, false)
         .isKeyPredicate(0, "PropertyInt16", "1")
         .isKeyPredicate(1, "PropertyString", "'2'")
-        .isTypeFilterOnEntry(EdmTechProvider.nameETBaseTwoKeyNav)
+        .isTypeFilterOnEntry(EntityTypeProvider.nameETBaseTwoKeyNav)
         .n()
         .isComplex("PropertyComplex")
-        .isType(EdmTechProvider.nameCTPrimComp, false)
+        .isType(ComplexTypeProvider.nameCTPrimComp, false)
         .n()
         .isFunction("BFCCTPrimCompRTESBaseTwoKeyNav");
 
@@ -109,16 +112,16 @@ public class TestFullResourcePath {
         .isKind(UriInfoKind.resource).goPath()
         .first()
         .isEntitySet("ESTwoKeyNav")
-        .isType(EdmTechProvider.nameETTwoKeyNav, false)
+        .isType(EntityTypeProvider.nameETTwoKeyNav, false)
         .isKeyPredicate(0, "PropertyInt16", "1")
         .isKeyPredicate(1, "PropertyString", "'2'")
-        .isTypeFilterOnEntry(EdmTechProvider.nameETBaseTwoKeyNav)
+        .isTypeFilterOnEntry(EntityTypeProvider.nameETBaseTwoKeyNav)
         .n()
         .isComplex("PropertyComplex")
-        .isType(EdmTechProvider.nameCTPrimComp, false)
+        .isType(ComplexTypeProvider.nameCTPrimComp, false)
         .n()
         .isFunction("BFCCTPrimCompRTESBaseTwoKeyNav")
-        .isType(EdmTechProvider.nameETBaseTwoKeyNav)
+        .isType(EntityTypeProvider.nameETBaseTwoKeyNav)
         .n()
         .isUriPathInfoKind(UriResourceKind.count);
 
@@ -134,7 +137,7 @@ public class TestFullResourcePath {
         .n()
         .isUriPathInfoKind(UriResourceKind.complexProperty)
         .isComplex("CollPropertyComplex")
-        .isType(EdmTechProvider.nameCTPrimComp, true)
+        .isType(ComplexTypeProvider.nameCTPrimComp, true)
         .n()
         .isFunction("BFCCollCTPrimCompRTESAllPrim");
 
@@ -147,10 +150,10 @@ public class TestFullResourcePath {
         .n()
         .isUriPathInfoKind(UriResourceKind.complexProperty)
         .isComplex("CollPropertyComplex")
-        .isType(EdmTechProvider.nameCTPrimComp, true)
+        .isType(ComplexTypeProvider.nameCTPrimComp, true)
         .n()
         .isFunction("BFCCollCTPrimCompRTESAllPrim")
-        .isType(EdmTechProvider.nameETAllPrim, true)
+        .isType(EntityTypeProvider.nameETAllPrim, true)
         .n()
         .isUriPathInfoKind(UriResourceKind.count);
   }
@@ -167,7 +170,7 @@ public class TestFullResourcePath {
         .n()
         .isUriPathInfoKind(UriResourceKind.complexProperty)
         .isComplex("PropertyComplex")
-        .isType(EdmTechProvider.nameCTPrimComp, false)
+        .isType(ComplexTypeProvider.nameCTPrimComp, false)
         .n()
         .isFunction("BFCCTPrimCompRTESTwoKeyNav");
 
@@ -181,10 +184,10 @@ public class TestFullResourcePath {
         .n()
         .isUriPathInfoKind(UriResourceKind.complexProperty)
         .isComplex("PropertyComplex")
-        .isType(EdmTechProvider.nameCTPrimComp, false)
+        .isType(ComplexTypeProvider.nameCTPrimComp, false)
         .n()
         .isFunction("BFCCTPrimCompRTESTwoKeyNav")
-        .isType(EdmTechProvider.nameETTwoKeyNav)
+        .isType(EntityTypeProvider.nameETTwoKeyNav)
         .n()
         .isUriPathInfoKind(UriResourceKind.count);
 
@@ -210,10 +213,10 @@ public class TestFullResourcePath {
         .isKind(UriInfoKind.resource).goPath()
         .first()
         .isEntitySet("ESTwoKeyNav")
-        .isType(EdmTechProvider.nameETTwoKeyNav, false)
+        .isType(EntityTypeProvider.nameETTwoKeyNav, false)
         .isKeyPredicate(0, "PropertyInt16", "1")
         .isKeyPredicate(1, "PropertyString", "'2'")
-        .isTypeFilterOnEntry(EdmTechProvider.nameETBaseTwoKeyNav)
+        .isTypeFilterOnEntry(EntityTypeProvider.nameETBaseTwoKeyNav)
         .n()
         .isFunction("BFCETBaseTwoKeyNavRTESTwoKeyNav");
 
@@ -223,8 +226,8 @@ public class TestFullResourcePath {
         .isKind(UriInfoKind.resource).goPath()
         .first()
         .isEntitySet("ESTwoKeyNav")
-        .isType(EdmTechProvider.nameETTwoKeyNav, false)
-        .isTypeFilterOnCollection(EdmTechProvider.nameETBaseTwoKeyNav)
+        .isType(EntityTypeProvider.nameETTwoKeyNav, false)
+        .isTypeFilterOnCollection(EntityTypeProvider.nameETBaseTwoKeyNav)
         .isKeyPredicate(0, "PropertyInt16", "1")
         .isKeyPredicate(1, "PropertyString", "'(''2'')'")
         .n()
@@ -238,8 +241,8 @@ public class TestFullResourcePath {
         .isKind(UriInfoKind.resource).goPath()
         .first()
         .isEntitySet("ESTwoKeyNav")
-        .isType(EdmTechProvider.nameETTwoKeyNav, true)
-        .isTypeFilterOnCollection(EdmTechProvider.nameETBaseTwoKeyNav)
+        .isType(EntityTypeProvider.nameETTwoKeyNav, true)
+        .isTypeFilterOnCollection(EntityTypeProvider.nameETBaseTwoKeyNav)
         .n()
         .isFunction("BFCESBaseTwoKeyNavRTESBaseTwoKey");
 
@@ -249,12 +252,12 @@ public class TestFullResourcePath {
         .isKind(UriInfoKind.resource).goPath()
         .first()
         .isEntitySet("ESTwoKeyNav")
-        .isType(EdmTechProvider.nameETTwoKeyNav, true)
-        .isTypeFilterOnCollection(EdmTechProvider.nameETBaseTwoKeyNav)
+        .isType(EntityTypeProvider.nameETTwoKeyNav, true)
+        .isTypeFilterOnCollection(EntityTypeProvider.nameETBaseTwoKeyNav)
         .n()
         .isFunction("BFCESBaseTwoKeyNavRTESBaseTwoKey")
-        .isType(EdmTechProvider.nameETBaseTwoKeyNav)
-        .isTypeFilterOnCollection(EdmTechProvider.nameETTwoBaseTwoKeyNav);
+        .isType(EntityTypeProvider.nameETBaseTwoKeyNav)
+        .isTypeFilterOnCollection(EntityTypeProvider.nameETTwoBaseTwoKeyNav);
 
     testUri.run("ESTwoKeyNav"
         + "/com.sap.odata.test1.BFCESTwoKeyNavRTESTwoKeyNav()"
@@ -265,11 +268,11 @@ public class TestFullResourcePath {
         .isEntitySet("ESTwoKeyNav")
         .n()
         .isFunction("BFCESTwoKeyNavRTESTwoKeyNav")
-        .isType(EdmTechProvider.nameETTwoKeyNav)
-        .isTypeFilterOnCollection(EdmTechProvider.nameETBaseTwoKeyNav)
+        .isType(EntityTypeProvider.nameETTwoKeyNav)
+        .isTypeFilterOnCollection(EntityTypeProvider.nameETBaseTwoKeyNav)
         .isKeyPredicate(0, "PropertyInt16", "1")
         .isKeyPredicate(1, "PropertyString", "'2'")
-        .isTypeFilterOnEntry(EdmTechProvider.nameETTwoBaseTwoKeyNav);
+        .isTypeFilterOnEntry(EntityTypeProvider.nameETTwoBaseTwoKeyNav);
   }
 
   @Test
@@ -280,7 +283,7 @@ public class TestFullResourcePath {
         .isEntitySet("ESAllPrim")
         .n()
         .isFunction("BFCESAllPrimRTCTAllPrim")
-        .isType(EdmTechProvider.nameCTAllPrim);
+        .isType(ComplexTypeProvider.nameCTAllPrim);
 
     testUri.run("ESTwoKeyNav/com.sap.odata.test1.BFCESTwoKeyNavRTCTTwoPrim()/com.sap.odata.test1.CTBase")
         .isKind(UriInfoKind.resource).goPath()
@@ -288,8 +291,8 @@ public class TestFullResourcePath {
         .isEntitySet("ESTwoKeyNav")
         .n()
         .isFunction("BFCESTwoKeyNavRTCTTwoPrim")
-        .isType(EdmTechProvider.nameCTTwoPrim, false)
-        .isTypeFilterOnEntry(EdmTechProvider.nameCTBase);
+        .isType(ComplexTypeProvider.nameCTTwoPrim, false)
+        .isTypeFilterOnEntry(ComplexTypeProvider.nameCTBase);
   }
 
   @Test
@@ -300,7 +303,7 @@ public class TestFullResourcePath {
         .isEntitySet("ESTwoKeyNav")
         .n()
         .isFunction("BFCESTwoKeyNavRTCollCTTwoPrim")
-        .isType(EdmTechProvider.nameCTTwoPrim, true);
+        .isType(ComplexTypeProvider.nameCTTwoPrim, true);
 
     testUri.run("ESTwoKeyNav/com.sap.odata.test1.BFCESTwoKeyNavRTCollCTTwoPrim()/$count")
         .isKind(UriInfoKind.resource).goPath()
@@ -308,7 +311,7 @@ public class TestFullResourcePath {
         .isEntitySet("ESTwoKeyNav")
         .n()
         .isFunction("BFCESTwoKeyNavRTCollCTTwoPrim")
-        .isType(EdmTechProvider.nameCTTwoPrim, true)
+        .isType(ComplexTypeProvider.nameCTTwoPrim, true)
         .n()
         .isUriPathInfoKind(UriResourceKind.count);
   }
@@ -322,7 +325,7 @@ public class TestFullResourcePath {
         .n()
         .isFunction("BFCESTwoKeyNavRTTwoKeyNav")
         .n()
-        .isNavProperty("NavPropertyETKeyNavOne", EdmTechProvider.nameETKeyNav, false);
+        .isNavProperty("NavPropertyETKeyNavOne", EntityTypeProvider.nameETKeyNav, false);
 
     testUri.run("ESTwoKeyNav/com.sap.odata.test1.BFCESTwoKeyNavRTTwoKeyNav()/NavPropertyETKeyNavOne/$ref")
         .isKind(UriInfoKind.resource).goPath()
@@ -331,7 +334,7 @@ public class TestFullResourcePath {
         .n()
         .isFunction("BFCESTwoKeyNavRTTwoKeyNav")
         .n()
-        .isNavProperty("NavPropertyETKeyNavOne", EdmTechProvider.nameETKeyNav, false)
+        .isNavProperty("NavPropertyETKeyNavOne", EntityTypeProvider.nameETKeyNav, false)
         .n()
         .isUriPathInfoKind(UriResourceKind.ref);
 
@@ -342,7 +345,7 @@ public class TestFullResourcePath {
         .n()
         .isFunction("BFCESKeyNavRTETKeyNav")
         .n()
-        .isNavProperty("NavPropertyETMediaOne", EdmTechProvider.nameETMedia, false)
+        .isNavProperty("NavPropertyETMediaOne", EntityTypeProvider.nameETMedia, false)
         .n()
         .isValue();
 
@@ -355,7 +358,7 @@ public class TestFullResourcePath {
         .isFunction("BFCESKeyNavRTETKeyNavParam")
         .isParameter(0, "ParameterString", "'1'")
         .n()
-        .isNavProperty("NavPropertyETTwoKeyNavOne", EdmTechProvider.nameETTwoKeyNav, false);
+        .isNavProperty("NavPropertyETTwoKeyNavOne", EntityTypeProvider.nameETTwoKeyNav, false);
 
     testUri.run("ESKeyNav/com.sap.odata.test1.BFCESKeyNavRTETKeyNavParam(ParameterString='1')"
         + "/NavPropertyETTwoKeyNavOne/PropertyComplex")
@@ -366,10 +369,10 @@ public class TestFullResourcePath {
         .isFunction("BFCESKeyNavRTETKeyNavParam")
         .isParameter(0, "ParameterString", "'1'")
         .n()
-        .isNavProperty("NavPropertyETTwoKeyNavOne", EdmTechProvider.nameETTwoKeyNav, false)
+        .isNavProperty("NavPropertyETTwoKeyNavOne", EntityTypeProvider.nameETTwoKeyNav, false)
         .n()
         .isComplex("PropertyComplex")
-        .isType(EdmTechProvider.nameCTPrimComp);
+        .isType(ComplexTypeProvider.nameCTPrimComp);
 
     testUri.run("ESKeyNav/com.sap.odata.test1.BFCESKeyNavRTETKeyNavParam(ParameterString='1')"
         + "/NavPropertyETTwoKeyNavOne/PropertyComplex/PropertyComplex")
@@ -380,13 +383,13 @@ public class TestFullResourcePath {
         .isFunction("BFCESKeyNavRTETKeyNavParam")
         .isParameter(0, "ParameterString", "'1'")
         .n()
-        .isNavProperty("NavPropertyETTwoKeyNavOne", EdmTechProvider.nameETTwoKeyNav, false)
+        .isNavProperty("NavPropertyETTwoKeyNavOne", EntityTypeProvider.nameETTwoKeyNav, false)
         .n()
         .isComplex("PropertyComplex")
-        .isType(EdmTechProvider.nameCTPrimComp)
+        .isType(ComplexTypeProvider.nameCTPrimComp)
         .n()
         .isComplex("PropertyComplex")
-        .isType(EdmTechProvider.nameCTAllPrim);
+        .isType(ComplexTypeProvider.nameCTAllPrim);
 
     testUri.run("ESKeyNav/com.sap.odata.test1.BFCESKeyNavRTETKeyNavParam(ParameterString='1')"
         + "/NavPropertyETTwoKeyNavOne/PropertyString")
@@ -397,9 +400,9 @@ public class TestFullResourcePath {
         .isFunction("BFCESKeyNavRTETKeyNavParam")
         .isParameter(0, "ParameterString", "'1'")
         .n()
-        .isNavProperty("NavPropertyETTwoKeyNavOne", EdmTechProvider.nameETTwoKeyNav, false)
+        .isNavProperty("NavPropertyETTwoKeyNavOne", EntityTypeProvider.nameETTwoKeyNav, false)
         .n()
-        .isPrimitiveProperty("PropertyString", EdmTechProvider.nameString, false);
+        .isPrimitiveProperty("PropertyString", PropertyProvider.nameString, false);
 
     testUri.run("ESKeyNav/com.sap.odata.test1.BFCESKeyNavRTETKeyNavParam(ParameterString='1')"
         + "/NavPropertyETTwoKeyNavMany(PropertyInt16=2,PropertyString='3')/PropertyString")
@@ -410,11 +413,11 @@ public class TestFullResourcePath {
         .isFunction("BFCESKeyNavRTETKeyNavParam")
         .isParameter(0, "ParameterString", "'1'")
         .n()
-        .isNavProperty("NavPropertyETTwoKeyNavMany", EdmTechProvider.nameETTwoKeyNav, false)
+        .isNavProperty("NavPropertyETTwoKeyNavMany", EntityTypeProvider.nameETTwoKeyNav, false)
         .isKeyPredicate(0, "PropertyInt16", "2")
         .isKeyPredicate(1, "PropertyString", "'3'")
         .n()
-        .isPrimitiveProperty("PropertyString", EdmTechProvider.nameString, false);
+        .isPrimitiveProperty("PropertyString", PropertyProvider.nameString, false);
   }
 
   @Test
@@ -427,9 +430,9 @@ public class TestFullResourcePath {
         .n()
         .isFunction("BFCESTwoKeyNavRTTwoKeyNav")
         .n()
-        .isNavProperty("NavPropertyETTwoKeyNavOne", EdmTechProvider.nameETTwoKeyNav, false)
-        .isType(EdmTechProvider.nameETTwoKeyNav, false)
-        .isTypeFilterOnEntry(EdmTechProvider.nameETBaseTwoKeyNav);
+        .isNavProperty("NavPropertyETTwoKeyNavOne", EntityTypeProvider.nameETTwoKeyNav, false)
+        .isType(EntityTypeProvider.nameETTwoKeyNav, false)
+        .isTypeFilterOnEntry(EntityTypeProvider.nameETBaseTwoKeyNav);
 
     testUri
         .run("ESTwoKeyNav/com.sap.odata.test1.BFCESTwoKeyNavRTESTwoKeyNav()(PropertyInt16=1,PropertyString='2')"
@@ -439,13 +442,13 @@ public class TestFullResourcePath {
         .isEntitySet("ESTwoKeyNav")
         .n()
         .isFunction("BFCESTwoKeyNavRTESTwoKeyNav")
-        .isType(EdmTechProvider.nameETTwoKeyNav, false)
+        .isType(EntityTypeProvider.nameETTwoKeyNav, false)
         .isKeyPredicate(0, "PropertyInt16", "1")
         .isKeyPredicate(1, "PropertyString", "'2'")
         .n()
-        .isNavProperty("NavPropertyETTwoKeyNavOne", EdmTechProvider.nameETTwoKeyNav, false)
-        .isType(EdmTechProvider.nameETTwoKeyNav, false)
-        .isTypeFilterOnEntry(EdmTechProvider.nameETTwoBaseTwoKeyNav);
+        .isNavProperty("NavPropertyETTwoKeyNavOne", EntityTypeProvider.nameETTwoKeyNav, false)
+        .isType(EntityTypeProvider.nameETTwoKeyNav, false)
+        .isTypeFilterOnEntry(EntityTypeProvider.nameETTwoBaseTwoKeyNav);
 
   }
 
@@ -460,7 +463,7 @@ public class TestFullResourcePath {
         .isFunction("BFCESKeyNavRTETKeyNav")
         .n()
         .isComplex("PropertyComplex")
-        .isType(EdmTechProvider.nameCTNavFiveProp);
+        .isType(ComplexTypeProvider.nameCTNavFiveProp);
 
     testUri.run("ESKeyNav/com.sap.odata.test1.BFCESKeyNavRTETKeyNav()/PropertyComplex/PropertyInt16")
         .isKind(UriInfoKind.resource).goPath()
@@ -470,9 +473,9 @@ public class TestFullResourcePath {
         .isFunction("BFCESKeyNavRTETKeyNav")
         .n()
         .isComplex("PropertyComplex")
-        .isType(EdmTechProvider.nameCTNavFiveProp)
+        .isType(ComplexTypeProvider.nameCTNavFiveProp)
         .n()
-        .isPrimitiveProperty("PropertyInt16", EdmTechProvider.nameInt16, false);
+        .isPrimitiveProperty("PropertyInt16", PropertyProvider.nameInt16, false);
 
     testUri.run("ESKeyNav/com.sap.odata.test1.BFCESKeyNavRTETKeyNav()/PropertyComplex/PropertyInt16/$value")
         .isKind(UriInfoKind.resource).goPath()
@@ -482,9 +485,9 @@ public class TestFullResourcePath {
         .isFunction("BFCESKeyNavRTETKeyNav")
         .n()
         .isComplex("PropertyComplex")
-        .isType(EdmTechProvider.nameCTNavFiveProp)
+        .isType(ComplexTypeProvider.nameCTNavFiveProp)
         .n()
-        .isPrimitiveProperty("PropertyInt16", EdmTechProvider.nameInt16, false)
+        .isPrimitiveProperty("PropertyInt16", PropertyProvider.nameInt16, false)
         .n()
         .isValue();
 
@@ -503,8 +506,8 @@ public class TestFullResourcePath {
         .isParameter(0, "ParameterString", "'1'")
         .n()
         .isComplex("PropertyComplexTwoPrim")
-        .isType(EdmTechProvider.nameCTTwoPrim)
-        .isTypeFilter(EdmTechProvider.nameCTTwoBase);
+        .isType(ComplexTypeProvider.nameCTTwoPrim)
+        .isTypeFilter(ComplexTypeProvider.nameCTTwoBase);
 
     testUri.run("ESKeyNav/com.sap.odata.test1.BFCESKeyNavRTETKeyNavParam(ParameterString='1')"
         + "/NavPropertyETTwoKeyNavMany(PropertyInt16=2,PropertyString='3')"
@@ -516,13 +519,13 @@ public class TestFullResourcePath {
         .isFunction("BFCESKeyNavRTETKeyNavParam")
         .isParameter(0, "ParameterString", "'1'")
         .n()
-        .isNavProperty("NavPropertyETTwoKeyNavMany", EdmTechProvider.nameETTwoKeyNav, false)
+        .isNavProperty("NavPropertyETTwoKeyNavMany", EntityTypeProvider.nameETTwoKeyNav, false)
         .isKeyPredicate(0, "PropertyInt16", "2")
         .isKeyPredicate(1, "PropertyString", "'3'")
         .n()
         .isComplex("PropertyComplexTwoPrim")
-        .isType(EdmTechProvider.nameCTTwoPrim)
-        .isTypeFilter(EdmTechProvider.nameCTTwoBase);
+        .isType(ComplexTypeProvider.nameCTTwoPrim)
+        .isTypeFilter(ComplexTypeProvider.nameCTTwoBase);
   }
 
   @Test
@@ -534,7 +537,7 @@ public class TestFullResourcePath {
         .n()
         .isFunction("BFCESKeyNavRTETKeyNav")
         .n()
-        .isPrimitiveProperty("PropertyInt16", EdmTechProvider.nameInt16, false);
+        .isPrimitiveProperty("PropertyInt16", PropertyProvider.nameInt16, false);
 
     testUri.run("ESKeyNav/com.sap.odata.test1.BFCESKeyNavRTETKeyNav()/PropertyInt16/$value")
         .isKind(UriInfoKind.resource).goPath()
@@ -543,7 +546,7 @@ public class TestFullResourcePath {
         .n()
         .isFunction("BFCESKeyNavRTETKeyNav")
         .n()
-        .isPrimitiveProperty("PropertyInt16", EdmTechProvider.nameInt16, false)
+        .isPrimitiveProperty("PropertyInt16", PropertyProvider.nameInt16, false)
         .n()
         .isValue();
 
@@ -558,7 +561,7 @@ public class TestFullResourcePath {
         .isEntitySet("ESTwoKeyNav")
         .n()
         .isFunction("BFCESTwoKeyNavRTESTwoKeyNav")
-        .isType(EdmTechProvider.nameETTwoKeyNav);
+        .isType(EntityTypeProvider.nameETTwoKeyNav);
 
     testUri.run("ESTwoKeyNav/com.sap.odata.test1.BFCESTwoKeyNavRTESTwoKeyNav(ParameterString='2')")
         .isKind(UriInfoKind.resource).goPath()
@@ -567,7 +570,7 @@ public class TestFullResourcePath {
         .n()
         .isFunction("BFCESTwoKeyNavRTESTwoKeyNav")
         .isParameter(0, "ParameterString", "'2'")
-        .isType(EdmTechProvider.nameETTwoKeyNav);
+        .isType(EntityTypeProvider.nameETTwoKeyNav);
 
     testUri.run("ESKeyNav/com.sap.odata.test1.BFCESTwoKeyNavRTESTwoKeyNav()")
         .isKind(UriInfoKind.resource).goPath()
@@ -575,7 +578,7 @@ public class TestFullResourcePath {
         .isEntitySet("ESKeyNav")
         .n()
         .isFunction("BFCESTwoKeyNavRTESTwoKeyNav")
-        .isType(EdmTechProvider.nameETTwoKeyNav);
+        .isType(EntityTypeProvider.nameETTwoKeyNav);
 
     testUri.run("ESKeyNav/com.sap.odata.test1.BFCESTwoKeyNavRTESTwoKeyNav(ParameterString='3')")
         .isKind(UriInfoKind.resource).goPath()
@@ -584,7 +587,7 @@ public class TestFullResourcePath {
         .n()
         .isFunction("BFCESTwoKeyNavRTESTwoKeyNav")
         .isParameter(0, "ParameterString", "'3'")
-        .isType(EdmTechProvider.nameETTwoKeyNav);
+        .isType(EntityTypeProvider.nameETTwoKeyNav);
 
     testUri.run("ESTwoKeyNav/com.sap.odata.test1.BFCESTwoKeyNavRTESTwoKeyNav()/$count")
         .isKind(UriInfoKind.resource).goPath()
@@ -592,7 +595,7 @@ public class TestFullResourcePath {
         .isEntitySet("ESTwoKeyNav")
         .n()
         .isFunction("BFCESTwoKeyNavRTESTwoKeyNav")
-        .isType(EdmTechProvider.nameETTwoKeyNav)
+        .isType(EntityTypeProvider.nameETTwoKeyNav)
         .n()
         .isCount();
 
@@ -618,7 +621,7 @@ public class TestFullResourcePath {
         .isKeyPredicate(0, "PropertyInt16", "1")
         .n()
         .isComplex("CollPropertyComplex")
-        .isType(EdmTechProvider.nameCTPrimComp)
+        .isType(ComplexTypeProvider.nameCTPrimComp)
         .n()
         .isFunction("BFCCollCTPrimCompRTESAllPrim")
         .n()
@@ -641,7 +644,7 @@ public class TestFullResourcePath {
         .isEntitySet("ESTwoKeyNav")
         .n()
         .isFunction("BFCESTwoKeyNavRTString")
-        .isType(EdmTechProvider.nameString)
+        .isType(PropertyProvider.nameString)
         .n()
         .isValue();
   }
@@ -654,7 +657,7 @@ public class TestFullResourcePath {
         .isEntitySet("ESTwoKeyNav")
         .n()
         .isFunction("BFCESTwoKeyNavRTCollString")
-        .isType(EdmTechProvider.nameString, true);
+        .isType(PropertyProvider.nameString, true);
 
     testUri.run("ESTwoKeyNav/com.sap.odata.test1.BFCESTwoKeyNavRTCollString()/$count")
         .isKind(UriInfoKind.resource).goPath()
@@ -662,7 +665,7 @@ public class TestFullResourcePath {
         .isEntitySet("ESTwoKeyNav")
         .n()
         .isFunction("BFCESTwoKeyNavRTCollString")
-        .isType(EdmTechProvider.nameString, true)
+        .isType(PropertyProvider.nameString, true)
         .n()
         .isCount();
   }
@@ -675,10 +678,10 @@ public class TestFullResourcePath {
         .isEntitySet("ESKeyNav")
         .isKeyPredicate(0, "PropertyInt16", "1")
         .n()
-        .isPrimitiveProperty("CollPropertyString", EdmTechProvider.nameString, true)
+        .isPrimitiveProperty("CollPropertyString", PropertyProvider.nameString, true)
         .n()
         .isFunction("BFCCollStringRTESTwoKeyNav")
-        .isType(EdmTechProvider.nameETTwoKeyNav, true);
+        .isType(EntityTypeProvider.nameETTwoKeyNav, true);
 
     testUri.run("ESKeyNav(1)/CollPropertyString/com.sap.odata.test1.BFCCollStringRTESTwoKeyNav()/$count")
         .isKind(UriInfoKind.resource).goPath()
@@ -686,10 +689,10 @@ public class TestFullResourcePath {
         .isEntitySet("ESKeyNav")
         .isKeyPredicate(0, "PropertyInt16", "1")
         .n()
-        .isPrimitiveProperty("CollPropertyString", EdmTechProvider.nameString, true)
+        .isPrimitiveProperty("CollPropertyString", PropertyProvider.nameString, true)
         .n()
         .isFunction("BFCCollStringRTESTwoKeyNav")
-        .isType(EdmTechProvider.nameETTwoKeyNav, true)
+        .isType(EntityTypeProvider.nameETTwoKeyNav, true)
         .n()
         .isCount();
   }
@@ -703,10 +706,10 @@ public class TestFullResourcePath {
         .isEntitySet("ESKeyNav")
         .isKeyPredicate(0, "PropertyInt16", "1")
         .n()
-        .isPrimitiveProperty("PropertyString", EdmTechProvider.nameString, false)
+        .isPrimitiveProperty("PropertyString", PropertyProvider.nameString, false)
         .n()
         .isFunction("BFCStringRTESTwoKeyNav")
-        .isType(EdmTechProvider.nameETTwoKeyNav, true);
+        .isType(EntityTypeProvider.nameETTwoKeyNav, true);
 
     testUri.run("ESKeyNav(1)/PropertyString/com.sap.odata.test1.BFCStringRTESTwoKeyNav()/$count")
         .isKind(UriInfoKind.resource).goPath()
@@ -714,10 +717,10 @@ public class TestFullResourcePath {
         .isEntitySet("ESKeyNav")
         .isKeyPredicate(0, "PropertyInt16", "1")
         .n()
-        .isPrimitiveProperty("PropertyString", EdmTechProvider.nameString, false)
+        .isPrimitiveProperty("PropertyString", PropertyProvider.nameString, false)
         .n()
         .isFunction("BFCStringRTESTwoKeyNav")
-        .isType(EdmTechProvider.nameETTwoKeyNav, true)
+        .isType(EntityTypeProvider.nameETTwoKeyNav, true)
         .n()
         .isCount();
 
@@ -727,10 +730,10 @@ public class TestFullResourcePath {
         .isEntitySet("ESKeyNav")
         .isKeyPredicate(0, "PropertyInt16", "1")
         .n()
-        .isPrimitiveProperty("PropertyString", EdmTechProvider.nameString, false)
+        .isPrimitiveProperty("PropertyString", PropertyProvider.nameString, false)
         .n()
         .isFunction("BFCStringRTESTwoKeyNav")
-        .isType(EdmTechProvider.nameETTwoKeyNav, true)
+        .isType(EntityTypeProvider.nameETTwoKeyNav, true)
         .n()
         .isRef();
   }
@@ -742,7 +745,7 @@ public class TestFullResourcePath {
         .isKind(UriInfoKind.resource).goPath()
         .first()
         .isSingleton("SINav")
-        .isType(EdmTechProvider.nameETTwoKeyNav, false)
+        .isType(EntityTypeProvider.nameETTwoKeyNav, false)
         .n()
         .isFunction("BFCSINavRTESTwoKeyNav");
   }
@@ -753,8 +756,8 @@ public class TestFullResourcePath {
         .isKind(UriInfoKind.resource).goPath()
         .first()
         .isSingleton("SINav")
-        .isType(EdmTechProvider.nameETTwoKeyNav, false)
-        .isTypeFilter(EdmTechProvider.nameETBaseTwoKeyNav)
+        .isType(EntityTypeProvider.nameETTwoKeyNav, false)
+        .isTypeFilter(EntityTypeProvider.nameETBaseTwoKeyNav)
         .n()
         .isFunction("BFCETBaseTwoKeyNavRTESBaseTwoKey");
   }
@@ -798,20 +801,20 @@ public class TestFullResourcePath {
         .goPath()
         .at(0)
         .isUriPathInfoKind(UriResourceKind.entitySet)
-        .isType(EdmTechProvider.nameETAllPrim, false)
+        .isType(EntityTypeProvider.nameETAllPrim, false)
         .at(1)
         .isUriPathInfoKind(UriResourceKind.primitiveProperty)
-        .isType(EdmTechProvider.nameString);
+        .isType(PropertyProvider.nameString);
 
     // on collection of primitive
     testUri.run("ESCollAllPrim(1)/CollPropertyString/com.sap.odata.test1.BFCCollStringRTESTwoKeyNav()")
         .goPath()
         .at(0)
         .isUriPathInfoKind(UriResourceKind.entitySet)
-        .isType(EdmTechProvider.nameETCollAllPrim, false)
+        .isType(EntityTypeProvider.nameETCollAllPrim, false)
         .at(1)
         .isUriPathInfoKind(UriResourceKind.primitiveProperty)
-        .isType(EdmTechProvider.nameString);
+        .isType(PropertyProvider.nameString);
 
     // on complex
     testUri.run("ESTwoKeyNav(ParameterInt16=1,PropertyString='ABC')"
@@ -819,11 +822,11 @@ public class TestFullResourcePath {
         .goPath()
         .at(0)
         .isUriPathInfoKind(UriResourceKind.entitySet)
-        .isType(EdmTechProvider.nameETTwoKeyNav, false)
+        .isType(EntityTypeProvider.nameETTwoKeyNav, false)
         .at(1)
         .isUriPathInfoKind(UriResourceKind.complexProperty)
         .at(2)
-        .isType(EdmTechProvider.nameETTwoKeyNav);
+        .isType(EntityTypeProvider.nameETTwoKeyNav);
 
     // on collection of complex
     testUri.run("ESKeyNav(1)/CollPropertyComplex/com.sap.odata.test1.BFCCollCTPrimCompRTESAllPrim()")
@@ -831,10 +834,10 @@ public class TestFullResourcePath {
         .at(0)
         .isUriPathInfoKind(UriResourceKind.entitySet)
         .at(1)
-        .isType(EdmTechProvider.nameCTPrimComp, true)
+        .isType(ComplexTypeProvider.nameCTPrimComp, true)
         .at(2)
         .isUriPathInfoKind(UriResourceKind.function)
-        .isType(EdmTechProvider.nameETAllPrim);
+        .isType(EntityTypeProvider.nameETAllPrim);
 
     // on entity
     testUri.run("ESTwoKeyNav(ParameterInt16=1,PropertyString='ABC')"
@@ -842,19 +845,19 @@ public class TestFullResourcePath {
         .goPath()
         .at(0)
         .isUriPathInfoKind(UriResourceKind.entitySet)
-        .isType(EdmTechProvider.nameETTwoKeyNav, false)
+        .isType(EntityTypeProvider.nameETTwoKeyNav, false)
         .at(1)
         .isUriPathInfoKind(UriResourceKind.function)
-        .isType(EdmTechProvider.nameETTwoKeyNav);
+        .isType(EntityTypeProvider.nameETTwoKeyNav);
 
     // on collection of entity
     testUri.run("ESTwoKeyNav/com.sap.odata.test1.BFCESTwoKeyNavRTESTwoKeyNav()")
         .goPath()
         .at(0)
         .isUriPathInfoKind(UriResourceKind.entitySet)
-        .isType(EdmTechProvider.nameETTwoKeyNav, true)
+        .isType(EntityTypeProvider.nameETTwoKeyNav, true)
         .at(1).isUriPathInfoKind(UriResourceKind.function)
-        .isType(EdmTechProvider.nameETTwoKeyNav);
+        .isType(EntityTypeProvider.nameETTwoKeyNav);
   }
 
   @Test
@@ -867,7 +870,7 @@ public class TestFullResourcePath {
         .isEntitySet("ESTwoKeyNav")
         .isKeyPredicate(0, "PropertyInt16", "1")
         .isKeyPredicate(1, "PropertyString", "'2'")
-        .isTypeFilterOnEntry(EdmTechProvider.nameETBaseTwoKeyNav)
+        .isTypeFilterOnEntry(EntityTypeProvider.nameETBaseTwoKeyNav)
         .n()
         .isAction("BAETBaseTwoKeyNavRTETBaseTwoKeyNav");
 
@@ -876,10 +879,10 @@ public class TestFullResourcePath {
         .isKind(UriInfoKind.resource).goPath()
         .first()
         .isEntitySet("ESTwoKeyNav")
-        .isTypeFilterOnCollection(EdmTechProvider.nameETBaseTwoKeyNav)
+        .isTypeFilterOnCollection(EntityTypeProvider.nameETBaseTwoKeyNav)
         .isKeyPredicate(0, "PropertyInt16", "1")
         .isKeyPredicate(1, "PropertyString", "'2'")
-        .isTypeFilterOnEntry(EdmTechProvider.nameETTwoBaseTwoKeyNav)
+        .isTypeFilterOnEntry(EntityTypeProvider.nameETTwoBaseTwoKeyNav)
         .n()
         .isAction("BAETTwoBaseTwoKeyNavRTETBaseTwoKeyNav");
   }
@@ -910,7 +913,7 @@ public class TestFullResourcePath {
         .isIdText("ESKeyNav(1)");
     testUri.run("$entity/com.sap.odata.test1.ETKeyNav?$id=ESKeyNav(1)")
         .isKind(UriInfoKind.entityId)
-        .isEntityType(EdmTechProvider.nameETKeyNav)
+        .isEntityType(EntityTypeProvider.nameETKeyNav)
         .isIdText("ESKeyNav(1)");
   }
 
@@ -929,13 +932,13 @@ public class TestFullResourcePath {
         .isKind(UriInfoKind.resource).goPath()
         .first()
         .isEntitySet("ESAllPrim")
-        .isType(EdmTechProvider.nameETAllPrim, true);
+        .isType(EntityTypeProvider.nameETAllPrim, true);
 
     testUri.run("ESAllPrim/$count")
         .isKind(UriInfoKind.resource).goPath()
         .first()
         .isEntitySet("ESAllPrim")
-        .isType(EdmTechProvider.nameETAllPrim, true)
+        .isType(EntityTypeProvider.nameETAllPrim, true)
         .n()
         .isCount();
   }
@@ -988,32 +991,32 @@ public class TestFullResourcePath {
         .isKind(UriInfoKind.resource).goPath()
         .first()
         .isEntitySet("ESTwoPrim")
-        .isType(EdmTechProvider.nameETTwoPrim, true)
-        .isTypeFilterOnCollection(EdmTechProvider.nameETBase);
+        .isType(EntityTypeProvider.nameETTwoPrim, true)
+        .isTypeFilterOnCollection(EntityTypeProvider.nameETBase);
 
     testUri.run("ESTwoPrim/com.sap.odata.test1.ETBase(-32768)/com.sap.odata.test1.ETTwoBase")
         .isKind(UriInfoKind.resource).goPath()
         .first()
         .isEntitySet("ESTwoPrim")
-        .isType(EdmTechProvider.nameETTwoPrim, false)
-        .isTypeFilterOnCollection(EdmTechProvider.nameETBase)
+        .isType(EntityTypeProvider.nameETTwoPrim, false)
+        .isTypeFilterOnCollection(EntityTypeProvider.nameETBase)
         .isKeyPredicate(0, "PropertyInt16", "-32768")
-        .isTypeFilterOnEntry(EdmTechProvider.nameETTwoBase);
+        .isTypeFilterOnEntry(EntityTypeProvider.nameETTwoBase);
 
     testUri.run("ESTwoPrim/com.sap.odata.test1.ETTwoBase(-32768)")
         .isKind(UriInfoKind.resource).goPath()
         .first()
         .isEntitySet("ESTwoPrim")
-        .isType(EdmTechProvider.nameETTwoPrim, false)
-        .isTypeFilterOnCollection(EdmTechProvider.nameETTwoBase)
+        .isType(EntityTypeProvider.nameETTwoPrim, false)
+        .isTypeFilterOnCollection(EntityTypeProvider.nameETTwoBase)
         .isKeyPredicate(0, "PropertyInt16", "-32768");
 
     testUri.run("ESTwoPrim/Namespace1_Alias.ETTwoBase(-32768)")
         .isKind(UriInfoKind.resource).goPath()
         .first()
         .isEntitySet("ESTwoPrim")
-        .isType(EdmTechProvider.nameETTwoPrim, false)
-        .isTypeFilterOnCollection(EdmTechProvider.nameETTwoBase)
+        .isType(EntityTypeProvider.nameETTwoPrim, false)
+        .isTypeFilterOnCollection(EntityTypeProvider.nameETTwoBase)
         .isKeyPredicate(0, "PropertyInt16", "-32768");
 
   }
@@ -1025,26 +1028,26 @@ public class TestFullResourcePath {
         .isKind(UriInfoKind.resource).goPath()
         .first()
         .isEntitySet("ESTwoKeyNav")
-        .isType(EdmTechProvider.nameETTwoKeyNav, false)
+        .isType(EntityTypeProvider.nameETTwoKeyNav, false)
         .isKeyPredicate(0, "PropertyInt16", "1")
         .isKeyPredicate(1, "PropertyString", "'2'")
-        .isTypeFilterOnEntry(EdmTechProvider.nameETBaseTwoKeyNav)
+        .isTypeFilterOnEntry(EntityTypeProvider.nameETBaseTwoKeyNav)
         .n()
-        .isPrimitiveProperty("PropertyDate", EdmTechProvider.nameDate, false);
+        .isPrimitiveProperty("PropertyDate", PropertyProvider.nameDate, false);
 
     testUri.run("ESTwoKeyNav(PropertyInt16=1,PropertyString='2')/com.sap.odata.test1.ETBaseTwoKeyNav"
         + "/PropertyComplex/PropertyInt16")
         .isKind(UriInfoKind.resource).goPath()
         .first()
         .isEntitySet("ESTwoKeyNav")
-        .isType(EdmTechProvider.nameETTwoKeyNav, false)
+        .isType(EntityTypeProvider.nameETTwoKeyNav, false)
         .isKeyPredicate(0, "PropertyInt16", "1")
         .isKeyPredicate(1, "PropertyString", "'2'")
-        .isTypeFilterOnEntry(EdmTechProvider.nameETBaseTwoKeyNav)
+        .isTypeFilterOnEntry(EntityTypeProvider.nameETBaseTwoKeyNav)
         .n()
         .isComplex("PropertyComplex")
         .n()
-        .isPrimitiveProperty("PropertyInt16", EdmTechProvider.nameInt16, false);
+        .isPrimitiveProperty("PropertyInt16", PropertyProvider.nameInt16, false);
   }
 
   @Test
@@ -1118,48 +1121,48 @@ public class TestFullResourcePath {
         .isKind(UriInfoKind.resource).goPath()
         .first()
         .isEntitySet("ESTwoPrim")
-        .isType(EdmTechProvider.nameETTwoPrim)
+        .isType(EntityTypeProvider.nameETTwoPrim)
         .isKeyPredicate(0, "PropertyInt16", "1")
-        .isTypeFilterOnEntry(EdmTechProvider.nameETBase);
+        .isTypeFilterOnEntry(EntityTypeProvider.nameETBase);
 
     testUri.run("ESTwoPrim(1)/com.sap.odata.test1.ETTwoBase")
         .isKind(UriInfoKind.resource).goPath()
         .first()
         .isEntitySet("ESTwoPrim")
-        .isType(EdmTechProvider.nameETTwoPrim)
+        .isType(EntityTypeProvider.nameETTwoPrim)
         .isKeyPredicate(0, "PropertyInt16", "1")
-        .isTypeFilterOnEntry(EdmTechProvider.nameETTwoBase);
+        .isTypeFilterOnEntry(EntityTypeProvider.nameETTwoBase);
 
     testUri.run("ESTwoPrim/com.sap.odata.test1.ETBase(1)")
         .isKind(UriInfoKind.resource).goPath()
         .first()
         .isEntitySet("ESTwoPrim")
-        .isType(EdmTechProvider.nameETTwoPrim)
+        .isType(EntityTypeProvider.nameETTwoPrim)
         .isKeyPredicate(0, "PropertyInt16", "1")
-        .isTypeFilterOnCollection(EdmTechProvider.nameETBase);
+        .isTypeFilterOnCollection(EntityTypeProvider.nameETBase);
 
     testUri.run("ESTwoPrim/com.sap.odata.test1.ETTwoBase(1)")
         .isKind(UriInfoKind.resource).goPath()
         .first()
         .isEntitySet("ESTwoPrim")
-        .isType(EdmTechProvider.nameETTwoPrim)
+        .isType(EntityTypeProvider.nameETTwoPrim)
         .isKeyPredicate(0, "PropertyInt16", "1")
-        .isTypeFilterOnCollection(EdmTechProvider.nameETTwoBase);
+        .isTypeFilterOnCollection(EntityTypeProvider.nameETTwoBase);
 
     testUri.run("ESTwoPrim/com.sap.odata.test1.ETBase(1)/com.sap.odata.test1.ETTwoBase")
         .isKind(UriInfoKind.resource).goPath()
         .first()
         .isEntitySet("ESTwoPrim")
-        .isType(EdmTechProvider.nameETTwoPrim)
+        .isType(EntityTypeProvider.nameETTwoPrim)
         .isKeyPredicate(0, "PropertyInt16", "1")
-        .isTypeFilterOnCollection(EdmTechProvider.nameETBase);
+        .isTypeFilterOnCollection(EntityTypeProvider.nameETBase);
 
     testUri.run("ESTwoPrim/com.sap.odata.test1.ETTwoBase")
         .isKind(UriInfoKind.resource).goPath()
         .first()
         .isEntitySet("ESTwoPrim")
-        .isType(EdmTechProvider.nameETTwoPrim)
-        .isTypeFilterOnCollection(EdmTechProvider.nameETTwoBase);
+        .isType(EntityTypeProvider.nameETTwoPrim)
+        .isTypeFilterOnCollection(EntityTypeProvider.nameETTwoBase);
   }
 
   @Test
@@ -1168,17 +1171,17 @@ public class TestFullResourcePath {
         .isKind(UriInfoKind.resource).goPath()
         .first()
         .isEntitySet("ESTwoKeyNav")
-        .isType(EdmTechProvider.nameETTwoKeyNav)
+        .isType(EntityTypeProvider.nameETTwoKeyNav)
         .isKeyPredicate(0, "PropertyInt16", "1")
         .isKeyPredicate(1, "PropertyString", "'2'")
-        .isTypeFilterOnEntry(EdmTechProvider.nameETBaseTwoKeyNav);
+        .isTypeFilterOnEntry(EntityTypeProvider.nameETBaseTwoKeyNav);
 
     testUri.run("ESTwoKeyNav/com.sap.odata.test1.ETBaseTwoKeyNav(PropertyInt16=1,PropertyString='2')")
         .isKind(UriInfoKind.resource).goPath()
         .first()
         .isEntitySet("ESTwoKeyNav")
-        .isType(EdmTechProvider.nameETTwoKeyNav)
-        .isTypeFilterOnCollection(EdmTechProvider.nameETBaseTwoKeyNav)
+        .isType(EntityTypeProvider.nameETTwoKeyNav)
+        .isTypeFilterOnCollection(EntityTypeProvider.nameETBaseTwoKeyNav)
         .isKeyPredicate(0, "PropertyInt16", "1")
         .isKeyPredicate(1, "PropertyString", "'2'");
   }
@@ -1215,27 +1218,27 @@ public class TestFullResourcePath {
         .isKeyPredicate(0, "PropertyInt16", "5")
         .n()
         .isComplex("CollPropertyComplex")
-        .isType(EdmTechProvider.nameCTTwoPrim, true);
+        .isType(ComplexTypeProvider.nameCTTwoPrim, true);
 
     testUri.run("ESKeyNav(1)/NavPropertyETTwoKeyNavOne/CollPropertyComplex")
         .isKind(UriInfoKind.resource).goPath()
         .first()
         .isEntitySet("ESKeyNav")
         .n()
-        .isNavProperty("NavPropertyETTwoKeyNavOne", EdmTechProvider.nameETTwoKeyNav, false)
+        .isNavProperty("NavPropertyETTwoKeyNavOne", EntityTypeProvider.nameETTwoKeyNav, false)
         .n()
         .isComplex("CollPropertyComplex")
-        .isType(EdmTechProvider.nameCTPrimComp, true);
+        .isType(ComplexTypeProvider.nameCTPrimComp, true);
 
     testUri.run("ESKeyNav(1)/NavPropertyETTwoKeyNavOne/CollPropertyComplex/$count")
         .isKind(UriInfoKind.resource).goPath()
         .first()
         .isEntitySet("ESKeyNav")
         .n()
-        .isNavProperty("NavPropertyETTwoKeyNavOne", EdmTechProvider.nameETTwoKeyNav, false)
+        .isNavProperty("NavPropertyETTwoKeyNavOne", EntityTypeProvider.nameETTwoKeyNav, false)
         .n()
         .isComplex("CollPropertyComplex")
-        .isType(EdmTechProvider.nameCTPrimComp, true)
+        .isType(ComplexTypeProvider.nameCTPrimComp, true)
         .n()
         .isCount();
   }
@@ -1248,8 +1251,8 @@ public class TestFullResourcePath {
         .isEntitySet("ESTwoKeyNav")
         .isKeyPredicate(0, "PropertyInt16", "1")
         .isKeyPredicate(1, "PropertyString", "'2'")
-        .isType(EdmTechProvider.nameETTwoKeyNav)
-        .isTypeFilterOnEntry(EdmTechProvider.nameETBaseTwoKeyNav)
+        .isType(EntityTypeProvider.nameETTwoKeyNav)
+        .isTypeFilterOnEntry(EntityTypeProvider.nameETBaseTwoKeyNav)
         .n()
         .isComplex("PropertyComplex");
 
@@ -1259,8 +1262,8 @@ public class TestFullResourcePath {
         .isKind(UriInfoKind.resource).goPath()
         .first()
         .isEntitySet("ESTwoKeyNav")
-        .isType(EdmTechProvider.nameETTwoKeyNav)
-        .isTypeFilterOnEntry(EdmTechProvider.nameETBaseTwoKeyNav)
+        .isType(EntityTypeProvider.nameETTwoKeyNav)
+        .isTypeFilterOnEntry(EntityTypeProvider.nameETBaseTwoKeyNav)
         .isKeyPredicate(0, "PropertyInt16", "1")
         .isKeyPredicate(1, "PropertyString", "'2'")
         .n()
@@ -1274,15 +1277,15 @@ public class TestFullResourcePath {
         .isKind(UriInfoKind.resource).goPath()
         .first()
         .isEntitySet("ESTwoKeyNav")
-        .isType(EdmTechProvider.nameETTwoKeyNav)
+        .isType(EntityTypeProvider.nameETTwoKeyNav)
         .isKeyPredicate(0, "PropertyInt16", "1")
         .isKeyPredicate(1, "PropertyString", "'2'")
 
-        .isTypeFilterOnEntry(EdmTechProvider.nameETBaseTwoKeyNav)
+        .isTypeFilterOnEntry(EntityTypeProvider.nameETBaseTwoKeyNav)
         .n()
         .isComplex("PropertyComplexTwoPrim")
-        .isType(EdmTechProvider.nameCTTwoPrim)
-        .isTypeFilter(EdmTechProvider.nameCTBase);
+        .isType(ComplexTypeProvider.nameCTTwoPrim)
+        .isTypeFilter(ComplexTypeProvider.nameCTBase);
 
     testUri
         .run("ESTwoKeyNav(PropertyInt16=1,PropertyString='2')/com.sap.odata.test1.ETBaseTwoKeyNav"
@@ -1290,14 +1293,14 @@ public class TestFullResourcePath {
         .isKind(UriInfoKind.resource).goPath()
         .first()
         .isEntitySet("ESTwoKeyNav")
-        .isType(EdmTechProvider.nameETTwoKeyNav)
+        .isType(EntityTypeProvider.nameETTwoKeyNav)
         .isKeyPredicate(0, "PropertyInt16", "1")
         .isKeyPredicate(1, "PropertyString", "'2'")
-        .isTypeFilterOnEntry(EdmTechProvider.nameETBaseTwoKeyNav)
+        .isTypeFilterOnEntry(EntityTypeProvider.nameETBaseTwoKeyNav)
         .n()
         .isComplex("PropertyComplexTwoPrim")
-        .isType(EdmTechProvider.nameCTTwoPrim)
-        .isTypeFilter(EdmTechProvider.nameCTTwoBase);
+        .isType(ComplexTypeProvider.nameCTTwoPrim)
+        .isTypeFilter(ComplexTypeProvider.nameCTTwoBase);
   }
 
   @Test
@@ -1308,7 +1311,7 @@ public class TestFullResourcePath {
         .isEntitySet("ESKeyNav")
         .isKeyPredicate(0, "PropertyInt16", "1")
         .n()
-        .isNavProperty("NavPropertyETTwoKeyNavMany", EdmTechProvider.nameETTwoKeyNav, true);
+        .isNavProperty("NavPropertyETTwoKeyNavMany", EntityTypeProvider.nameETTwoKeyNav, true);
 
     testUri.run("ESKeyNav(1)/NavPropertyETKeyNavMany(2)")
         .isKind(UriInfoKind.resource).goPath()
@@ -1316,7 +1319,7 @@ public class TestFullResourcePath {
         .isEntitySet("ESKeyNav")
         .isKeyPredicate(0, "PropertyInt16", "1")
         .n()
-        .isNavProperty("NavPropertyETKeyNavMany", EdmTechProvider.nameETKeyNav, false)
+        .isNavProperty("NavPropertyETKeyNavMany", EntityTypeProvider.nameETKeyNav, false)
         .isKeyPredicate(0, "PropertyInt16", "2");
 
     testUri.run("ESKeyNav(PropertyInt16=1)/NavPropertyETKeyNavMany(PropertyInt16=2)")
@@ -1325,7 +1328,7 @@ public class TestFullResourcePath {
         .isEntitySet("ESKeyNav")
         .isKeyPredicate(0, "PropertyInt16", "1")
         .n()
-        .isNavProperty("NavPropertyETKeyNavMany", EdmTechProvider.nameETKeyNav, false)
+        .isNavProperty("NavPropertyETKeyNavMany", EntityTypeProvider.nameETKeyNav, false)
         .isKeyPredicate(0, "PropertyInt16", "2");
 
     testUri.run("ESKeyNav(1)/NavPropertyETKeyNavMany(2)/PropertyInt16")
@@ -1334,10 +1337,10 @@ public class TestFullResourcePath {
         .isEntitySet("ESKeyNav")
         .isKeyPredicate(0, "PropertyInt16", "1")
         .n()
-        .isNavProperty("NavPropertyETKeyNavMany", EdmTechProvider.nameETKeyNav, false)
+        .isNavProperty("NavPropertyETKeyNavMany", EntityTypeProvider.nameETKeyNav, false)
         .isKeyPredicate(0, "PropertyInt16", "2")
         .n()
-        .isPrimitiveProperty("PropertyInt16", EdmTechProvider.nameInt16, false);
+        .isPrimitiveProperty("PropertyInt16", PropertyProvider.nameInt16, false);
 
     testUri.run("ESKeyNav(1)/NavPropertyETKeyNavMany(2)/PropertyComplex")
         .isKind(UriInfoKind.resource).goPath()
@@ -1345,7 +1348,7 @@ public class TestFullResourcePath {
         .isEntitySet("ESKeyNav")
         .isKeyPredicate(0, "PropertyInt16", "1")
         .n()
-        .isNavProperty("NavPropertyETKeyNavMany", EdmTechProvider.nameETKeyNav, false)
+        .isNavProperty("NavPropertyETKeyNavMany", EntityTypeProvider.nameETKeyNav, false)
         .isKeyPredicate(0, "PropertyInt16", "2")
         .n()
         .isComplex("PropertyComplex");
@@ -1356,10 +1359,10 @@ public class TestFullResourcePath {
         .isEntitySet("ESKeyNav")
         .isKeyPredicate(0, "PropertyInt16", "1")
         .n()
-        .isNavProperty("NavPropertyETKeyNavMany", EdmTechProvider.nameETKeyNav, false)
+        .isNavProperty("NavPropertyETKeyNavMany", EntityTypeProvider.nameETKeyNav, false)
         .isKeyPredicate(0, "PropertyInt16", "2")
         .n()
-        .isNavProperty("NavPropertyETKeyNavOne", EdmTechProvider.nameETKeyNav, false);
+        .isNavProperty("NavPropertyETKeyNavOne", EntityTypeProvider.nameETKeyNav, false);
 
     testUri.run("ESKeyNav(1)/NavPropertyETTwoKeyNavMany(PropertyInt16=2,PropertyString='3')"
         + "/NavPropertyETKeyNavMany(4)")
@@ -1368,11 +1371,11 @@ public class TestFullResourcePath {
         .isEntitySet("ESKeyNav")
         .isKeyPredicate(0, "PropertyInt16", "1")
         .n()
-        .isNavProperty("NavPropertyETTwoKeyNavMany", EdmTechProvider.nameETTwoKeyNav, false)
+        .isNavProperty("NavPropertyETTwoKeyNavMany", EntityTypeProvider.nameETTwoKeyNav, false)
         .isKeyPredicate(0, "PropertyInt16", "2")
         .isKeyPredicate(1, "PropertyString", "'3'")
         .n()
-        .isNavProperty("NavPropertyETKeyNavMany", EdmTechProvider.nameETKeyNav, false)
+        .isNavProperty("NavPropertyETKeyNavMany", EntityTypeProvider.nameETKeyNav, false)
         .isKeyPredicate(0, "PropertyInt16", "4");
 
     testUri.run("ESKeyNav(1)/PropertyComplex/NavPropertyETTwoKeyNavOne")
@@ -1383,7 +1386,7 @@ public class TestFullResourcePath {
         .n()
         .isComplex("PropertyComplex")
         .n()
-        .isNavProperty("NavPropertyETTwoKeyNavOne", EdmTechProvider.nameETTwoKeyNav, false);
+        .isNavProperty("NavPropertyETTwoKeyNavOne", EntityTypeProvider.nameETTwoKeyNav, false);
 
     testUri.run("ESKeyNav(1)/NavPropertyETTwoKeyNavMany(PropertyInt16=2,PropertyString='(3)')"
         + "/PropertyComplex/PropertyComplex/PropertyInt16")
@@ -1392,7 +1395,7 @@ public class TestFullResourcePath {
         .isEntitySet("ESKeyNav")
         .isKeyPredicate(0, "PropertyInt16", "1")
         .n()
-        .isNavProperty("NavPropertyETTwoKeyNavMany", EdmTechProvider.nameETTwoKeyNav, false)
+        .isNavProperty("NavPropertyETTwoKeyNavMany", EntityTypeProvider.nameETTwoKeyNav, false)
         .isKeyPredicate(0, "PropertyInt16", "2")
         .isKeyPredicate(1, "PropertyString", "'(3)'")
         .n()
@@ -1400,7 +1403,7 @@ public class TestFullResourcePath {
         .n()
         .isComplex("PropertyComplex")
         .n()
-        .isPrimitiveProperty("PropertyInt16", EdmTechProvider.nameInt16, false);
+        .isPrimitiveProperty("PropertyInt16", PropertyProvider.nameInt16, false);
 
     testUri.run("ESKeyNav(1)/NavPropertyETMediaMany(2)/$value")
         .isKind(UriInfoKind.resource).goPath()
@@ -1408,7 +1411,7 @@ public class TestFullResourcePath {
         .isEntitySet("ESKeyNav")
         .isKeyPredicate(0, "PropertyInt16", "1")
         .n()
-        .isNavProperty("NavPropertyETMediaMany", EdmTechProvider.nameETMedia, false)
+        .isNavProperty("NavPropertyETMediaMany", EntityTypeProvider.nameETMedia, false)
         .isKeyPredicate(0, "PropertyInt16", "2")
         .n()
         .isValue();
@@ -1420,13 +1423,13 @@ public class TestFullResourcePath {
         .isEntitySet("ESKeyNav")
         .isKeyPredicate(0, "PropertyInt16", "1")
         .n()
-        .isNavProperty("NavPropertyETTwoKeyNavMany", EdmTechProvider.nameETTwoKeyNav, false)
+        .isNavProperty("NavPropertyETTwoKeyNavMany", EntityTypeProvider.nameETTwoKeyNav, false)
         .isKeyPredicate(0, "PropertyInt16", "2")
         .isKeyPredicate(1, "PropertyString", "'3'")
         .n()
-        .isNavProperty("NavPropertyETKeyNavOne", EdmTechProvider.nameETKeyNav, false)
+        .isNavProperty("NavPropertyETKeyNavOne", EntityTypeProvider.nameETKeyNav, false)
         .n()
-        .isNavProperty("NavPropertyETMediaOne", EdmTechProvider.nameETMedia, false)
+        .isNavProperty("NavPropertyETMediaOne", EntityTypeProvider.nameETMedia, false)
         .n()
         .isValue();
 
@@ -1437,11 +1440,11 @@ public class TestFullResourcePath {
         .isEntitySet("ESKeyNav")
         .isKeyPredicate(0, "PropertyInt16", "1")
         .n()
-        .isNavProperty("NavPropertyETTwoKeyNavMany", EdmTechProvider.nameETTwoKeyNav, false)
+        .isNavProperty("NavPropertyETTwoKeyNavMany", EntityTypeProvider.nameETTwoKeyNav, false)
         .isKeyPredicate(0, "PropertyInt16", "2")
         .isKeyPredicate(1, "PropertyString", "'3'")
         .n()
-        .isNavProperty("NavPropertyETKeyNavOne", EdmTechProvider.nameETKeyNav, false)
+        .isNavProperty("NavPropertyETKeyNavOne", EntityTypeProvider.nameETKeyNav, false)
         .n()
         .isRef();
   }
@@ -1453,24 +1456,24 @@ public class TestFullResourcePath {
         .isKind(UriInfoKind.resource).goPath()
         .first()
         .isEntitySet("ESTwoKeyNav")
-        .isType(EdmTechProvider.nameETTwoKeyNav)
+        .isType(EntityTypeProvider.nameETTwoKeyNav)
         .isKeyPredicate(0, "PropertyInt16", "1")
         .isKeyPredicate(1, "PropertyString", "'2'")
-        .isTypeFilterOnEntry(EdmTechProvider.nameETBaseTwoKeyNav)
+        .isTypeFilterOnEntry(EntityTypeProvider.nameETBaseTwoKeyNav)
         .n()
-        .isNavProperty("NavPropertyETKeyNavMany", EdmTechProvider.nameETKeyNav, true);
+        .isNavProperty("NavPropertyETKeyNavMany", EntityTypeProvider.nameETKeyNav, true);
 
     testUri.run("ESTwoKeyNav(PropertyInt16=1,PropertyString='2')/com.sap.odata.test1.ETBaseTwoKeyNav"
         + "/NavPropertyETKeyNavMany(3)")
         .isKind(UriInfoKind.resource).goPath()
         .first()
         .isEntitySet("ESTwoKeyNav")
-        .isType(EdmTechProvider.nameETTwoKeyNav)
+        .isType(EntityTypeProvider.nameETTwoKeyNav)
         .isKeyPredicate(0, "PropertyInt16", "1")
         .isKeyPredicate(1, "PropertyString", "'2'")
-        .isTypeFilterOnEntry(EdmTechProvider.nameETBaseTwoKeyNav)
+        .isTypeFilterOnEntry(EntityTypeProvider.nameETBaseTwoKeyNav)
         .n()
-        .isNavProperty("NavPropertyETKeyNavMany", EdmTechProvider.nameETKeyNav, false)
+        .isNavProperty("NavPropertyETKeyNavMany", EntityTypeProvider.nameETKeyNav, false)
         .isKeyPredicate(0, "PropertyInt16", "3");
 
     testUri.run("ESTwoKeyNav(PropertyInt16=1,PropertyString='2')/com.sap.odata.test1.ETBaseTwoKeyNav"
@@ -1478,15 +1481,15 @@ public class TestFullResourcePath {
         .isKind(UriInfoKind.resource).goPath()
         .first()
         .isEntitySet("ESTwoKeyNav")
-        .isType(EdmTechProvider.nameETTwoKeyNav)
+        .isType(EntityTypeProvider.nameETTwoKeyNav)
         .isKeyPredicate(0, "PropertyInt16", "1")
         .isKeyPredicate(1, "PropertyString", "'2'")
-        .isTypeFilterOnEntry(EdmTechProvider.nameETBaseTwoKeyNav)
+        .isTypeFilterOnEntry(EntityTypeProvider.nameETBaseTwoKeyNav)
         .n()
-        .isNavProperty("NavPropertyETTwoKeyNavMany", EdmTechProvider.nameETTwoKeyNav, false)
+        .isNavProperty("NavPropertyETTwoKeyNavMany", EntityTypeProvider.nameETTwoKeyNav, false)
         .isKeyPredicate(0, "PropertyInt16", "3")
         .isKeyPredicate(1, "PropertyString", "'4'")
-        .isTypeFilterOnCollection(EdmTechProvider.nameETTwoBaseTwoKeyNav);
+        .isTypeFilterOnCollection(EntityTypeProvider.nameETTwoBaseTwoKeyNav);
 
     testUri.run("ESKeyNav(1)/NavPropertyETTwoKeyNavMany(PropertyInt16=2,PropertyString='3')"
         + "/NavPropertyETTwoKeyNavMany/com.sap.odata.test1.ETBaseTwoKeyNav(PropertyInt16=4,PropertyString='5')"
@@ -1496,18 +1499,18 @@ public class TestFullResourcePath {
         .isEntitySet("ESKeyNav")
         .isKeyPredicate(0, "PropertyInt16", "1")
         .n()
-        .isNavProperty("NavPropertyETTwoKeyNavMany", EdmTechProvider.nameETTwoKeyNav, false)
+        .isNavProperty("NavPropertyETTwoKeyNavMany", EntityTypeProvider.nameETTwoKeyNav, false)
         .isKeyPredicate(0, "PropertyInt16", "2")
         .isKeyPredicate(1, "PropertyString", "'3'")
         .n()
-        .isNavProperty("NavPropertyETTwoKeyNavMany", EdmTechProvider.nameETTwoKeyNav, false)
-        .isType(EdmTechProvider.nameETTwoKeyNav)
-        .isTypeFilterOnCollection(EdmTechProvider.nameETBaseTwoKeyNav)
+        .isNavProperty("NavPropertyETTwoKeyNavMany", EntityTypeProvider.nameETTwoKeyNav, false)
+        .isType(EntityTypeProvider.nameETTwoKeyNav)
+        .isTypeFilterOnCollection(EntityTypeProvider.nameETBaseTwoKeyNav)
         .isKeyPredicate(0, "PropertyInt16", "4")
         .isKeyPredicate(1, "PropertyString", "'5'")
-        .isTypeFilterOnEntry(EdmTechProvider.nameETTwoBaseTwoKeyNav)
+        .isTypeFilterOnEntry(EntityTypeProvider.nameETTwoBaseTwoKeyNav)
         .n()
-        .isNavProperty("NavPropertyETBaseTwoKeyNavMany", EdmTechProvider.nameETBaseTwoKeyNav, true);
+        .isNavProperty("NavPropertyETBaseTwoKeyNavMany", EntityTypeProvider.nameETBaseTwoKeyNav, true);
 
     testUri.run("ESKeyNav(1)/NavPropertyETTwoKeyNavMany(PropertyInt16=2,PropertyString='3')/"
         + "NavPropertyETTwoKeyNavMany/com.sap.odata.test1.ETBaseTwoKeyNav(PropertyInt16=4,PropertyString='5')/"
@@ -1517,16 +1520,16 @@ public class TestFullResourcePath {
         .isEntitySet("ESKeyNav")
         .isKeyPredicate(0, "PropertyInt16", "1")
         .n()
-        .isNavProperty("NavPropertyETTwoKeyNavMany", EdmTechProvider.nameETTwoKeyNav, false)
+        .isNavProperty("NavPropertyETTwoKeyNavMany", EntityTypeProvider.nameETTwoKeyNav, false)
         .isKeyPredicate(0, "PropertyInt16", "2")
         .isKeyPredicate(1, "PropertyString", "'3'")
         .n()
-        .isNavProperty("NavPropertyETTwoKeyNavMany", EdmTechProvider.nameETTwoKeyNav, false)
-        .isTypeFilterOnCollection(EdmTechProvider.nameETBaseTwoKeyNav)
+        .isNavProperty("NavPropertyETTwoKeyNavMany", EntityTypeProvider.nameETTwoKeyNav, false)
+        .isTypeFilterOnCollection(EntityTypeProvider.nameETBaseTwoKeyNav)
         .isKeyPredicate(0, "PropertyInt16", "4")
         .isKeyPredicate(1, "PropertyString", "'5'")
         .n()
-        .isNavProperty("NavPropertyETKeyNavMany", EdmTechProvider.nameETKeyNav, true);
+        .isNavProperty("NavPropertyETKeyNavMany", EntityTypeProvider.nameETKeyNav, true);
   }
 
   @Test
@@ -1537,7 +1540,7 @@ public class TestFullResourcePath {
         .isEntitySet("ESKeyNav")
         .isKeyPredicate(0, "PropertyInt16", "1")
         .n()
-        .isNavProperty("NavPropertyETTwoKeyNavMany", EdmTechProvider.nameETTwoKeyNav, false)
+        .isNavProperty("NavPropertyETTwoKeyNavMany", EntityTypeProvider.nameETTwoKeyNav, false)
         .isKeyPredicateRef(0, "PropertyInt16", "PropertyInt16")
         .isKeyPredicate(1, "PropertyString", "'2'");
 
@@ -1546,7 +1549,7 @@ public class TestFullResourcePath {
         .isEntitySet("ESKeyNav")
         .isKeyPredicate(0, "PropertyInt16", "1")
         .n()
-        .isNavProperty("NavPropertyETTwoKeyNavMany", EdmTechProvider.nameETTwoKeyNav, false)
+        .isNavProperty("NavPropertyETTwoKeyNavMany", EntityTypeProvider.nameETTwoKeyNav, false)
         .isKeyPredicateRef(0, "PropertyInt16", "PropertyInt16")
         .isKeyPredicate(1, "PropertyString", "'2'");
 
@@ -1560,7 +1563,7 @@ public class TestFullResourcePath {
         .isEntitySet("ESAllPrim")
         .isKeyPredicate(0, "PropertyInt16", "1")
         .n()
-        .isPrimitiveProperty("PropertyByte", EdmTechProvider.nameByte, false);
+        .isPrimitiveProperty("PropertyByte", PropertyProvider.nameByte, false);
 
     testUri.run("ESAllPrim(1)/PropertyByte/$value")
         .isKind(UriInfoKind.resource).goPath()
@@ -1568,7 +1571,7 @@ public class TestFullResourcePath {
         .isEntitySet("ESAllPrim")
         .isKeyPredicate(0, "PropertyInt16", "1")
         .n()
-        .isPrimitiveProperty("PropertyByte", EdmTechProvider.nameByte, false)
+        .isPrimitiveProperty("PropertyByte", PropertyProvider.nameByte, false)
         .n()
         .isValue();
 
@@ -1580,7 +1583,7 @@ public class TestFullResourcePath {
         .n()
         .isComplex("PropertyComplex")
         .n()
-        .isPrimitiveProperty("PropertyString", EdmTechProvider.nameString, false);
+        .isPrimitiveProperty("PropertyString", PropertyProvider.nameString, false);
   }
 
   @Test
@@ -1591,7 +1594,7 @@ public class TestFullResourcePath {
         .isEntitySet("ESCollAllPrim")
         .isKeyPredicate(0, "PropertyInt16", "1")
         .n()
-        .isPrimitiveProperty("CollPropertyString", EdmTechProvider.nameString, true);
+        .isPrimitiveProperty("CollPropertyString", PropertyProvider.nameString, true);
 
     testUri.run("ESKeyNav(1)/NavPropertyETTwoKeyNavMany(PropertyInt16=2,PropertyString='3')/CollPropertyString")
         .isKind(UriInfoKind.resource).goPath()
@@ -1599,9 +1602,9 @@ public class TestFullResourcePath {
         .isEntitySet("ESKeyNav")
         .isKeyPredicate(0, "PropertyInt16", "1")
         .n()
-        .isNavProperty("NavPropertyETTwoKeyNavMany", EdmTechProvider.nameETTwoKeyNav, false)
+        .isNavProperty("NavPropertyETTwoKeyNavMany", EntityTypeProvider.nameETTwoKeyNav, false)
         .n()
-        .isPrimitiveProperty("CollPropertyString", EdmTechProvider.nameString, true);
+        .isPrimitiveProperty("CollPropertyString", PropertyProvider.nameString, true);
 
     testUri.run("ESKeyNav(1)/NavPropertyETTwoKeyNavMany(PropertyInt16=2,PropertyString='3')/CollPropertyString/$count")
         .isKind(UriInfoKind.resource).goPath()
@@ -1609,11 +1612,11 @@ public class TestFullResourcePath {
         .isEntitySet("ESKeyNav")
         .isKeyPredicate(0, "PropertyInt16", "1")
         .n()
-        .isNavProperty("NavPropertyETTwoKeyNavMany", EdmTechProvider.nameETTwoKeyNav, false)
+        .isNavProperty("NavPropertyETTwoKeyNavMany", EntityTypeProvider.nameETTwoKeyNav, false)
         .isKeyPredicate(0, "PropertyInt16", "2")
         .isKeyPredicate(1, "PropertyString", "'3'")
         .n()
-        .isPrimitiveProperty("CollPropertyString", EdmTechProvider.nameString, true)
+        .isPrimitiveProperty("CollPropertyString", PropertyProvider.nameString, true)
         .n()
         .isCount();
 
@@ -1641,7 +1644,7 @@ public class TestFullResourcePath {
         .isEntitySet("ESKeyNav")
         .isKeyPredicate(0, "PropertyInt16", "1")
         .n()
-        .isNavProperty("NavPropertyETTwoKeyNavMany", EdmTechProvider.nameETTwoKeyNav, true)
+        .isNavProperty("NavPropertyETTwoKeyNavMany", EntityTypeProvider.nameETTwoKeyNav, true)
         .n()
         .isRef();
     testUri.run("ESKeyNav(1)/NavPropertyETTwoKeyNavMany(PropertyInt16=1,PropertyString='2')/$ref")
@@ -1650,7 +1653,7 @@ public class TestFullResourcePath {
         .isEntitySet("ESKeyNav")
         .isKeyPredicate(0, "PropertyInt16", "1")
         .n()
-        .isNavProperty("NavPropertyETTwoKeyNavMany", EdmTechProvider.nameETTwoKeyNav, false)
+        .isNavProperty("NavPropertyETTwoKeyNavMany", EntityTypeProvider.nameETTwoKeyNav, false)
         .isKeyPredicate(0, "PropertyInt16", "1")
         .isKeyPredicate(1, "PropertyString", "'2'")
         .n()
@@ -1673,8 +1676,8 @@ public class TestFullResourcePath {
         .isFunctionImport("FICRTETTwoKeyNavParam")
         .isFunction("UFCRTETTwoKeyNavParam")
         .isParameter(0, "ParameterInt16", "1")
-        .isType(EdmTechProvider.nameETTwoKeyNav)
-        .isTypeFilterOnEntry(EdmTechProvider.nameETBaseTwoKeyNav)
+        .isType(EntityTypeProvider.nameETTwoKeyNav)
+        .isTypeFilterOnEntry(EntityTypeProvider.nameETBaseTwoKeyNav)
         .n()
         .isFunction("BFCETBaseTwoKeyNavRTETTwoKeyNav");
 
@@ -1686,8 +1689,8 @@ public class TestFullResourcePath {
         .isFunctionImport("FICRTESTwoKeyNavParam")
         .isFunction("UFCRTESTwoKeyNavParam")
         .isParameter(0, "ParameterInt16", "1")
-        .isType(EdmTechProvider.nameETTwoKeyNav)
-        .isTypeFilterOnCollection(EdmTechProvider.nameETBaseTwoKeyNav)
+        .isType(EntityTypeProvider.nameETTwoKeyNav)
+        .isTypeFilterOnCollection(EntityTypeProvider.nameETBaseTwoKeyNav)
         .isKeyPredicate(0, "PropertyInt16", "2")
         .isKeyPredicate(1, "PropertyString", "'3'")
         .n()
@@ -1702,7 +1705,7 @@ public class TestFullResourcePath {
         .first()
         .isFunctionImport("FICRTETKeyNav")
         .isFunction("UFCRTETKeyNav")
-        .isType(EdmTechProvider.nameETKeyNav);
+        .isType(EntityTypeProvider.nameETKeyNav);
 
     testUri.run("FICRTETTwoKeyNavParam(ParameterInt16=1)(PropertyInt16=2,PropertyString='3')")
         .isKind(UriInfoKind.resource).goPath()
@@ -1741,8 +1744,8 @@ public class TestFullResourcePath {
         .isFunctionImport("FICRTETTwoKeyNavParam")
         .isFunction("UFCRTETTwoKeyNavParam")
         .isParameter(0, "ParameterInt16", "1")
-        .isType(EdmTechProvider.nameETTwoKeyNav)
-        .isTypeFilterOnEntry(EdmTechProvider.nameETBaseTwoKeyNav);
+        .isType(EntityTypeProvider.nameETTwoKeyNav)
+        .isTypeFilterOnEntry(EntityTypeProvider.nameETBaseTwoKeyNav);
 
     testUri.run("FICRTETTwoKeyNavParam(ParameterInt16=1)(PropertyInt16=2,PropertyString='3')"
         + "/com.sap.odata.test1.ETBaseTwoKeyNav")
@@ -1753,8 +1756,8 @@ public class TestFullResourcePath {
         .isParameter(0, "ParameterInt16", "1")
         .isKeyPredicate(0, "PropertyInt16", "2")
         .isKeyPredicate(1, "PropertyString", "'3'")
-        .isType(EdmTechProvider.nameETTwoKeyNav)
-        .isTypeFilterOnEntry(EdmTechProvider.nameETBaseTwoKeyNav);
+        .isType(EntityTypeProvider.nameETTwoKeyNav)
+        .isTypeFilterOnEntry(EntityTypeProvider.nameETBaseTwoKeyNav);
 
     testUri.run("FICRTESTwoKeyNavParam(ParameterInt16=1)"
         + "/com.sap.odata.test1.ETBaseTwoKeyNav(PropertyInt16=2,PropertyString='3')")
@@ -1763,8 +1766,8 @@ public class TestFullResourcePath {
         .isFunctionImport("FICRTESTwoKeyNavParam")
         .isFunction("UFCRTESTwoKeyNavParam")
         .isParameter(0, "ParameterInt16", "1")
-        .isType(EdmTechProvider.nameETTwoKeyNav)
-        .isTypeFilterOnCollection(EdmTechProvider.nameETBaseTwoKeyNav)
+        .isType(EntityTypeProvider.nameETTwoKeyNav)
+        .isTypeFilterOnCollection(EntityTypeProvider.nameETBaseTwoKeyNav)
         .isKeyPredicate(0, "PropertyInt16", "2")
         .isKeyPredicate(1, "PropertyString", "'3'");
   }
@@ -1779,7 +1782,7 @@ public class TestFullResourcePath {
         .isFunction("UFCRTESMixPrimCollCompTwoParam")
         .isParameter(0, "ParameterInt16", "1")
         .isParameter(1, "ParameterString", "'2'")
-        .isType(EdmTechProvider.nameETMixPrimCollComp);
+        .isType(EntityTypeProvider.nameETMixPrimCollComp);
 
     testUri.run("FINRTESMixPrimCollCompTwoParam(ParameterInt16=1,ParameterString='2')")
         .isKind(UriInfoKind.resource).goPath()
@@ -1788,7 +1791,7 @@ public class TestFullResourcePath {
         .isFunction("UFNRTESMixPrimCollCompTwoParam")
         .isParameter(0, "ParameterInt16", "1")
         .isParameter(1, "ParameterString", "'2'")
-        .isType(EdmTechProvider.nameETMixPrimCollComp);
+        .isType(EntityTypeProvider.nameETMixPrimCollComp);
 
     testUri.run("FICRTESMixPrimCollCompTwoParam(ParameterInt16=1,ParameterString='2')/$count")
         .isKind(UriInfoKind.resource).goPath()
@@ -1797,7 +1800,7 @@ public class TestFullResourcePath {
         .isFunction("UFCRTESMixPrimCollCompTwoParam")
         .isParameter(0, "ParameterInt16", "1")
         .isParameter(1, "ParameterString", "'2'")
-        .isType(EdmTechProvider.nameETMixPrimCollComp)
+        .isType(EntityTypeProvider.nameETMixPrimCollComp)
         .n()
         .isCount();
   }
@@ -1825,8 +1828,8 @@ public class TestFullResourcePath {
         .isFunctionImport("FICRTESTwoKeyNavParam")
         .isFunction("UFCRTESTwoKeyNavParam")
         .isParameter(0, "ParameterInt16", "1")
-        .isType(EdmTechProvider.nameETTwoKeyNav)
-        .isTypeFilterOnCollection(EdmTechProvider.nameETBaseTwoKeyNav);
+        .isType(EntityTypeProvider.nameETTwoKeyNav)
+        .isTypeFilterOnCollection(EntityTypeProvider.nameETBaseTwoKeyNav);
 
     testUri.run("FICRTESTwoKeyNavParam(ParameterInt16=1)/com.sap.odata.test1.ETBaseTwoKeyNav/$count")
         .isKind(UriInfoKind.resource).goPath()
@@ -1834,8 +1837,8 @@ public class TestFullResourcePath {
         .isFunctionImport("FICRTESTwoKeyNavParam")
         .isFunction("UFCRTESTwoKeyNavParam")
         .isParameter(0, "ParameterInt16", "1")
-        .isType(EdmTechProvider.nameETTwoKeyNav)
-        .isTypeFilterOnCollection(EdmTechProvider.nameETBaseTwoKeyNav)
+        .isType(EntityTypeProvider.nameETTwoKeyNav)
+        .isTypeFilterOnCollection(EntityTypeProvider.nameETBaseTwoKeyNav)
         .n()
         .isCount();
 
@@ -1846,8 +1849,8 @@ public class TestFullResourcePath {
         .isFunctionImport("FICRTESTwoKeyNavParam")
         .isFunction("UFCRTESTwoKeyNavParam")
         .isParameter(0, "ParameterInt16", "1")
-        .isType(EdmTechProvider.nameETTwoKeyNav)
-        .isTypeFilterOnCollection(EdmTechProvider.nameETBaseTwoKeyNav)
+        .isType(EntityTypeProvider.nameETTwoKeyNav)
+        .isTypeFilterOnCollection(EntityTypeProvider.nameETBaseTwoKeyNav)
         .isKeyPredicate(0, "PropertyInt16", "2")
         .isKeyPredicate(1, "PropertyString", "'3'");
 
@@ -1859,11 +1862,11 @@ public class TestFullResourcePath {
         .isFunctionImport("FICRTESTwoKeyNavParam")
         .isFunction("UFCRTESTwoKeyNavParam")
         .isParameter(0, "ParameterInt16", "1")
-        .isType(EdmTechProvider.nameETTwoKeyNav)
-        .isTypeFilterOnCollection(EdmTechProvider.nameETBaseTwoKeyNav)
+        .isType(EntityTypeProvider.nameETTwoKeyNav)
+        .isTypeFilterOnCollection(EntityTypeProvider.nameETBaseTwoKeyNav)
         .isKeyPredicate(0, "PropertyInt16", "2")
         .isKeyPredicate(1, "PropertyString", "'3'")
-        .isTypeFilterOnEntry(EdmTechProvider.nameETTwoBaseTwoKeyNav);
+        .isTypeFilterOnEntry(EntityTypeProvider.nameETTwoBaseTwoKeyNav);
 
   }
 
@@ -1882,19 +1885,19 @@ public class TestFullResourcePath {
         .isKind(UriInfoKind.resource).goPath()
         .first()
         .isSingleton("SINav")
-        .isType(EdmTechProvider.nameETTwoKeyNav)
-        .isTypeFilter(EdmTechProvider.nameETBaseTwoKeyNav)
+        .isType(EntityTypeProvider.nameETTwoKeyNav)
+        .isTypeFilter(EntityTypeProvider.nameETBaseTwoKeyNav)
         .n()
-        .isNavProperty("NavPropertyETKeyNavMany", EdmTechProvider.nameETKeyNav, true);
+        .isNavProperty("NavPropertyETKeyNavMany", EntityTypeProvider.nameETKeyNav, true);
 
     testUri.run("SINav/com.sap.odata.test1.ETBaseTwoKeyNav/NavPropertyETKeyNavMany(1)")
         .isKind(UriInfoKind.resource).goPath()
         .first()
         .isSingleton("SINav")
-        .isType(EdmTechProvider.nameETTwoKeyNav)
-        .isTypeFilter(EdmTechProvider.nameETBaseTwoKeyNav)
+        .isType(EntityTypeProvider.nameETTwoKeyNav)
+        .isTypeFilter(EntityTypeProvider.nameETBaseTwoKeyNav)
         .n()
-        .isNavProperty("NavPropertyETKeyNavMany", EdmTechProvider.nameETKeyNav, false)
+        .isNavProperty("NavPropertyETKeyNavMany", EntityTypeProvider.nameETKeyNav, false)
         .isKeyPredicate(0, "PropertyInt16", "1");
 
   }
@@ -1905,8 +1908,8 @@ public class TestFullResourcePath {
         .isKind(UriInfoKind.resource).goPath()
         .first()
         .isSingleton("SINav")
-        .isType(EdmTechProvider.nameETTwoKeyNav)
-        .isTypeFilter(EdmTechProvider.nameETBaseTwoKeyNav)
+        .isType(EntityTypeProvider.nameETTwoKeyNav)
+        .isTypeFilter(EntityTypeProvider.nameETBaseTwoKeyNav)
         .n()
         .isComplex("PropertyComplex");
 
@@ -1914,8 +1917,8 @@ public class TestFullResourcePath {
         .isKind(UriInfoKind.resource).goPath()
         .first()
         .isSingleton("SINav")
-        .isType(EdmTechProvider.nameETTwoKeyNav)
-        .isTypeFilter(EdmTechProvider.nameETBaseTwoKeyNav)
+        .isType(EntityTypeProvider.nameETTwoKeyNav)
+        .isTypeFilter(EntityTypeProvider.nameETBaseTwoKeyNav)
         .n()
         .isComplex("PropertyComplex")
         .n()
@@ -1925,12 +1928,12 @@ public class TestFullResourcePath {
         .isKind(UriInfoKind.resource).goPath()
         .first()
         .isSingleton("SINav")
-        .isType(EdmTechProvider.nameETTwoKeyNav)
-        .isTypeFilter(EdmTechProvider.nameETBaseTwoKeyNav)
+        .isType(EntityTypeProvider.nameETTwoKeyNav)
+        .isTypeFilter(EntityTypeProvider.nameETBaseTwoKeyNav)
         .n()
         .isComplex("PropertyComplexTwoPrim")
-        .isType(EdmTechProvider.nameCTTwoPrim)
-        .isTypeFilter(EdmTechProvider.nameCTBase);
+        .isType(ComplexTypeProvider.nameCTTwoPrim)
+        .isTypeFilter(ComplexTypeProvider.nameCTBase);
 
   }
 
@@ -1940,20 +1943,20 @@ public class TestFullResourcePath {
         .isKind(UriInfoKind.resource).goPath()
         .first()
         .isSingleton("SINav")
-        .isType(EdmTechProvider.nameETTwoKeyNav)
-        .isTypeFilter(EdmTechProvider.nameETBaseTwoKeyNav)
+        .isType(EntityTypeProvider.nameETTwoKeyNav)
+        .isTypeFilter(EntityTypeProvider.nameETBaseTwoKeyNav)
         .n()
-        .isPrimitiveProperty("PropertyInt16", EdmTechProvider.nameInt16, false);
+        .isPrimitiveProperty("PropertyInt16", PropertyProvider.nameInt16, false);
 
     testUri.run("SINav/com.sap.odata.test1.ETBaseTwoKeyNav/CollPropertyString")
         .isKind(UriInfoKind.resource).goPath()
         .first()
         .isSingleton("SINav")
-        .isType(EdmTechProvider.nameETTwoKeyNav)
-        .isTypeFilter(EdmTechProvider.nameETBaseTwoKeyNav)
+        .isType(EntityTypeProvider.nameETTwoKeyNav)
+        .isTypeFilter(EntityTypeProvider.nameETBaseTwoKeyNav)
         .n()
-        .isPrimitiveProperty("CollPropertyString", EdmTechProvider.nameString, true)
-        .isType(EdmTechProvider.nameString, true);
+        .isPrimitiveProperty("CollPropertyString", PropertyProvider.nameString, true)
+        .isType(PropertyProvider.nameString, true);
 
   }
 
@@ -1964,14 +1967,14 @@ public class TestFullResourcePath {
         .first()
         .isSingleton("SINav")
         .n()
-        .isNavProperty("NavPropertyETKeyNavMany", EdmTechProvider.nameETKeyNav, true);
+        .isNavProperty("NavPropertyETKeyNavMany", EntityTypeProvider.nameETKeyNav, true);
 
     testUri.run("SINav/NavPropertyETTwoKeyNavMany(PropertyInt16=1,PropertyString='2')")
         .isKind(UriInfoKind.resource).goPath()
         .first()
         .isSingleton("SINav")
         .n()
-        .isNavProperty("NavPropertyETTwoKeyNavMany", EdmTechProvider.nameETTwoKeyNav, false)
+        .isNavProperty("NavPropertyETTwoKeyNavMany", EntityTypeProvider.nameETTwoKeyNav, false)
         .isKeyPredicate(0, "PropertyInt16", "1")
         .isKeyPredicate(1, "PropertyString", "'2'");
 
@@ -2005,7 +2008,7 @@ public class TestFullResourcePath {
         .isSingleton("SINav")
         .n()
         .isComplex("CollPropertyComplex")
-        .isType(EdmTechProvider.nameCTPrimComp, true);
+        .isType(ComplexTypeProvider.nameCTPrimComp, true);
 
     testUri.run("SINav/CollPropertyComplex/$count")
         .isKind(UriInfoKind.resource).goPath()
@@ -2013,7 +2016,7 @@ public class TestFullResourcePath {
         .isSingleton("SINav")
         .n()
         .isComplex("CollPropertyComplex")
-        .isType(EdmTechProvider.nameCTPrimComp, true)
+        .isType(ComplexTypeProvider.nameCTPrimComp, true)
         .n()
         .isCount();
   }
@@ -2025,7 +2028,7 @@ public class TestFullResourcePath {
         .first()
         .isSingleton("SINav")
         .n()
-        .isPrimitiveProperty("PropertyString", EdmTechProvider.nameString, false);
+        .isPrimitiveProperty("PropertyString", PropertyProvider.nameString, false);
   }
 
   @Test
@@ -2036,13 +2039,13 @@ public class TestFullResourcePath {
         .first()
         .isSingleton("SINav")
         .n()
-        .isPrimitiveProperty("CollPropertyString", EdmTechProvider.nameString, true);
+        .isPrimitiveProperty("CollPropertyString", PropertyProvider.nameString, true);
     testUri.run("SINav/CollPropertyString/$count")
         .isKind(UriInfoKind.resource).goPath()
         .first()
         .isSingleton("SINav")
         .n()
-        .isPrimitiveProperty("CollPropertyString", EdmTechProvider.nameString, true)
+        .isPrimitiveProperty("CollPropertyString", PropertyProvider.nameString, true)
         .n()
         .isCount();
   }
@@ -2067,7 +2070,7 @@ public class TestFullResourcePath {
         .isSegmentStar(0).isSegmentRef(1)
         .next()
         .goPath().first()
-        .isNavProperty("NavPropertyETKeyNavMany", EdmTechProvider.nameETKeyNav, true);
+        .isNavProperty("NavPropertyETKeyNavMany", EntityTypeProvider.nameETKeyNav, true);
 
     testUri.run("ESKeyNav(1)?$expand=*($levels=3)")
         .isKind(UriInfoKind.resource).goPath().goExpand()
@@ -2085,24 +2088,24 @@ public class TestFullResourcePath {
         .isKind(UriInfoKind.resource).goPath().goExpand()
         .first()
         .goPath().first()
-        .isNavProperty("NavPropertyETKeyNavMany", EdmTechProvider.nameETKeyNav, true)
-        .isType(EdmTechProvider.nameETKeyNav, true)
+        .isNavProperty("NavPropertyETKeyNavMany", EntityTypeProvider.nameETKeyNav, true)
+        .isType(EntityTypeProvider.nameETKeyNav, true)
         .n().isRef();
 
     testUri.run("ESKeyNav(1)?$expand=NavPropertyETKeyNavOne/$ref")
         .isKind(UriInfoKind.resource).goPath().goExpand()
         .first()
         .goPath().first()
-        .isNavProperty("NavPropertyETKeyNavOne", EdmTechProvider.nameETKeyNav, false)
-        .isType(EdmTechProvider.nameETKeyNav, false)
+        .isNavProperty("NavPropertyETKeyNavOne", EntityTypeProvider.nameETKeyNav, false)
+        .isType(EntityTypeProvider.nameETKeyNav, false)
         .n().isRef();
 
     testUri.run("ESKeyNav(1)?$expand=NavPropertyETKeyNavMany/$ref($filter=PropertyInt16 eq 1)")
         .isKind(UriInfoKind.resource).goPath().goExpand()
         .first()
         .goPath().first()
-        .isNavProperty("NavPropertyETKeyNavMany", EdmTechProvider.nameETKeyNav, true)
-        .isType(EdmTechProvider.nameETKeyNav, true)
+        .isNavProperty("NavPropertyETKeyNavMany", EntityTypeProvider.nameETKeyNav, true)
+        .isType(EntityTypeProvider.nameETKeyNav, true)
         .n().isRef()
         .goUpExpandValidator().isFilterSerialized("<<PropertyInt16> eq <1>>");
 
@@ -2110,19 +2113,19 @@ public class TestFullResourcePath {
         .isKind(UriInfoKind.resource).goPath().goExpand()
         .first()
         .goPath().first()
-        .isNavProperty("NavPropertyETKeyNavMany", EdmTechProvider.nameETKeyNav, true)
-        .isType(EdmTechProvider.nameETKeyNav, true)
+        .isNavProperty("NavPropertyETKeyNavMany", EntityTypeProvider.nameETKeyNav, true)
+        .isType(EntityTypeProvider.nameETKeyNav, true)
         .n().isRef()
         .goUpExpandValidator()
         .isSortOrder(0, false)
-        .goOrder(0).goPath().isPrimitiveProperty("PropertyInt16", EdmTechProvider.nameInt16, false);
+        .goOrder(0).goPath().isPrimitiveProperty("PropertyInt16", PropertyProvider.nameInt16, false);
 
     testUri.run("ESKeyNav(1)?$expand=NavPropertyETKeyNavMany/$ref($skip=1)")
         .isKind(UriInfoKind.resource).goPath().goExpand()
         .first()
         .goPath().first()
-        .isNavProperty("NavPropertyETKeyNavMany", EdmTechProvider.nameETKeyNav, true)
-        .isType(EdmTechProvider.nameETKeyNav, true)
+        .isNavProperty("NavPropertyETKeyNavMany", EntityTypeProvider.nameETKeyNav, true)
+        .isType(EntityTypeProvider.nameETKeyNav, true)
         .n().isRef()
         .goUpExpandValidator()
         .isSkipText("1");
@@ -2131,8 +2134,8 @@ public class TestFullResourcePath {
         .isKind(UriInfoKind.resource).goPath().goExpand()
         .first()
         .goPath().first()
-        .isNavProperty("NavPropertyETKeyNavMany", EdmTechProvider.nameETKeyNav, true)
-        .isType(EdmTechProvider.nameETKeyNav, true)
+        .isNavProperty("NavPropertyETKeyNavMany", EntityTypeProvider.nameETKeyNav, true)
+        .isType(EntityTypeProvider.nameETKeyNav, true)
         .n().isRef()
         .goUpExpandValidator()
         .isTopText("2");
@@ -2141,8 +2144,8 @@ public class TestFullResourcePath {
         .isKind(UriInfoKind.resource).goPath().goExpand()
         .first()
         .goPath().first()
-        .isNavProperty("NavPropertyETKeyNavMany", EdmTechProvider.nameETKeyNav, true)
-        .isType(EdmTechProvider.nameETKeyNav, true)
+        .isNavProperty("NavPropertyETKeyNavMany", EntityTypeProvider.nameETKeyNav, true)
+        .isType(EntityTypeProvider.nameETKeyNav, true)
         .n().isRef()
         .goUpExpandValidator()
         .isInlineCountText("true");
@@ -2151,8 +2154,8 @@ public class TestFullResourcePath {
         .isKind(UriInfoKind.resource).goPath().goExpand()
         .first()
         .goPath().first()
-        .isNavProperty("NavPropertyETKeyNavMany", EdmTechProvider.nameETKeyNav, true)
-        .isType(EdmTechProvider.nameETKeyNav, true)
+        .isNavProperty("NavPropertyETKeyNavMany", EntityTypeProvider.nameETKeyNav, true)
+        .isType(EntityTypeProvider.nameETKeyNav, true)
         .n().isRef()
         .goUpExpandValidator()
         .isSkipText("1")
@@ -2162,8 +2165,8 @@ public class TestFullResourcePath {
         .isKind(UriInfoKind.resource).goPath().goExpand()
         .first()
         .goPath().first()
-        .isNavProperty("NavPropertyETKeyNavMany", EdmTechProvider.nameETKeyNav, true)
-        .isType(EdmTechProvider.nameETKeyNav, true)
+        .isNavProperty("NavPropertyETKeyNavMany", EntityTypeProvider.nameETKeyNav, true)
+        .isType(EntityTypeProvider.nameETKeyNav, true)
         .n().isRef()
         .goUpExpandValidator()
         .isSkipText("1")
@@ -2173,24 +2176,24 @@ public class TestFullResourcePath {
         .isKind(UriInfoKind.resource).goPath().goExpand()
         .first()
         .goPath().first()
-        .isNavProperty("NavPropertyETKeyNavMany", EdmTechProvider.nameETKeyNav, true)
-        .isType(EdmTechProvider.nameETKeyNav, true)
+        .isNavProperty("NavPropertyETKeyNavMany", EntityTypeProvider.nameETKeyNav, true)
+        .isType(EntityTypeProvider.nameETKeyNav, true)
         .n().isCount();
 
     testUri.run("ESKeyNav(1)?$expand=NavPropertyETKeyNavOne/$count")
         .isKind(UriInfoKind.resource).goPath().goExpand()
         .first()
         .goPath().first()
-        .isNavProperty("NavPropertyETKeyNavOne", EdmTechProvider.nameETKeyNav, false)
-        .isType(EdmTechProvider.nameETKeyNav, false)
+        .isNavProperty("NavPropertyETKeyNavOne", EntityTypeProvider.nameETKeyNav, false)
+        .isType(EntityTypeProvider.nameETKeyNav, false)
         .n().isCount();
 
     testUri.run("ESKeyNav(1)?$expand=NavPropertyETKeyNavMany/$count($filter=PropertyInt16 gt 1)")
         .isKind(UriInfoKind.resource).goPath().goExpand()
         .first()
         .goPath().first()
-        .isNavProperty("NavPropertyETKeyNavMany", EdmTechProvider.nameETKeyNav, true)
-        .isType(EdmTechProvider.nameETKeyNav, true)
+        .isNavProperty("NavPropertyETKeyNavMany", EntityTypeProvider.nameETKeyNav, true)
+        .isType(EntityTypeProvider.nameETKeyNav, true)
         .n().isCount()
         .goUpExpandValidator()
         .isFilterSerialized("<<PropertyInt16> gt <1>>");
@@ -2199,8 +2202,8 @@ public class TestFullResourcePath {
         .isKind(UriInfoKind.resource).goPath().goExpand()
         .first()
         .goPath().first()
-        .isNavProperty("NavPropertyETKeyNavMany", EdmTechProvider.nameETKeyNav, true)
-        .isType(EdmTechProvider.nameETKeyNav, true)
+        .isNavProperty("NavPropertyETKeyNavMany", EntityTypeProvider.nameETKeyNav, true)
+        .isType(EntityTypeProvider.nameETKeyNav, true)
         .goUpExpandValidator()
         .isFilterSerialized("<<PropertyInt16> eq <1>>");
 
@@ -2208,18 +2211,18 @@ public class TestFullResourcePath {
         .isKind(UriInfoKind.resource).goPath().goExpand()
         .first()
         .goPath().first()
-        .isNavProperty("NavPropertyETKeyNavMany", EdmTechProvider.nameETKeyNav, true)
-        .isType(EdmTechProvider.nameETKeyNav, true)
+        .isNavProperty("NavPropertyETKeyNavMany", EntityTypeProvider.nameETKeyNav, true)
+        .isType(EntityTypeProvider.nameETKeyNav, true)
         .goUpExpandValidator()
         .isSortOrder(0, false)
-        .goOrder(0).goPath().isPrimitiveProperty("PropertyInt16", EdmTechProvider.nameInt16, false);
+        .goOrder(0).goPath().isPrimitiveProperty("PropertyInt16", PropertyProvider.nameInt16, false);
 
     testUri.run("ESKeyNav(1)?$expand=NavPropertyETKeyNavMany($skip=1)")
         .isKind(UriInfoKind.resource).goPath().goExpand()
         .first()
         .goPath().first()
-        .isNavProperty("NavPropertyETKeyNavMany", EdmTechProvider.nameETKeyNav, true)
-        .isType(EdmTechProvider.nameETKeyNav, true)
+        .isNavProperty("NavPropertyETKeyNavMany", EntityTypeProvider.nameETKeyNav, true)
+        .isType(EntityTypeProvider.nameETKeyNav, true)
         .goUpExpandValidator()
         .isSkipText("1");
 
@@ -2227,8 +2230,8 @@ public class TestFullResourcePath {
         .isKind(UriInfoKind.resource).goPath().goExpand()
         .first()
         .goPath().first()
-        .isNavProperty("NavPropertyETKeyNavMany", EdmTechProvider.nameETKeyNav, true)
-        .isType(EdmTechProvider.nameETKeyNav, true)
+        .isNavProperty("NavPropertyETKeyNavMany", EntityTypeProvider.nameETKeyNav, true)
+        .isType(EntityTypeProvider.nameETKeyNav, true)
         .goUpExpandValidator()
         .isTopText("2");
 
@@ -2236,8 +2239,8 @@ public class TestFullResourcePath {
         .isKind(UriInfoKind.resource).goPath().goExpand()
         .first()
         .goPath().first()
-        .isNavProperty("NavPropertyETKeyNavMany", EdmTechProvider.nameETKeyNav, true)
-        .isType(EdmTechProvider.nameETKeyNav, true)
+        .isNavProperty("NavPropertyETKeyNavMany", EntityTypeProvider.nameETKeyNav, true)
+        .isType(EntityTypeProvider.nameETKeyNav, true)
         .goUpExpandValidator()
         .isInlineCountText("true");
 
@@ -2245,40 +2248,40 @@ public class TestFullResourcePath {
         .isKind(UriInfoKind.resource).goPath().goExpand()
         .first()
         .goPath().first()
-        .isNavProperty("NavPropertyETKeyNavMany", EdmTechProvider.nameETKeyNav, true)
-        .isType(EdmTechProvider.nameETKeyNav, true)
+        .isNavProperty("NavPropertyETKeyNavMany", EntityTypeProvider.nameETKeyNav, true)
+        .isType(EntityTypeProvider.nameETKeyNav, true)
         .goUpExpandValidator()
         .isSelectText("PropertyString")
-        .goSelectItem(0).isPrimitiveProperty("PropertyString", EdmTechProvider.nameString, false);
+        .goSelectItem(0).isPrimitiveProperty("PropertyString", PropertyProvider.nameString, false);
 
     testUri.run("ESKeyNav(1)?$expand=NavPropertyETKeyNavMany($expand=NavPropertyETTwoKeyNavOne)")
         .isKind(UriInfoKind.resource).goPath().goExpand()
         .first()
         .goPath().first()
-        .isNavProperty("NavPropertyETKeyNavMany", EdmTechProvider.nameETKeyNav, true)
-        .isType(EdmTechProvider.nameETKeyNav, true)
+        .isNavProperty("NavPropertyETKeyNavMany", EntityTypeProvider.nameETKeyNav, true)
+        .isType(EntityTypeProvider.nameETKeyNav, true)
         .goUpExpandValidator()
         .goExpand()
         .goPath().first()
-        .isNavProperty("NavPropertyETTwoKeyNavOne", EdmTechProvider.nameETTwoKeyNav, false);
+        .isNavProperty("NavPropertyETTwoKeyNavOne", EntityTypeProvider.nameETTwoKeyNav, false);
 
     testUri.run("ESKeyNav(1)?$expand=NavPropertyETKeyNavMany($expand=NavPropertyETKeyNavMany)")
         .isKind(UriInfoKind.resource).goPath().goExpand()
         .first()
         .goPath().first()
-        .isNavProperty("NavPropertyETKeyNavMany", EdmTechProvider.nameETKeyNav, true)
-        .isType(EdmTechProvider.nameETKeyNav, true)
+        .isNavProperty("NavPropertyETKeyNavMany", EntityTypeProvider.nameETKeyNav, true)
+        .isType(EntityTypeProvider.nameETKeyNav, true)
         .goUpExpandValidator()
         .goExpand()
         .goPath().first()
-        .isNavProperty("NavPropertyETKeyNavMany", EdmTechProvider.nameETKeyNav, true);
+        .isNavProperty("NavPropertyETKeyNavMany", EntityTypeProvider.nameETKeyNav, true);
 
     testUri.run("ESKeyNav(1)?$expand=NavPropertyETKeyNavOne($levels=5)")
         .isKind(UriInfoKind.resource).goPath().goExpand()
         .first()
         .goPath().first()
-        .isNavProperty("NavPropertyETKeyNavOne", EdmTechProvider.nameETKeyNav, false)
-        .isType(EdmTechProvider.nameETKeyNav, false)
+        .isNavProperty("NavPropertyETKeyNavOne", EntityTypeProvider.nameETKeyNav, false)
+        .isType(EntityTypeProvider.nameETKeyNav, false)
         .goUpExpandValidator()
         .isLevelText("5");
 
@@ -2286,18 +2289,18 @@ public class TestFullResourcePath {
         .isKind(UriInfoKind.resource).goPath().goExpand()
         .first()
         .goPath().first()
-        .isNavProperty("NavPropertyETKeyNavMany", EdmTechProvider.nameETKeyNav, true)
-        .isType(EdmTechProvider.nameETKeyNav, true)
+        .isNavProperty("NavPropertyETKeyNavMany", EntityTypeProvider.nameETKeyNav, true)
+        .isType(EntityTypeProvider.nameETKeyNav, true)
         .goUpExpandValidator()
         .isSelectText("PropertyString")
-        .goSelectItem(0).isPrimitiveProperty("PropertyString", EdmTechProvider.nameString, false);
+        .goSelectItem(0).isPrimitiveProperty("PropertyString", PropertyProvider.nameString, false);
 
     testUri.run("ESKeyNav(1)?$expand=NavPropertyETKeyNavOne($levels=max)")
         .isKind(UriInfoKind.resource).goPath().goExpand()
         .first()
         .goPath().first()
-        .isNavProperty("NavPropertyETKeyNavOne", EdmTechProvider.nameETKeyNav, false)
-        .isType(EdmTechProvider.nameETKeyNav, false)
+        .isNavProperty("NavPropertyETKeyNavOne", EntityTypeProvider.nameETKeyNav, false)
+        .isType(EntityTypeProv

<TRUNCATED>

[3/9] [OLINGO-168] Refactor Tech Provider

Posted by ch...@apache.org.
http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/59ef14f4/lib/server-core/src/test/java/org/apache/olingo/server/core/testutil/techprovider/FunctionProvider.java
----------------------------------------------------------------------
diff --git a/lib/server-core/src/test/java/org/apache/olingo/server/core/testutil/techprovider/FunctionProvider.java b/lib/server-core/src/test/java/org/apache/olingo/server/core/testutil/techprovider/FunctionProvider.java
new file mode 100644
index 0000000..f9e15ec
--- /dev/null
+++ b/lib/server-core/src/test/java/org/apache/olingo/server/core/testutil/techprovider/FunctionProvider.java
@@ -0,0 +1,794 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.olingo.server.core.testutil.techprovider;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+import org.apache.olingo.commons.api.ODataException;
+import org.apache.olingo.commons.api.edm.FullQualifiedName;
+import org.apache.olingo.server.api.edm.provider.Function;
+import org.apache.olingo.server.api.edm.provider.Parameter;
+import org.apache.olingo.server.api.edm.provider.ReturnType;
+
+public class FunctionProvider {
+
+  // Bound Functions
+  public static final FullQualifiedName nameBFCCollCTPrimCompRTESAllPrim =
+      new FullQualifiedName(SchemaProvider.nameSpace, "BFCCollCTPrimCompRTESAllPrim");
+
+  public static final FullQualifiedName nameBFCCollStringRTESTwoKeyNav =
+      new FullQualifiedName(SchemaProvider.nameSpace, "BFCCollStringRTESTwoKeyNav");
+
+  public static final FullQualifiedName nameBFCCTPrimCompRTESBaseTwoKeyNav =
+      new FullQualifiedName(SchemaProvider.nameSpace, "BFCCTPrimCompRTESBaseTwoKeyNav");
+
+  public static final FullQualifiedName nameBFCCTPrimCompRTESTwoKeyNav =
+      new FullQualifiedName(SchemaProvider.nameSpace, "BFCCTPrimCompRTESTwoKeyNav");
+
+  public static final FullQualifiedName nameBFCCTPrimCompRTESTwoKeyNavParam =
+      new FullQualifiedName(SchemaProvider.nameSpace, "BFCCTPrimCompRTESTwoKeyNavParam");
+
+  public static final FullQualifiedName nameBFCCTPrimCompRTETTwoKeyNavParam =
+      new FullQualifiedName(SchemaProvider.nameSpace, "BFCCTPrimCompRTETTwoKeyNavParam");
+
+  public static final FullQualifiedName nameBFCESAllPrimRTCTAllPrim =
+      new FullQualifiedName(SchemaProvider.nameSpace, "BFCESAllPrimRTCTAllPrim");
+
+  public static final FullQualifiedName nameBFCESBaseTwoKeyNavRTESBaseTwoKey =
+      new FullQualifiedName(SchemaProvider.nameSpace, "BFCESBaseTwoKeyNavRTESBaseTwoKey");
+
+  public static final FullQualifiedName nameBFCESKeyNavRTETKeyNav =
+      new FullQualifiedName(SchemaProvider.nameSpace, "BFCESKeyNavRTETKeyNav");
+
+  public static final FullQualifiedName nameBFCESKeyNavRTETKeyNavParam =
+      new FullQualifiedName(SchemaProvider.nameSpace, "BFCESKeyNavRTETKeyNavParam");
+
+  public static final FullQualifiedName nameBFCESTwoKeyNavRTCollCTTwoPrim =
+      new FullQualifiedName(SchemaProvider.nameSpace, "BFCESTwoKeyNavRTCollCTTwoPrim");
+
+  public static final FullQualifiedName nameBFCESTwoKeyNavRTCollString =
+      new FullQualifiedName(SchemaProvider.nameSpace, "BFCESTwoKeyNavRTCollString");
+
+  public static final FullQualifiedName nameBFCESTwoKeyNavRTCTTwoPrim =
+      new FullQualifiedName(SchemaProvider.nameSpace, "BFCESTwoKeyNavRTCTTwoPrim");
+
+  public static final FullQualifiedName nameBFCESTwoKeyNavRTESTwoKeyNav =
+      new FullQualifiedName(SchemaProvider.nameSpace, "BFCESTwoKeyNavRTESTwoKeyNav");
+
+  public static final FullQualifiedName nameBFCESTwoKeyNavRTString =
+      new FullQualifiedName(SchemaProvider.nameSpace, "BFCESTwoKeyNavRTString");
+
+  public static final FullQualifiedName nameBFCESTwoKeyNavRTStringParam =
+      new FullQualifiedName(SchemaProvider.nameSpace, "BFCESTwoKeyNavRTStringParam");
+
+  public static final FullQualifiedName nameBFCESTwoKeyNavRTTwoKeyNav =
+      new FullQualifiedName(SchemaProvider.nameSpace, "BFCESTwoKeyNavRTTwoKeyNav");
+
+  public static final FullQualifiedName nameBFCETBaseTwoKeyNavRTESBaseTwoKey =
+      new FullQualifiedName(SchemaProvider.nameSpace, "BFCETBaseTwoKeyNavRTESBaseTwoKey");
+
+  public static final FullQualifiedName nameBFCETBaseTwoKeyNavRTESTwoKeyNav =
+      new FullQualifiedName(SchemaProvider.nameSpace, "BFCETBaseTwoKeyNavRTESTwoKeyNav");
+
+  public static final FullQualifiedName nameBFCETBaseTwoKeyNavRTETTwoKeyNav =
+      new FullQualifiedName(SchemaProvider.nameSpace, "BFCETBaseTwoKeyNavRTETTwoKeyNav");
+
+  public static final FullQualifiedName nameBFCETKeyNavRTETKeyNav =
+      new FullQualifiedName(SchemaProvider.nameSpace, "BFCETKeyNavRTETKeyNav");
+
+  public static final FullQualifiedName nameBFCETTwoKeyNavRTCTTwoPrim =
+      new FullQualifiedName(SchemaProvider.nameSpace, "BFCETTwoKeyNavRTCTTwoPrim");
+
+  public static final FullQualifiedName nameBFCETTwoKeyNavRTESTwoKeyNav =
+      new FullQualifiedName(SchemaProvider.nameSpace, "BFCETTwoKeyNavRTESTwoKeyNav");
+
+  public static final FullQualifiedName nameBFCETTwoKeyNavRTETTwoKeyNav =
+      new FullQualifiedName(SchemaProvider.nameSpace, "BFCETTwoKeyNavRTETTwoKeyNav");
+
+  public static final FullQualifiedName nameBFCSINavRTESTwoKeyNav =
+      new FullQualifiedName(SchemaProvider.nameSpace, "BFCSINavRTESTwoKeyNav");
+
+  public static final FullQualifiedName nameBFCStringRTESTwoKeyNav =
+      new FullQualifiedName(SchemaProvider.nameSpace, "BFCStringRTESTwoKeyNav");
+
+  public static final FullQualifiedName nameBFESTwoKeyNavRTESTwoKeyNav =
+      new FullQualifiedName(SchemaProvider.nameSpace, "BFESTwoKeyNavRTESTwoKeyNav");
+
+  // TODO: warum BAET?
+  public static final FullQualifiedName nameBAETTwoKeyNavRTETTwoKeyNav =
+      new FullQualifiedName(SchemaProvider.nameSpace, "BAETTwoKeyNavRTETTwoKeyNav");
+
+  // Unbound Functions
+  public static final FullQualifiedName nameUFCRTCollCTTwoPrim =
+      new FullQualifiedName(SchemaProvider.nameSpace, "UFCRTCollCTTwoPrim");
+  public static final FullQualifiedName nameUFCRTCollCTTwoPrimParam =
+      new FullQualifiedName(SchemaProvider.nameSpace, "UFCRTCollCTTwoPrimParam");
+  public static final FullQualifiedName nameUFCRTCollString = new FullQualifiedName(SchemaProvider.nameSpace, "UFCRTCollString");
+  public static final FullQualifiedName nameUFCRTCollStringTwoParam =
+      new FullQualifiedName(SchemaProvider.nameSpace, "UFCRTCollStringTwoParam");
+  public static final FullQualifiedName nameUFCRTCTAllPrimTwoParam =
+      new FullQualifiedName(SchemaProvider.nameSpace, "UFCRTCTAllPrimTwoParam");
+  public static final FullQualifiedName nameUFCRTCTTwoPrim = new FullQualifiedName(SchemaProvider.nameSpace, "UFCRTCTTwoPrim");
+  public static final FullQualifiedName nameUFCRTCTTwoPrimParam =
+      new FullQualifiedName(SchemaProvider.nameSpace, "UFCRTCTTwoPrimParam");
+  public static final FullQualifiedName nameUFCRTESMixPrimCollCompTwoParam =
+      new FullQualifiedName(SchemaProvider.nameSpace, "UFCRTESMixPrimCollCompTwoParam");
+  public static final FullQualifiedName nameUFCRTESTwoKeyNavParam =
+      new FullQualifiedName(SchemaProvider.nameSpace, "UFCRTESTwoKeyNavParam");
+  public static final FullQualifiedName nameUFCRTETAllPrimTwoParam =
+      new FullQualifiedName(SchemaProvider.nameSpace, "UFCRTETAllPrimTwoParam");
+  public static final FullQualifiedName nameUFCRTETKeyNav = new FullQualifiedName(SchemaProvider.nameSpace, "UFCRTETKeyNav");
+  public static final FullQualifiedName nameUFCRTETMedia = new FullQualifiedName(SchemaProvider.nameSpace, "UFCRTETMedia");
+
+  public static final FullQualifiedName nameUFCRTETTwoKeyNavParam =
+      new FullQualifiedName(SchemaProvider.nameSpace, "UFCRTETTwoKeyNavParam");
+
+  public static final FullQualifiedName nameUFCRTETTwoKeyNavParamCTTwoPrim =
+      new FullQualifiedName(SchemaProvider.nameSpace, "UFCRTETTwoKeyNavParamCTTwoPrim");
+
+  public static final FullQualifiedName nameUFCRTString = new FullQualifiedName(SchemaProvider.nameSpace, "UFCRTString");
+
+  public static final FullQualifiedName nameUFCRTStringTwoParam =
+      new FullQualifiedName(SchemaProvider.nameSpace, "UFCRTStringTwoParam");
+
+  public static final FullQualifiedName nameUFNRTESMixPrimCollCompTwoParam =
+      new FullQualifiedName(SchemaProvider.nameSpace, "UFNRTESMixPrimCollCompTwoParam");
+  public static final FullQualifiedName nameUFNRTInt16 =
+      new FullQualifiedName(SchemaProvider.nameSpace, "UFNRTInt16");
+
+  public List<Function> getFunctions(final FullQualifiedName functionName) throws ODataException {
+
+    if (functionName.equals(nameUFNRTInt16)) {
+      return Arrays.asList(
+          new Function()
+              .setName("UFNRTInt16")
+              .setParameters(new ArrayList<Parameter>())
+              .setReturnType(
+                  new ReturnType().setType(PropertyProvider.nameString))
+          );
+
+    } else if (functionName.equals(nameUFCRTETKeyNav)) {
+      return Arrays.asList(
+          new Function()
+              .setName("UFCRTETKeyNav")
+              .setParameters(new ArrayList<Parameter>())
+              .setComposable(true)
+              .setReturnType(
+                  new ReturnType().setType(EntityTypeProvider.nameETKeyNav))
+          );
+
+    } else if (functionName.equals(nameUFCRTETTwoKeyNavParam)) {
+      return Arrays.asList(
+          new Function()
+              .setName("UFCRTETTwoKeyNavParam")
+              .setParameters(Arrays.asList(
+                  new Parameter().setName("ParameterInt16").setType(PropertyProvider.nameInt16)))
+              .setComposable(true)
+              .setReturnType(
+                  new ReturnType().setType(EntityTypeProvider.nameETTwoKeyNav)
+              )
+          );
+
+    } else if (functionName.equals(nameUFCRTETTwoKeyNavParamCTTwoPrim)) {
+      return Arrays.asList(
+          new Function()
+              .setName("UFCRTETTwoKeyNavParamCTTwoPrim")
+              .setParameters(Arrays.asList(
+                  new Parameter().setName("ParameterCTTwoPrim").setType(ComplexTypeProvider.nameCTTwoPrim)))
+              .setComposable(true)
+              .setReturnType(
+                  new ReturnType().setType(EntityTypeProvider.nameETTwoKeyNav)
+              )
+          );
+
+    } else if (functionName.equals(nameUFCRTStringTwoParam)) {
+      return Arrays.asList(
+          new Function()
+              .setName("UFCRTStringTwoParam")
+              .setParameters(Arrays.asList(
+                  new Parameter()
+                      .setName("ParameterInt16")
+                      .setType(PropertyProvider.nameInt16)))
+              .setComposable(true)
+              .setReturnType(
+                  new ReturnType().setType(PropertyProvider.nameString)),
+          new Function()
+              .setName("UFCRTStringTwoParam")
+              .setParameters(Arrays.asList(
+                  new Parameter()
+                      .setName("ParameterString")
+                      .setType(PropertyProvider.nameString),
+                  new Parameter()
+                      .setName("ParameterInt16")
+                      .setType(PropertyProvider.nameInt16)))
+              .setComposable(true)
+              .setReturnType(
+                  new ReturnType().setType(PropertyProvider.nameString))
+
+          );
+
+    } else if (functionName.equals(nameUFCRTESTwoKeyNavParam)) {
+      return Arrays.asList(
+          new Function()
+              .setName("UFCRTESTwoKeyNavParam")
+              .setParameters(Arrays.asList(
+                  new Parameter()
+                      .setName("ParameterInt16")
+                      .setType(PropertyProvider.nameInt16)))
+              .setComposable(true)
+              .setReturnType(
+                  new ReturnType().setType(EntityTypeProvider.nameETTwoKeyNav).setCollection(true))
+          );
+
+    } else if (functionName.equals(nameUFCRTString)) {
+      return Arrays.asList(
+          new Function()
+              .setName("UFCRTString")
+
+              .setComposable(true)
+              .setParameters(new ArrayList<Parameter>())
+              .setComposable(true)
+              .setReturnType(
+                  new ReturnType().setType(PropertyProvider.nameString)
+              )
+          );
+
+    } else if (functionName.equals(nameUFCRTCollStringTwoParam)) {
+      return Arrays.asList(
+          new Function()
+              .setName("UFCRTCollStringTwoParam")
+              .setParameters(Arrays.asList(
+                  new Parameter().setName("ParameterString").setType(PropertyProvider.nameString),
+                  new Parameter().setName("ParameterInt16").setType(PropertyProvider.nameInt16)))
+              .setComposable(true)
+              .setReturnType(
+                  new ReturnType().setType(PropertyProvider.nameString).setCollection(true))
+          );
+
+    } else if (functionName.equals(nameUFCRTCollString)) {
+      return Arrays.asList(
+          new Function()
+              .setName("UFCRTCollString")
+              .setParameters(new ArrayList<Parameter>())
+              .setComposable(true)
+              .setReturnType(
+                  new ReturnType().setType(PropertyProvider.nameString).setCollection(true))
+          );
+
+    } else if (functionName.equals(nameUFCRTCTAllPrimTwoParam)) {
+      return Arrays.asList(
+          new Function()
+              .setName("UFCRTCTAllPrimTwoParam")
+              .setParameters(Arrays.asList(
+                  new Parameter().setName("ParameterString").setType(PropertyProvider.nameString),
+                  new Parameter().setName("ParameterInt16").setType(PropertyProvider.nameInt16)))
+              .setComposable(true)
+              .setReturnType(
+                  new ReturnType().setType(ComplexTypeProvider.nameCTAllPrim))
+          );
+
+    } else if (functionName.equals(nameUFCRTCTTwoPrimParam)) {
+      return Arrays.asList(
+          new Function()
+              .setName("UFCRTCTTwoPrimParam")
+              .setParameters(Arrays.asList(
+                  new Parameter().setName("ParameterString").setType(PropertyProvider.nameString),
+                  new Parameter().setName("ParameterInt16").setType(PropertyProvider.nameInt16)))
+              .setComposable(true)
+              .setReturnType(
+                  new ReturnType().setType(ComplexTypeProvider.nameCTTwoPrim))
+          );
+    } else if (functionName.equals(nameUFCRTCollCTTwoPrimParam)) {
+      return Arrays.asList(
+          new Function()
+              .setName("UFCRTCollCTTwoPrimParam")
+              .setParameters(Arrays.asList(
+                  new Parameter().setName("ParameterString").setType(PropertyProvider.nameString),
+                  new Parameter().setName("ParameterInt16").setType(PropertyProvider.nameInt16)))
+              .setComposable(true)
+              .setReturnType(
+                  new ReturnType().setType(ComplexTypeProvider.nameCTTwoPrim).setCollection(true))
+          );
+
+    } else if (functionName.equals(nameUFCRTCTTwoPrim)) {
+      return Arrays.asList(
+          new Function()
+              .setName("UFCRTCTTwoPrim")
+              .setParameters(new ArrayList<Parameter>())
+              .setComposable(true)
+              .setReturnType(
+                  new ReturnType().setType(ComplexTypeProvider.nameCTTwoPrim))
+          );
+
+    } else if (functionName.equals(nameUFCRTCollCTTwoPrim)) {
+      return Arrays.asList(
+          new Function()
+              .setName("UFCRTCTTwoPrim")
+
+              .setParameters(new ArrayList<Parameter>())
+              .setReturnType(
+                  new ReturnType().setType(ComplexTypeProvider.nameCTTwoPrim).setCollection(true))
+          );
+
+    } else if (functionName.equals(nameUFCRTETMedia)) {
+      return Arrays.asList(
+          new Function()
+              .setName("UFCRTETMedia")
+              .setParameters(new ArrayList<Parameter>())
+              .setReturnType(
+                  new ReturnType().setType(EntityTypeProvider.nameETMedia))
+          );
+
+    } else if (functionName.equals(nameUFCRTString)) {
+      return Arrays.asList(
+          new Function()
+              .setName("UFCRTString")
+              .setParameters(new ArrayList<Parameter>())
+              .setReturnType(new ReturnType()
+                  .setType(PropertyProvider.nameString)
+              )
+          );
+
+    } else if (functionName.equals(nameUFCRTCollCTTwoPrim)) {
+      return Arrays.asList(
+          new Function()
+              .setName("UFCRTCollCTTwoPrim")
+              .setComposable(true)
+              .setParameters(new ArrayList<Parameter>())
+              .setReturnType(
+                  new ReturnType().setType(ComplexTypeProvider.nameCTTwoPrim).setCollection(true))
+          );
+
+    } else if (functionName.equals(nameUFNRTESMixPrimCollCompTwoParam)) {
+      return Arrays.asList(
+          new Function()
+              .setName("UFNRTESMixPrimCollCompTwoParam")
+              .setParameters(Arrays.asList(
+                  new Parameter().setName("ParameterString").setType(PropertyProvider.nameString),
+                  new Parameter().setName("ParameterInt16").setType(PropertyProvider.nameInt16)))
+              .setComposable(false)
+              .setReturnType(
+                  new ReturnType().setType(EntityTypeProvider.nameETMixPrimCollComp).setCollection(true))
+          );
+
+    } else if (functionName.equals(nameUFCRTETAllPrimTwoParam)) {
+      return Arrays.asList(
+          new Function()
+              .setName("UFCRTETAllPrimTwoParam")
+              .setParameters(Arrays.asList(
+                  new Parameter().setName("ParameterString").setType(PropertyProvider.nameString),
+                  new Parameter().setName("ParameterInt16").setType(PropertyProvider.nameInt16)))
+              .setComposable(true)
+              .setReturnType(
+                  new ReturnType().setType(EntityTypeProvider.nameETAllPrim))
+          );
+
+    } else if (functionName.equals(nameUFCRTESMixPrimCollCompTwoParam)) {
+      return Arrays.asList(
+          new Function()
+              .setName("UFCRTESMixPrimCollCompTwoParam")
+              .setParameters(Arrays.asList(
+                  new Parameter().setName("ParameterString").setType(PropertyProvider.nameString),
+                  new Parameter().setName("ParameterInt16").setType(PropertyProvider.nameInt16)
+                  ))
+              .setComposable(true)
+              .setReturnType(
+                  new ReturnType().setType(EntityTypeProvider.nameETMixPrimCollComp).setCollection(true))
+          );
+
+    } else if (functionName.equals(nameBFCESTwoKeyNavRTESTwoKeyNav)) {
+      return Arrays
+          .asList(
+              new Function()
+                  .setName("BFCESTwoKeyNavRTESTwoKeyNav")
+                  .setBound(true)
+                  .setParameters(
+                      Arrays.asList(
+                          new Parameter().setName("BindingParam").setType(EntityTypeProvider.nameETTwoKeyNav)
+                              .setCollection(true)))
+                  .setComposable(true)
+                  .setReturnType(
+                      new ReturnType().setType(EntityTypeProvider.nameETTwoKeyNav).setCollection(true)),
+
+              new Function()
+                  .setName("BFCESTwoKeyNavRTESTwoKeyNav")
+                  .setBound(true)
+                  .setParameters(
+                      Arrays.asList(
+                          new Parameter().setName("BindingParam").setType(EntityTypeProvider.nameETTwoKeyNav)
+                              .setCollection(true),
+                          new Parameter().setName("ParameterString").setType(PropertyProvider.nameString)
+                              .setCollection(false)))
+                  .setComposable(true)
+                  .setReturnType(
+                      new ReturnType().setType(EntityTypeProvider.nameETTwoKeyNav).setCollection(true)),
+              new Function()
+                  .setName("BFCESTwoKeyNavRTESTwoKeyNav")
+                  .setBound(true)
+                  .setParameters(
+                      Arrays.asList(
+                          new Parameter().setName("BindingParam").setType(EntityTypeProvider.nameETKeyNav)
+                              .setCollection(true)))
+                  .setComposable(true)
+                  .setReturnType(
+                      new ReturnType().setType(EntityTypeProvider.nameETTwoKeyNav).setCollection(true)),
+              new Function()
+                  .setName("BFCESTwoKeyNavRTESTwoKeyNav")
+                  .setBound(true)
+                  .setParameters(
+                      Arrays.asList(new Parameter().setName("BindingParam").setType(EntityTypeProvider.nameETKeyNav)
+                          .setCollection(true),
+                          new Parameter().setName("ParameterString").setType(PropertyProvider.nameString)
+                              .setCollection(false)))
+                  .setComposable(true)
+                  .setReturnType(
+                      new ReturnType().setType(EntityTypeProvider.nameETTwoKeyNav).setCollection(true))
+          );
+
+    } else if (functionName.equals(nameBFCStringRTESTwoKeyNav)) {
+      return Arrays.asList(
+          new Function().setName("BFCStringRTESTwoKeyNav")
+              .setBound(true)
+              .setParameters(Arrays.asList(
+                  new Parameter().setName("BindingParam").setType(PropertyProvider.nameString)))
+              .setComposable(true)
+              .setReturnType(
+                  new ReturnType().setType(EntityTypeProvider.nameETTwoKeyNav).setCollection(true))
+          );
+
+    } else if (functionName.equals(nameBFCETBaseTwoKeyNavRTETTwoKeyNav)) {
+      return Arrays.asList(
+          new Function()
+              .setName("BFCETBaseTwoKeyNavRTETTwoKeyNav")
+              .setBound(true)
+              .setParameters(Arrays.asList(
+                  new Parameter().setName("BindingParam").setType(EntityTypeProvider.nameETBaseTwoKeyNav)))
+              .setComposable(true)
+              .setReturnType(
+                  new ReturnType().setType(EntityTypeProvider.nameETTwoKeyNav)
+              )
+          );
+
+    } else if (functionName.equals(nameBFCESBaseTwoKeyNavRTESBaseTwoKey)) {
+      return Arrays.asList(
+          new Function()
+              .setName("BFCESBaseTwoKeyNavRTESBaseTwoKey")
+              .setBound(true)
+              .setParameters(Arrays.asList(
+                  new Parameter().setName("BindingParam").setType(EntityTypeProvider.nameETBaseTwoKeyNav)
+                      .setCollection(true)))
+              .setComposable(true)
+              .setReturnType(
+                  new ReturnType().setType(EntityTypeProvider.nameETBaseTwoKeyNav).setCollection(true))
+          );
+
+    } else if (functionName.equals(nameBFCESAllPrimRTCTAllPrim)) {
+      return Arrays.asList(
+          new Function()
+              .setName("BFCESAllPrimRTCTAllPrim")
+              .setBound(true)
+              .setParameters(
+                  Arrays.asList(
+                      new Parameter().setName("BindingParam").setType(EntityTypeProvider.nameETAllPrim).setCollection(
+                          true)))
+              .setComposable(true)
+              .setReturnType(
+                  new ReturnType().setType(ComplexTypeProvider.nameCTAllPrim))
+          );
+
+    } else if (functionName.equals(nameBFCESTwoKeyNavRTCTTwoPrim)) {
+      return Arrays.asList(
+          new Function()
+              .setName("BFCESTwoKeyNavRTCTTwoPrim")
+              .setBound(true)
+              .setParameters(
+                  Arrays.asList(
+                      new Parameter().setName("BindingParam").setType(EntityTypeProvider.nameETTwoKeyNav)
+                          .setCollection(true)))
+              .setComposable(true)
+              .setReturnType(
+                  new ReturnType().setType(ComplexTypeProvider.nameCTTwoPrim))
+          );
+
+    } else if (functionName.equals(nameBFCESTwoKeyNavRTCollCTTwoPrim)) {
+      return Arrays.asList(
+          new Function()
+              .setName("BFCESTwoKeyNavRTCollCTTwoPrim")
+              .setBound(true)
+              .setParameters(
+                  Arrays.asList(
+                      new Parameter().setName("BindingParam").setType(EntityTypeProvider.nameETTwoKeyNav)
+                          .setCollection(true)))
+              .setComposable(true)
+              .setReturnType(
+                  new ReturnType().setType(ComplexTypeProvider.nameCTTwoPrim).setCollection(true))
+          );
+
+    } else if (functionName.equals(nameBFCESTwoKeyNavRTString)) {
+      return Arrays.asList(
+          new Function()
+              .setName("BFCESTwoKeyNavRTString")
+              .setBound(true)
+              .setParameters(
+                  Arrays.asList(
+                      new Parameter().setName("BindingParam").setType(EntityTypeProvider.nameETTwoKeyNav)
+                          .setCollection(true)))
+              .setComposable(true)
+              .setReturnType(
+                  new ReturnType().setType(PropertyProvider.nameString))
+          );
+
+    } else if (functionName.equals(nameBFCESTwoKeyNavRTCollString)) {
+      return Arrays.asList(
+          new Function()
+              .setName("BFCESTwoKeyNavRTCollString")
+              .setBound(true)
+              .setParameters(
+                  Arrays.asList(
+                      new Parameter().setName("BindingParam").setType(EntityTypeProvider.nameETTwoKeyNav)
+                          .setCollection(true)))
+              .setComposable(true)
+              .setReturnType(
+                  new ReturnType().setType(PropertyProvider.nameString).setCollection(true))
+          );
+
+    } else if (functionName.equals(nameBFCETTwoKeyNavRTESTwoKeyNav)) {
+      return Arrays.asList(
+          new Function()
+              .setName("BFCETTwoKeyNavRTESTwoKeyNav")
+              .setBound(true)
+              .setParameters(Arrays.asList(
+                  new Parameter().setName("BindingParam").setType(EntityTypeProvider.nameETTwoKeyNav)))
+              .setComposable(true)
+              .setReturnType(
+                  new ReturnType().setType(EntityTypeProvider.nameETTwoKeyNav).setCollection(true))
+          );
+
+    } else if (functionName.equals(nameBFCETBaseTwoKeyNavRTESTwoKeyNav)) {
+      return Arrays.asList(
+          new Function()
+              .setName("BFCETBaseTwoKeyNavRTESTwoKeyNav")
+              .setBound(true)
+              .setParameters(Arrays.asList(
+                  new Parameter().setName("BindingParam").setType(EntityTypeProvider.nameETBaseTwoKeyNav)))
+              .setComposable(true)
+              .setReturnType(
+                  new ReturnType().setType(EntityTypeProvider.nameETTwoKeyNav).setCollection(true))
+          );
+
+    } else if (functionName.equals(nameBFCSINavRTESTwoKeyNav)) {
+      return Arrays.asList(
+          new Function()
+              .setName("BFCSINavRTESTwoKeyNav")
+              .setBound(true)
+              .setParameters(Arrays.asList(
+                  new Parameter().setName("BindingParam").setType(EntityTypeProvider.nameETTwoKeyNav)))
+              .setComposable(true)
+              .setReturnType(
+                  new ReturnType().setType(EntityTypeProvider.nameETTwoKeyNav).setCollection(true))
+          );
+
+    } else if (functionName.equals(nameBFCETBaseTwoKeyNavRTESBaseTwoKey)) {
+      return Arrays.asList(
+          new Function()
+              .setName("BFCETBaseTwoKeyNavRTESBaseTwoKey")
+              .setBound(true)
+              .setParameters(Arrays.asList(
+                  new Parameter().setName("BindingParam").setType(EntityTypeProvider.nameETBaseTwoKeyNav)))
+              .setComposable(true)
+              .setReturnType(
+                  new ReturnType().setType(EntityTypeProvider.nameETBaseTwoKeyNav).setCollection(true))
+          );
+
+    } else if (functionName.equals(nameBFCCollStringRTESTwoKeyNav)) {
+      return Arrays.asList(
+          new Function()
+              .setName("BFCCollStringRTESTwoKeyNav")
+              .setBound(true)
+              .setParameters(Arrays.asList(
+                  new Parameter().setName("BindingParam").setType(PropertyProvider.nameString).setCollection(true)))
+              .setComposable(true)
+              .setReturnType(new ReturnType().setType(EntityTypeProvider.nameETTwoKeyNav).setCollection(true))
+          );
+
+    } else if (functionName.equals(nameBFCCTPrimCompRTESTwoKeyNav)) {
+      return Arrays.asList(
+          new Function()
+              .setName("BFCCTPrimCompRTESTwoKeyNav")
+              .setBound(true)
+              .setParameters(Arrays.asList(
+                  new Parameter().setName("BindingParam").setType(ComplexTypeProvider.nameCTPrimComp)))
+              .setComposable(true)
+              .setReturnType(
+                  new ReturnType().setType(EntityTypeProvider.nameETTwoKeyNav).setCollection(true))
+          );
+
+    } else if (functionName.equals(nameBFCCTPrimCompRTESBaseTwoKeyNav)) {
+      return Arrays.asList(
+          new Function()
+              .setName("BFCCTPrimCompRTESBaseTwoKeyNav")
+              .setBound(true)
+              .setParameters(Arrays.asList(
+                  new Parameter().setName("BindingParam").setType(ComplexTypeProvider.nameCTPrimComp)))
+              .setComposable(true)
+              .setReturnType(
+                  new ReturnType().setType(EntityTypeProvider.nameETBaseTwoKeyNav).setCollection(true))
+          );
+
+    } else if (functionName.equals(nameBFCCollCTPrimCompRTESAllPrim)) {
+      return Arrays.asList(
+          new Function()
+              .setName("BFCCollCTPrimCompRTESAllPrim")
+              .setBound(true)
+              .setParameters(
+                  Arrays.asList(
+                      new Parameter().setName("BindingParam").setType(ComplexTypeProvider.nameCTPrimComp)
+                          .setCollection(true)))
+              .setComposable(true)
+              .setReturnType(
+                  new ReturnType().setType(EntityTypeProvider.nameETAllPrim).setCollection(true))
+          );
+
+    } else if (functionName.equals(nameBFCESTwoKeyNavRTTwoKeyNav)) {
+      return Arrays.asList(
+          new Function()
+              .setName("BFCESTwoKeyNavRTTwoKeyNav")
+              .setBound(true)
+              .setParameters(
+                  Arrays.asList(
+                      new Parameter().setName("BindingParam").setType(EntityTypeProvider.nameETTwoKeyNav)
+                          .setCollection(true)))
+              .setComposable(true)
+              .setReturnType(
+                  new ReturnType().setType(EntityTypeProvider.nameETTwoKeyNav))
+          );
+
+    } else if (functionName.equals(nameBFCESKeyNavRTETKeyNav)) {
+      return Arrays
+          .asList(
+          new Function()
+              .setName("BFCESKeyNavRTETKeyNav")
+              .setBound(true)
+              .setParameters(Arrays.asList(
+                  new Parameter().setName("BindingParam").setType(EntityTypeProvider.nameETKeyNav).setCollection(true)))
+              .setComposable(true)
+              .setReturnType(
+                  new ReturnType().setType(EntityTypeProvider.nameETKeyNav))
+          );
+
+    } else if (functionName.equals(nameBFCETKeyNavRTETKeyNav)) {
+      return Arrays.asList(
+          new Function()
+              .setName("BFCETKeyNavRTETKeyNav")
+              .setBound(true)
+              .setParameters(Arrays.asList(
+                  new Parameter().setName("BindingParam").setType(EntityTypeProvider.nameETKeyNav)))
+              .setComposable(true)
+              .setReturnType(
+                  new ReturnType().setType(EntityTypeProvider.nameETKeyNav))
+          );
+    } else if (functionName.equals(nameBFESTwoKeyNavRTESTwoKeyNav)) {
+      return Arrays.asList(
+          new Function()
+              .setName("BFESTwoKeyNavRTESTwoKeyNav")
+              .setBound(true)
+              .setParameters(
+                  Arrays.asList(
+                      new Parameter().setName("BindingParam").setType(EntityTypeProvider.nameETTwoKeyNav)
+                          .setCollection(true)))
+              .setComposable(true)
+              .setReturnType(new ReturnType().setType(EntityTypeProvider.nameETTwoKeyNav).setCollection(true))
+
+          );
+
+    } else if (functionName.equals(nameBFCETTwoKeyNavRTETTwoKeyNav)) {
+      return Arrays.asList(
+          new Function()
+              .setName("BFCETTwoKeyNavRTETTwoKeyNav")
+              .setBound(true)
+              .setParameters(Arrays.asList(
+                  new Parameter().setName("BindingParam").setType(EntityTypeProvider.nameETTwoKeyNav)))
+              .setComposable(true)
+              .setReturnType(
+                  new ReturnType().setType(EntityTypeProvider.nameETTwoKeyNav))
+          );
+
+    } else if (functionName.equals(nameBFCETTwoKeyNavRTCTTwoPrim)) {
+      return Arrays.asList(
+          new Function()
+              .setName("BFCETTwoKeyNavRTCTTwoPrim")
+              .setBound(true)
+              .setParameters(Arrays.asList(
+                  new Parameter().setName("BindingParam").setType(EntityTypeProvider.nameETTwoKeyNav)))
+              .setComposable(true)
+              .setReturnType(
+                  new ReturnType().setType(ComplexTypeProvider.nameCTTwoPrim))
+          );
+    } else if (functionName.equals(nameBFCESTwoKeyNavRTStringParam)) {
+      return Arrays.asList(
+          new Function()
+              .setName("BFCESTwoKeyNavRTStringParam")
+              .setBound(true)
+              .setParameters(
+                  Arrays.asList(
+                      new Parameter().setName("BindingParam").setType(EntityTypeProvider.nameETTwoKeyNav)
+                          .setCollection(true),
+                      new Parameter().setName("ParameterComplex").setType(ComplexTypeProvider.nameCTTwoPrim)))
+              .setComposable(true)
+              .setReturnType(
+                  new ReturnType().setType(PropertyProvider.nameString))
+          );
+
+    } else if (functionName.equals(nameBFCESKeyNavRTETKeyNavParam)) {
+      return Arrays.asList(
+          new Function()
+              .setName("BFCESKeyNavRTETKeyNavParam")
+              .setBound(true)
+              .setParameters(Arrays.asList(
+                  new Parameter().setName("BindingParam").setType(EntityTypeProvider.nameETKeyNav).setCollection(true),
+                  new Parameter().setName("ParameterString").setType(PropertyProvider.nameString)))
+              .setComposable(true)
+              .setReturnType(
+                  new ReturnType().setType(EntityTypeProvider.nameETKeyNav))
+          );
+    } else if (functionName.equals(nameBFCCTPrimCompRTETTwoKeyNavParam)) {
+      return Arrays.asList(
+          new Function()
+              .setName("BFCCTPrimCompRTETTwoKeyNavParam")
+              .setBound(true)
+              .setParameters(Arrays.asList(
+                  new Parameter().setName("BindingParam").setType(ComplexTypeProvider.nameCTPrimComp),
+                  new Parameter().setName("ParameterString").setType(PropertyProvider.nameString)))
+              .setComposable(true)
+              .setReturnType(new ReturnType()
+                  .setType(EntityTypeProvider.nameETTwoKeyNav)
+              )
+          );
+    } else if (functionName.equals(nameBAETTwoKeyNavRTETTwoKeyNav)) {
+      return Arrays.asList(
+          new Function()
+              .setName("BAETTwoKeyNavRTETTwoKeyNav")
+              .setBound(true)
+              .setParameters(Arrays.asList(
+                  new Parameter().setName("BindingParam").setType(PropertyProvider.nameInt16).setCollection(true),
+                  new Parameter().setName("ParameterString").setType(PropertyProvider.nameString).setNullable(true)))
+              .setComposable(true)
+              .setReturnType(
+                  new ReturnType().setType(ComplexTypeProvider.nameCTTwoPrim).setCollection(true))
+          );
+    } else if (functionName.equals(nameBFCCTPrimCompRTESTwoKeyNavParam)) {
+      return Arrays.asList(
+          new Function()
+              .setName("BFCCTPrimCompRTESTwoKeyNavParam")
+              .setBound(true)
+              .setParameters(Arrays.asList(
+                  new Parameter().setName("BindingParam").setType(ComplexTypeProvider.nameCTPrimComp),
+                  new Parameter().setName("ParameterString").setType(PropertyProvider.nameString)))
+              .setComposable(true)
+              .setReturnType(
+                  new ReturnType().setType(EntityTypeProvider.nameETTwoKeyNav).setCollection(true))
+          );
+    }
+
+    return null;
+  }
+
+}

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/59ef14f4/lib/server-core/src/test/java/org/apache/olingo/server/core/testutil/techprovider/PropertyProvider.java
----------------------------------------------------------------------
diff --git a/lib/server-core/src/test/java/org/apache/olingo/server/core/testutil/techprovider/PropertyProvider.java b/lib/server-core/src/test/java/org/apache/olingo/server/core/testutil/techprovider/PropertyProvider.java
new file mode 100644
index 0000000..a237ebd
--- /dev/null
+++ b/lib/server-core/src/test/java/org/apache/olingo/server/core/testutil/techprovider/PropertyProvider.java
@@ -0,0 +1,308 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.olingo.server.core.testutil.techprovider;
+
+import org.apache.olingo.commons.api.edm.FullQualifiedName;
+import org.apache.olingo.commons.core.edm.primitivetype.EdmPrimitiveTypeKind;
+import org.apache.olingo.server.api.edm.provider.NavigationProperty;
+import org.apache.olingo.server.api.edm.provider.Property;
+
+public class PropertyProvider {
+
+  // Primitive Type Names
+  public static final FullQualifiedName nameBinary = EdmPrimitiveTypeKind.Binary.getFullQualifiedName();
+  public static final FullQualifiedName nameBoolean = EdmPrimitiveTypeKind.Boolean.getFullQualifiedName();
+  public static final FullQualifiedName nameByte = EdmPrimitiveTypeKind.Byte.getFullQualifiedName();
+
+  public static final FullQualifiedName nameDate = EdmPrimitiveTypeKind.Date.getFullQualifiedName();
+  public static final FullQualifiedName nameDateTimeOffset =
+      EdmPrimitiveTypeKind.DateTimeOffset.getFullQualifiedName();
+
+  public static final FullQualifiedName nameDecimal = EdmPrimitiveTypeKind.Decimal.getFullQualifiedName();
+  public static final FullQualifiedName nameDouble = EdmPrimitiveTypeKind.Double.getFullQualifiedName();
+  public static final FullQualifiedName nameDuration = EdmPrimitiveTypeKind.Duration.getFullQualifiedName();
+
+  public static final FullQualifiedName nameGuid = EdmPrimitiveTypeKind.Guid.getFullQualifiedName();
+  public static final FullQualifiedName nameInt16 = EdmPrimitiveTypeKind.Int16.getFullQualifiedName();
+  public static final FullQualifiedName nameInt32 = EdmPrimitiveTypeKind.Int32.getFullQualifiedName();
+  public static final FullQualifiedName nameInt64 = EdmPrimitiveTypeKind.Int64.getFullQualifiedName();
+
+  public static final FullQualifiedName nameSByte = EdmPrimitiveTypeKind.SByte.getFullQualifiedName();
+  public static final FullQualifiedName nameSingle = EdmPrimitiveTypeKind.Single.getFullQualifiedName();
+
+  public static final FullQualifiedName nameString = EdmPrimitiveTypeKind.String.getFullQualifiedName();
+  public static final FullQualifiedName nameTimeOfDay = EdmPrimitiveTypeKind.TimeOfDay.getFullQualifiedName();
+
+  // Primitive Properties --------------------------------------------------------------------------------------------
+  public static final Property collPropertyBinary = new Property()
+      .setName("CollPropertyBinary")
+      .setType(nameBinary)
+      .setCollection(true);
+
+  public static final Property collPropertyBoolean = new Property()
+      .setName("CollPropertyBoolean")
+      .setType(nameBoolean)
+      .setCollection(true);
+
+  public static final Property collPropertyByte = new Property()
+      .setName("CollPropertyByte")
+      .setType(nameByte)
+      .setCollection(true);
+
+  public static final Property collPropertyDate = new Property()
+      .setName("CollPropertyDate")
+      .setType(nameDate)
+      .setCollection(true);
+
+  public static final Property collPropertyDateTimeOffset = new Property()
+      .setName("CollPropertyDateTimeOffset")
+      .setType(nameDateTimeOffset)
+      .setCollection(true);
+
+  public static final Property collPropertyDecimal = new Property()
+      .setName("CollPropertyDecimal")
+      .setType(nameDecimal)
+      .setCollection(true);
+
+  public static final Property collPropertyDouble = new Property()
+      .setName("CollPropertyDouble")
+      .setType(nameDouble)
+      .setCollection(true);
+
+  public static final Property collPropertyDuration = new Property()
+      .setName("CollPropertyDuration")
+      .setType(nameDuration)
+      .setCollection(true);
+  public static final Property collPropertyGuid = new Property()
+      .setName("CollPropertyGuid")
+      .setType(nameGuid)
+      .setCollection(true);
+  public static final Property collPropertyInt16 = new Property()
+      .setName("CollPropertyInt16")
+      .setType(nameInt16)
+      .setCollection(true);
+  public static final Property collPropertyInt32 = new Property()
+      .setName("CollPropertyInt32")
+      .setType(nameInt32)
+      .setCollection(true);
+  public static final Property collPropertyInt64 = new Property()
+      .setName("CollPropertyInt64")
+      .setType(nameInt64)
+      .setCollection(true);
+
+  public static final Property collPropertySByte = new Property()
+      .setName("CollPropertySByte")
+      .setType(nameSByte)
+      .setCollection(true);
+
+  public static final Property collPropertySingle = new Property()
+      .setName("CollPropertySingle")
+      .setType(nameSingle)
+      .setCollection(true);
+
+  public static final Property collPropertyString = new Property()
+      .setName("CollPropertyString")
+      .setType(nameString)
+      .setCollection(true);
+
+  public static final Property collPropertyTimeOfDay = new Property()
+      .setName("CollPropertyTimeOfDay")
+      .setType(nameTimeOfDay)
+      .setCollection(true);
+
+  public static final Property propertyBinary = new Property()
+      .setName("PropertyBinary")
+      .setType(nameBinary);
+  public static final Property propertyBoolean = new Property()
+      .setName("PropertyBoolean")
+      .setType(nameBoolean);
+  public static final Property propertyByte = new Property()
+      .setName("PropertyByte")
+      .setType(nameByte);
+
+  public static final Property propertyDate = new Property()
+      .setName("PropertyDate")
+      .setType(nameDate);
+
+  public static final Property propertyDateTimeOffset = new Property()
+      .setName("PropertyDateTimeOffset")
+      .setType(nameDateTimeOffset);
+
+  public static final Property propertyDecimal = new Property()
+      .setName("PropertyDecimal")
+      .setType(nameDecimal);
+
+  public static final Property propertyDouble = new Property()
+      .setName("PropertyDouble")
+      .setType(nameDouble);
+
+  public static final Property propertyDuration = new Property()
+      .setName("PropertyDuration")
+      .setType(nameDuration);
+
+  public static final Property propertyGuid = new Property()
+      .setName("PropertyGuid")
+      .setType(nameGuid);
+
+  public static final Property propertyInt16 = new Property()
+      .setName("PropertyInt16")
+      .setType(nameInt16);
+
+  public static final Property propertyInt16_NotNullable = new Property()
+      .setName("PropertyInt16")
+      .setType(nameInt16)
+      .setNullable(false);
+  public static final Property propertyInt32 = new Property()
+      .setName("PropertyInt32")
+      .setType(nameInt32);
+
+  public static final Property propertyInt64 = new Property()
+      .setName("PropertyInt64")
+      .setType(nameInt64);
+
+  public static final Property propertySByte = new Property()
+      .setName("PropertySByte")
+      .setType(nameSByte);
+
+  public static final Property propertySingle = new Property()
+      .setName("PropertySingle")
+      .setType(nameSingle);
+
+  public static final Property propertyString = new Property()
+      .setName("PropertyString")
+      .setType(nameString);
+
+  public static final Property propertyString_NotNullable = new Property()
+      .setName("PropertyString")
+      .setType(nameString);
+
+  public static final Property propertyTimeOfDay = new Property().setName("PropertyTimeOfDay")
+      .setType(nameTimeOfDay);
+
+  /*
+   * TODO add propertyStream
+   * Property propertyStream = new Property()
+   * .setName("PropertyStream")
+   * .setType(EdmStream.getFullQualifiedName());
+   */
+
+  // Complex Properties ----------------------------------------------------------------------------------------------
+  public static final Property collPropertyComplex_CTPrimComp = new Property()
+      .setName("CollPropertyComplex")
+      .setType(ComplexTypeProvider.nameCTPrimComp)
+      .setCollection(true);
+
+  public static final Property collPropertyComplex_CTTwoPrim = new Property()
+      .setName("CollPropertyComplex")
+      .setType(ComplexTypeProvider.nameCTTwoPrim)
+      .setCollection(true);
+
+  public static final Property propertyComplex_CTAllPrim = new Property()
+      .setName("PropertyComplex")
+      .setType(ComplexTypeProvider.nameCTAllPrim);
+
+  public static final Property propertyComplex_CTCollAllPrim = new Property()
+      .setName("PropertyComplex")
+      .setType(ComplexTypeProvider.nameCTCollAllPrim);
+
+  public static final Property propertyComplex_CTCompCollComp = new Property()
+      .setName("PropertyComplex")
+      .setType(ComplexTypeProvider.nameCTCompCollComp);
+
+  public static final Property propertyComplex_CTCompComp = new Property()
+      .setName("PropertyComplex")
+      .setType(ComplexTypeProvider.nameCTCompComp);
+
+  public static final Property propertyComplex_CTNavFiveProp = new Property()
+      .setName("PropertyComplex")
+      .setType(ComplexTypeProvider.nameCTNavFiveProp);
+
+  public static final Property propertyComplex_CTPrimComp_NotNullable = new Property()
+      .setName("PropertyComplex")
+      .setType(ComplexTypeProvider.nameCTPrimComp);
+
+  public static final Property propertyComplex_CTTwoPrim = new Property()
+      .setName("PropertyComplex")
+      .setType(ComplexTypeProvider.nameCTTwoPrim);
+
+  public static final Property propertyComplexAllPrim_CTAllPrim = new Property()
+      .setName("PropertyComplexAllPrim")
+      .setType(ComplexTypeProvider.nameCTAllPrim);
+
+  public static final Property propertyComplexComplex_CTCompComp = new Property()
+      .setName("PropertyComplexComplex")
+      .setType(ComplexTypeProvider.nameCTCompComp);
+
+  public static final Property propertyComplexEnum_CTPrimEnum_NotNullable = new Property()
+      .setName("PropertyComplexEnum")
+      .setType(ComplexTypeProvider.nameCTPrimEnum);
+
+  public static final Property propertyComplexTwoPrim_CTTwoPrim = new Property()
+      .setName("PropertyComplexTwoPrim")
+      .setType(ComplexTypeProvider.nameCTTwoPrim);
+
+  public static final Property propertyMixedPrimCollComp_CTMixPrimCollComp = new Property()
+      .setName("PropertyMixedPrimCollComp")
+      .setType(ComplexTypeProvider.nameCTMixPrimCollComp)
+      .setCollection(true);
+
+  // Navigation Properties -------------------------------------------------------------------------------------------
+  public static final NavigationProperty collectionNavPropertyETKeyNavMany_ETKeyNav = new NavigationProperty()
+      .setName("NavPropertyETKeyNavMany")
+      .setType(EntityTypeProvider.nameETKeyNav)
+      .setCollection(true);
+
+  public static final NavigationProperty collectionNavPropertyETMediaMany_ETMedia = new NavigationProperty()
+      .setName("NavPropertyETMediaMany")
+      .setType(EntityTypeProvider.nameETMedia)
+      .setCollection(true);
+
+  public static final NavigationProperty collectionNavPropertyETTwoKeyNavMany_ETTwoKeyNav = new NavigationProperty()
+      .setName("NavPropertyETTwoKeyNavMany")
+      .setType(EntityTypeProvider.nameETTwoKeyNav)
+      .setCollection(true)
+      .setPartner("NavPropertyETKeyNavOne");
+
+  public static final NavigationProperty collectionNavPropertyETTwoKeyNavOne_ETTwoKeyNav = new NavigationProperty()
+      .setName("NavPropertyETTwoKeyNavOne")
+      .setType(EntityTypeProvider.nameETTwoKeyNav);
+
+  public static final NavigationProperty navPropertyETKeyNavOne_ETKeyNav = new NavigationProperty()
+      .setName("NavPropertyETKeyNavOne")
+      .setType(EntityTypeProvider.nameETKeyNav);
+  public static final NavigationProperty navPropertyETMediaOne_ETMedia = new NavigationProperty()
+      .setName("NavPropertyETMediaOne")
+      .setType(EntityTypeProvider.nameETMedia);
+
+  public static final NavigationProperty navPropertyETKeyPrimNavOne = new NavigationProperty()
+      .setName("NavPropertyETKeyPrimNavOne")
+      .setType(EntityTypeProvider.nameETKeyPrimNav);
+
+  public static final NavigationProperty navPropertyETTwoKeyNavOne_ETTwoKeyNav = new NavigationProperty()
+      .setName("NavPropertyETTwoKeyNavOne")
+      .setType(EntityTypeProvider.nameETTwoKeyNav);
+
+  // EnumProperties --------------------------------------------------------------------------------------------------
+  public static final Property propertyEnumString_ENString = new Property()
+      .setName("PropertyEnumString")
+      .setType(EnumTypeProvider.nameENString);
+
+  // TypeDefinition Properties ---------------------------------------------------------------------------------------
+
+}

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/59ef14f4/lib/server-core/src/test/java/org/apache/olingo/server/core/testutil/techprovider/SchemaProvider.java
----------------------------------------------------------------------
diff --git a/lib/server-core/src/test/java/org/apache/olingo/server/core/testutil/techprovider/SchemaProvider.java b/lib/server-core/src/test/java/org/apache/olingo/server/core/testutil/techprovider/SchemaProvider.java
new file mode 100644
index 0000000..6a0708f
--- /dev/null
+++ b/lib/server-core/src/test/java/org/apache/olingo/server/core/testutil/techprovider/SchemaProvider.java
@@ -0,0 +1,247 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.olingo.server.core.testutil.techprovider;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.olingo.commons.api.ODataException;
+import org.apache.olingo.server.api.edm.provider.Action;
+import org.apache.olingo.server.api.edm.provider.ActionImport;
+import org.apache.olingo.server.api.edm.provider.ComplexType;
+import org.apache.olingo.server.api.edm.provider.EntityContainer;
+import org.apache.olingo.server.api.edm.provider.EntitySet;
+import org.apache.olingo.server.api.edm.provider.EntityType;
+import org.apache.olingo.server.api.edm.provider.EnumType;
+import org.apache.olingo.server.api.edm.provider.Function;
+import org.apache.olingo.server.api.edm.provider.FunctionImport;
+import org.apache.olingo.server.api.edm.provider.Schema;
+import org.apache.olingo.server.api.edm.provider.Singleton;
+
+public class SchemaProvider {
+
+  private EdmTechProvider prov;
+
+  public static final String nameSpace = "com.sap.odata.test1";
+
+  public SchemaProvider(EdmTechProvider prov) {
+    this.prov = prov;
+  }
+
+  public List<Schema> getSchemas() throws ODataException {
+    List<Schema> schemas = new ArrayList<Schema>();
+    Schema schema = new Schema();
+    schema.setNamespace("com.sap.odata.test1");
+    schema.setAlias("Namespace1_Alias");
+    schemas.add(schema);
+    // EnumTypes
+    List<EnumType> enumTypes = new ArrayList<EnumType>();
+    schema.setEnumTypes(enumTypes);
+    enumTypes.add(prov.getEnumType(EnumTypeProvider.nameENString));
+    // EntityTypes
+    List<EntityType> entityTypes = new ArrayList<EntityType>();
+    schema.setEntityTypes(entityTypes);
+
+    entityTypes.add(prov.getEntityType(EntityTypeProvider.nameETAllPrim));
+    entityTypes.add(prov.getEntityType(EntityTypeProvider.nameETCollAllPrim));
+    entityTypes.add(prov.getEntityType(EntityTypeProvider.nameETTwoPrim));
+    entityTypes.add(prov.getEntityType(EntityTypeProvider.nameETMixPrimCollComp));
+    entityTypes.add(prov.getEntityType(EntityTypeProvider.nameETTwoKeyTwoPrim));
+    entityTypes.add(prov.getEntityType(EntityTypeProvider.nameETBase));
+    entityTypes.add(prov.getEntityType(EntityTypeProvider.nameETTwoBase));
+    entityTypes.add(prov.getEntityType(EntityTypeProvider.nameETAllKey));
+    entityTypes.add(prov.getEntityType(EntityTypeProvider.nameETCompAllPrim));
+    entityTypes.add(prov.getEntityType(EntityTypeProvider.nameETCompCollAllPrim));
+    entityTypes.add(prov.getEntityType(EntityTypeProvider.nameETCompComp));
+    entityTypes.add(prov.getEntityType(EntityTypeProvider.nameETCompCollComp));
+    entityTypes.add(prov.getEntityType(EntityTypeProvider.nameETMedia));
+    entityTypes.add(prov.getEntityType(EntityTypeProvider.nameETFourKeyAlias));
+    entityTypes.add(prov.getEntityType(EntityTypeProvider.nameETServerSidePaging));
+    entityTypes.add(prov.getEntityType(EntityTypeProvider.nameETAllNullable));
+    entityTypes.add(prov.getEntityType(EntityTypeProvider.nameETKeyNav));
+    entityTypes.add(prov.getEntityType(EntityTypeProvider.nameETTwoKeyNav));
+    entityTypes.add(prov.getEntityType(EntityTypeProvider.nameETBaseTwoKeyNav));
+    entityTypes.add(prov.getEntityType(EntityTypeProvider.nameETTwoBaseTwoKeyNav));
+    entityTypes.add(prov.getEntityType(EntityTypeProvider.nameETCompMixPrimCollComp));
+    entityTypes.add(prov.getEntityType(EntityTypeProvider.nameETKeyPrimNav));
+
+    // ComplexTypes
+    List<ComplexType> complexType = new ArrayList<ComplexType>();
+    schema.setComplexTypes(complexType);
+    complexType.add(prov.getComplexType(ComplexTypeProvider.nameCTPrim));
+    complexType.add(prov.getComplexType(ComplexTypeProvider.nameCTAllPrim));
+    complexType.add(prov.getComplexType(ComplexTypeProvider.nameCTCollAllPrim));
+    complexType.add(prov.getComplexType(ComplexTypeProvider.nameCTTwoPrim));
+    complexType.add(prov.getComplexType(ComplexTypeProvider.nameCTMixPrimCollComp));
+    complexType.add(prov.getComplexType(ComplexTypeProvider.nameCTBase));
+    complexType.add(prov.getComplexType(ComplexTypeProvider.nameCTTwoBase));
+    complexType.add(prov.getComplexType(ComplexTypeProvider.nameCTCompComp));
+    complexType.add(prov.getComplexType(ComplexTypeProvider.nameCTCompCollComp));
+    complexType.add(prov.getComplexType(ComplexTypeProvider.nameCTPrimComp));
+    complexType.add(prov.getComplexType(ComplexTypeProvider.nameCTNavFiveProp));
+    complexType.add(prov.getComplexType(ComplexTypeProvider.nameCTPrimEnum));
+    complexType.add(prov.getComplexType(ComplexTypeProvider.nameCTBasePrimCompNav));
+    complexType.add(prov.getComplexType(ComplexTypeProvider.nameCTTwoBasePrimCompNav));
+    complexType.add(prov.getComplexType(ComplexTypeProvider.nameCTCompNav));
+
+    // TypeDefinitions
+
+    // Actions
+    List<Action> actions = new ArrayList<Action>();
+    schema.setActions(actions);
+    actions.addAll(prov.getActions(ActionProvider.nameUARTPrimParam));
+    actions.addAll(prov.getActions(ActionProvider.nameUARTPrimCollParam));
+    actions.addAll(prov.getActions(ActionProvider.nameUARTCompParam));
+    actions.addAll(prov.getActions(ActionProvider.nameUARTCompCollParam));
+    actions.addAll(prov.getActions(ActionProvider.nameUARTETParam));
+    actions.addAll(prov.getActions(ActionProvider.nameUARTETCollAllPrimParam));
+    actions.addAll(prov.getActions(ActionProvider.nameBAETTwoKeyNavRTETTwoKeyNav));
+    actions.addAll(prov.getActions(ActionProvider.nameBAESAllPrimRTETAllPrim));
+    actions.addAll(prov.getActions(ActionProvider.nameBAESTwoKeyNavRTESTwoKeyNav));
+    actions.addAll(prov.getActions(ActionProvider.nameBAETBaseTwoKeyNavRTETBaseTwoKeyNav));
+    actions.addAll(prov.getActions(ActionProvider.nameBAETTwoBaseTwoKeyNavRTETBaseTwoKeyNav));
+
+    // Functions
+    List<Function> functions = new ArrayList<Function>();
+    schema.setFunctions(functions);
+
+    functions.addAll(prov.getFunctions(FunctionProvider.nameUFNRTInt16));
+    functions.addAll(prov.getFunctions(FunctionProvider.nameUFCRTETKeyNav));
+    functions.addAll(prov.getFunctions(FunctionProvider.nameUFCRTETTwoKeyNavParam));
+    functions.addAll(prov.getFunctions(FunctionProvider.nameUFCRTETTwoKeyNavParamCTTwoPrim));
+    functions.addAll(prov.getFunctions(FunctionProvider.nameUFCRTStringTwoParam));
+    functions.addAll(prov.getFunctions(FunctionProvider.nameUFCRTESTwoKeyNavParam));
+    // TODO: check why it exists twice
+    functions.addAll(prov.getFunctions(FunctionProvider.nameUFCRTString));
+    functions.addAll(prov.getFunctions(FunctionProvider.nameUFCRTCollStringTwoParam));
+    functions.addAll(prov.getFunctions(FunctionProvider.nameUFCRTCollString));
+    functions.addAll(prov.getFunctions(FunctionProvider.nameUFCRTCTAllPrimTwoParam));
+    functions.addAll(prov.getFunctions(FunctionProvider.nameUFCRTCTTwoPrimParam));
+    functions.addAll(prov.getFunctions(FunctionProvider.nameUFCRTCollCTTwoPrimParam));
+    functions.addAll(prov.getFunctions(FunctionProvider.nameUFCRTCTTwoPrim));
+    functions.addAll(prov.getFunctions(FunctionProvider.nameUFCRTCollCTTwoPrim));
+    functions.addAll(prov.getFunctions(FunctionProvider.nameUFCRTETMedia));
+    functions.addAll(prov.getFunctions(FunctionProvider.nameUFNRTESMixPrimCollCompTwoParam));
+    functions.addAll(prov.getFunctions(FunctionProvider.nameUFCRTETAllPrimTwoParam));
+    functions.addAll(prov.getFunctions(FunctionProvider.nameUFCRTESMixPrimCollCompTwoParam));
+    functions.addAll(prov.getFunctions(FunctionProvider.nameBFCESTwoKeyNavRTESTwoKeyNav));
+    functions.addAll(prov.getFunctions(FunctionProvider.nameBFCStringRTESTwoKeyNav));
+    functions.addAll(prov.getFunctions(FunctionProvider.nameBFCETBaseTwoKeyNavRTETTwoKeyNav));
+    functions.addAll(prov.getFunctions(FunctionProvider.nameBFCESBaseTwoKeyNavRTESBaseTwoKey));
+    functions.addAll(prov.getFunctions(FunctionProvider.nameBFCESAllPrimRTCTAllPrim));
+    functions.addAll(prov.getFunctions(FunctionProvider.nameBFCESTwoKeyNavRTCTTwoPrim));
+    functions.addAll(prov.getFunctions(FunctionProvider.nameBFCESTwoKeyNavRTCollCTTwoPrim));
+    functions.addAll(prov.getFunctions(FunctionProvider.nameBFCESTwoKeyNavRTString));
+    functions.addAll(prov.getFunctions(FunctionProvider.nameBFCESTwoKeyNavRTCollString));
+    functions.addAll(prov.getFunctions(FunctionProvider.nameBFCETTwoKeyNavRTESTwoKeyNav));
+    functions.addAll(prov.getFunctions(FunctionProvider.nameBFCETBaseTwoKeyNavRTESTwoKeyNav));
+    functions.addAll(prov.getFunctions(FunctionProvider.nameBFCSINavRTESTwoKeyNav));
+    functions.addAll(prov.getFunctions(FunctionProvider.nameBFCETBaseTwoKeyNavRTESBaseTwoKey));
+    functions.addAll(prov.getFunctions(FunctionProvider.nameBFCCollStringRTESTwoKeyNav));
+    functions.addAll(prov.getFunctions(FunctionProvider.nameBFCCTPrimCompRTESTwoKeyNav));
+    functions.addAll(prov.getFunctions(FunctionProvider.nameBFCCTPrimCompRTESBaseTwoKeyNav));
+    functions.addAll(prov.getFunctions(FunctionProvider.nameBFCCollCTPrimCompRTESAllPrim));
+    functions.addAll(prov.getFunctions(FunctionProvider.nameBFCESTwoKeyNavRTTwoKeyNav));
+    functions.addAll(prov.getFunctions(FunctionProvider.nameBFCESKeyNavRTETKeyNav));
+    functions.addAll(prov.getFunctions(FunctionProvider.nameBFCETKeyNavRTETKeyNav));
+    functions.addAll(prov.getFunctions(FunctionProvider.nameBFESTwoKeyNavRTESTwoKeyNav));
+    functions.addAll(prov.getFunctions(FunctionProvider.nameBFCETTwoKeyNavRTETTwoKeyNav));
+    functions.addAll(prov.getFunctions(FunctionProvider.nameBFCETTwoKeyNavRTCTTwoPrim));
+    functions.addAll(prov.getFunctions(FunctionProvider.nameBFCESTwoKeyNavRTStringParam));
+    functions.addAll(prov.getFunctions(FunctionProvider.nameBFCESKeyNavRTETKeyNavParam));
+    functions.addAll(prov.getFunctions(FunctionProvider.nameBFCCTPrimCompRTETTwoKeyNavParam));
+    functions.addAll(prov.getFunctions(FunctionProvider.nameBAETTwoKeyNavRTETTwoKeyNav));
+    functions.addAll(prov.getFunctions(FunctionProvider.nameBFCCTPrimCompRTESTwoKeyNavParam));
+
+    // EntityContainer
+    EntityContainer container = new EntityContainer();
+    schema.setEntityContainer(container);
+    container.setName(ContainerProvider.nameContainer.getName());
+
+    // EntitySets
+    List<EntitySet> entitySets = new ArrayList<EntitySet>();
+    container.setEntitySets(entitySets);
+    entitySets.add(prov.getEntitySet(ContainerProvider.nameContainer, "ESAllPrim"));
+    entitySets.add(prov.getEntitySet(ContainerProvider.nameContainer, "ESCollAllPrim"));
+    entitySets.add(prov.getEntitySet(ContainerProvider.nameContainer, "ESTwoPrim"));
+    entitySets.add(prov.getEntitySet(ContainerProvider.nameContainer, "ESMixPrimCollComp"));
+    entitySets.add(prov.getEntitySet(ContainerProvider.nameContainer, "ESBase"));
+    entitySets.add(prov.getEntitySet(ContainerProvider.nameContainer, "ESTwoBase"));
+    entitySets.add(prov.getEntitySet(ContainerProvider.nameContainer, "ESTwoKeyTwoPrim"));
+    entitySets.add(prov.getEntitySet(ContainerProvider.nameContainer, "ESBaseTwoKeyTwoPrim"));
+    entitySets.add(prov.getEntitySet(ContainerProvider.nameContainer, "ESTwoBaseTwoKeyTwoPrim"));
+    entitySets.add(prov.getEntitySet(ContainerProvider.nameContainer, "ESAllKey"));
+    entitySets.add(prov.getEntitySet(ContainerProvider.nameContainer, "ESCompAllPrim"));
+    entitySets.add(prov.getEntitySet(ContainerProvider.nameContainer, "ESCompCollAllPrim"));
+    entitySets.add(prov.getEntitySet(ContainerProvider.nameContainer, "ESCompComp"));
+    entitySets.add(prov.getEntitySet(ContainerProvider.nameContainer, "ESCompCollComp"));
+    entitySets.add(prov.getEntitySet(ContainerProvider.nameContainer, "ESMedia"));
+    entitySets.add(prov.getEntitySet(ContainerProvider.nameContainer, "ESKeyTwoKeyComp"));
+    entitySets.add(prov.getEntitySet(ContainerProvider.nameContainer, "ESInvisible"));
+    entitySets.add(prov.getEntitySet(ContainerProvider.nameContainer, "ESServerSidePaging"));
+    entitySets.add(prov.getEntitySet(ContainerProvider.nameContainer, "ESAllNullable"));
+    entitySets.add(prov.getEntitySet(ContainerProvider.nameContainer, "ESKeyNav"));
+    entitySets.add(prov.getEntitySet(ContainerProvider.nameContainer, "ESTwoKeyNav"));
+    entitySets.add(prov.getEntitySet(ContainerProvider.nameContainer, "ESBaseTwoKeyNav"));
+    entitySets.add(prov.getEntitySet(ContainerProvider.nameContainer, "ESCompMixPrimCollComp"));
+    entitySets.add(prov.getEntitySet(ContainerProvider.nameContainer, "ESFourKeyAlias"));
+
+    // Singletons
+    List<Singleton> singletons = new ArrayList<Singleton>();
+    container.setSingletons(singletons);
+    singletons.add(prov.getSingleton(ContainerProvider.nameContainer, "SI"));
+    singletons.add(prov.getSingleton(ContainerProvider.nameContainer, "SINav"));
+    singletons.add(prov.getSingleton(ContainerProvider.nameContainer, "SIMedia"));
+
+    // ActionImports
+    List<ActionImport> actionImports = new ArrayList<ActionImport>();
+    container.setActionImports(actionImports);
+    actionImports.add(prov.getActionImport(ContainerProvider.nameContainer, "AIRTPrimParam"));
+    actionImports.add(prov.getActionImport(ContainerProvider.nameContainer, "AIRTPrimCollParam"));
+    actionImports.add(prov.getActionImport(ContainerProvider.nameContainer, "AIRTCompParam"));
+    actionImports.add(prov.getActionImport(ContainerProvider.nameContainer, "AIRTCompCollParam"));
+    actionImports.add(prov.getActionImport(ContainerProvider.nameContainer, "AIRTETParam"));
+    actionImports.add(prov.getActionImport(ContainerProvider.nameContainer, "AIRTETCollAllPrimParam"));
+
+    // FunctionImports
+    List<FunctionImport> functionImports = new ArrayList<FunctionImport>();
+    container.setFunctionImports(functionImports);
+    functionImports.add(prov.getFunctionImport(ContainerProvider.nameContainer, "FINRTInt16"));
+    functionImports.add(prov.getFunctionImport(ContainerProvider.nameContainer, "FINInvisibleRTInt16"));
+    functionImports.add(prov.getFunctionImport(ContainerProvider.nameContainer, "FINInvisible2RTInt16"));
+    functionImports.add(prov.getFunctionImport(ContainerProvider.nameContainer, "FICRTETKeyNav"));
+    functionImports.add(prov.getFunctionImport(ContainerProvider.nameContainer, "FICRTETTwoKeyNavParam"));
+    functionImports.add(prov.getFunctionImport(ContainerProvider.nameContainer, "FICRTStringTwoParam"));
+    functionImports.add(prov.getFunctionImport(ContainerProvider.nameContainer, "FICRTCollStringTwoParam"));
+    functionImports.add(prov.getFunctionImport(ContainerProvider.nameContainer, "FICRTCTAllPrimTwoParam"));
+    functionImports.add(prov.getFunctionImport(ContainerProvider.nameContainer, "FICRTESMixPrimCollCompTwoParam"));
+    functionImports.add(prov.getFunctionImport(ContainerProvider.nameContainer, "FINRTESMixPrimCollCompTwoParam"));
+    functionImports.add(prov.getFunctionImport(ContainerProvider.nameContainer, "FICRTCollCTTwoPrim"));
+    functionImports.add(prov.getFunctionImport(ContainerProvider.nameContainer, "FICRTETMedia"));
+    functionImports.add(prov.getFunctionImport(ContainerProvider.nameContainer, "FICRTCTTwoPrimParam"));
+    functionImports.add(prov.getFunctionImport(ContainerProvider.nameContainer, "FICRTCTTwoPrim"));
+    functionImports.add(prov.getFunctionImport(ContainerProvider.nameContainer, "FICRTCollString"));
+    functionImports.add(prov.getFunctionImport(ContainerProvider.nameContainer, "FICRTString"));
+    functionImports.add(prov.getFunctionImport(ContainerProvider.nameContainer, "FICRTESTwoKeyNavParam"));
+    functionImports.add(prov.getFunctionImport(ContainerProvider.nameContainer, "FICRTCollCTTwoPrimParam"));
+
+    return schemas;
+  }
+
+}

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/59ef14f4/lib/server-core/src/test/java/org/apache/olingo/server/core/testutil/techprovider/TypeDefinitionProvider.java
----------------------------------------------------------------------
diff --git a/lib/server-core/src/test/java/org/apache/olingo/server/core/testutil/techprovider/TypeDefinitionProvider.java b/lib/server-core/src/test/java/org/apache/olingo/server/core/testutil/techprovider/TypeDefinitionProvider.java
new file mode 100644
index 0000000..879affd
--- /dev/null
+++ b/lib/server-core/src/test/java/org/apache/olingo/server/core/testutil/techprovider/TypeDefinitionProvider.java
@@ -0,0 +1,30 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.olingo.server.core.testutil.techprovider;
+
+import org.apache.olingo.commons.api.edm.FullQualifiedName;
+import org.apache.olingo.server.api.edm.provider.TypeDefinition;
+
+public class TypeDefinitionProvider {
+
+  public TypeDefinition getTypeDefinition(FullQualifiedName typeDefinitionName) {
+    return null;
+  }
+
+}

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/59ef14f4/lib/server-core/src/test/java/org/apache/olingo/server/core/uri/UriInfoImplTest.java
----------------------------------------------------------------------
diff --git a/lib/server-core/src/test/java/org/apache/olingo/server/core/uri/UriInfoImplTest.java b/lib/server-core/src/test/java/org/apache/olingo/server/core/uri/UriInfoImplTest.java
index 4474e07..a9d516d 100644
--- a/lib/server-core/src/test/java/org/apache/olingo/server/core/uri/UriInfoImplTest.java
+++ b/lib/server-core/src/test/java/org/apache/olingo/server/core/uri/UriInfoImplTest.java
@@ -36,8 +36,8 @@ import org.apache.olingo.server.api.uri.UriInfoResource;
 import org.apache.olingo.server.api.uri.UriInfoService;
 import org.apache.olingo.server.api.uri.queryoption.CustomQueryOption;
 import org.apache.olingo.server.core.edm.provider.EdmProviderImpl;
-import org.apache.olingo.server.core.testutil.EdmTechProvider;
 import org.apache.olingo.server.core.testutil.EdmTechTestProvider;
+import org.apache.olingo.server.core.testutil.techprovider.EntityTypeProvider;
 import org.apache.olingo.server.core.uri.queryoption.CountOptionImpl;
 import org.apache.olingo.server.core.uri.queryoption.CustomQueryOptionImpl;
 import org.apache.olingo.server.core.uri.queryoption.ExpandOptionImpl;
@@ -192,7 +192,7 @@ public class UriInfoImplTest {
   @Test
   public void testEntityTypeCast() {
     UriInfoImpl uriInfo = new UriInfoImpl();
-    EdmEntityType entityType = edm.getEntityType(EdmTechProvider.nameETKeyNav);
+    EdmEntityType entityType = edm.getEntityType(EntityTypeProvider.nameETKeyNav);
     assertNotNull(entityType);
 
     uriInfo.setEntityTypeCast(entityType);

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/59ef14f4/lib/server-core/src/test/java/org/apache/olingo/server/core/uri/UriResourceImplTest.java
----------------------------------------------------------------------
diff --git a/lib/server-core/src/test/java/org/apache/olingo/server/core/uri/UriResourceImplTest.java b/lib/server-core/src/test/java/org/apache/olingo/server/core/uri/UriResourceImplTest.java
index 0eb88e0..6cd6cf3 100644
--- a/lib/server-core/src/test/java/org/apache/olingo/server/core/uri/UriResourceImplTest.java
+++ b/lib/server-core/src/test/java/org/apache/olingo/server/core/uri/UriResourceImplTest.java
@@ -40,8 +40,10 @@ import org.apache.olingo.server.core.edm.provider.EdmComplexTypeImpl;
 import org.apache.olingo.server.core.edm.provider.EdmEntitySetImpl;
 import org.apache.olingo.server.core.edm.provider.EdmProviderImpl;
 import org.apache.olingo.server.core.edm.provider.EdmSingletonImpl;
-import org.apache.olingo.server.core.testutil.EdmTechProvider;
 import org.apache.olingo.server.core.testutil.EdmTechTestProvider;
+import org.apache.olingo.server.core.testutil.techprovider.ActionProvider;
+import org.apache.olingo.server.core.testutil.techprovider.ComplexTypeProvider;
+import org.apache.olingo.server.core.testutil.techprovider.EntityTypeProvider;
 import org.apache.olingo.server.core.uri.queryoption.expression.ExpressionImpl;
 import org.apache.olingo.server.core.uri.queryoption.expression.LiteralImpl;
 import org.junit.Test;
@@ -72,10 +74,10 @@ public class UriResourceImplTest {
     assertEquals("", impl.toString());
 
     // action
-    EdmAction action = edm.getAction(EdmTechProvider.nameUARTETParam, null, null);
+    EdmAction action = edm.getAction(ActionProvider.nameUARTETParam, null, null);
     impl.setAction(action);
     assertEquals(action, impl.getAction());
-    assertEquals(EdmTechProvider.nameUARTETParam.getName(), impl.toString());
+    assertEquals(ActionProvider.nameUARTETParam.getName(), impl.toString());
 
     // action import
     impl = new UriResourceActionImpl();
@@ -125,7 +127,7 @@ public class UriResourceImplTest {
     UriResourceComplexPropertyImpl impl = new UriResourceComplexPropertyImpl();
     assertEquals(UriResourceKind.complexProperty, impl.getKind());
 
-    EdmEntityType entityType = edm.getEntityType(EdmTechProvider.nameETKeyNav);
+    EdmEntityType entityType = edm.getEntityType(EntityTypeProvider.nameETKeyNav);
     EdmProperty property = (EdmProperty) entityType.getProperty("PropertyComplex");
     impl.setProperty(property);
 
@@ -137,7 +139,7 @@ public class UriResourceImplTest {
     impl.getComplexType();
 
     EdmComplexTypeImpl complexTypeImplType =
-        (EdmComplexTypeImpl) edm.getComplexType(EdmTechProvider.nameCTBasePrimCompNav);
+        (EdmComplexTypeImpl) edm.getComplexType(ComplexTypeProvider.nameCTBasePrimCompNav);
 
     impl.setTypeFilter(complexTypeImplType);
     assertEquals(complexTypeImplType, impl.getTypeFilter());
@@ -151,7 +153,7 @@ public class UriResourceImplTest {
     UriResourcePrimitivePropertyImpl impl = new UriResourcePrimitivePropertyImpl();
     assertEquals(UriResourceKind.primitiveProperty, impl.getKind());
 
-    EdmEntityType entityType = edm.getEntityType(EdmTechProvider.nameETKeyNav);
+    EdmEntityType entityType = edm.getEntityType(EntityTypeProvider.nameETKeyNav);
     EdmProperty property = (EdmProperty) entityType.getProperty("PropertyInt16");
     impl.setProperty(property);
 
@@ -261,9 +263,9 @@ public class UriResourceImplTest {
     }
 
     Mock impl = new Mock();
-    EdmEntityType entityType = edm.getEntityType(EdmTechProvider.nameETTwoKeyNav);
-    EdmEntityType entityTypeBaseColl = edm.getEntityType(EdmTechProvider.nameETBaseTwoKeyNav);
-    EdmEntityType entityTypeBaseEntry = edm.getEntityType(EdmTechProvider.nameETTwoBaseTwoKeyNav);
+    EdmEntityType entityType = edm.getEntityType(EntityTypeProvider.nameETTwoKeyNav);
+    EdmEntityType entityTypeBaseColl = edm.getEntityType(EntityTypeProvider.nameETBaseTwoKeyNav);
+    EdmEntityType entityTypeBaseEntry = edm.getEntityType(EntityTypeProvider.nameETTwoBaseTwoKeyNav);
 
     impl.setType(entityType);
     assertEquals(entityType, impl.getType());
@@ -339,9 +341,9 @@ public class UriResourceImplTest {
     }
 
     Mock impl = new Mock();
-    EdmEntityType entityType = edm.getEntityType(EdmTechProvider.nameETTwoKeyNav);
-    EdmEntityType entityTypeBaseColl = edm.getEntityType(EdmTechProvider.nameETBaseTwoKeyNav);
-    edm.getEntityType(EdmTechProvider.nameETTwoBaseTwoKeyNav);
+    EdmEntityType entityType = edm.getEntityType(EntityTypeProvider.nameETTwoKeyNav);
+    EdmEntityType entityTypeBaseColl = edm.getEntityType(EntityTypeProvider.nameETBaseTwoKeyNav);
+    edm.getEntityType(EntityTypeProvider.nameETTwoBaseTwoKeyNav);
 
     impl.setType(entityType);
     assertEquals("mock", impl.toString());
@@ -361,7 +363,7 @@ public class UriResourceImplTest {
     UriResourceItImpl impl = new UriResourceItImpl();
     assertEquals(UriResourceKind.it, impl.getKind());
 
-    EdmEntityType entityType = edm.getEntityType(EdmTechProvider.nameETTwoKeyNav);
+    EdmEntityType entityType = edm.getEntityType(EntityTypeProvider.nameETTwoKeyNav);
     assertEquals("$it", impl.toString());
 
     impl.setType(entityType);
@@ -383,7 +385,7 @@ public class UriResourceImplTest {
     UriResourceNavigationPropertyImpl impl = new UriResourceNavigationPropertyImpl();
     assertEquals(UriResourceKind.navigationProperty, impl.getKind());
 
-    EdmEntityType entityType = edm.getEntityType(EdmTechProvider.nameETTwoKeyNav);
+    EdmEntityType entityType = edm.getEntityType(EntityTypeProvider.nameETTwoKeyNav);
     EdmNavigationProperty property = (EdmNavigationProperty) entityType.getProperty("NavPropertyETKeyNavMany");
     assertNotNull(property);
 
@@ -414,7 +416,7 @@ public class UriResourceImplTest {
     UriResourceRootImpl impl = new UriResourceRootImpl();
     assertEquals(UriResourceKind.root, impl.getKind());
 
-    EdmEntityType entityType = edm.getEntityType(EdmTechProvider.nameETTwoKeyNav);
+    EdmEntityType entityType = edm.getEntityType(EntityTypeProvider.nameETTwoKeyNav);
     assertEquals("$root", impl.toString());
 
     impl.setType(entityType);
@@ -437,7 +439,7 @@ public class UriResourceImplTest {
     assertEquals(UriResourceKind.singleton, impl.getKind());
 
     EdmSingletonImpl singleton = (EdmSingletonImpl) edm.getEntityContainer(null).getSingleton("SINav");
-    EdmEntityType entityTypeBaseColl = edm.getEntityType(EdmTechProvider.nameETBaseTwoKeyNav);
+    EdmEntityType entityTypeBaseColl = edm.getEntityType(EntityTypeProvider.nameETBaseTwoKeyNav);
     impl.setSingleton(singleton);
 
     assertEquals("SINav", impl.toString());
@@ -466,7 +468,7 @@ public class UriResourceImplTest {
     UriResourceLambdaVarImpl impl = new UriResourceLambdaVarImpl();
     assertEquals(UriResourceKind.lambdaVariable, impl.getKind());
 
-    EdmEntityType entityType = edm.getEntityType(EdmTechProvider.nameETTwoKeyNav);
+    EdmEntityType entityType = edm.getEntityType(EntityTypeProvider.nameETTwoKeyNav);
     impl.setType(entityType);
     impl.setVariableText("A");
 
@@ -482,7 +484,7 @@ public class UriResourceImplTest {
   public void testUriResourceStartingTypeFilterImpl() {
     UriResourceStartingTypeFilterImpl impl = new UriResourceStartingTypeFilterImpl();
 
-    EdmEntityType entityType = edm.getEntityType(EdmTechProvider.nameETTwoKeyNav);
+    EdmEntityType entityType = edm.getEntityType(EntityTypeProvider.nameETTwoKeyNav);
 
     impl.setType(entityType);
     assertEquals("com.sap.odata.test1.ETTwoKeyNav", impl.toString());


[4/9] [OLINGO-168] Refactor Tech Provider

Posted by ch...@apache.org.
http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/59ef14f4/lib/server-core/src/test/java/org/apache/olingo/server/core/testutil/EdmTechTestProvider.java
----------------------------------------------------------------------
diff --git a/lib/server-core/src/test/java/org/apache/olingo/server/core/testutil/EdmTechTestProvider.java b/lib/server-core/src/test/java/org/apache/olingo/server/core/testutil/EdmTechTestProvider.java
index 3672799..f3cc85c 100644
--- a/lib/server-core/src/test/java/org/apache/olingo/server/core/testutil/EdmTechTestProvider.java
+++ b/lib/server-core/src/test/java/org/apache/olingo/server/core/testutil/EdmTechTestProvider.java
@@ -23,11 +23,13 @@ import java.util.List;
 
 import org.apache.olingo.commons.api.ODataException;
 import org.apache.olingo.commons.api.edm.FullQualifiedName;
+import org.apache.olingo.commons.core.edm.primitivetype.EdmPrimitiveTypeKind;
 import org.apache.olingo.server.api.edm.provider.ComplexType;
 import org.apache.olingo.server.api.edm.provider.EntitySet;
 import org.apache.olingo.server.api.edm.provider.EntityType;
 import org.apache.olingo.server.api.edm.provider.Property;
 import org.apache.olingo.server.api.edm.provider.PropertyRef;
+import org.apache.olingo.server.core.testutil.techprovider.EdmTechProvider;
 
 /**
  * Implement the EdmTechProvider and
@@ -37,6 +39,10 @@ import org.apache.olingo.server.api.edm.provider.PropertyRef;
  */
 public class EdmTechTestProvider extends EdmTechProvider {
 
+  private static final FullQualifiedName nameInt16 = EdmPrimitiveTypeKind.Int16.getFullQualifiedName();
+  public static final String nameSpace = "com.sap.odata.test1";
+  public static final FullQualifiedName nameContainer = new FullQualifiedName(nameSpace, "Container");
+  
   Property propertyAInt16 = new Property().setName("a").setType(nameInt16);
   Property propertyBInt16 = new Property().setName("b").setType(nameInt16);
   Property propertyCInt16 = new Property().setName("c").setType(nameInt16);

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/59ef14f4/lib/server-core/src/test/java/org/apache/olingo/server/core/testutil/techprovider/ActionProvider.java
----------------------------------------------------------------------
diff --git a/lib/server-core/src/test/java/org/apache/olingo/server/core/testutil/techprovider/ActionProvider.java b/lib/server-core/src/test/java/org/apache/olingo/server/core/testutil/techprovider/ActionProvider.java
new file mode 100644
index 0000000..3ddc6d9
--- /dev/null
+++ b/lib/server-core/src/test/java/org/apache/olingo/server/core/testutil/techprovider/ActionProvider.java
@@ -0,0 +1,179 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.olingo.server.core.testutil.techprovider;
+
+import java.util.Arrays;
+import java.util.List;
+
+import org.apache.olingo.commons.api.ODataException;
+import org.apache.olingo.commons.api.edm.FullQualifiedName;
+import org.apache.olingo.server.api.edm.provider.Action;
+import org.apache.olingo.server.api.edm.provider.Parameter;
+import org.apache.olingo.server.api.edm.provider.ReturnType;
+
+public class ActionProvider {
+
+  //Bound Actions
+  public static final FullQualifiedName nameBAESAllPrimRTETAllPrim =
+      new FullQualifiedName(SchemaProvider.nameSpace, "BAESAllPrimRTETAllPrim");
+
+  public static final FullQualifiedName nameBAESTwoKeyNavRTESTwoKeyNav =
+      new FullQualifiedName(SchemaProvider.nameSpace, "BAESTwoKeyNavRTESTwoKeyNav");
+
+  public static final FullQualifiedName nameBAETBaseTwoKeyNavRTETBaseTwoKeyNav =
+      new FullQualifiedName(SchemaProvider.nameSpace, "BAETBaseTwoKeyNavRTETBaseTwoKeyNav");
+
+  public static final FullQualifiedName nameBAETTwoBaseTwoKeyNavRTETBaseTwoKeyNav =
+      new FullQualifiedName(SchemaProvider.nameSpace, "BAETTwoBaseTwoKeyNavRTETBaseTwoKeyNav");
+
+  public static final FullQualifiedName nameBAETTwoKeyNavRTETTwoKeyNav =
+      new FullQualifiedName(SchemaProvider.nameSpace, "BAETTwoKeyNavRTETTwoKeyNav");
+
+  
+  //Unbound Actions
+  public static final FullQualifiedName nameUARTCompCollParam = new FullQualifiedName(SchemaProvider.nameSpace, "UARTCompCollParam");
+  public static final FullQualifiedName nameUARTCompParam = new FullQualifiedName(SchemaProvider.nameSpace, "UARTCompParam");
+  public static final FullQualifiedName nameUARTETCollAllPrimParam =
+      new FullQualifiedName(SchemaProvider.nameSpace, "UARTETCollAllPrimParam");
+
+  public static final FullQualifiedName nameUARTETParam = new FullQualifiedName(SchemaProvider.nameSpace, "UARTETParam");
+  public static final FullQualifiedName nameUARTPrimParam = new FullQualifiedName(SchemaProvider.nameSpace, "UARTPrimParam");
+  public static final FullQualifiedName nameUARTPrimCollParam = new FullQualifiedName(SchemaProvider.nameSpace, "UARTPrimCollParam");
+  
+  
+  public List<Action> getActions(final FullQualifiedName actionName) throws ODataException {
+    if (actionName.equals(nameUARTPrimParam)) {
+      return Arrays.asList(
+          new Action().setName("UARTPrimParam")
+              .setParameters(Arrays.asList(
+                  new Parameter().setName("ParameterInt16").setType(PropertyProvider.nameInt16)))
+
+              .setReturnType(new ReturnType().setType(PropertyProvider.nameString))
+          );
+
+    } else if (actionName.equals(nameUARTPrimCollParam)) {
+      return Arrays.asList(
+          new Action().setName("UARTPrimCollParam")
+              .setParameters(Arrays.asList(
+                  new Parameter().setName("ParameterInt16").setType(PropertyProvider.nameInt16)))
+
+              .setReturnType(
+                  new ReturnType().setType(PropertyProvider.nameString).setCollection(true))
+          );
+
+    } else if (actionName.equals(nameUARTCompParam)) {
+      return Arrays.asList(
+          new Action().setName("UARTCompParam")
+              .setParameters(Arrays.asList(
+                  new Parameter().setName("ParameterInt16").setType(PropertyProvider.nameInt16)))
+
+              .setReturnType(
+                  new ReturnType().setType(ComplexTypeProvider.nameCTTwoPrim))
+          );
+
+    } else if (actionName.equals(nameUARTCompCollParam)) {
+      return Arrays.asList(
+          new Action().setName("UARTCompCollParam")
+              .setParameters(Arrays.asList(
+                  new Parameter().setName("ParameterInt16").setType(PropertyProvider.nameInt16)))
+
+              .setReturnType(
+                  new ReturnType().setType(ComplexTypeProvider.nameCTTwoPrim).setCollection(true))
+          );
+
+    } else if (actionName.equals(nameUARTETParam)) {
+      return Arrays.asList(
+          new Action().setName("UARTCompCollParam")
+              .setParameters(Arrays.asList(
+                  new Parameter().setName("ParameterInt16").setType(PropertyProvider.nameInt16)))
+              .setReturnType(
+                  new ReturnType().setType(EntityTypeProvider.nameETTwoKeyTwoPrim))
+          );
+
+    } else if (actionName.equals(nameUARTETCollAllPrimParam)) {
+      return Arrays.asList(
+          new Action().setName("UARTETCollAllPrimParam")
+              .setParameters(Arrays.asList(
+                  new Parameter().setName("ParameterInt16").setType(PropertyProvider.nameInt16)))
+
+              .setReturnType(
+                  new ReturnType().setType(EntityTypeProvider.nameETCollAllPrim).setCollection(true))
+          );
+
+    } else if (actionName.equals(nameBAETTwoKeyNavRTETTwoKeyNav)) {
+      return Arrays.asList(
+          new Action().setName("BAETTwoKeyNavRTETTwoKeyNav")
+              .setParameters(Arrays.asList(
+                  new Parameter().setName("ParameterETTwoKeyNav").setType(EntityTypeProvider.nameETTwoKeyNav)))
+              .setBound(true)
+              .setReturnType(
+                  new ReturnType().setType(EntityTypeProvider.nameETTwoKeyNav))
+          ,
+          new Action().setName("BAETTwoKeyNavRTETTwoKeyNav")
+              .setParameters(Arrays.asList(
+                  new Parameter().setName("ParameterETKeyNav").setType(EntityTypeProvider.nameETKeyNav)))
+              .setBound(true)
+              .setReturnType(
+                  new ReturnType().setType(EntityTypeProvider.nameETTwoKeyNav))
+          );
+
+    } else if (actionName.equals(nameBAESAllPrimRTETAllPrim)) {
+      return Arrays.asList(
+          new Action().setName("BAESAllPrimRTETAllPrim")
+              .setParameters(Arrays.asList(
+                  new Parameter().setName("ParameterESAllPrim").setType(EntityTypeProvider.nameETAllPrim).setCollection(true)))
+              .setBound(true)
+              .setReturnType(
+                  new ReturnType().setType(EntityTypeProvider.nameETAllPrim))
+          );
+
+    } else if (actionName.equals(nameBAESTwoKeyNavRTESTwoKeyNav)) {
+      return Arrays.asList(
+          new Action().setName("BAESTwoKeyNavRTESTwoKeyNav")
+              .setParameters(Arrays.asList(
+                  new Parameter().setName("ParameterETTwoKeyNav").setType(EntityTypeProvider.nameETTwoKeyNav).setCollection(true)))
+              .setBound(true)
+              .setReturnType(
+                  new ReturnType().setType(EntityTypeProvider.nameETTwoKeyNav).setCollection(true))
+          );
+
+    } else if (actionName.equals(nameBAETBaseTwoKeyNavRTETBaseTwoKeyNav)) {
+      return Arrays.asList(
+          new Action().setName("BAETBaseTwoKeyNavRTETBaseTwoKeyNav")
+              .setParameters(Arrays.asList(
+                  new Parameter().setName("ParameterETTwoKeyNav").setType(EntityTypeProvider.nameETBaseTwoKeyNav)))
+              .setBound(true)
+              .setReturnType(
+                  new ReturnType().setType(EntityTypeProvider.nameETTwoKeyNav))
+          );
+
+    } else if (actionName.equals(nameBAETTwoBaseTwoKeyNavRTETBaseTwoKeyNav)) {
+      return Arrays.asList(
+          new Action().setName("BAETTwoBaseTwoKeyNavRTETBaseTwoKeyNav")
+              .setParameters(Arrays.asList(
+                  new Parameter().setName("ParameterETTwoBaseTwoKeyNav").setType(EntityTypeProvider.nameETTwoBaseTwoKeyNav)))
+              .setBound(true)
+              .setReturnType(
+                  new ReturnType().setType(EntityTypeProvider.nameETBaseTwoKeyNav))
+          );
+    }
+
+    return null;
+  }
+}

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/59ef14f4/lib/server-core/src/test/java/org/apache/olingo/server/core/testutil/techprovider/ComplexTypeProvider.java
----------------------------------------------------------------------
diff --git a/lib/server-core/src/test/java/org/apache/olingo/server/core/testutil/techprovider/ComplexTypeProvider.java b/lib/server-core/src/test/java/org/apache/olingo/server/core/testutil/techprovider/ComplexTypeProvider.java
new file mode 100644
index 0000000..3eaf86f
--- /dev/null
+++ b/lib/server-core/src/test/java/org/apache/olingo/server/core/testutil/techprovider/ComplexTypeProvider.java
@@ -0,0 +1,171 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.olingo.server.core.testutil.techprovider;
+
+import java.util.Arrays;
+
+import org.apache.olingo.commons.api.ODataException;
+import org.apache.olingo.commons.api.edm.FullQualifiedName;
+import org.apache.olingo.server.api.edm.provider.ComplexType;
+import org.apache.olingo.server.api.edm.provider.NavigationProperty;
+import org.apache.olingo.server.api.edm.provider.Property;
+
+public class ComplexTypeProvider {
+
+  public static final FullQualifiedName nameCTAllPrim = new FullQualifiedName(SchemaProvider.nameSpace, "CTAllPrim");
+  public static final FullQualifiedName nameCTBase = new FullQualifiedName(SchemaProvider.nameSpace, "CTBase");
+  public static final FullQualifiedName nameCTBasePrimCompNav = new FullQualifiedName(SchemaProvider.nameSpace, "CTBasePrimCompNav");
+  public static final FullQualifiedName nameCTCollAllPrim = new FullQualifiedName(SchemaProvider.nameSpace, "CTCollAllPrim");
+  public static final FullQualifiedName nameCTCompCollComp = new FullQualifiedName(SchemaProvider.nameSpace, "CTCompCollComp");
+  public static final FullQualifiedName nameCTCompComp = new FullQualifiedName(SchemaProvider.nameSpace, "CTCompComp");
+  public static final FullQualifiedName nameCTCompNav = new FullQualifiedName(SchemaProvider.nameSpace, "CTCompNav");
+
+  public static final FullQualifiedName nameCTMixPrimCollComp = new FullQualifiedName(SchemaProvider.nameSpace, "CTMixPrimCollComp");
+  public static final FullQualifiedName nameCTNavFiveProp = new FullQualifiedName(SchemaProvider.nameSpace, "CTNavFiveProp");
+  public static final FullQualifiedName nameCTPrim = new FullQualifiedName(SchemaProvider.nameSpace, "CTPrim");
+  public static final FullQualifiedName nameCTPrimComp = new FullQualifiedName(SchemaProvider.nameSpace, "CTPrimComp");
+  public static final FullQualifiedName nameCTPrimEnum = new FullQualifiedName(SchemaProvider.nameSpace, "CTPrimEnum");
+  public static final FullQualifiedName nameCTTwoBase = new FullQualifiedName(SchemaProvider.nameSpace, "CTTwoBase");
+  public static final FullQualifiedName nameCTTwoBasePrimCompNav =
+      new FullQualifiedName(SchemaProvider.nameSpace, "CTTwoBasePrimCompNav");
+  public static final FullQualifiedName nameCTTwoPrim = new FullQualifiedName(SchemaProvider.nameSpace, "CTTwoPrim");
+
+  public ComplexType getComplexType(final FullQualifiedName complexTypeName) throws ODataException {
+
+    if (complexTypeName.equals(nameCTPrim)) {
+      return new ComplexType()
+          .setName("CTPrim")
+          .setProperties(Arrays.asList(PropertyProvider.propertyInt16));
+
+    } else if (complexTypeName.equals(nameCTAllPrim)) {
+      return new ComplexType()
+          .setName("CTAllPrim")
+          .setProperties(
+              Arrays.asList(PropertyProvider.propertyString, PropertyProvider.propertyBinary,
+                  PropertyProvider.propertyBoolean, PropertyProvider.propertyByte, PropertyProvider.propertyDate,
+                  PropertyProvider.propertyDateTimeOffset, PropertyProvider.propertyDecimal,
+                  PropertyProvider.propertySingle, PropertyProvider.propertyDouble, PropertyProvider.propertyDuration,
+                  PropertyProvider.propertyGuid, PropertyProvider.propertyInt16, PropertyProvider.propertyInt32,
+                  PropertyProvider.propertyInt64, PropertyProvider.propertySByte, PropertyProvider.propertyTimeOfDay
+                  /* TODO add propertyStream */));
+
+    } else if (complexTypeName.equals(nameCTCollAllPrim)) {
+      return new ComplexType()
+          .setName("CTCollAllPrim")
+          .setProperties(
+              Arrays.asList(
+                  PropertyProvider.collPropertyString, PropertyProvider.collPropertyBoolean,
+                  PropertyProvider.collPropertyByte, PropertyProvider.collPropertySByte,
+                  PropertyProvider.collPropertyInt16, PropertyProvider.collPropertyInt32,
+                  PropertyProvider.collPropertyInt64, PropertyProvider.collPropertySingle,
+                  PropertyProvider.collPropertyDouble, PropertyProvider.collPropertyDecimal,
+                  PropertyProvider.collPropertyBinary, PropertyProvider.collPropertyDate,
+                  PropertyProvider.collPropertyDateTimeOffset, PropertyProvider.collPropertyDuration,
+                  PropertyProvider.collPropertyGuid, PropertyProvider.collPropertyTimeOfDay
+                  /* TODO add collectionPropertyStream */));
+
+    } else if (complexTypeName.equals(nameCTTwoPrim)) {
+      return new ComplexType()
+          .setName("CTTwoPrim")
+          .setProperties(Arrays.asList(PropertyProvider.propertyInt16, PropertyProvider.propertyString));
+
+    } else if (complexTypeName.equals(nameCTCompNav)) {
+      return new ComplexType()
+          .setName("CTCompNav")
+          .setProperties(Arrays.asList(PropertyProvider.propertyInt16, PropertyProvider.propertyComplex_CTNavFiveProp));
+
+    } else if (complexTypeName.equals(nameCTMixPrimCollComp)) {
+      return new ComplexType()
+          .setName("CTMixPrimCollComp")
+          .setProperties(
+              Arrays.asList(PropertyProvider.propertyInt16, PropertyProvider.collPropertyString,
+                  PropertyProvider.propertyComplex_CTTwoPrim, PropertyProvider.collPropertyComplex_CTTwoPrim));
+
+    } else if (complexTypeName.equals(nameCTBase)) {
+      return new ComplexType()
+          .setName("CTBase")
+          .setBaseType(nameCTTwoPrim)
+          .setProperties(Arrays.asList(
+              new Property()
+                  .setName("AdditionalPropString")
+                  .setType(new FullQualifiedName("Edm", "String"))));
+
+    } else if (complexTypeName.equals(nameCTTwoBase)) {
+      return new ComplexType()
+          .setName("CTTwoBase")
+          .setBaseType(nameCTBase)
+          .setProperties(Arrays.asList(
+              new Property()
+                  .setName("AdditionalPropString")
+                  .setType(new FullQualifiedName("Edm", "String"))));
+
+    } else if (complexTypeName.equals(nameCTCompComp)) {
+      return new ComplexType()
+          .setName("CTCompComp")
+          .setProperties(Arrays.asList(PropertyProvider.propertyComplex_CTTwoPrim));
+
+    } else if (complexTypeName.equals(nameCTCompCollComp)) {
+      return new ComplexType()
+          .setName("CTCompComp")
+          .setProperties(Arrays.asList(PropertyProvider.collPropertyComplex_CTTwoPrim));
+
+    } else if (complexTypeName.equals(nameCTPrimComp)) {
+      return new ComplexType()
+          .setName("CTPrimComp")
+          .setProperties(Arrays.asList(PropertyProvider.propertyInt16, PropertyProvider.propertyComplex_CTAllPrim));
+
+    } else if (complexTypeName.equals(nameCTNavFiveProp)) {
+      return new ComplexType()
+          .setName("CTNavFiveProp")
+          .setProperties(Arrays.asList(PropertyProvider.propertyInt16))
+          .setNavigationProperties((Arrays.asList(
+              PropertyProvider.collectionNavPropertyETTwoKeyNavOne_ETTwoKeyNav,
+              PropertyProvider.collectionNavPropertyETTwoKeyNavMany_ETTwoKeyNav,
+              new NavigationProperty()
+                  .setName("NavPropertyETMediaOne")
+                  .setType(EntityTypeProvider.nameETMedia),
+              new NavigationProperty()
+                  .setName("NavPropertyETMediaMany")
+                  .setType(EntityTypeProvider.nameETMedia).setCollection(true)
+              )));
+
+    } else if (complexTypeName.equals(nameCTBasePrimCompNav)) {
+      return new ComplexType()
+          .setName("CTBasePrimCompNav")
+          .setBaseType(nameCTPrimComp)
+          .setNavigationProperties(Arrays.asList(
+              PropertyProvider.collectionNavPropertyETTwoKeyNavMany_ETTwoKeyNav,
+              PropertyProvider.collectionNavPropertyETTwoKeyNavOne_ETTwoKeyNav));
+
+    } else if (complexTypeName.equals(nameCTPrimEnum)) {
+      return new ComplexType()
+          .setName("CTPrimEnum")
+          .setProperties(Arrays.asList(PropertyProvider.propertyInt16, PropertyProvider.propertyEnumString_ENString));
+
+    } else if (complexTypeName.equals(nameCTTwoBasePrimCompNav)) {
+      return new ComplexType()
+          .setName("CTTwoBasePrimCompNav")
+          .setBaseType(nameCTBasePrimCompNav);
+
+    }
+
+    return null;
+  }
+
+}

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/59ef14f4/lib/server-core/src/test/java/org/apache/olingo/server/core/testutil/techprovider/ContainerProvider.java
----------------------------------------------------------------------
diff --git a/lib/server-core/src/test/java/org/apache/olingo/server/core/testutil/techprovider/ContainerProvider.java b/lib/server-core/src/test/java/org/apache/olingo/server/core/testutil/techprovider/ContainerProvider.java
new file mode 100644
index 0000000..62b11e2
--- /dev/null
+++ b/lib/server-core/src/test/java/org/apache/olingo/server/core/testutil/techprovider/ContainerProvider.java
@@ -0,0 +1,361 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.olingo.server.core.testutil.techprovider;
+
+import java.util.Arrays;
+
+import org.apache.olingo.commons.api.ODataException;
+import org.apache.olingo.commons.api.edm.FullQualifiedName;
+import org.apache.olingo.commons.api.edm.Target;
+import org.apache.olingo.server.api.edm.provider.ActionImport;
+import org.apache.olingo.server.api.edm.provider.EntityContainer;
+import org.apache.olingo.server.api.edm.provider.EntityContainerInfo;
+import org.apache.olingo.server.api.edm.provider.EntitySet;
+import org.apache.olingo.server.api.edm.provider.FunctionImport;
+import org.apache.olingo.server.api.edm.provider.NavigationPropertyBinding;
+import org.apache.olingo.server.api.edm.provider.Singleton;
+
+public class ContainerProvider {
+
+  public static final FullQualifiedName nameContainer = new FullQualifiedName(SchemaProvider.nameSpace, "Container");
+
+  EntityContainerInfo entityContainerInfoTest1 =
+      new EntityContainerInfo().setContainerName(nameContainer);
+
+  public EntityContainerInfo getEntityContainerInfo(final FullQualifiedName entityContainerName) throws ODataException {
+    if (entityContainerName == null) {
+      return entityContainerInfoTest1;
+    } else if (entityContainerName.equals(nameContainer)) {
+      return entityContainerInfoTest1;
+    }
+
+    return null;
+  }
+
+  public EntityContainer getEntityContainer() throws ODataException {
+    return null;
+  }
+
+  public EntitySet getEntitySet(final FullQualifiedName entityContainer, final String name) throws ODataException {
+    if (entityContainer == nameContainer) {
+      if (name.equals("ESAllPrim")) {
+        return new EntitySet()
+            .setName("ESAllPrim")
+            .setType(EntityTypeProvider.nameETAllPrim);
+
+      } else if (name.equals("ESCollAllPrim")) {
+        return new EntitySet()
+            .setName("ESCollAllPrim")
+            .setType(EntityTypeProvider.nameETCollAllPrim);
+
+      } else if (name.equals("ESTwoPrim")) {
+        return new EntitySet()
+            .setName("ESTwoPrim")
+            .setType(EntityTypeProvider.nameETTwoPrim);
+
+      } else if (name.equals("ESMixPrimCollComp")) {
+        return new EntitySet()
+            .setName("ESMixPrimCollComp")
+            .setType(EntityTypeProvider.nameETMixPrimCollComp);
+
+      } else if (name.equals("ESBase")) {
+        return new EntitySet()
+            .setName("ESBase")
+            .setType(EntityTypeProvider.nameETBase);
+
+      } else if (name.equals("ESTwoBase")) {
+        return new EntitySet()
+            .setName("ESTwoBase")
+            .setType(EntityTypeProvider.nameETTwoBase);
+
+      } else if (name.equals("ESTwoKeyTwoPrim")) {
+        return new EntitySet()
+            .setName("ESTwoKeyTwoPrim")
+            .setType(EntityTypeProvider.nameETTwoKeyTwoPrim);
+
+      } else if (name.equals("ESBaseTwoKeyTwoPrim")) {
+        return new EntitySet()
+            .setName("ESBaseTwoKeyTwoPrim")
+            .setType(EntityTypeProvider.nameETBaseTwoKeyTwoPrim);
+
+      } else if (name.equals("ESTwoBaseTwoKeyTwoPrim")) {
+        return new EntitySet()
+            .setName("ESTwoBaseTwoKeyTwoPrim")
+            .setType(EntityTypeProvider.nameETTwoBaseTwoKeyTwoPrim);
+
+      } else if (name.equals("ESAllKey")) {
+        return new EntitySet()
+            .setName("ESAllKey")
+            .setType(EntityTypeProvider.nameETAllKey);
+
+      } else if (name.equals("ESCompAllPrim")) {
+        return new EntitySet()
+            .setName("ESCompAllPrim")
+            .setType(EntityTypeProvider.nameETCompAllPrim);
+
+      } else if (name.equals("ESCompCollAllPrim")) {
+        return new EntitySet()
+            .setName("ESCompCollAllPrim")
+            .setType(EntityTypeProvider.nameETCompCollAllPrim);
+
+      } else if (name.equals("ESCompComp")) {
+        return new EntitySet()
+            .setName("ESCompComp")
+            .setType(EntityTypeProvider.nameETCompComp);
+
+      } else if (name.equals("ESCompCollComp")) {
+        return new EntitySet()
+            .setName("ESCompCollComp")
+            .setType(EntityTypeProvider.nameETCompCollComp);
+
+      } else if (name.equals("ESMedia")) {
+        return new EntitySet()
+            .setName("ESMedia")
+            .setType(EntityTypeProvider.nameETMedia)
+            .setIncludeInServiceDocument(true);
+
+      } else if (name.equals("ESKeyTwoKeyComp")) {
+        return new EntitySet()
+            .setName("ESKeyTwoKeyComp")
+            .setType(EntityTypeProvider.nameETKeyTwoKeyComp);
+
+      } else if (name.equals("ESInvisible")) {
+        return new EntitySet()
+            .setName("ESInvisible")
+            .setType(EntityTypeProvider.nameETAllPrim);
+
+      } else if (name.equals("ESServerSidePaging")) {
+        return new EntitySet()
+            .setName("ESServerSidePaging")
+            .setType(EntityTypeProvider.nameETServerSidePaging);
+
+      } else if (name.equals("ESAllNullable")) {
+        return new EntitySet()
+            .setName("ESAllNullable")
+            .setType(EntityTypeProvider.nameETAllNullable);
+
+      } else if (name.equals("ESKeyNav")) {
+        return new EntitySet()
+            .setName("ESKeyNav")
+            .setType(EntityTypeProvider.nameETKeyNav);
+
+      } else if (name.equals("ESTwoKeyNav")) {
+        return new EntitySet()
+            .setName("ESTwoKeyNav")
+            .setType(EntityTypeProvider.nameETTwoKeyNav);
+
+      } else if (name.equals("ESBaseTwoKeyNav")) {
+        return new EntitySet()
+            .setName("ESBaseTwoKeyNav")
+            .setType(EntityTypeProvider.nameETBaseTwoKeyNav);
+
+      } else if (name.equals("ESCompMixPrimCollComp")) {
+        return new EntitySet()
+            .setName("ESCompMixPrimCollComp")
+            .setType(EntityTypeProvider.nameETCompMixPrimCollComp);
+
+      } else if (name.equals("ESFourKeyAlias")) {
+        return new EntitySet()
+            .setName("ESFourKeyAlias")
+            .setType(EntityTypeProvider.nameETFourKeyAlias);
+      }
+    }
+
+    return null;
+  }
+
+  public ActionImport getActionImport(final FullQualifiedName entityContainer, final String name) throws ODataException
+  {
+    if (entityContainer.equals(nameContainer)) {
+      if (name.equals("AIRTPrimParam")) {
+        return new ActionImport()
+            .setName("AIRTPrimParam")
+            .setAction(ActionProvider.nameUARTPrimParam);
+
+      } else if (name.equals("AIRTPrimCollParam")) {
+        return new ActionImport()
+            .setName("AIRTPrimCollParam")
+            .setAction(ActionProvider.nameUARTPrimCollParam);
+
+      } else if (name.equals("AIRTCompParam")) {
+        return new ActionImport()
+            .setName("AIRTCompParam")
+            .setAction(ActionProvider.nameUARTCompParam);
+
+      } else if (name.equals("AIRTCompCollParam")) {
+        return new ActionImport()
+            .setName("AIRTCompCollParam")
+            .setAction(ActionProvider.nameUARTCompCollParam);
+
+      } else if (name.equals("AIRTETParam")) {
+        return new ActionImport()
+            .setName("AIRTETParam")
+            .setAction(ActionProvider.nameUARTETParam);
+
+      } else if (name.equals("AIRTETCollAllPrimParam")) {
+        return new ActionImport()
+            .setName("AIRTETCollAllPrimParam")
+            .setAction(ActionProvider.nameUARTETCollAllPrimParam);
+      }
+    }
+
+    return null;
+  }
+
+  public FunctionImport getFunctionImport(final FullQualifiedName entityContainer, final String name)
+      throws ODataException {
+
+    if (entityContainer.equals(nameContainer)) {
+      if (name.equals("FINRTInt16")) {
+        return new FunctionImport()
+            .setName("FINRTInt16")
+            .setFunction(FunctionProvider.nameUFNRTInt16)
+            .setIncludeInServiceDocument(true);
+
+      } else if (name.equals("FINInvisibleRTInt16")) {
+        return new FunctionImport()
+            .setName("FINInvisibleRTInt16")
+            .setFunction(FunctionProvider.nameUFNRTInt16);
+
+      } else if (name.equals("FINInvisible2RTInt16")) {
+        return new FunctionImport()
+            .setName("FINInvisible2RTInt16")
+            .setFunction(FunctionProvider.nameUFNRTInt16);
+
+      } else if (name.equals("FICRTETKeyNav")) {
+        return new FunctionImport()
+            .setName("FICRTETKeyNav")
+            .setFunction(FunctionProvider.nameUFCRTETKeyNav);
+
+      } else if (name.equals("FICRTETTwoKeyNavParam")) {
+        return new FunctionImport()
+            .setName("FICRTETTwoKeyNavParam")
+            .setFunction(FunctionProvider.nameUFCRTETTwoKeyNavParam)
+            .setIncludeInServiceDocument(true);
+
+      } else if (name.equals("FICRTStringTwoParam")) {
+        return new FunctionImport()
+            .setName("FICRTStringTwoParam")
+            .setFunction(FunctionProvider.nameUFCRTStringTwoParam)
+            .setIncludeInServiceDocument(true);
+
+      } else if (name.equals("FICRTCollStringTwoParam")) {
+        return new FunctionImport()
+            .setName("FICRTCollStringTwoParam")
+            .setFunction(FunctionProvider.nameUFCRTCollStringTwoParam)
+            .setIncludeInServiceDocument(true);
+
+      } else if (name.equals("FICRTCTAllPrimTwoParam")) {
+        return new FunctionImport()
+            .setName("FICRTCTAllPrimTwoParam")
+            .setFunction(FunctionProvider.nameUFCRTCTAllPrimTwoParam)
+            .setIncludeInServiceDocument(true);
+
+      } else if (name.equals("FICRTESMixPrimCollCompTwoParam")) {
+        return new FunctionImport()
+            .setName("FICRTESMixPrimCollCompTwoParam")
+            .setFunction(FunctionProvider.nameUFCRTESMixPrimCollCompTwoParam)
+            .setIncludeInServiceDocument(true);
+
+      } else if (name.equals("FINRTESMixPrimCollCompTwoParam")) {
+        return new FunctionImport()
+            .setName("FINRTESMixPrimCollCompTwoParam")
+            .setFunction(FunctionProvider.nameUFNRTESMixPrimCollCompTwoParam)
+            .setIncludeInServiceDocument(true);
+
+      } else if (name.equals("FICRTCollCTTwoPrim")) {
+        return new FunctionImport()
+            .setName("FICRTCollCTTwoPrim")
+            .setFunction(FunctionProvider.nameUFCRTCollCTTwoPrim)
+            .setIncludeInServiceDocument(true);
+
+      } else if (name.equals("FICRTETMedia")) {
+        return new FunctionImport()
+            .setName("FICRTETMedia")
+            .setFunction(FunctionProvider.nameUFCRTETMedia)
+            .setIncludeInServiceDocument(true);
+
+      } else if (name.equals("FICRTCTTwoPrimParam")) {
+        return new FunctionImport()
+            .setName("FICRTCTTwoPrimParam")
+            .setFunction(FunctionProvider.nameUFCRTCTTwoPrimParam)
+            .setIncludeInServiceDocument(true);
+
+      } else if (name.equals("FICRTCTTwoPrim")) {
+        return new FunctionImport()
+            .setName("FICRTCTTwoPrim")
+            .setFunction(FunctionProvider.nameUFCRTCTTwoPrim)
+            .setIncludeInServiceDocument(true);
+
+      } else if (name.equals("FICRTCollString")) {
+        return new FunctionImport()
+            .setName("FICRTCollString")
+            .setFunction(FunctionProvider.nameUFCRTCollString)
+            .setIncludeInServiceDocument(true);
+
+      } else if (name.equals("FICRTString")) {
+        return new FunctionImport()
+            .setName("FICRTString")
+            .setFunction(FunctionProvider.nameUFCRTString)
+            .setIncludeInServiceDocument(true);
+
+      } else if (name.equals("FICRTESTwoKeyNavParam")) {
+        return new FunctionImport()
+            .setName("FICRTESTwoKeyNavParam")
+            .setFunction(FunctionProvider.nameUFCRTESTwoKeyNavParam)
+            .setIncludeInServiceDocument(true);
+
+      } else if (name.equals("FICRTCollCTTwoPrimParam")) {
+        return new FunctionImport()
+            .setName("FICRTCollCTTwoPrimParam")
+            .setFunction(FunctionProvider.nameUFCRTCollCTTwoPrimParam)
+            .setIncludeInServiceDocument(true);
+
+      }
+    }
+
+    return null;
+  }
+
+  public Singleton getSingleton(final FullQualifiedName entityContainer, final String name) throws ODataException {
+    if (entityContainer.equals(nameContainer)) {
+
+      if (name.equals("SI")) {
+        return new Singleton()
+            .setName("SI")
+            .setType(EntityTypeProvider.nameETTwoPrim);
+
+      } else if (name.equals("SINav")) {
+        return new Singleton()
+            .setName("SINav")
+            .setType(EntityTypeProvider.nameETTwoKeyNav)
+            .setNavigationPropertyBindings(Arrays.asList(
+                new NavigationPropertyBinding()
+                    .setPath("NavPropertyETTwoKeyNavMany")
+                    .setTarget(new Target().setTargetName("ESTwoKeyNav"))));
+
+      } else if (name.equals("SIMedia")) {
+        return new Singleton()
+            .setName("SIMedia")
+            .setType(EntityTypeProvider.nameETMedia);
+      }
+    }
+    return null;
+  }
+}

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/59ef14f4/lib/server-core/src/test/java/org/apache/olingo/server/core/testutil/techprovider/EdmTechProvider.java
----------------------------------------------------------------------
diff --git a/lib/server-core/src/test/java/org/apache/olingo/server/core/testutil/techprovider/EdmTechProvider.java b/lib/server-core/src/test/java/org/apache/olingo/server/core/testutil/techprovider/EdmTechProvider.java
new file mode 100644
index 0000000..45a35c8
--- /dev/null
+++ b/lib/server-core/src/test/java/org/apache/olingo/server/core/testutil/techprovider/EdmTechProvider.java
@@ -0,0 +1,135 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.olingo.server.core.testutil.techprovider;
+
+import java.util.Arrays;
+import java.util.List;
+
+import org.apache.olingo.commons.api.ODataException;
+import org.apache.olingo.commons.api.edm.FullQualifiedName;
+import org.apache.olingo.server.api.edm.provider.Action;
+import org.apache.olingo.server.api.edm.provider.ActionImport;
+import org.apache.olingo.server.api.edm.provider.AliasInfo;
+import org.apache.olingo.server.api.edm.provider.ComplexType;
+import org.apache.olingo.server.api.edm.provider.EdmProvider;
+import org.apache.olingo.server.api.edm.provider.EntityContainer;
+import org.apache.olingo.server.api.edm.provider.EntityContainerInfo;
+import org.apache.olingo.server.api.edm.provider.EntitySet;
+import org.apache.olingo.server.api.edm.provider.EntityType;
+import org.apache.olingo.server.api.edm.provider.EnumType;
+import org.apache.olingo.server.api.edm.provider.Function;
+import org.apache.olingo.server.api.edm.provider.FunctionImport;
+import org.apache.olingo.server.api.edm.provider.Schema;
+import org.apache.olingo.server.api.edm.provider.Singleton;
+import org.apache.olingo.server.api.edm.provider.Term;
+import org.apache.olingo.server.api.edm.provider.TypeDefinition;
+
+public class EdmTechProvider extends EdmProvider {
+
+  public static final String nameSpace = "com.sap.odata.test1";
+
+  private final SchemaProvider schemaProvider;
+  private final EntityTypeProvider entityTypeProvider;
+  private final ContainerProvider containerProvider;
+  private final ComplexTypeProvider complexTypeProvider;
+  private final EnumTypeProvider enumTypeProvider;
+  private final ActionProvider actionProvider;
+  private final FunctionProvider functionProvider;
+  private final TypeDefinitionProvider typeDefinitionProvider;
+
+  public EdmTechProvider() {
+    containerProvider = new ContainerProvider();
+    entityTypeProvider = new EntityTypeProvider();
+    complexTypeProvider = new ComplexTypeProvider();
+    enumTypeProvider = new EnumTypeProvider();
+    actionProvider = new ActionProvider();
+    functionProvider = new FunctionProvider();
+    typeDefinitionProvider = new TypeDefinitionProvider();
+    schemaProvider = new SchemaProvider(this);
+  }
+
+  @Override
+  public List<AliasInfo> getAliasInfos() throws ODataException {
+    return Arrays.asList(
+        new AliasInfo().setAlias("Namespace1_Alias").setNamespace(nameSpace)
+        );
+  }
+
+  public EnumType getEnumType(final FullQualifiedName enumTypeName) throws ODataException {
+    return enumTypeProvider.getEnumType(enumTypeName);
+  }
+
+  public TypeDefinition getTypeDefinition(final FullQualifiedName typeDefinitionName) throws ODataException {
+    return typeDefinitionProvider.getTypeDefinition(typeDefinitionName);
+  }
+
+  public EntityType getEntityType(final FullQualifiedName entityTypeName) throws ODataException {
+    return entityTypeProvider.getEntityType(entityTypeName);
+  }
+
+  public ComplexType getComplexType(final FullQualifiedName complexTypeName) throws ODataException {
+    return complexTypeProvider.getComplexType(complexTypeName);
+  }
+
+  public List<Action> getActions(final FullQualifiedName actionName) throws ODataException {
+    return actionProvider.getActions(actionName);
+  }
+
+  public List<Function> getFunctions(final FullQualifiedName functionName) throws ODataException {
+    return functionProvider.getFunctions(functionName);
+  }
+
+  public Term getTerm(final FullQualifiedName termName) throws ODataException {
+    return null;
+  }
+
+  public EntitySet getEntitySet(final FullQualifiedName entityContainer, final String entitySetName)
+      throws ODataException {
+    return containerProvider.getEntitySet(entityContainer, entitySetName);
+  }
+
+  public Singleton getSingleton(final FullQualifiedName entityContainer, final String singletonName)
+      throws ODataException {
+    return containerProvider.getSingleton(entityContainer, singletonName);
+  }
+
+  public ActionImport getActionImport(final FullQualifiedName entityContainer, final String actionImportName)
+      throws ODataException {
+    return containerProvider.getActionImport(entityContainer, actionImportName);
+  }
+
+  public FunctionImport getFunctionImport(final FullQualifiedName entityContainer, final String functionImportName)
+      throws ODataException {
+    return containerProvider.getFunctionImport(entityContainer, functionImportName);
+  }
+
+  public List<Schema> getSchemas() throws ODataException {
+    return schemaProvider.getSchemas();
+  }
+
+  @Override
+  public EntityContainer getEntityContainer() throws ODataException {
+    return containerProvider.getEntityContainer();
+  }
+
+  @Override
+  public EntityContainerInfo getEntityContainerInfo(final FullQualifiedName entityContainerName) throws ODataException {
+    return containerProvider.getEntityContainerInfo(entityContainerName);
+  }
+}

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/59ef14f4/lib/server-core/src/test/java/org/apache/olingo/server/core/testutil/techprovider/EntityTypeProvider.java
----------------------------------------------------------------------
diff --git a/lib/server-core/src/test/java/org/apache/olingo/server/core/testutil/techprovider/EntityTypeProvider.java b/lib/server-core/src/test/java/org/apache/olingo/server/core/testutil/techprovider/EntityTypeProvider.java
new file mode 100644
index 0000000..fd93d5d
--- /dev/null
+++ b/lib/server-core/src/test/java/org/apache/olingo/server/core/testutil/techprovider/EntityTypeProvider.java
@@ -0,0 +1,395 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.olingo.server.core.testutil.techprovider;
+
+import java.util.Arrays;
+
+import org.apache.olingo.commons.api.ODataException;
+import org.apache.olingo.commons.api.edm.FullQualifiedName;
+import org.apache.olingo.server.api.edm.provider.EntityType;
+import org.apache.olingo.server.api.edm.provider.NavigationProperty;
+import org.apache.olingo.server.api.edm.provider.Property;
+import org.apache.olingo.server.api.edm.provider.PropertyRef;
+import org.apache.olingo.server.api.edm.provider.ReferentialConstraint;
+
+public class EntityTypeProvider {
+
+  public static final FullQualifiedName nameETAllKey = new FullQualifiedName(SchemaProvider.nameSpace, "ETAllKey");
+  public static final FullQualifiedName nameETAllNullable = new FullQualifiedName(SchemaProvider.nameSpace, "ETAllNullable");
+  public static final FullQualifiedName nameETAllPrim = new FullQualifiedName(SchemaProvider.nameSpace, "ETAllPrim");
+  public static final FullQualifiedName nameETBase = new FullQualifiedName(SchemaProvider.nameSpace, "ETBase");
+  public static final FullQualifiedName nameETBaseTwoKeyNav = new FullQualifiedName(SchemaProvider.nameSpace, "ETBaseTwoKeyNav");
+  public static final FullQualifiedName nameETBaseTwoKeyTwoPrim =
+      new FullQualifiedName(SchemaProvider.nameSpace, "ETBaseTwoKeyTwoPrim");
+  public static final FullQualifiedName nameETCollAllPrim = new FullQualifiedName(SchemaProvider.nameSpace, "ETCollAllPrim");
+  public static final FullQualifiedName nameETCompAllPrim = new FullQualifiedName(SchemaProvider.nameSpace, "ETCompAllPrim");
+  public static final FullQualifiedName nameETCompCollAllPrim = new FullQualifiedName(SchemaProvider.nameSpace, "ETCompCollAllPrim");
+  public static final FullQualifiedName nameETCompCollComp = new FullQualifiedName(SchemaProvider.nameSpace, "ETCompCollComp");
+  public static final FullQualifiedName nameETCompComp = new FullQualifiedName(SchemaProvider.nameSpace, "ETCompComp");
+  public static final FullQualifiedName nameETCompMixPrimCollComp =
+      new FullQualifiedName(SchemaProvider.nameSpace, "ETCompMixPrimCollComp");
+  public static final FullQualifiedName nameETFourKeyAlias = new FullQualifiedName(SchemaProvider.nameSpace, "ETFourKeyAlias");
+  public static final FullQualifiedName nameETKeyNav = new FullQualifiedName(SchemaProvider.nameSpace, "ETKeyNav");
+  public static final FullQualifiedName nameETKeyPrimNav = new FullQualifiedName(SchemaProvider.nameSpace, "ETKeyPrimNav");
+  public static final FullQualifiedName nameETKeyTwoKeyComp = new FullQualifiedName(SchemaProvider.nameSpace, "ETKeyTwoKeyComp");
+  public static final FullQualifiedName nameETMedia = new FullQualifiedName(SchemaProvider.nameSpace, "ETMedia");
+  public static final FullQualifiedName nameETMixPrimCollComp = new FullQualifiedName(SchemaProvider.nameSpace, "ETMixPrimCollComp");
+  public static final FullQualifiedName nameETServerSidePaging =
+      new FullQualifiedName(SchemaProvider.nameSpace, "ETServerSidePaging");
+  public static final FullQualifiedName nameETTwoBase = new FullQualifiedName(SchemaProvider.nameSpace, "ETTwoBase");
+  public static final FullQualifiedName nameETTwoBaseTwoKeyNav =
+      new FullQualifiedName(SchemaProvider.nameSpace, "ETTwoBaseTwoKeyNav");
+  public static final FullQualifiedName nameETTwoBaseTwoKeyTwoPrim =
+      new FullQualifiedName(SchemaProvider.nameSpace, "ETTwoBaseTwoKeyTwoPrim");
+  public static final FullQualifiedName nameETTwoKeyNav = new FullQualifiedName(SchemaProvider.nameSpace, "ETTwoKeyNav");
+  public static final FullQualifiedName nameETTwoKeyTwoPrim = new FullQualifiedName(SchemaProvider.nameSpace, "ETTwoKeyTwoPrim");
+  public static final FullQualifiedName nameETTwoPrim = new FullQualifiedName(SchemaProvider.nameSpace, "ETTwoPrim");
+
+  public EntityType getEntityType(final FullQualifiedName entityTypeName) throws ODataException {
+    if (entityTypeName.equals(nameETAllPrim)) {
+      return new EntityType()
+          .setName("ETAllPrim")
+          .setKey(Arrays.asList(
+              new PropertyRef().setPropertyName("PropertyInt16")))
+          .setProperties(Arrays.asList(
+              PropertyProvider.propertyInt16_NotNullable, PropertyProvider.propertyString,
+              PropertyProvider.propertyBoolean, PropertyProvider.propertyByte, PropertyProvider.propertySByte,
+              PropertyProvider.propertyInt32, PropertyProvider.propertyInt64,
+              PropertyProvider.propertySingle, PropertyProvider.propertyDouble, PropertyProvider.propertyDecimal,
+              PropertyProvider.propertyBinary, PropertyProvider.propertyDate, PropertyProvider.propertyDateTimeOffset,
+              PropertyProvider.propertyDuration, PropertyProvider.propertyGuid, PropertyProvider.propertyTimeOfDay
+              /* TODO add propertyStream */));
+
+    } else if (entityTypeName.equals(nameETCollAllPrim)) {
+      return new EntityType()
+          .setName("ETCollAllPrim")
+          .setKey(Arrays.asList(new PropertyRef().setPropertyName("PropertyInt16")))
+
+          .setProperties(
+              Arrays.asList(
+                  PropertyProvider.propertyInt16_NotNullable, PropertyProvider.collPropertyString,
+                  PropertyProvider.collPropertyBoolean, PropertyProvider.collPropertyByte,
+                  PropertyProvider.collPropertySByte, PropertyProvider.collPropertyInt16,
+                  PropertyProvider.collPropertyInt32, PropertyProvider.collPropertyInt64,
+                  PropertyProvider.collPropertySingle, PropertyProvider.collPropertyDouble,
+                  PropertyProvider.collPropertyDecimal, PropertyProvider.collPropertyBinary,
+                  PropertyProvider.collPropertyDate, PropertyProvider.collPropertyDateTimeOffset,
+                  PropertyProvider.collPropertyDuration, PropertyProvider.collPropertyGuid,
+                  PropertyProvider.collPropertyTimeOfDay /* TODO add propertyStream */));
+
+    } else if (entityTypeName.equals(nameETTwoPrim)) {
+      return new EntityType()
+          .setName("ETTwoPrim")
+          .setKey(Arrays.asList(new PropertyRef().setPropertyName("PropertyInt16")))
+          .setProperties(Arrays.asList(
+              PropertyProvider.propertyInt16_NotNullable, PropertyProvider.propertyString));
+
+    } else if (entityTypeName.equals(nameETMixPrimCollComp)) {
+      return new EntityType()
+          .setName("ETMixPrimCollComp")
+          .setKey(Arrays.asList(new PropertyRef().setPropertyName("PropertyInt16")))
+          .setProperties(Arrays.asList(
+              PropertyProvider.propertyInt16_NotNullable, PropertyProvider.collPropertyString,
+              PropertyProvider.propertyComplex_CTTwoPrim, PropertyProvider.collPropertyComplex_CTTwoPrim));
+
+    } else if (entityTypeName.equals(nameETTwoKeyTwoPrim)) {
+      return new EntityType()
+          .setName("ETTwoKeyTwoPrim")
+          .setKey(Arrays.asList(
+              new PropertyRef().setPropertyName("PropertyInt16"),
+              new PropertyRef().setPropertyName("PropertyString")))
+          .setProperties(Arrays.asList(
+              PropertyProvider.propertyInt16_NotNullable, PropertyProvider.propertyString));
+
+    } else if (entityTypeName.equals(nameETBaseTwoKeyTwoPrim)) {
+      return new EntityType()
+          .setName("ETBaseTwoKeyTwoPrim")
+          .setBaseType(nameETTwoKeyTwoPrim);
+
+    } else if (entityTypeName.equals(nameETTwoBaseTwoKeyTwoPrim)) {
+      return new EntityType()
+          .setName("ETTwoBaseTwoKeyTwoPrim")
+          .setBaseType(nameETTwoKeyTwoPrim);
+
+    } else if (entityTypeName.equals(nameETBase)) {
+      return new EntityType()
+          .setName("ETBase")
+          .setBaseType(nameETTwoPrim)
+          .setProperties(Arrays.asList(new Property()
+              .setName("AdditionalPropertyString_5")
+              .setType(PropertyProvider.nameString)));
+
+    } else if (entityTypeName.equals(nameETTwoBase)) {
+      return new EntityType()
+          .setName("ETTwoBase")
+          .setBaseType(nameETBase)
+          .setProperties(Arrays.asList(new Property()
+              .setName("AdditionalPropertyString_6")
+              .setType(PropertyProvider.nameString))
+          );
+
+    } else if (entityTypeName.equals(nameETAllKey)) {
+      return new EntityType()
+          .setName("ETAllKey")
+          .setKey(Arrays.asList(
+              new PropertyRef().setPropertyName("PropertyString"),
+              new PropertyRef().setPropertyName("PropertyBoolean"),
+              new PropertyRef().setPropertyName("PropertyByte"),
+              new PropertyRef().setPropertyName("PropertySByte"),
+              new PropertyRef().setPropertyName("PropertyInt16"),
+              new PropertyRef().setPropertyName("PropertyInt32"),
+              new PropertyRef().setPropertyName("PropertyInt64"),
+              new PropertyRef().setPropertyName("PropertyDecimal"),
+              new PropertyRef().setPropertyName("PropertyDate"),
+              new PropertyRef().setPropertyName("PropertyDateTimeOffset"),
+              new PropertyRef().setPropertyName("PropertyDuration"),
+              new PropertyRef().setPropertyName("PropertyGuid"),
+              new PropertyRef().setPropertyName("PropertyTimeOfDay")))
+          .setProperties(
+              Arrays.asList(
+                  PropertyProvider.propertyString, PropertyProvider.propertyBoolean,
+                  PropertyProvider.propertyByte, PropertyProvider.propertySByte,
+                  PropertyProvider.propertyInt16, PropertyProvider.propertyInt32, PropertyProvider.propertyInt64,
+                  PropertyProvider.propertyDecimal, PropertyProvider.propertyDate,
+                  PropertyProvider.propertySingle, PropertyProvider.propertyDouble,
+                  PropertyProvider.propertyDateTimeOffset,
+                  PropertyProvider.propertyDuration, PropertyProvider.propertyGuid,
+                  PropertyProvider.propertyTimeOfDay /* TODO add propertyStream */));
+
+    } else if (entityTypeName.equals(nameETCompAllPrim)) {
+      return new EntityType()
+          .setName("ETCompAllPrim")
+          .setKey(Arrays.asList(new PropertyRef().setPropertyName("PropertyInt16")))
+          .setProperties(
+              Arrays.asList(PropertyProvider.propertyInt16_NotNullable, PropertyProvider.propertyComplex_CTAllPrim));
+
+    } else if (entityTypeName.equals(nameETCompCollAllPrim)) {
+      return new EntityType()
+          .setName("ETCompAllPrim")
+          .setKey(Arrays.asList(new PropertyRef().setPropertyName("PropertyInt16")))
+
+          .setProperties(
+              Arrays.asList(PropertyProvider.propertyInt16_NotNullable, 
+                  PropertyProvider.propertyComplex_CTCollAllPrim));
+
+    } else if (entityTypeName.equals(nameETCompComp)) {
+      return new EntityType()
+          .setName("ETCompComp")
+          .setKey(Arrays.asList(new PropertyRef().setPropertyName("PropertyInt16")))
+          .setProperties(
+              Arrays.asList(PropertyProvider.propertyInt16_NotNullable, PropertyProvider.propertyComplex_CTCompComp));
+
+    } else if (entityTypeName.equals(nameETCompCollComp)) {
+      return new EntityType()
+          .setName("ETCompCollComp")
+          .setKey(Arrays.asList(new PropertyRef().setPropertyName("PropertyInt16")))
+          .setProperties(
+              Arrays
+                  .asList(PropertyProvider.propertyInt16_NotNullable, PropertyProvider.propertyComplex_CTCompCollComp));
+
+    } else if (entityTypeName.equals(nameETMedia)) {
+      return new EntityType()
+          .setName("ETCompCollComp")
+          .setKey(Arrays.asList(new PropertyRef().setPropertyName("PropertyInt16")))
+          .setProperties(Arrays.asList(PropertyProvider.propertyInt16_NotNullable))
+          .setHasStream(true);
+
+    } else if (entityTypeName.equals(nameETKeyTwoKeyComp)) {
+      return new EntityType()
+          .setName("ETKeyTwoKeyComp")
+          .setKey(Arrays.asList(
+              new PropertyRef()
+                  .setPropertyName("PropertyInt16"),
+              new PropertyRef()
+                  .setPropertyName("PropertyComplex/PropertyInt16")
+                  .setAlias("KeyAlias1"),
+              new PropertyRef()
+                  .setPropertyName("PropertyComplex/PropertyString")
+                  .setAlias("KeyAlias2"),
+              new PropertyRef()
+                  .setPropertyName("PropertyComplexComplex/PropertyComplex/PropertyString")
+                  .setAlias("KeyAlias3")))
+          .setProperties(
+              Arrays.asList(
+                  PropertyProvider.propertyInt16_NotNullable, PropertyProvider.propertyComplex_CTTwoPrim,
+                  PropertyProvider.propertyComplexComplex_CTCompComp));
+
+    } else if (entityTypeName.equals(nameETServerSidePaging)) {
+      return new EntityType()
+          .setName("ETKeyTwoKeyComp")
+          .setKey(Arrays.asList(new PropertyRef().setPropertyName("PropertyInt16")))
+          .setProperties(Arrays.asList(PropertyProvider.propertyInt16_NotNullable, PropertyProvider.propertyString));
+
+    } else if (entityTypeName.equals(nameETAllNullable)) {
+      return new EntityType()
+          .setName("ETAllNullable")
+          .setKey(Arrays.asList(new PropertyRef().setPropertyName("PropertyKey")))
+          .setProperties(
+              Arrays.asList(
+                  new Property()
+                      .setName("PropertyKey").setType(PropertyProvider.nameInt16),
+                  PropertyProvider.propertyInt16,
+                  PropertyProvider.propertyString, PropertyProvider.propertyBoolean,
+                  PropertyProvider.propertyByte, PropertyProvider.propertySByte,
+                  PropertyProvider.propertyInt32, PropertyProvider.propertyInt64,
+                  PropertyProvider.propertySingle, PropertyProvider.propertyDouble,
+                  PropertyProvider.propertyDecimal, PropertyProvider.propertyBinary, PropertyProvider.propertyDate,
+                  PropertyProvider.propertyDateTimeOffset,
+                  PropertyProvider.propertyDuration, PropertyProvider.propertyGuid,
+                  PropertyProvider.propertyTimeOfDay /* TODO add propertyStream */,
+                  PropertyProvider.collPropertyString, PropertyProvider.collPropertyBoolean,
+                  PropertyProvider.collPropertyByte, PropertyProvider.collPropertySByte,
+                  PropertyProvider.collPropertyInt16,
+                  PropertyProvider.collPropertyInt32, PropertyProvider.collPropertyInt64,
+                  PropertyProvider.collPropertySingle, PropertyProvider.collPropertyDouble,
+                  PropertyProvider.collPropertyDecimal, PropertyProvider.collPropertyBinary,
+                  PropertyProvider.collPropertyDate,
+                  PropertyProvider.collPropertyDateTimeOffset,
+                  PropertyProvider.collPropertyDuration, PropertyProvider.collPropertyGuid,
+                  PropertyProvider.collPropertyTimeOfDay /* TODO add propertyStream */));
+
+    } else if (entityTypeName.equals(nameETKeyNav)) {
+      return new EntityType()
+          .setName("ETKeyNav")
+          .setKey(Arrays.asList(new PropertyRef().setPropertyName("PropertyInt16")))
+          .setProperties(
+              Arrays.asList(
+                  PropertyProvider.propertyInt16_NotNullable, PropertyProvider.propertyString_NotNullable,
+                  PropertyProvider.propertyComplex_CTNavFiveProp,
+                  PropertyProvider.propertyComplexAllPrim_CTAllPrim, PropertyProvider.propertyComplexTwoPrim_CTTwoPrim,
+                  PropertyProvider.collPropertyString, PropertyProvider.collPropertyInt16,
+                  PropertyProvider.collPropertyComplex_CTPrimComp,
+                  new Property()
+                      .setName("PropertyComplexComplex").setType(ComplexTypeProvider.nameCTCompNav)
+                  ))
+          .setNavigationProperties(
+              Arrays.asList(
+                  PropertyProvider.navPropertyETTwoKeyNavOne_ETTwoKeyNav,
+                  PropertyProvider.collectionNavPropertyETTwoKeyNavMany_ETTwoKeyNav,
+                  PropertyProvider.navPropertyETKeyNavOne_ETKeyNav,
+                  PropertyProvider.collectionNavPropertyETKeyNavMany_ETKeyNav,
+                  PropertyProvider.navPropertyETMediaOne_ETMedia,
+                  PropertyProvider.collectionNavPropertyETMediaMany_ETMedia
+                  ));
+    } else if (entityTypeName.equals(nameETKeyPrimNav)) {
+      return new EntityType()
+          .setName("ETKeyNav")
+          .setKey(Arrays.asList(new PropertyRef().setPropertyName("PropertyInt16")))
+          .setProperties(Arrays.asList(
+              PropertyProvider.propertyInt16_NotNullable, PropertyProvider.propertyString_NotNullable))
+          .setNavigationProperties(
+              Arrays.asList(
+                  PropertyProvider.navPropertyETTwoKeyNavOne_ETTwoKeyNav,
+                  PropertyProvider.collectionNavPropertyETTwoKeyNavMany_ETTwoKeyNav,
+                  PropertyProvider.navPropertyETKeyNavOne_ETKeyNav,
+                  PropertyProvider.collectionNavPropertyETKeyNavMany_ETKeyNav,
+                  PropertyProvider.navPropertyETMediaOne_ETMedia,
+                  PropertyProvider.collectionNavPropertyETMediaMany_ETMedia
+                  ));
+
+    } else if (entityTypeName.equals(nameETTwoKeyNav)) {
+      return new EntityType()
+          .setName("ETTwoKeyNav")
+          .setKey(Arrays.asList(
+              new PropertyRef().setPropertyName("PropertyInt16"),
+              new PropertyRef().setPropertyName("PropertyString")))
+          .setProperties(
+              Arrays.asList(
+                  PropertyProvider.propertyInt16, PropertyProvider.propertyString,
+                  PropertyProvider.propertyComplex_CTPrimComp_NotNullable,
+                  new Property().setName("PropertyComplexNav").setType(ComplexTypeProvider.nameCTBasePrimCompNav),
+                  PropertyProvider.propertyComplexEnum_CTPrimEnum_NotNullable,
+                  PropertyProvider.collPropertyComplex_CTPrimComp,
+                  new Property().setName("CollPropertyComplexNav").setType(ComplexTypeProvider.nameCTNavFiveProp)
+                      .setCollection(true),
+                  PropertyProvider.collPropertyString, PropertyProvider.propertyComplexTwoPrim_CTTwoPrim,
+                  PropertyProvider.propertyEnumString_ENString
+                  ))
+          .setNavigationProperties(Arrays.asList(
+              new NavigationProperty()
+                  .setName("NavPropertyETKeyNavOne")
+                  .setType(nameETKeyNav)
+                  .setReferentialConstraints(Arrays.asList(
+                      new ReferentialConstraint()
+                          .setProperty("PropertyInt16")
+                          .setReferencedProperty("PropertyInt16"))),
+              PropertyProvider.collectionNavPropertyETKeyNavMany_ETKeyNav,
+              PropertyProvider.navPropertyETTwoKeyNavOne_ETTwoKeyNav,
+              PropertyProvider.collectionNavPropertyETTwoKeyNavMany_ETTwoKeyNav));
+
+    } else if (entityTypeName.equals(nameETBaseTwoKeyNav)) {
+      return new EntityType()
+          .setName("ETBaseTwoKeyNav")
+          .setBaseType(nameETTwoKeyNav)
+          .setProperties(Arrays.asList(PropertyProvider.propertyDate))
+          .setNavigationProperties(Arrays.asList(
+              new NavigationProperty()
+                  .setName("NavPropertyETBaseTwoKeyNav")
+                  .setType(nameETBaseTwoKeyNav),
+              new NavigationProperty()
+                  .setName("NavPropertyETTwoBaseTwoKeyNav")
+                  .setType(nameETTwoBaseTwoKeyNav)))
+          .setHasStream(true);
+
+    } else if (entityTypeName.equals(nameETTwoBaseTwoKeyNav)) {
+      return new EntityType()
+          .setName("ETTwoBaseTwoKeyNav")
+          .setBaseType(nameETBaseTwoKeyNav)
+          .setKey(Arrays.asList(new PropertyRef().setPropertyName("PropertyInt16")))
+          .setProperties(Arrays.asList(PropertyProvider.propertyGuid))
+          .setNavigationProperties(Arrays.asList(
+              new NavigationProperty()
+                  .setName("NavPropertyETBaseTwoKeyNavOne")
+                  .setType(nameETBaseTwoKeyNav),
+              new NavigationProperty()
+                  .setName("NavPropertyETBaseTwoKeyNavMany")
+                  .setType(nameETBaseTwoKeyNav)
+                  .setCollection(true)
+              ));
+
+    } else if (entityTypeName.equals(nameETFourKeyAlias)) {
+      return new EntityType()
+          .setName("ETFourKeyAlias")
+          .setKey(Arrays.asList(
+              new PropertyRef()
+                  .setPropertyName("PropertyInt16"),
+              new PropertyRef()
+                  .setPropertyName("PropertyComplex/PropertyInt16").setAlias("KeyAlias1"),
+              new PropertyRef()
+                  .setPropertyName("PropertyComplex/PropertyString").setAlias("KeyAlias2"),
+              new PropertyRef()
+                  .setPropertyName("PropertyComplexComplex/PropertyComplex/PropertyString")
+                  .setAlias("KeyAlias3")))
+          .setProperties(
+              Arrays.asList(PropertyProvider.propertyGuid, PropertyProvider.propertyComplex_CTTwoPrim,
+                  PropertyProvider.propertyComplexComplex_CTCompComp));
+    } else if (entityTypeName.equals(nameETCompMixPrimCollComp)) {
+      return new EntityType()
+          .setName("ETCompMixPrimCollComp")
+          .setKey(Arrays.asList(
+              new PropertyRef()
+                  .setPropertyName("PropertyInt16")))
+          .setProperties(
+              Arrays.asList(PropertyProvider.propertyInt16_NotNullable,
+                  PropertyProvider.propertyMixedPrimCollComp_CTMixPrimCollComp));
+    }
+
+    return null;
+  }
+}

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/59ef14f4/lib/server-core/src/test/java/org/apache/olingo/server/core/testutil/techprovider/EnumTypeProvider.java
----------------------------------------------------------------------
diff --git a/lib/server-core/src/test/java/org/apache/olingo/server/core/testutil/techprovider/EnumTypeProvider.java b/lib/server-core/src/test/java/org/apache/olingo/server/core/testutil/techprovider/EnumTypeProvider.java
new file mode 100644
index 0000000..0640a99
--- /dev/null
+++ b/lib/server-core/src/test/java/org/apache/olingo/server/core/testutil/techprovider/EnumTypeProvider.java
@@ -0,0 +1,44 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.olingo.server.core.testutil.techprovider;
+
+import java.util.Arrays;
+
+import org.apache.olingo.commons.api.ODataException;
+import org.apache.olingo.commons.api.edm.FullQualifiedName;
+import org.apache.olingo.server.api.edm.provider.EnumMember;
+import org.apache.olingo.server.api.edm.provider.EnumType;
+
+public class EnumTypeProvider {
+
+  public static final FullQualifiedName nameENString = new FullQualifiedName(SchemaProvider.nameSpace, "ENString");
+
+  public EnumType getEnumType(final FullQualifiedName enumTypeName) throws ODataException {
+    if (enumTypeName.equals(nameENString)) {
+      return new EnumType()
+          .setName("ENString")
+          .setMembers(Arrays.asList(
+              new EnumMember().setName("String1").setValue("1"),
+              new EnumMember().setName("String2").setValue("2"),
+              new EnumMember().setName("String3").setValue("3")));
+    }
+
+    return null;
+  }
+}


[5/9] [OLINGO-168] Refactor Tech Provider

Posted by ch...@apache.org.
http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/59ef14f4/lib/server-core/src/test/java/org/apache/olingo/server/core/testutil/EdmTechProvider.java
----------------------------------------------------------------------
diff --git a/lib/server-core/src/test/java/org/apache/olingo/server/core/testutil/EdmTechProvider.java b/lib/server-core/src/test/java/org/apache/olingo/server/core/testutil/EdmTechProvider.java
deleted file mode 100644
index bbfd107..0000000
--- a/lib/server-core/src/test/java/org/apache/olingo/server/core/testutil/EdmTechProvider.java
+++ /dev/null
@@ -1,2200 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.olingo.server.core.testutil;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-
-import org.apache.olingo.commons.api.ODataException;
-import org.apache.olingo.commons.api.edm.FullQualifiedName;
-import org.apache.olingo.commons.api.edm.Target;
-import org.apache.olingo.commons.core.edm.primitivetype.EdmPrimitiveTypeKind;
-import org.apache.olingo.server.api.edm.provider.Action;
-import org.apache.olingo.server.api.edm.provider.ActionImport;
-import org.apache.olingo.server.api.edm.provider.AliasInfo;
-import org.apache.olingo.server.api.edm.provider.ComplexType;
-import org.apache.olingo.server.api.edm.provider.EdmProvider;
-import org.apache.olingo.server.api.edm.provider.EntityContainer;
-import org.apache.olingo.server.api.edm.provider.EntityContainerInfo;
-import org.apache.olingo.server.api.edm.provider.EntitySet;
-import org.apache.olingo.server.api.edm.provider.EntityType;
-import org.apache.olingo.server.api.edm.provider.EnumMember;
-import org.apache.olingo.server.api.edm.provider.EnumType;
-import org.apache.olingo.server.api.edm.provider.Function;
-import org.apache.olingo.server.api.edm.provider.FunctionImport;
-import org.apache.olingo.server.api.edm.provider.NavigationProperty;
-import org.apache.olingo.server.api.edm.provider.NavigationPropertyBinding;
-import org.apache.olingo.server.api.edm.provider.Parameter;
-import org.apache.olingo.server.api.edm.provider.Property;
-import org.apache.olingo.server.api.edm.provider.PropertyRef;
-import org.apache.olingo.server.api.edm.provider.ReferentialConstraint;
-import org.apache.olingo.server.api.edm.provider.ReturnType;
-import org.apache.olingo.server.api.edm.provider.Schema;
-import org.apache.olingo.server.api.edm.provider.Singleton;
-
-public class EdmTechProvider extends EdmProvider {
-
-  public static final String nameSpace = "com.sap.odata.test1";
-
-  public static final FullQualifiedName nameBAESAllPrimRTETAllPrim =
-      new FullQualifiedName(nameSpace, "BAESAllPrimRTETAllPrim");
-
-  public static final FullQualifiedName nameBAESTwoKeyNavRTESTwoKeyNav =
-      new FullQualifiedName(nameSpace, "BAESTwoKeyNavRTESTwoKeyNav");
-
-  public static final FullQualifiedName nameBAETBaseTwoKeyNavRTETBaseTwoKeyNav =
-      new FullQualifiedName(nameSpace, "BAETBaseTwoKeyNavRTETBaseTwoKeyNav");
-
-  public static final FullQualifiedName nameBAETTwoBaseTwoKeyNavRTETBaseTwoKeyNav =
-      new FullQualifiedName(nameSpace, "BAETTwoBaseTwoKeyNavRTETBaseTwoKeyNav");
-
-  public static final FullQualifiedName nameBAETTwoKeyNavRTETTwoKeyNav =
-      new FullQualifiedName(nameSpace, "BAETTwoKeyNavRTETTwoKeyNav");
-
-  public static final FullQualifiedName nameBFCCollCTPrimCompRTESAllPrim =
-      new FullQualifiedName(nameSpace, "BFCCollCTPrimCompRTESAllPrim");
-
-  public static final FullQualifiedName nameBFCCollStringRTESTwoKeyNav =
-      new FullQualifiedName(nameSpace, "BFCCollStringRTESTwoKeyNav");
-
-  public static final FullQualifiedName nameBFCCTPrimCompRTESBaseTwoKeyNav =
-      new FullQualifiedName(nameSpace, "BFCCTPrimCompRTESBaseTwoKeyNav");
-
-  public static final FullQualifiedName nameBFCCTPrimCompRTESTwoKeyNav =
-      new FullQualifiedName(nameSpace, "BFCCTPrimCompRTESTwoKeyNav");
-
-  public static final FullQualifiedName nameBFCCTPrimCompRTESTwoKeyNavParam =
-      new FullQualifiedName(nameSpace, "BFCCTPrimCompRTESTwoKeyNavParam");
-
-  public static final FullQualifiedName nameBFCCTPrimCompRTETTwoKeyNavParam =
-      new FullQualifiedName(nameSpace, "BFCCTPrimCompRTETTwoKeyNavParam");
-
-  public static final FullQualifiedName nameBFCESAllPrimRTCTAllPrim =
-      new FullQualifiedName(nameSpace, "BFCESAllPrimRTCTAllPrim");
-
-  public static final FullQualifiedName nameBFCESBaseTwoKeyNavRTESBaseTwoKey =
-      new FullQualifiedName(nameSpace, "BFCESBaseTwoKeyNavRTESBaseTwoKey");
-
-  public static final FullQualifiedName nameBFCESKeyNavRTETKeyNav =
-      new FullQualifiedName(nameSpace, "BFCESKeyNavRTETKeyNav");
-
-  public static final FullQualifiedName nameBFCESKeyNavRTETKeyNavParam =
-      new FullQualifiedName(nameSpace, "BFCESKeyNavRTETKeyNavParam");
-
-  public static final FullQualifiedName nameBFCESTwoKeyNavRTCollCTTwoPrim =
-      new FullQualifiedName(nameSpace, "BFCESTwoKeyNavRTCollCTTwoPrim");
-
-  public static final FullQualifiedName nameBFCESTwoKeyNavRTCollString =
-      new FullQualifiedName(nameSpace, "BFCESTwoKeyNavRTCollString");
-
-  public static final FullQualifiedName nameBFCESTwoKeyNavRTCTTwoPrim =
-      new FullQualifiedName(nameSpace, "BFCESTwoKeyNavRTCTTwoPrim");
-
-  public static final FullQualifiedName nameBFCESTwoKeyNavRTESTwoKeyNav =
-      new FullQualifiedName(nameSpace, "BFCESTwoKeyNavRTESTwoKeyNav");
-
-  public static final FullQualifiedName nameBFCESTwoKeyNavRTString =
-      new FullQualifiedName(nameSpace, "BFCESTwoKeyNavRTString");
-
-  public static final FullQualifiedName nameBFCESTwoKeyNavRTStringParam =
-      new FullQualifiedName(nameSpace, "BFCESTwoKeyNavRTStringParam");
-
-  public static final FullQualifiedName nameBFCESTwoKeyNavRTTwoKeyNav =
-      new FullQualifiedName(nameSpace, "BFCESTwoKeyNavRTTwoKeyNav");
-
-  public static final FullQualifiedName nameBFCETBaseTwoKeyNavRTESBaseTwoKey =
-      new FullQualifiedName(nameSpace, "BFCETBaseTwoKeyNavRTESBaseTwoKey");
-
-  public static final FullQualifiedName nameBFCETBaseTwoKeyNavRTESTwoKeyNav =
-      new FullQualifiedName(nameSpace, "BFCETBaseTwoKeyNavRTESTwoKeyNav");
-
-  public static final FullQualifiedName nameBFCETBaseTwoKeyNavRTETTwoKeyNav =
-      new FullQualifiedName(nameSpace, "BFCETBaseTwoKeyNavRTETTwoKeyNav");
-
-  public static final FullQualifiedName nameBFCETKeyNavRTETKeyNav =
-      new FullQualifiedName(nameSpace, "BFCETKeyNavRTETKeyNav");
-
-  public static final FullQualifiedName nameBFCETTwoKeyNavRTCTTwoPrim =
-      new FullQualifiedName(nameSpace, "BFCETTwoKeyNavRTCTTwoPrim");
-
-  public static final FullQualifiedName nameBFCETTwoKeyNavRTESTwoKeyNav =
-      new FullQualifiedName(nameSpace, "BFCETTwoKeyNavRTESTwoKeyNav");
-
-  public static final FullQualifiedName nameBFCETTwoKeyNavRTETTwoKeyNav =
-      new FullQualifiedName(nameSpace, "BFCETTwoKeyNavRTETTwoKeyNav");
-
-  public static final FullQualifiedName nameBFCSINavRTESTwoKeyNav =
-      new FullQualifiedName(nameSpace, "BFCSINavRTESTwoKeyNav");
-
-  public static final FullQualifiedName nameBFCStringRTESTwoKeyNav =
-      new FullQualifiedName(nameSpace, "BFCStringRTESTwoKeyNav");
-
-  public static final FullQualifiedName nameBFESTwoKeyNavRTESTwoKeyNav =
-      new FullQualifiedName(nameSpace, "BFESTwoKeyNavRTESTwoKeyNav");
-
-  public static final FullQualifiedName nameBinary = EdmPrimitiveTypeKind.Binary.getFullQualifiedName();
-  public static final FullQualifiedName nameBoolean = EdmPrimitiveTypeKind.Boolean.getFullQualifiedName();
-  public static final FullQualifiedName nameByte = EdmPrimitiveTypeKind.Byte.getFullQualifiedName();
-  public static final FullQualifiedName nameContainer = new FullQualifiedName(nameSpace, "Container");
-  public static final FullQualifiedName nameCTAllPrim = new FullQualifiedName(nameSpace, "CTAllPrim");
-  public static final FullQualifiedName nameCTBase = new FullQualifiedName(nameSpace, "CTBase");
-  public static final FullQualifiedName nameCTBasePrimCompNav = new FullQualifiedName(nameSpace, "CTBasePrimCompNav");
-  public static final FullQualifiedName nameCTCollAllPrim = new FullQualifiedName(nameSpace, "CTCollAllPrim");
-  public static final FullQualifiedName nameCTCompCollComp = new FullQualifiedName(nameSpace, "CTCompCollComp");
-  public static final FullQualifiedName nameCTCompComp = new FullQualifiedName(nameSpace, "CTCompComp");
-  public static final FullQualifiedName nameCTCompNav = new FullQualifiedName(nameSpace, "CTCompNav");
-
-  public static final FullQualifiedName nameCTMixPrimCollComp = new FullQualifiedName(nameSpace, "CTMixPrimCollComp");
-  public static final FullQualifiedName nameCTNavFiveProp = new FullQualifiedName(nameSpace, "CTNavFiveProp");
-  public static final FullQualifiedName nameCTPrim = new FullQualifiedName(nameSpace, "CTPrim");
-  public static final FullQualifiedName nameCTPrimComp = new FullQualifiedName(nameSpace, "CTPrimComp");
-  public static final FullQualifiedName nameCTPrimEnum = new FullQualifiedName(nameSpace, "CTPrimEnum");
-  public static final FullQualifiedName nameCTTwoBase = new FullQualifiedName(nameSpace, "CTTwoBase");
-  public static final FullQualifiedName nameCTTwoBasePrimCompNav =
-      new FullQualifiedName(nameSpace, "CTTwoBasePrimCompNav");
-  public static final FullQualifiedName nameCTTwoPrim = new FullQualifiedName(nameSpace, "CTTwoPrim");
-  public static final FullQualifiedName nameDate = EdmPrimitiveTypeKind.Date.getFullQualifiedName();
-  public static final FullQualifiedName nameDateTimeOffset =
-      EdmPrimitiveTypeKind.DateTimeOffset.getFullQualifiedName();
-
-  public static final FullQualifiedName nameDecimal = EdmPrimitiveTypeKind.Decimal.getFullQualifiedName();
-  public static final FullQualifiedName nameDouble = EdmPrimitiveTypeKind.Double.getFullQualifiedName();
-  public static final FullQualifiedName nameDuration = EdmPrimitiveTypeKind.Duration.getFullQualifiedName();
-  public static final FullQualifiedName nameENString = new FullQualifiedName(nameSpace, "ENString");
-  public static final FullQualifiedName nameETAllKey = new FullQualifiedName(nameSpace, "ETAllKey");
-  public static final FullQualifiedName nameETAllNullable = new FullQualifiedName(nameSpace, "ETAllNullable");
-  public static final FullQualifiedName nameETAllPrim = new FullQualifiedName(nameSpace, "ETAllPrim");
-  public static final FullQualifiedName nameETBase = new FullQualifiedName(nameSpace, "ETBase");
-  public static final FullQualifiedName nameETBaseTwoKeyNav = new FullQualifiedName(nameSpace, "ETBaseTwoKeyNav");
-  public static final FullQualifiedName nameETBaseTwoKeyTwoPrim =
-      new FullQualifiedName(nameSpace, "ETBaseTwoKeyTwoPrim");
-  public static final FullQualifiedName nameETCollAllPrim = new FullQualifiedName(nameSpace, "ETCollAllPrim");
-  public static final FullQualifiedName nameETCompAllPrim = new FullQualifiedName(nameSpace, "ETCompAllPrim");
-  public static final FullQualifiedName nameETCompCollAllPrim = new FullQualifiedName(nameSpace, "ETCompCollAllPrim");
-  public static final FullQualifiedName nameETCompCollComp = new FullQualifiedName(nameSpace, "ETCompCollComp");
-  public static final FullQualifiedName nameETCompComp = new FullQualifiedName(nameSpace, "ETCompComp");
-  public static final FullQualifiedName nameETCompMixPrimCollComp =
-      new FullQualifiedName(nameSpace, "ETCompMixPrimCollComp");
-  public static final FullQualifiedName nameETFourKeyAlias = new FullQualifiedName(nameSpace, "ETFourKeyAlias");
-  public static final FullQualifiedName nameETKeyNav = new FullQualifiedName(nameSpace, "ETKeyNav");
-  public static final FullQualifiedName nameETKeyPrimNav = new FullQualifiedName(nameSpace, "ETKeyPrimNav");
-  public static final FullQualifiedName nameETKeyTwoKeyComp = new FullQualifiedName(nameSpace, "ETKeyTwoKeyComp");
-  public static final FullQualifiedName nameETMedia = new FullQualifiedName(nameSpace, "ETMedia");
-  public static final FullQualifiedName nameETMixPrimCollComp = new FullQualifiedName(nameSpace, "ETMixPrimCollComp");
-  public static final FullQualifiedName nameETServerSidePaging =
-      new FullQualifiedName(nameSpace, "ETServerSidePaging");
-  public static final FullQualifiedName nameETTwoBase = new FullQualifiedName(nameSpace, "ETTwoBase");
-  public static final FullQualifiedName nameETTwoBaseTwoKeyNav =
-      new FullQualifiedName(nameSpace, "ETTwoBaseTwoKeyNav");
-  public static final FullQualifiedName nameETTwoBaseTwoKeyTwoPrim =
-      new FullQualifiedName(nameSpace, "ETTwoBaseTwoKeyTwoPrim");
-  public static final FullQualifiedName nameETTwoKeyNav = new FullQualifiedName(nameSpace, "ETTwoKeyNav");
-  public static final FullQualifiedName nameETTwoKeyTwoPrim = new FullQualifiedName(nameSpace, "ETTwoKeyTwoPrim");
-  public static final FullQualifiedName nameETTwoPrim = new FullQualifiedName(nameSpace, "ETTwoPrim");
-  public static final FullQualifiedName nameGuid = EdmPrimitiveTypeKind.Guid.getFullQualifiedName();
-  public static final FullQualifiedName nameInt16 = EdmPrimitiveTypeKind.Int16.getFullQualifiedName();
-  public static final FullQualifiedName nameInt32 = EdmPrimitiveTypeKind.Int32.getFullQualifiedName();
-  public static final FullQualifiedName nameInt64 = EdmPrimitiveTypeKind.Int64.getFullQualifiedName();
-
-  public static final FullQualifiedName nameSByte = EdmPrimitiveTypeKind.SByte.getFullQualifiedName();
-  public static final FullQualifiedName nameSingle = EdmPrimitiveTypeKind.Single.getFullQualifiedName();
-
-  public static final FullQualifiedName nameString = EdmPrimitiveTypeKind.String.getFullQualifiedName();
-  public static final FullQualifiedName nameTimeOfDay = EdmPrimitiveTypeKind.TimeOfDay.getFullQualifiedName();
-  public static final FullQualifiedName nameUARTCompCollParam = new FullQualifiedName(nameSpace, "UARTCompCollParam");
-  public static final FullQualifiedName nameUARTCompParam = new FullQualifiedName(nameSpace, "UARTCompParam");
-  public static final FullQualifiedName nameUARTETCollAllPrimParam =
-      new FullQualifiedName(nameSpace, "UARTETCollAllPrimParam");
-
-  public static final FullQualifiedName nameUARTETParam = new FullQualifiedName(nameSpace, "UARTETParam");
-  public static final FullQualifiedName nameUARTPrimParam = new FullQualifiedName(nameSpace, "UARTPrimParam");
-  public static final FullQualifiedName nameUARTPrimCollParam = new FullQualifiedName(nameSpace, "UARTPrimCollParam");
-  public static final FullQualifiedName nameUFCRTCollCTTwoPrim =
-      new FullQualifiedName(nameSpace, "UFCRTCollCTTwoPrim");
-  public static final FullQualifiedName nameUFCRTCollCTTwoPrimParam =
-      new FullQualifiedName(nameSpace, "UFCRTCollCTTwoPrimParam");
-  public static final FullQualifiedName nameUFCRTCollString = new FullQualifiedName(nameSpace, "UFCRTCollString");
-  public static final FullQualifiedName nameUFCRTCollStringTwoParam =
-      new FullQualifiedName(nameSpace, "UFCRTCollStringTwoParam");
-  public static final FullQualifiedName nameUFCRTCTAllPrimTwoParam =
-      new FullQualifiedName(nameSpace, "UFCRTCTAllPrimTwoParam");
-  public static final FullQualifiedName nameUFCRTCTTwoPrim = new FullQualifiedName(nameSpace, "UFCRTCTTwoPrim");
-  public static final FullQualifiedName nameUFCRTCTTwoPrimParam =
-      new FullQualifiedName(nameSpace, "UFCRTCTTwoPrimParam");
-  public static final FullQualifiedName nameUFCRTESMixPrimCollCompTwoParam =
-      new FullQualifiedName(nameSpace, "UFCRTESMixPrimCollCompTwoParam");
-  public static final FullQualifiedName nameUFCRTESTwoKeyNavParam =
-      new FullQualifiedName(nameSpace, "UFCRTESTwoKeyNavParam");
-  public static final FullQualifiedName nameUFCRTETAllPrimTwoParam =
-      new FullQualifiedName(nameSpace, "UFCRTETAllPrimTwoParam");
-  public static final FullQualifiedName nameUFCRTETKeyNav = new FullQualifiedName(nameSpace, "UFCRTETKeyNav");
-  public static final FullQualifiedName nameUFCRTETMedia = new FullQualifiedName(nameSpace, "UFCRTETMedia");
-
-  public static final FullQualifiedName nameUFCRTETTwoKeyNavParam =
-      new FullQualifiedName(nameSpace, "UFCRTETTwoKeyNavParam");
-
-  public static final FullQualifiedName nameUFCRTETTwoKeyNavParamCTTwoPrim =
-      new FullQualifiedName(nameSpace, "UFCRTETTwoKeyNavParamCTTwoPrim");
-
-  public static final FullQualifiedName nameUFCRTString = new FullQualifiedName(nameSpace, "UFCRTString");
-
-  public static final FullQualifiedName nameUFCRTStringTwoParam =
-      new FullQualifiedName(nameSpace, "UFCRTStringTwoParam");
-
-  public static final FullQualifiedName nameUFNRTESMixPrimCollCompTwoParam =
-      new FullQualifiedName(nameSpace, "UFNRTESMixPrimCollCompTwoParam");
-  public static final FullQualifiedName nameUFNRTInt16 =
-      new FullQualifiedName(nameSpace, "UFNRTInt16");
-
-  NavigationProperty collectionNavPropertyETKeyNavMany_ETKeyNav = new NavigationProperty()
-      .setName("NavPropertyETKeyNavMany")
-      .setType(nameETKeyNav)
-      .setCollection(true);
-
-  NavigationProperty collectionNavPropertyETMediaMany_ETMedia = new NavigationProperty()
-      .setName("NavPropertyETMediaMany")
-      .setType(nameETMedia)
-      .setCollection(true);
-
-  NavigationProperty collectionNavPropertyETTwoKeyNavMany_ETTwoKeyNav = new NavigationProperty()
-      .setName("NavPropertyETTwoKeyNavMany")
-      .setType(nameETTwoKeyNav)
-      .setCollection(true)
-      .setPartner("NavPropertyETKeyNavOne");
-
-  NavigationProperty collectionNavPropertyETTwoKeyNavOne_ETTwoKeyNav = new NavigationProperty()
-      .setName("NavPropertyETTwoKeyNavOne")
-      .setType(nameETTwoKeyNav);
-
-  Property collPropertyBinary = new Property()
-      .setName("CollPropertyBinary")
-      .setType(nameBinary)
-      .setCollection(true);
-
-  Property collPropertyBoolean = new Property()
-      .setName("CollPropertyBoolean")
-      .setType(nameBoolean)
-      .setCollection(true);
-
-  Property collPropertyByte = new Property()
-      .setName("CollPropertyByte")
-      .setType(nameByte)
-      .setCollection(true);
-
-  Property collPropertyComplex_CTPrimComp = new Property()
-      .setName("CollPropertyComplex")
-      .setType(nameCTPrimComp)
-      .setCollection(true);
-
-  Property collPropertyComplex_CTTwoPrim = new Property()
-      .setName("CollPropertyComplex")
-      .setType(nameCTTwoPrim)
-      .setCollection(true);
-
-  Property collPropertyDate = new Property()
-      .setName("CollPropertyDate")
-      .setType(nameDate)
-      .setCollection(true);
-
-  Property collPropertyDateTimeOffset = new Property()
-      .setName("CollPropertyDateTimeOffset")
-      .setType(nameDateTimeOffset)
-      .setCollection(true);
-
-  Property collPropertyDecimal = new Property()
-      .setName("CollPropertyDecimal")
-      .setType(nameDecimal)
-      .setCollection(true);
-
-  Property collPropertyDouble = new Property()
-      .setName("CollPropertyDouble")
-      .setType(nameDouble)
-      .setCollection(true);
-
-  Property collPropertyDuration = new Property()
-      .setName("CollPropertyDuration")
-      .setType(nameDuration)
-      .setCollection(true);
-  Property collPropertyGuid = new Property()
-      .setName("CollPropertyGuid")
-      .setType(nameGuid)
-      .setCollection(true);
-  Property collPropertyInt16 = new Property()
-      .setName("CollPropertyInt16")
-      .setType(nameInt16)
-      .setCollection(true);
-  Property collPropertyInt32 = new Property()
-      .setName("CollPropertyInt32")
-      .setType(nameInt32)
-      .setCollection(true);
-  Property collPropertyInt64 = new Property()
-      .setName("CollPropertyInt64")
-      .setType(nameInt64)
-      .setCollection(true);
-
-  Property collPropertySByte = new Property()
-      .setName("CollPropertySByte")
-      .setType(nameSByte)
-      .setCollection(true);
-
-  Property collPropertySingle = new Property()
-      .setName("CollPropertySingle")
-      .setType(nameSingle)
-      .setCollection(true);
-  Property collPropertyString = new Property()
-      .setName("CollPropertyString")
-      .setType(nameString)
-      .setCollection(true);
-  Property collPropertyTimeOfDay = new Property()
-      .setName("CollPropertyTimeOfDay")
-      .setType(nameTimeOfDay)
-      .setCollection(true);
-  EntityContainerInfo entityContainerInfoTest1 =
-      new EntityContainerInfo().setContainerName(nameContainer);
-  NavigationProperty navPropertyETKeyNavOne_ETKeyNav = new NavigationProperty()
-      .setName("NavPropertyETKeyNavOne")
-      .setType(nameETKeyNav);
-  NavigationProperty navPropertyETMediaOne_ETMedia = new NavigationProperty()
-      .setName("NavPropertyETMediaOne")
-      .setType(nameETMedia);
-
-  /*
-   * TODO add propertyStream
-   * Property propertyStream = new Property()
-   * .setName("PropertyStream")
-   * .setType(EdmStream.getFullQualifiedName());
-   */
-
-  NavigationProperty navPropertyETKeyPrimNavOne = new NavigationProperty()
-      .setName("NavPropertyETKeyPrimNavOne")
-      .setType(nameETKeyPrimNav);
-
-  NavigationProperty navPropertyETTwoKeyNavOne_ETTwoKeyNav = new NavigationProperty()
-      .setName("NavPropertyETTwoKeyNavOne")
-      .setType(nameETTwoKeyNav);
-  Property propertyBinary = new Property()
-      .setName("PropertyBinary")
-      .setType(nameBinary);
-  Property propertyBoolean = new Property()
-      .setName("PropertyBoolean")
-      .setType(nameBoolean);
-  Property propertyByte = new Property()
-      .setName("PropertyByte")
-      .setType(nameByte);
-  Property propertyComplex_CTAllPrim = new Property()
-      .setName("PropertyComplex")
-      .setType(nameCTAllPrim);
-  Property propertyComplex_CTCollAllPrim = new Property()
-      .setName("PropertyComplex")
-      .setType(nameCTCollAllPrim);
-  Property propertyComplex_CTCompCollComp = new Property()
-      .setName("PropertyComplex")
-      .setType(nameCTCompCollComp);
-  Property propertyComplex_CTCompComp = new Property()
-      .setName("PropertyComplex")
-      .setType(nameCTCompComp);
-  Property propertyComplex_CTNavFiveProp = new Property()
-      .setName("PropertyComplex")
-      .setType(nameCTNavFiveProp);
-  Property propertyComplex_CTPrimComp_NotNullable = new Property()
-      .setName("PropertyComplex")
-      .setType(nameCTPrimComp);
-  Property propertyComplex_CTTwoPrim = new Property()
-      .setName("PropertyComplex")
-      .setType(nameCTTwoPrim);
-  Property propertyComplexAllPrim_CTAllPrim = new Property()
-      .setName("PropertyComplexAllPrim")
-      .setType(nameCTAllPrim);
-  Property propertyComplexComplex_CTCompComp = new Property()
-      .setName("PropertyComplexComplex")
-      .setType(nameCTCompComp);
-  Property propertyComplexEnum_CTPrimEnum_NotNullable = new Property()
-      .setName("PropertyComplexEnum")
-      .setType(nameCTPrimEnum);
-  Property propertyComplexTwoPrim_CTTwoPrim = new Property()
-      .setName("PropertyComplexTwoPrim")
-      .setType(nameCTTwoPrim);
-  Property propertyDate = new Property()
-      .setName("PropertyDate")
-      .setType(nameDate);
-
-  Property propertyDateTimeOffset = new Property()
-      .setName("PropertyDateTimeOffset")
-      .setType(nameDateTimeOffset);
-
-  Property propertyDecimal = new Property()
-      .setName("PropertyDecimal")
-      .setType(nameDecimal);
-
-  Property propertyDouble = new Property()
-      .setName("PropertyDouble")
-      .setType(nameDouble);
-
-  Property propertyDuration = new Property()
-      .setName("PropertyDuration")
-      .setType(nameDuration);
-
-  Property propertyEnumString_ENString = new Property()
-      .setName("PropertyEnumString")
-      .setType(nameENString);
-
-  Property propertyGuid = new Property()
-      .setName("PropertyGuid")
-      .setType(nameGuid);
-
-  Property propertyInt16 = new Property()
-      .setName("PropertyInt16")
-      .setType(nameInt16);
-
-  Property propertyInt16_NotNullable = new Property()
-      .setName("PropertyInt16")
-      .setType(nameInt16)
-      .setNullable(false);
-  Property propertyInt32 = new Property()
-      .setName("PropertyInt32")
-      .setType(nameInt32);
-
-  Property propertyInt64 = new Property()
-      .setName("PropertyInt64")
-      .setType(nameInt64);
-
-  Property propertyMixedPrimCollComp_CTMixPrimCollComp = new Property()
-      .setName("PropertyMixedPrimCollComp")
-      .setType(nameCTMixPrimCollComp)
-      .setCollection(true);
-
-  Property propertySByte = new Property()
-      .setName("PropertySByte")
-      .setType(nameSByte);
-
-  Property propertySingle = new Property()
-      .setName("PropertySingle")
-      .setType(nameSingle);
-
-  Property propertyString = new Property()
-      .setName("PropertyString")
-      .setType(nameString);
-
-  Property propertyString_NotNullable = new Property()
-      .setName("PropertyString")
-      .setType(nameString);
-
-  Property propertyTimeOfDay = new Property().setName("PropertyTimeOfDay")
-      .setType(nameTimeOfDay);
-
-  @Override
-  public EntityContainer getEntityContainer() throws ODataException {
-    // TODO Auto-generated method stub
-    return super.getEntityContainer();
-  }
-
-  @Override
-  public List<Schema> getSchemas() throws ODataException {
-    List<Schema> schemas = new ArrayList<Schema>();
-    Schema schema = new Schema();
-    schema.setNamespace("com.sap.odata.test1");
-    schema.setAlias("Namespace1_Alias");
-    schemas.add(schema);
-    // EnumTypes
-    List<EnumType> enumTypes = new ArrayList<EnumType>();
-    schema.setEnumTypes(enumTypes);
-    enumTypes.add(getEnumType(nameENString));
-    // EntityTypes
-    List<EntityType> entityTypes = new ArrayList<EntityType>();
-    schema.setEntityTypes(entityTypes);
-    entityTypes.add(getEntityType(nameETAllPrim));
-    entityTypes.add(getEntityType(nameETCollAllPrim));
-    entityTypes.add(getEntityType(nameETTwoPrim));
-    entityTypes.add(getEntityType(nameETMixPrimCollComp));
-    entityTypes.add(getEntityType(nameETTwoKeyTwoPrim));
-    entityTypes.add(getEntityType(nameETBase));
-    entityTypes.add(getEntityType(nameETTwoBase));
-    entityTypes.add(getEntityType(nameETAllKey));
-    entityTypes.add(getEntityType(nameETCompAllPrim));
-    entityTypes.add(getEntityType(nameETCompCollAllPrim));
-    entityTypes.add(getEntityType(nameETCompComp));
-    entityTypes.add(getEntityType(nameETCompCollComp));
-    entityTypes.add(getEntityType(nameETMedia));
-    entityTypes.add(getEntityType(nameETFourKeyAlias));
-    entityTypes.add(getEntityType(nameETServerSidePaging));
-    entityTypes.add(getEntityType(nameETAllNullable));
-    entityTypes.add(getEntityType(nameETKeyNav));
-    entityTypes.add(getEntityType(nameETTwoKeyNav));
-    entityTypes.add(getEntityType(nameETBaseTwoKeyNav));
-    entityTypes.add(getEntityType(nameETTwoBaseTwoKeyNav));
-    entityTypes.add(getEntityType(nameETCompMixPrimCollComp));
-    entityTypes.add(getEntityType(nameETKeyPrimNav));
-
-    // ComplexTypes
-    List<ComplexType> complexType = new ArrayList<ComplexType>();
-    schema.setComplexTypes(complexType);
-    complexType.add(getComplexType(nameCTPrim));
-    complexType.add(getComplexType(nameCTAllPrim));
-    complexType.add(getComplexType(nameCTCollAllPrim));
-    complexType.add(getComplexType(nameCTTwoPrim));
-    complexType.add(getComplexType(nameCTMixPrimCollComp));
-    complexType.add(getComplexType(nameCTBase));
-    complexType.add(getComplexType(nameCTTwoBase));
-    complexType.add(getComplexType(nameCTCompComp));
-    complexType.add(getComplexType(nameCTCompCollComp));
-    complexType.add(getComplexType(nameCTPrimComp));
-    complexType.add(getComplexType(nameCTNavFiveProp));
-    complexType.add(getComplexType(nameCTPrimEnum));
-    complexType.add(getComplexType(nameCTBasePrimCompNav));
-    complexType.add(getComplexType(nameCTTwoBasePrimCompNav));
-    complexType.add(getComplexType(nameCTCompNav));
-
-    // TypeDefinitions
-
-    // Actions
-    List<Action> actions = new ArrayList<Action>();
-    schema.setActions(actions);
-    actions.addAll(getActions(nameUARTPrimParam));
-    actions.addAll(getActions(nameUARTPrimCollParam));
-    actions.addAll(getActions(nameUARTCompParam));
-    actions.addAll(getActions(nameUARTCompCollParam));
-    actions.addAll(getActions(nameUARTETParam));
-    actions.addAll(getActions(nameUARTETCollAllPrimParam));
-    actions.addAll(getActions(nameBAETTwoKeyNavRTETTwoKeyNav));
-    actions.addAll(getActions(nameBAESAllPrimRTETAllPrim));
-    actions.addAll(getActions(nameBAESTwoKeyNavRTESTwoKeyNav));
-    actions.addAll(getActions(nameBAETBaseTwoKeyNavRTETBaseTwoKeyNav));
-    actions.addAll(getActions(nameBAETTwoBaseTwoKeyNavRTETBaseTwoKeyNav));
-
-    // Functions
-    List<Function> functions = new ArrayList<Function>();
-    schema.setFunctions(functions);
-
-    functions.addAll(getFunctions(nameUFNRTInt16));
-    functions.addAll(getFunctions(nameUFCRTETKeyNav));
-    functions.addAll(getFunctions(nameUFCRTETTwoKeyNavParam));
-    functions.addAll(getFunctions(nameUFCRTETTwoKeyNavParamCTTwoPrim));
-    functions.addAll(getFunctions(nameUFCRTStringTwoParam));
-    functions.addAll(getFunctions(nameUFCRTESTwoKeyNavParam));
-    // TODO: check why it exists twice
-    functions.addAll(getFunctions(nameUFCRTString));
-    functions.addAll(getFunctions(nameUFCRTCollStringTwoParam));
-    functions.addAll(getFunctions(nameUFCRTCollString));
-    functions.addAll(getFunctions(nameUFCRTCTAllPrimTwoParam));
-    functions.addAll(getFunctions(nameUFCRTCTTwoPrimParam));
-    functions.addAll(getFunctions(nameUFCRTCollCTTwoPrimParam));
-    functions.addAll(getFunctions(nameUFCRTCTTwoPrim));
-    functions.addAll(getFunctions(nameUFCRTCollCTTwoPrim));
-    functions.addAll(getFunctions(nameUFCRTETMedia));
-    functions.addAll(getFunctions(nameUFNRTESMixPrimCollCompTwoParam));
-    functions.addAll(getFunctions(nameUFCRTETAllPrimTwoParam));
-    functions.addAll(getFunctions(nameUFCRTESMixPrimCollCompTwoParam));
-    functions.addAll(getFunctions(nameBFCESTwoKeyNavRTESTwoKeyNav));
-    functions.addAll(getFunctions(nameBFCStringRTESTwoKeyNav));
-    functions.addAll(getFunctions(nameBFCETBaseTwoKeyNavRTETTwoKeyNav));
-    functions.addAll(getFunctions(nameBFCESBaseTwoKeyNavRTESBaseTwoKey));
-    functions.addAll(getFunctions(nameBFCESAllPrimRTCTAllPrim));
-    functions.addAll(getFunctions(nameBFCESTwoKeyNavRTCTTwoPrim));
-    functions.addAll(getFunctions(nameBFCESTwoKeyNavRTCollCTTwoPrim));
-    functions.addAll(getFunctions(nameBFCESTwoKeyNavRTString));
-    functions.addAll(getFunctions(nameBFCESTwoKeyNavRTCollString));
-    functions.addAll(getFunctions(nameBFCETTwoKeyNavRTESTwoKeyNav));
-    functions.addAll(getFunctions(nameBFCETBaseTwoKeyNavRTESTwoKeyNav));
-    functions.addAll(getFunctions(nameBFCSINavRTESTwoKeyNav));
-    functions.addAll(getFunctions(nameBFCETBaseTwoKeyNavRTESBaseTwoKey));
-    functions.addAll(getFunctions(nameBFCCollStringRTESTwoKeyNav));
-    functions.addAll(getFunctions(nameBFCCTPrimCompRTESTwoKeyNav));
-    functions.addAll(getFunctions(nameBFCCTPrimCompRTESBaseTwoKeyNav));
-    functions.addAll(getFunctions(nameBFCCollCTPrimCompRTESAllPrim));
-    functions.addAll(getFunctions(nameBFCESTwoKeyNavRTTwoKeyNav));
-    functions.addAll(getFunctions(nameBFCESKeyNavRTETKeyNav));
-    functions.addAll(getFunctions(nameBFCETKeyNavRTETKeyNav));
-    functions.addAll(getFunctions(nameBFESTwoKeyNavRTESTwoKeyNav));
-    functions.addAll(getFunctions(nameBFCETTwoKeyNavRTETTwoKeyNav));
-    functions.addAll(getFunctions(nameBFCETTwoKeyNavRTCTTwoPrim));
-    functions.addAll(getFunctions(nameBFCESTwoKeyNavRTStringParam));
-    functions.addAll(getFunctions(nameBFCESKeyNavRTETKeyNavParam));
-    functions.addAll(getFunctions(nameBFCCTPrimCompRTETTwoKeyNavParam));
-    functions.addAll(getFunctions(nameBAETTwoKeyNavRTETTwoKeyNav));
-    functions.addAll(getFunctions(nameBFCCTPrimCompRTESTwoKeyNavParam));
-
-    // EntityContainer
-    EntityContainer container = new EntityContainer();
-    schema.setEntityContainer(container);
-    container.setName(nameContainer.getName());
-
-    // EntitySets
-    List<EntitySet> entitySets = new ArrayList<EntitySet>();
-    container.setEntitySets(entitySets);
-    entitySets.add(getEntitySet(nameContainer, "ESAllPrim"));
-    entitySets.add(getEntitySet(nameContainer, "ESCollAllPrim"));
-    entitySets.add(getEntitySet(nameContainer, "ESTwoPrim"));
-    entitySets.add(getEntitySet(nameContainer, "ESMixPrimCollComp"));
-    entitySets.add(getEntitySet(nameContainer, "ESBase"));
-    entitySets.add(getEntitySet(nameContainer, "ESTwoBase"));
-    entitySets.add(getEntitySet(nameContainer, "ESTwoKeyTwoPrim"));
-    entitySets.add(getEntitySet(nameContainer, "ESBaseTwoKeyTwoPrim"));
-    entitySets.add(getEntitySet(nameContainer, "ESTwoBaseTwoKeyTwoPrim"));
-    entitySets.add(getEntitySet(nameContainer, "ESAllKey"));
-    entitySets.add(getEntitySet(nameContainer, "ESCompAllPrim"));
-    entitySets.add(getEntitySet(nameContainer, "ESCompCollAllPrim"));
-    entitySets.add(getEntitySet(nameContainer, "ESCompComp"));
-    entitySets.add(getEntitySet(nameContainer, "ESCompCollComp"));
-    entitySets.add(getEntitySet(nameContainer, "ESMedia"));
-    entitySets.add(getEntitySet(nameContainer, "ESKeyTwoKeyComp"));
-    entitySets.add(getEntitySet(nameContainer, "ESInvisible"));
-    entitySets.add(getEntitySet(nameContainer, "ESServerSidePaging"));
-    entitySets.add(getEntitySet(nameContainer, "ESAllNullable"));
-    entitySets.add(getEntitySet(nameContainer, "ESKeyNav"));
-    entitySets.add(getEntitySet(nameContainer, "ESTwoKeyNav"));
-    entitySets.add(getEntitySet(nameContainer, "ESBaseTwoKeyNav"));
-    entitySets.add(getEntitySet(nameContainer, "ESCompMixPrimCollComp"));
-    entitySets.add(getEntitySet(nameContainer, "ESFourKeyAlias"));
-
-    // Singletons
-    List<Singleton> singletons = new ArrayList<Singleton>();
-    container.setSingletons(singletons);
-    singletons.add(getSingleton(nameContainer, "SI"));
-    singletons.add(getSingleton(nameContainer, "SINav"));
-    singletons.add(getSingleton(nameContainer, "SIMedia"));
-
-    // ActionImports
-    List<ActionImport> actionImports = new ArrayList<ActionImport>();
-    container.setActionImports(actionImports);
-    actionImports.add(getActionImport(nameContainer, "AIRTPrimParam"));
-    actionImports.add(getActionImport(nameContainer, "AIRTPrimCollParam"));
-    actionImports.add(getActionImport(nameContainer, "AIRTCompParam"));
-    actionImports.add(getActionImport(nameContainer, "AIRTCompCollParam"));
-    actionImports.add(getActionImport(nameContainer, "AIRTETParam"));
-    actionImports.add(getActionImport(nameContainer, "AIRTETCollAllPrimParam"));
-
-    // FunctionImports
-    List<FunctionImport> functionImports = new ArrayList<FunctionImport>();
-    container.setFunctionImports(functionImports);
-    functionImports.add(getFunctionImport(nameContainer, "FINRTInt16"));
-    functionImports.add(getFunctionImport(nameContainer, "FINInvisibleRTInt16"));
-    functionImports.add(getFunctionImport(nameContainer, "FINInvisible2RTInt16"));
-    functionImports.add(getFunctionImport(nameContainer, "FICRTETKeyNav"));
-    functionImports.add(getFunctionImport(nameContainer, "FICRTETTwoKeyNavParam"));
-    functionImports.add(getFunctionImport(nameContainer, "FICRTStringTwoParam"));
-    functionImports.add(getFunctionImport(nameContainer, "FICRTCollStringTwoParam"));
-    functionImports.add(getFunctionImport(nameContainer, "FICRTCTAllPrimTwoParam"));
-    functionImports.add(getFunctionImport(nameContainer, "FICRTESMixPrimCollCompTwoParam"));
-    functionImports.add(getFunctionImport(nameContainer, "FINRTESMixPrimCollCompTwoParam"));
-    functionImports.add(getFunctionImport(nameContainer, "FICRTCollCTTwoPrim"));
-    functionImports.add(getFunctionImport(nameContainer, "FICRTETMedia"));
-    functionImports.add(getFunctionImport(nameContainer, "FICRTCTTwoPrimParam"));
-    functionImports.add(getFunctionImport(nameContainer, "FICRTCTTwoPrim"));
-    functionImports.add(getFunctionImport(nameContainer, "FICRTCollString"));
-    functionImports.add(getFunctionImport(nameContainer, "FICRTString"));
-    functionImports.add(getFunctionImport(nameContainer, "FICRTESTwoKeyNavParam"));
-    functionImports.add(getFunctionImport(nameContainer, "FICRTCollCTTwoPrimParam"));
-
-    return schemas;
-  }
-
-  @Override
-  public ActionImport getActionImport(final FullQualifiedName entityContainer, final String name) throws ODataException
-  {
-    if (entityContainer.equals(nameContainer)) {
-      if (name.equals("AIRTPrimParam")) {
-        return new ActionImport()
-            .setName("AIRTPrimParam")
-            .setAction(nameUARTPrimParam);
-
-      } else if (name.equals("AIRTPrimCollParam")) {
-        return new ActionImport()
-            .setName("AIRTPrimCollParam")
-            .setAction(nameUARTPrimCollParam);
-
-      } else if (name.equals("AIRTCompParam")) {
-        return new ActionImport()
-            .setName("AIRTCompParam")
-            .setAction(nameUARTCompParam);
-
-      } else if (name.equals("AIRTCompCollParam")) {
-        return new ActionImport()
-            .setName("AIRTCompCollParam")
-            .setAction(nameUARTCompCollParam);
-
-      } else if (name.equals("AIRTETParam")) {
-        return new ActionImport()
-            .setName("AIRTETParam")
-            .setAction(nameUARTETParam);
-
-      } else if (name.equals("AIRTETCollAllPrimParam")) {
-        return new ActionImport()
-            .setName("AIRTETCollAllPrimParam")
-            .setAction(nameUARTETCollAllPrimParam);
-      }
-    }
-
-    return null;
-  }
-
-  @Override
-  public List<Action> getActions(final FullQualifiedName actionName) throws ODataException {
-    if (actionName.equals(nameUARTPrimParam)) {
-      return Arrays.asList(
-          new Action().setName("UARTPrimParam")
-              .setParameters(Arrays.asList(
-                  new Parameter().setName("ParameterInt16").setType(nameInt16)))
-
-              .setReturnType(new ReturnType().setType(nameString))
-          );
-
-    } else if (actionName.equals(nameUARTPrimCollParam)) {
-      return Arrays.asList(
-          new Action().setName("UARTPrimCollParam")
-              .setParameters(Arrays.asList(
-                  new Parameter().setName("ParameterInt16").setType(nameInt16)))
-
-              .setReturnType(
-                  new ReturnType().setType(nameString).setCollection(true))
-          );
-
-    } else if (actionName.equals(nameUARTCompParam)) {
-      return Arrays.asList(
-          new Action().setName("UARTCompParam")
-              .setParameters(Arrays.asList(
-                  new Parameter().setName("ParameterInt16").setType(nameInt16)))
-
-              .setReturnType(
-                  new ReturnType().setType(nameCTTwoPrim))
-          );
-
-    } else if (actionName.equals(nameUARTCompCollParam)) {
-      return Arrays.asList(
-          new Action().setName("UARTCompCollParam")
-              .setParameters(Arrays.asList(
-                  new Parameter().setName("ParameterInt16").setType(nameInt16)))
-
-              .setReturnType(
-                  new ReturnType().setType(nameCTTwoPrim).setCollection(true))
-          );
-
-    } else if (actionName.equals(nameUARTETParam)) {
-      return Arrays.asList(
-          new Action().setName("UARTCompCollParam")
-              .setParameters(Arrays.asList(
-                  new Parameter().setName("ParameterInt16").setType(nameInt16)))
-              .setReturnType(
-                  new ReturnType().setType(nameETTwoKeyTwoPrim))
-          );
-
-    } else if (actionName.equals(nameUARTETCollAllPrimParam)) {
-      return Arrays.asList(
-          new Action().setName("UARTETCollAllPrimParam")
-              .setParameters(Arrays.asList(
-                  new Parameter().setName("ParameterInt16").setType(nameInt16)))
-
-              .setReturnType(
-                  new ReturnType().setType(nameETCollAllPrim).setCollection(true))
-          );
-
-    } else if (actionName.equals(nameBAETTwoKeyNavRTETTwoKeyNav)) {
-      return Arrays.asList(
-          new Action().setName("BAETTwoKeyNavRTETTwoKeyNav")
-              .setParameters(Arrays.asList(
-                  new Parameter().setName("ParameterETTwoKeyNav").setType(nameETTwoKeyNav)))
-              .setBound(true)
-              .setReturnType(
-                  new ReturnType().setType(nameETTwoKeyNav))
-          ,
-          new Action().setName("BAETTwoKeyNavRTETTwoKeyNav")
-              .setParameters(Arrays.asList(
-                  new Parameter().setName("ParameterETKeyNav").setType(nameETKeyNav)))
-              .setBound(true)
-              .setReturnType(
-                  new ReturnType().setType(nameETTwoKeyNav))
-          );
-
-    } else if (actionName.equals(nameBAESAllPrimRTETAllPrim)) {
-      return Arrays.asList(
-          new Action().setName("BAESAllPrimRTETAllPrim")
-              .setParameters(Arrays.asList(
-                  new Parameter().setName("ParameterESAllPrim").setType(nameETAllPrim).setCollection(true)))
-              .setBound(true)
-              .setReturnType(
-                  new ReturnType().setType(nameETAllPrim))
-          );
-
-    } else if (actionName.equals(nameBAESTwoKeyNavRTESTwoKeyNav)) {
-      return Arrays.asList(
-          new Action().setName("BAESTwoKeyNavRTESTwoKeyNav")
-              .setParameters(Arrays.asList(
-                  new Parameter().setName("ParameterETTwoKeyNav").setType(nameETTwoKeyNav).setCollection(true)))
-              .setBound(true)
-              .setReturnType(
-                  new ReturnType().setType(nameETTwoKeyNav).setCollection(true))
-          );
-
-    } else if (actionName.equals(nameBAETBaseTwoKeyNavRTETBaseTwoKeyNav)) {
-      return Arrays.asList(
-          new Action().setName("BAETBaseTwoKeyNavRTETBaseTwoKeyNav")
-              .setParameters(Arrays.asList(
-                  new Parameter().setName("ParameterETTwoKeyNav").setType(nameETBaseTwoKeyNav)))
-              .setBound(true)
-              .setReturnType(
-                  new ReturnType().setType(nameETTwoKeyNav))
-          );
-
-    } else if (actionName.equals(nameBAETTwoBaseTwoKeyNavRTETBaseTwoKeyNav)) {
-      return Arrays.asList(
-          new Action().setName("BAETTwoBaseTwoKeyNavRTETBaseTwoKeyNav")
-              .setParameters(Arrays.asList(
-                  new Parameter().setName("ParameterETTwoBaseTwoKeyNav").setType(nameETTwoBaseTwoKeyNav)))
-              .setBound(true)
-              .setReturnType(
-                  new ReturnType().setType(nameETBaseTwoKeyNav))
-          );
-    }
-
-    return null;
-  }
-
-  @Override
-  public List<AliasInfo> getAliasInfos() throws ODataException {
-    return Arrays.asList(
-        new AliasInfo().setAlias("Namespace1_Alias").setNamespace(nameSpace)
-        );
-  }
-
-  @Override
-  public ComplexType getComplexType(final FullQualifiedName complexTypeName) throws ODataException {
-
-    if (complexTypeName.equals(nameCTPrim)) {
-      return new ComplexType()
-          .setName("CTPrim")
-          .setProperties(Arrays.asList(propertyInt16));
-
-    } else if (complexTypeName.equals(nameCTAllPrim)) {
-      return new ComplexType()
-          .setName("CTAllPrim")
-          .setProperties(Arrays.asList(propertyString, propertyBinary, propertyBoolean,
-              propertyByte, propertyDate, propertyDateTimeOffset,
-              propertyDecimal, propertySingle, propertyDouble,
-              propertyDuration, propertyGuid, propertyInt16,
-              propertyInt32, propertyInt64, propertySByte,
-              propertyTimeOfDay/* TODO add propertyStream */));
-
-    } else if (complexTypeName.equals(nameCTCollAllPrim)) {
-      return new ComplexType()
-          .setName("CTCollAllPrim")
-          .setProperties(Arrays.asList(
-              collPropertyString,
-              collPropertyBoolean, collPropertyByte,
-              collPropertySByte,
-              collPropertyInt16, collPropertyInt32, collPropertyInt64,
-              collPropertySingle, collPropertyDouble,
-              collPropertyDecimal, collPropertyBinary,
-              collPropertyDate, collPropertyDateTimeOffset,
-              collPropertyDuration, collPropertyGuid,
-              collPropertyTimeOfDay /* TODO add collectionPropertyStream */));
-
-    } else if (complexTypeName.equals(nameCTTwoPrim)) {
-      return new ComplexType()
-          .setName("CTTwoPrim")
-          .setProperties(Arrays.asList(propertyInt16, propertyString));
-
-    } else if (complexTypeName.equals(nameCTCompNav)) {
-      return new ComplexType()
-          .setName("CTCompNav")
-          .setProperties(Arrays.asList(propertyInt16, propertyComplex_CTNavFiveProp));
-
-    } else if (complexTypeName.equals(nameCTMixPrimCollComp)) {
-      return new ComplexType()
-          .setName("CTMixPrimCollComp")
-          .setProperties(Arrays.asList(
-              propertyInt16, collPropertyString, propertyComplex_CTTwoPrim, collPropertyComplex_CTTwoPrim));
-
-    } else if (complexTypeName.equals(nameCTBase)) {
-      return new ComplexType()
-          .setName("CTBase")
-          .setBaseType(nameCTTwoPrim)
-          .setProperties(Arrays.asList(
-              new Property()
-                  .setName("AdditionalPropString")
-                  .setType(new FullQualifiedName("Edm", "String"))));
-
-    } else if (complexTypeName.equals(nameCTTwoBase)) {
-      return new ComplexType()
-          .setName("CTTwoBase")
-          .setBaseType(nameCTBase)
-          .setProperties(Arrays.asList(
-              new Property()
-                  .setName("AdditionalPropString")
-                  .setType(new FullQualifiedName("Edm", "String"))));
-
-    } else if (complexTypeName.equals(nameCTCompComp)) {
-      return new ComplexType()
-          .setName("CTCompComp")
-          .setProperties(Arrays.asList(propertyComplex_CTTwoPrim));
-
-    } else if (complexTypeName.equals(nameCTCompCollComp)) {
-      return new ComplexType()
-          .setName("CTCompComp")
-          .setProperties(Arrays.asList(collPropertyComplex_CTTwoPrim));
-
-    } else if (complexTypeName.equals(nameCTPrimComp)) {
-      return new ComplexType()
-          .setName("CTPrimComp")
-          .setProperties(Arrays.asList(propertyInt16, propertyComplex_CTAllPrim));
-
-    } else if (complexTypeName.equals(nameCTNavFiveProp)) {
-      return new ComplexType()
-          .setName("CTNavFiveProp")
-          .setProperties(Arrays.asList(propertyInt16))
-          .setNavigationProperties((Arrays.asList(
-              collectionNavPropertyETTwoKeyNavOne_ETTwoKeyNav,
-              collectionNavPropertyETTwoKeyNavMany_ETTwoKeyNav,
-              new NavigationProperty()
-                  .setName("NavPropertyETMediaOne")
-                  .setType(nameETMedia),
-              new NavigationProperty()
-                  .setName("NavPropertyETMediaMany")
-                  .setType(nameETMedia).setCollection(true)
-              )));
-
-    } else if (complexTypeName.equals(nameCTBasePrimCompNav)) {
-      return new ComplexType()
-          .setName("CTBasePrimCompNav")
-          .setBaseType(nameCTPrimComp)
-          .setNavigationProperties(Arrays.asList(
-              collectionNavPropertyETTwoKeyNavMany_ETTwoKeyNav,
-              collectionNavPropertyETTwoKeyNavOne_ETTwoKeyNav));
-
-    } else if (complexTypeName.equals(nameCTPrimEnum)) {
-      return new ComplexType()
-          .setName("CTPrimEnum")
-          .setProperties(Arrays.asList(propertyInt16, propertyEnumString_ENString));
-
-    } else if (complexTypeName.equals(nameCTTwoBasePrimCompNav)) {
-      return new ComplexType()
-          .setName("CTTwoBasePrimCompNav")
-          .setBaseType(nameCTBasePrimCompNav);
-
-    }
-
-    return null;
-  }
-
-  @Override
-  public EntityContainerInfo getEntityContainerInfo(final FullQualifiedName entityContainerName) throws ODataException {
-    if (entityContainerName == null) {
-      return entityContainerInfoTest1;
-    } else if (entityContainerName.equals(nameContainer)) {
-      return entityContainerInfoTest1;
-    }
-
-    return null;
-  }
-
-  @Override
-  public EntitySet getEntitySet(final FullQualifiedName entityContainer, final String name) throws ODataException {
-    if (entityContainer == nameContainer) {
-      if (name.equals("ESAllPrim")) {
-        return new EntitySet()
-            .setName("ESAllPrim")
-            .setType(nameETAllPrim);
-
-      } else if (name.equals("ESCollAllPrim")) {
-        return new EntitySet()
-            .setName("ESCollAllPrim")
-            .setType(nameETCollAllPrim);
-
-      } else if (name.equals("ESTwoPrim")) {
-        return new EntitySet()
-            .setName("ESTwoPrim")
-            .setType(nameETTwoPrim);
-
-      } else if (name.equals("ESMixPrimCollComp")) {
-        return new EntitySet()
-            .setName("ESMixPrimCollComp")
-            .setType(nameETMixPrimCollComp);
-
-      } else if (name.equals("ESBase")) {
-        return new EntitySet()
-            .setName("ESBase")
-            .setType(nameETBase);
-
-      } else if (name.equals("ESTwoBase")) {
-        return new EntitySet()
-            .setName("ESTwoBase")
-            .setType(nameETTwoBase);
-
-      } else if (name.equals("ESTwoKeyTwoPrim")) {
-        return new EntitySet()
-            .setName("ESTwoKeyTwoPrim")
-            .setType(nameETTwoKeyTwoPrim);
-
-      } else if (name.equals("ESBaseTwoKeyTwoPrim")) {
-        return new EntitySet()
-            .setName("ESBaseTwoKeyTwoPrim")
-            .setType(nameETBaseTwoKeyTwoPrim);
-
-      } else if (name.equals("ESTwoBaseTwoKeyTwoPrim")) {
-        return new EntitySet()
-            .setName("ESTwoBaseTwoKeyTwoPrim")
-            .setType(nameETTwoBaseTwoKeyTwoPrim);
-
-      } else if (name.equals("ESAllKey")) {
-        return new EntitySet()
-            .setName("ESAllKey")
-            .setType(nameETAllKey);
-
-      } else if (name.equals("ESCompAllPrim")) {
-        return new EntitySet()
-            .setName("ESCompAllPrim")
-            .setType(nameETCompAllPrim);
-
-      } else if (name.equals("ESCompCollAllPrim")) {
-        return new EntitySet()
-            .setName("ESCompCollAllPrim")
-            .setType(nameETCompCollAllPrim);
-
-      } else if (name.equals("ESCompComp")) {
-        return new EntitySet()
-            .setName("ESCompComp")
-            .setType(nameETCompComp);
-
-      } else if (name.equals("ESCompCollComp")) {
-        return new EntitySet()
-            .setName("ESCompCollComp")
-            .setType(nameETCompCollComp);
-
-      } else if (name.equals("ESMedia")) {
-        return new EntitySet()
-            .setName("ESMedia")
-            .setType(nameETMedia)
-            .setIncludeInServiceDocument(true);
-
-      } else if (name.equals("ESKeyTwoKeyComp")) {
-        return new EntitySet()
-            .setName("ESKeyTwoKeyComp")
-            .setType(nameETKeyTwoKeyComp);
-
-      } else if (name.equals("ESInvisible")) {
-        return new EntitySet()
-            .setName("ESInvisible")
-            .setType(nameETAllPrim);
-
-      } else if (name.equals("ESServerSidePaging")) {
-        return new EntitySet()
-            .setName("ESServerSidePaging")
-            .setType(nameETServerSidePaging);
-
-      } else if (name.equals("ESAllNullable")) {
-        return new EntitySet()
-            .setName("ESAllNullable")
-            .setType(nameETAllNullable);
-
-      } else if (name.equals("ESKeyNav")) {
-        return new EntitySet()
-            .setName("ESKeyNav")
-            .setType(nameETKeyNav);
-
-      } else if (name.equals("ESTwoKeyNav")) {
-        return new EntitySet()
-            .setName("ESTwoKeyNav")
-            .setType(nameETTwoKeyNav);
-
-      } else if (name.equals("ESBaseTwoKeyNav")) {
-        return new EntitySet()
-            .setName("ESBaseTwoKeyNav")
-            .setType(nameETBaseTwoKeyNav);
-
-      } else if (name.equals("ESCompMixPrimCollComp")) {
-        return new EntitySet()
-            .setName("ESCompMixPrimCollComp")
-            .setType(nameETCompMixPrimCollComp);
-
-      } else if (name.equals("ESFourKeyAlias")) {
-        return new EntitySet()
-            .setName("ESFourKeyAlias")
-            .setType(nameETFourKeyAlias);
-      }
-    }
-
-    return null;
-  }
-
-  @Override
-  public EntityType getEntityType(final FullQualifiedName entityTypeName) throws ODataException {
-
-    if (entityTypeName.equals(nameETAllPrim)) {
-      return new EntityType()
-          .setName("ETAllPrim")
-          .setKey(Arrays.asList(
-              new PropertyRef().setPropertyName("PropertyInt16")))
-          .setProperties(Arrays.asList(
-              propertyInt16_NotNullable, propertyString,
-              propertyBoolean, propertyByte, propertySByte,
-              propertyInt32, propertyInt64,
-              propertySingle, propertyDouble, propertyDecimal,
-              propertyBinary, propertyDate, propertyDateTimeOffset,
-              propertyDuration, propertyGuid,
-              propertyTimeOfDay /* TODO add propertyStream */));
-
-    } else if (entityTypeName.equals(nameETCollAllPrim)) {
-      return new EntityType()
-          .setName("ETCollAllPrim")
-          .setKey(Arrays.asList(new PropertyRef().setPropertyName("PropertyInt16")))
-
-          .setProperties(Arrays.asList(
-              propertyInt16_NotNullable,
-              collPropertyString, collPropertyBoolean,
-              collPropertyByte, collPropertySByte,
-              collPropertyInt16, collPropertyInt32, collPropertyInt64,
-              collPropertySingle, collPropertyDouble, collPropertyDecimal,
-              collPropertyBinary, collPropertyDate, collPropertyDateTimeOffset,
-              collPropertyDuration, collPropertyGuid, collPropertyTimeOfDay /* TODO add propertyStream */));
-
-    } else if (entityTypeName.equals(nameETTwoPrim)) {
-      return new EntityType()
-          .setName("ETTwoPrim")
-          .setKey(Arrays.asList(new PropertyRef().setPropertyName("PropertyInt16")))
-
-          .setProperties(Arrays.asList(
-              propertyInt16_NotNullable, propertyString));
-
-    } else if (entityTypeName.equals(nameETMixPrimCollComp)) {
-      return new EntityType()
-          .setName("ETMixPrimCollComp")
-          .setKey(Arrays.asList(new PropertyRef().setPropertyName("PropertyInt16")))
-
-          .setProperties(Arrays.asList(
-              propertyInt16_NotNullable, collPropertyString,
-              propertyComplex_CTTwoPrim, collPropertyComplex_CTTwoPrim));
-
-    } else if (entityTypeName.equals(nameETTwoKeyTwoPrim)) {
-      return new EntityType()
-          .setName("ETTwoKeyTwoPrim")
-          .setKey(Arrays.asList(
-              new PropertyRef().setPropertyName("PropertyInt16"),
-              new PropertyRef().setPropertyName("PropertyString")))
-          .setProperties(Arrays.asList(
-              propertyInt16_NotNullable, propertyString));
-
-    } else if (entityTypeName.equals(nameETBaseTwoKeyTwoPrim)) {
-      return new EntityType()
-          .setName("ETBaseTwoKeyTwoPrim")
-          .setBaseType(nameETTwoKeyTwoPrim);
-
-    } else if (entityTypeName.equals(nameETTwoBaseTwoKeyTwoPrim)) {
-      return new EntityType()
-          .setName("ETTwoBaseTwoKeyTwoPrim")
-          .setBaseType(nameETTwoKeyTwoPrim);
-
-    } else if (entityTypeName.equals(nameETBase)) {
-      return new EntityType()
-          .setName("ETBase")
-          .setBaseType(nameETTwoPrim)
-          .setProperties(Arrays.asList(new Property()
-              .setName("AdditionalPropertyString_5")
-              .setType(nameString)));
-
-    } else if (entityTypeName.equals(nameETTwoBase)) {
-      return new EntityType()
-          .setName("ETTwoBase")
-          .setBaseType(nameETBase)
-          .setProperties(Arrays.asList(new Property()
-              .setName("AdditionalPropertyString_6")
-              .setType(nameString))
-          );
-
-    } else if (entityTypeName.equals(nameETAllKey)) {
-      return new EntityType()
-          .setName("ETAllKey")
-          .setKey(Arrays.asList(
-              new PropertyRef().setPropertyName("PropertyString"),
-              new PropertyRef().setPropertyName("PropertyBoolean"),
-              new PropertyRef().setPropertyName("PropertyByte"),
-              new PropertyRef().setPropertyName("PropertySByte"),
-              new PropertyRef().setPropertyName("PropertyInt16"),
-              new PropertyRef().setPropertyName("PropertyInt32"),
-              new PropertyRef().setPropertyName("PropertyInt64"),
-              new PropertyRef().setPropertyName("PropertyDecimal"),
-              new PropertyRef().setPropertyName("PropertyDate"),
-              new PropertyRef().setPropertyName("PropertyDateTimeOffset"),
-              new PropertyRef().setPropertyName("PropertyDuration"),
-              new PropertyRef().setPropertyName("PropertyGuid"),
-              new PropertyRef().setPropertyName("PropertyTimeOfDay")))
-          .setProperties(Arrays.asList(
-              propertyString, propertyBoolean,
-              propertyByte, propertySByte,
-              propertyInt16, propertyInt32, propertyInt64,
-              propertyDecimal, propertyDate,
-              propertySingle, propertyDouble, propertyDateTimeOffset,
-              propertyDuration, propertyGuid,
-              propertyTimeOfDay /* TODO add propertyStream */));
-
-    } else if (entityTypeName.equals(nameETCompAllPrim)) {
-      return new EntityType()
-          .setName("ETCompAllPrim")
-          .setKey(Arrays.asList(new PropertyRef().setPropertyName("PropertyInt16")))
-          .setProperties(Arrays.asList(propertyInt16_NotNullable, propertyComplex_CTAllPrim));
-
-    } else if (entityTypeName.equals(nameETCompCollAllPrim)) {
-      return new EntityType()
-          .setName("ETCompAllPrim")
-          .setKey(Arrays.asList(new PropertyRef().setPropertyName("PropertyInt16")))
-
-          .setProperties(Arrays.asList(propertyInt16_NotNullable, propertyComplex_CTCollAllPrim));
-
-    } else if (entityTypeName.equals(nameETCompComp)) {
-      return new EntityType()
-          .setName("ETCompComp")
-          .setKey(Arrays.asList(new PropertyRef().setPropertyName("PropertyInt16")))
-          .setProperties(Arrays.asList(propertyInt16_NotNullable, propertyComplex_CTCompComp));
-
-    } else if (entityTypeName.equals(nameETCompCollComp)) {
-      return new EntityType()
-          .setName("ETCompCollComp")
-          .setKey(Arrays.asList(new PropertyRef().setPropertyName("PropertyInt16")))
-          .setProperties(Arrays.asList(propertyInt16_NotNullable, propertyComplex_CTCompCollComp));
-
-    } else if (entityTypeName.equals(nameETMedia)) {
-      return new EntityType()
-          .setName("ETCompCollComp")
-          .setKey(Arrays.asList(new PropertyRef().setPropertyName("PropertyInt16")))
-          .setProperties(Arrays.asList(propertyInt16_NotNullable))
-          .setHasStream(true);
-
-    } else if (entityTypeName.equals(nameETKeyTwoKeyComp)) {
-      return new EntityType()
-          .setName("ETKeyTwoKeyComp")
-          .setKey(Arrays.asList(
-              new PropertyRef()
-                  .setPropertyName("PropertyInt16"),
-              new PropertyRef()
-                  .setPropertyName("PropertyComplex/PropertyInt16")
-                  .setAlias("KeyAlias1"),
-              new PropertyRef()
-                  .setPropertyName("PropertyComplex/PropertyString")
-                  .setAlias("KeyAlias2"),
-              new PropertyRef()
-                  .setPropertyName("PropertyComplexComplex/PropertyComplex/PropertyString")
-                  .setAlias("KeyAlias3")))
-          .setProperties(Arrays.asList(
-              propertyInt16_NotNullable, propertyComplex_CTTwoPrim, propertyComplexComplex_CTCompComp));
-
-    } else if (entityTypeName.equals(nameETServerSidePaging)) {
-      return new EntityType()
-          .setName("ETKeyTwoKeyComp")
-          .setKey(Arrays.asList(new PropertyRef().setPropertyName("PropertyInt16")))
-          .setProperties(Arrays.asList(propertyInt16_NotNullable, propertyString));
-
-    } else if (entityTypeName.equals(nameETAllNullable)) {
-      return new EntityType()
-          .setName("ETAllNullable")
-          .setKey(Arrays.asList(new PropertyRef().setPropertyName("PropertyKey")))
-          .setProperties(Arrays.asList(
-              new Property()
-                  .setName("PropertyKey").setType(nameInt16),
-              propertyInt16,
-              propertyString, propertyBoolean,
-              propertyByte, propertySByte,
-              propertyInt32, propertyInt64,
-              propertySingle, propertyDouble,
-              propertyDecimal, propertyBinary, propertyDate,
-              propertyDateTimeOffset,
-              propertyDuration, propertyGuid, propertyTimeOfDay /* TODO add propertyStream */,
-              collPropertyString, collPropertyBoolean,
-              collPropertyByte, collPropertySByte,
-              collPropertyInt16,
-              collPropertyInt32, collPropertyInt64,
-              collPropertySingle, collPropertyDouble,
-              collPropertyDecimal, collPropertyBinary, collPropertyDate,
-              collPropertyDateTimeOffset,
-              collPropertyDuration, collPropertyGuid, collPropertyTimeOfDay /* TODO add propertyStream */));
-
-    } else if (entityTypeName.equals(nameETKeyNav)) {
-      return new EntityType()
-          .setName("ETKeyNav")
-          .setKey(Arrays.asList(new PropertyRef().setPropertyName("PropertyInt16")))
-          .setProperties(Arrays.asList(
-              propertyInt16_NotNullable, propertyString_NotNullable, propertyComplex_CTNavFiveProp,
-              propertyComplexAllPrim_CTAllPrim, propertyComplexTwoPrim_CTTwoPrim,
-              collPropertyString, collPropertyInt16, collPropertyComplex_CTPrimComp,
-              new Property()
-                  .setName("PropertyComplexComplex").setType(nameCTCompNav)
-              ))
-          .setNavigationProperties(Arrays.asList(
-              navPropertyETTwoKeyNavOne_ETTwoKeyNav, collectionNavPropertyETTwoKeyNavMany_ETTwoKeyNav,
-              navPropertyETKeyNavOne_ETKeyNav, collectionNavPropertyETKeyNavMany_ETKeyNav,
-              navPropertyETMediaOne_ETMedia, collectionNavPropertyETMediaMany_ETMedia
-              ));
-    } else if (entityTypeName.equals(nameETKeyPrimNav)) {
-      return new EntityType()
-          .setName("ETKeyNav")
-          .setKey(Arrays.asList(new PropertyRef().setPropertyName("PropertyInt16")))
-          .setProperties(Arrays.asList(
-              propertyInt16_NotNullable, propertyString_NotNullable))
-          .setNavigationProperties(Arrays.asList(
-              navPropertyETTwoKeyNavOne_ETTwoKeyNav, collectionNavPropertyETTwoKeyNavMany_ETTwoKeyNav,
-              navPropertyETKeyNavOne_ETKeyNav, collectionNavPropertyETKeyNavMany_ETKeyNav,
-              navPropertyETMediaOne_ETMedia, collectionNavPropertyETMediaMany_ETMedia
-              ));
-
-    } else if (entityTypeName.equals(nameETTwoKeyNav)) {
-      return new EntityType()
-          .setName("ETTwoKeyNav")
-          .setKey(Arrays.asList(
-              new PropertyRef().setPropertyName("PropertyInt16"),
-              new PropertyRef().setPropertyName("PropertyString")))
-          .setProperties(Arrays.asList(
-              propertyInt16, propertyString, propertyComplex_CTPrimComp_NotNullable,
-              new Property().setName("PropertyComplexNav").setType(nameCTBasePrimCompNav),
-              propertyComplexEnum_CTPrimEnum_NotNullable,
-              collPropertyComplex_CTPrimComp,
-              new Property().setName("CollPropertyComplexNav").setType(nameCTNavFiveProp).setCollection(true),
-              collPropertyString, propertyComplexTwoPrim_CTTwoPrim,
-              propertyEnumString_ENString
-              ))
-          .setNavigationProperties(Arrays.asList(
-              new NavigationProperty()
-                  .setName("NavPropertyETKeyNavOne")
-                  .setType(nameETKeyNav)
-                  .setReferentialConstraints(Arrays.asList(
-                      new ReferentialConstraint()
-                          .setProperty("PropertyInt16")
-                          .setReferencedProperty("PropertyInt16"))),
-              collectionNavPropertyETKeyNavMany_ETKeyNav,
-              navPropertyETTwoKeyNavOne_ETTwoKeyNav,
-              collectionNavPropertyETTwoKeyNavMany_ETTwoKeyNav));
-
-    } else if (entityTypeName.equals(nameETBaseTwoKeyNav)) {
-      return new EntityType()
-          .setName("ETBaseTwoKeyNav")
-          .setBaseType(nameETTwoKeyNav)
-          .setProperties(Arrays.asList(propertyDate))
-          .setNavigationProperties(Arrays.asList(
-              new NavigationProperty()
-                  .setName("NavPropertyETBaseTwoKeyNav")
-                  .setType(nameETBaseTwoKeyNav),
-              new NavigationProperty()
-                  .setName("NavPropertyETTwoBaseTwoKeyNav")
-                  .setType(nameETTwoBaseTwoKeyNav)))
-          .setHasStream(true);
-
-    } else if (entityTypeName.equals(nameETTwoBaseTwoKeyNav)) {
-      return new EntityType()
-          .setName("ETTwoBaseTwoKeyNav")
-          .setBaseType(nameETBaseTwoKeyNav)
-          .setKey(Arrays.asList(new PropertyRef().setPropertyName("PropertyInt16")))
-          .setProperties(Arrays.asList(propertyGuid))
-          .setNavigationProperties(Arrays.asList(
-              new NavigationProperty()
-                  .setName("NavPropertyETBaseTwoKeyNavOne")
-                  .setType(nameETBaseTwoKeyNav),
-              new NavigationProperty()
-                  .setName("NavPropertyETBaseTwoKeyNavMany")
-                  .setType(nameETBaseTwoKeyNav)
-                  .setCollection(true)
-              ));
-
-    } else if (entityTypeName.equals(nameETFourKeyAlias)) {
-      return new EntityType()
-          .setName("ETFourKeyAlias")
-          .setKey(Arrays.asList(
-              new PropertyRef()
-                  .setPropertyName("PropertyInt16"),
-              new PropertyRef()
-                  .setPropertyName("PropertyComplex/PropertyInt16").setAlias("KeyAlias1"),
-              new PropertyRef()
-                  .setPropertyName("PropertyComplex/PropertyString").setAlias("KeyAlias2"),
-              new PropertyRef()
-                  .setPropertyName("PropertyComplexComplex/PropertyComplex/PropertyString")
-                  .setAlias("KeyAlias3")))
-          .setProperties(Arrays.asList(propertyGuid, propertyComplex_CTTwoPrim, propertyComplexComplex_CTCompComp));
-    } else if (entityTypeName.equals(nameETCompMixPrimCollComp)) {
-      return new EntityType()
-          .setName("ETCompMixPrimCollComp")
-          .setKey(Arrays.asList(
-              new PropertyRef()
-                  .setPropertyName("PropertyInt16")))
-          .setProperties(Arrays.asList(propertyInt16_NotNullable, propertyMixedPrimCollComp_CTMixPrimCollComp));
-    }
-
-    return null;
-  }
-
-  @Override
-  public EnumType getEnumType(final FullQualifiedName enumTypeName) throws ODataException {
-    if (enumTypeName.equals(nameENString)) {
-      return new EnumType()
-          .setName("ENString")
-          .setMembers(Arrays.asList(
-              new EnumMember().setName("String1").setValue("1"),
-              new EnumMember().setName("String2").setValue("2"),
-              new EnumMember().setName("String3").setValue("3")));
-    }
-
-    return null;
-  }
-
-  @Override
-  public FunctionImport getFunctionImport(final FullQualifiedName entityContainer, final String name)
-      throws ODataException {
-
-    if (entityContainer.equals(nameContainer)) {
-      if (name.equals("FINRTInt16")) {
-        return new FunctionImport()
-            .setName("FINRTInt16")
-            .setFunction(nameUFNRTInt16)
-            .setIncludeInServiceDocument(true);
-
-      } else if (name.equals("FINInvisibleRTInt16")) {
-        return new FunctionImport()
-            .setName("FINInvisibleRTInt16")
-            .setFunction(nameUFNRTInt16);
-
-      } else if (name.equals("FINInvisible2RTInt16")) {
-        return new FunctionImport()
-            .setName("FINInvisible2RTInt16")
-            .setFunction(nameUFNRTInt16);
-
-      } else if (name.equals("FICRTETKeyNav")) {
-        return new FunctionImport()
-            .setName("FICRTETKeyNav")
-            .setFunction(nameUFCRTETKeyNav);
-
-      } else if (name.equals("FICRTETTwoKeyNavParam")) {
-        return new FunctionImport()
-            .setName("FICRTETTwoKeyNavParam")
-            .setFunction(nameUFCRTETTwoKeyNavParam)
-            .setIncludeInServiceDocument(true);
-
-      } else if (name.equals("FICRTStringTwoParam")) {
-        return new FunctionImport()
-            .setName("FICRTStringTwoParam")
-            .setFunction(nameUFCRTStringTwoParam)
-            .setIncludeInServiceDocument(true);
-
-      } else if (name.equals("FICRTCollStringTwoParam")) {
-        return new FunctionImport()
-            .setName("FICRTCollStringTwoParam")
-            .setFunction(nameUFCRTCollStringTwoParam)
-            .setIncludeInServiceDocument(true);
-
-      } else if (name.equals("FICRTCTAllPrimTwoParam")) {
-        return new FunctionImport()
-            .setName("FICRTCTAllPrimTwoParam")
-            .setFunction(nameUFCRTCTAllPrimTwoParam)
-            .setIncludeInServiceDocument(true);
-
-      } else if (name.equals("FICRTESMixPrimCollCompTwoParam")) {
-        return new FunctionImport()
-            .setName("FICRTESMixPrimCollCompTwoParam")
-            .setFunction(nameUFCRTESMixPrimCollCompTwoParam)
-            .setIncludeInServiceDocument(true);
-
-      } else if (name.equals("FINRTESMixPrimCollCompTwoParam")) {
-        return new FunctionImport()
-            .setName("FINRTESMixPrimCollCompTwoParam")
-            .setFunction(nameUFNRTESMixPrimCollCompTwoParam)
-            .setIncludeInServiceDocument(true);
-
-      } else if (name.equals("FICRTCollCTTwoPrim")) {
-        return new FunctionImport()
-            .setName("FICRTCollCTTwoPrim")
-            .setFunction(nameUFCRTCollCTTwoPrim)
-            .setIncludeInServiceDocument(true);
-
-      } else if (name.equals("FICRTETMedia")) {
-        return new FunctionImport()
-            .setName("FICRTETMedia")
-            .setFunction(nameUFCRTETMedia)
-            .setIncludeInServiceDocument(true);
-
-      } else if (name.equals("FICRTCTTwoPrimParam")) {
-        return new FunctionImport()
-            .setName("FICRTCTTwoPrimParam")
-            .setFunction(nameUFCRTCTTwoPrimParam)
-            .setIncludeInServiceDocument(true);
-
-      } else if (name.equals("FICRTCTTwoPrim")) {
-        return new FunctionImport()
-            .setName("FICRTCTTwoPrim")
-            .setFunction(nameUFCRTCTTwoPrim)
-            .setIncludeInServiceDocument(true);
-
-      } else if (name.equals("FICRTCollString")) {
-        return new FunctionImport()
-            .setName("FICRTCollString")
-            .setFunction(nameUFCRTCollString)
-            .setIncludeInServiceDocument(true);
-
-      } else if (name.equals("FICRTString")) {
-        return new FunctionImport()
-            .setName("FICRTString")
-            .setFunction(nameUFCRTString)
-            .setIncludeInServiceDocument(true);
-
-      } else if (name.equals("FICRTESTwoKeyNavParam")) {
-        return new FunctionImport()
-            .setName("FICRTESTwoKeyNavParam")
-            .setFunction(nameUFCRTESTwoKeyNavParam)
-            .setIncludeInServiceDocument(true);
-
-      } else if (name.equals("FICRTCollCTTwoPrimParam")) {
-        return new FunctionImport()
-            .setName("FICRTCollCTTwoPrimParam")
-            .setFunction(nameUFCRTCollCTTwoPrimParam)
-            .setIncludeInServiceDocument(true);
-
-      }
-    }
-
-    return null;
-  }
-
-  @Override
-  public List<Function> getFunctions(final FullQualifiedName functionName) throws ODataException {
-
-    if (functionName.equals(nameUFNRTInt16)) {
-      return Arrays.asList(
-          new Function()
-              .setName("UFNRTInt16")
-              .setParameters(new ArrayList<Parameter>())
-              .setReturnType(
-                  new ReturnType().setType(nameString))
-          );
-
-    } else if (functionName.equals(nameUFCRTETKeyNav)) {
-      return Arrays.asList(
-          new Function()
-              .setName("UFCRTETKeyNav")
-              .setParameters(new ArrayList<Parameter>())
-              .setComposable(true)
-              .setReturnType(
-                  new ReturnType().setType(nameETKeyNav))
-          );
-
-    } else if (functionName.equals(nameUFCRTETTwoKeyNavParam)) {
-      return Arrays.asList(
-          new Function()
-              .setName("UFCRTETTwoKeyNavParam")
-              .setParameters(Arrays.asList(
-                  new Parameter().setName("ParameterInt16").setType(nameInt16)))
-              .setComposable(true)
-              .setReturnType(
-                  new ReturnType().setType(nameETTwoKeyNav)
-              )
-          );
-
-    } else if (functionName.equals(nameUFCRTETTwoKeyNavParamCTTwoPrim)) {
-      return Arrays.asList(
-          new Function()
-              .setName("UFCRTETTwoKeyNavParamCTTwoPrim")
-              .setParameters(Arrays.asList(
-                  new Parameter().setName("ParameterCTTwoPrim").setType(nameCTTwoPrim)))
-              .setComposable(true)
-              .setReturnType(
-                  new ReturnType().setType(nameETTwoKeyNav)
-              )
-          );
-
-    } else if (functionName.equals(nameUFCRTStringTwoParam)) {
-      return Arrays.asList(
-          new Function()
-              .setName("UFCRTStringTwoParam")
-              .setParameters(Arrays.asList(
-                  new Parameter()
-                      .setName("ParameterInt16")
-                      .setType(nameInt16)))
-              .setComposable(true)
-              .setReturnType(
-                  new ReturnType().setType(nameString)),
-          new Function()
-              .setName("UFCRTStringTwoParam")
-              .setParameters(Arrays.asList(
-                  new Parameter()
-                      .setName("ParameterString")
-                      .setType(nameString),
-                  new Parameter()
-                      .setName("ParameterInt16")
-                      .setType(nameInt16)))
-              .setComposable(true)
-              .setReturnType(
-                  new ReturnType().setType(nameString))
-
-          );
-
-    } else if (functionName.equals(nameUFCRTESTwoKeyNavParam)) {
-      return Arrays.asList(
-          new Function()
-              .setName("UFCRTESTwoKeyNavParam")
-              .setParameters(Arrays.asList(
-                  new Parameter()
-                      .setName("ParameterInt16")
-                      .setType(nameInt16)))
-              .setComposable(true)
-              .setReturnType(
-                  new ReturnType().setType(nameETTwoKeyNav).setCollection(true))
-          );
-
-    } else if (functionName.equals(nameUFCRTString)) {
-      return Arrays.asList(
-          new Function()
-              .setName("UFCRTString")
-
-              .setComposable(true)
-              .setParameters(new ArrayList<Parameter>())
-              .setComposable(true)
-              .setReturnType(
-                  new ReturnType().setType(nameString)
-              )
-          );
-
-    } else if (functionName.equals(nameUFCRTCollStringTwoParam)) {
-      return Arrays.asList(
-          new Function()
-              .setName("UFCRTCollStringTwoParam")
-              .setParameters(Arrays.asList(
-                  new Parameter().setName("ParameterString").setType(nameString),
-                  new Parameter().setName("ParameterInt16").setType(nameInt16)))
-              .setComposable(true)
-              .setReturnType(
-                  new ReturnType().setType(nameString).setCollection(true))
-          );
-
-    } else if (functionName.equals(nameUFCRTCollString)) {
-      return Arrays.asList(
-          new Function()
-              .setName("UFCRTCollString")
-              .setParameters(new ArrayList<Parameter>())
-              .setComposable(true)
-              .setReturnType(
-                  new ReturnType().setType(nameString).setCollection(true))
-          );
-
-    } else if (functionName.equals(nameUFCRTCTAllPrimTwoParam)) {
-      return Arrays.asList(
-          new Function()
-              .setName("UFCRTCTAllPrimTwoParam")
-              .setParameters(Arrays.asList(
-                  new Parameter().setName("ParameterString").setType(nameString),
-                  new Parameter().setName("ParameterInt16").setType(nameInt16)))
-              .setComposable(true)
-              .setReturnType(
-                  new ReturnType().setType(nameCTAllPrim))
-          );
-
-    } else if (functionName.equals(nameUFCRTCTTwoPrimParam)) {
-      return Arrays.asList(
-          new Function()
-              .setName("UFCRTCTTwoPrimParam")
-              .setParameters(Arrays.asList(
-                  new Parameter().setName("ParameterString").setType(nameString),
-                  new Parameter().setName("ParameterInt16").setType(nameInt16)))
-              .setComposable(true)
-              .setReturnType(
-                  new ReturnType().setType(nameCTTwoPrim))
-          );
-    } else if (functionName.equals(nameUFCRTCollCTTwoPrimParam)) {
-      return Arrays.asList(
-          new Function()
-              .setName("UFCRTCollCTTwoPrimParam")
-              .setParameters(Arrays.asList(
-                  new Parameter().setName("ParameterString").setType(nameString),
-                  new Parameter().setName("ParameterInt16").setType(nameInt16)))
-              .setComposable(true)
-              .setReturnType(
-                  new ReturnType().setType(nameCTTwoPrim).setCollection(true))
-          );
-
-    } else if (functionName.equals(nameUFCRTCTTwoPrim)) {
-      return Arrays.asList(
-          new Function()
-              .setName("UFCRTCTTwoPrim")
-              .setParameters(new ArrayList<Parameter>())
-              .setComposable(true)
-              .setReturnType(
-                  new ReturnType().setType(nameCTTwoPrim))
-          );
-
-    } else if (functionName.equals(nameUFCRTCollCTTwoPrim)) {
-      return Arrays.asList(
-          new Function()
-              .setName("UFCRTCTTwoPrim")
-
-              .setParameters(new ArrayList<Parameter>())
-              .setReturnType(
-                  new ReturnType().setType(nameCTTwoPrim).setCollection(true))
-          );
-
-    } else if (functionName.equals(nameUFCRTETMedia)) {
-      return Arrays.asList(
-          new Function()
-              .setName("UFCRTETMedia")
-              .setParameters(new ArrayList<Parameter>())
-              .setReturnType(
-                  new ReturnType().setType(nameETMedia))
-          );
-
-    } else if (functionName.equals(nameUFCRTString)) {
-      return Arrays.asList(
-          new Function()
-              .setName("UFCRTString")
-              .setParameters(new ArrayList<Parameter>())
-              .setReturnType(new ReturnType()
-                  .setType(nameString)
-              )
-          );
-
-    } else if (functionName.equals(nameUFCRTCollCTTwoPrim)) {
-      return Arrays.asList(
-          new Function()
-              .setName("UFCRTCollCTTwoPrim")
-              .setComposable(true)
-              .setParameters(new ArrayList<Parameter>())
-              .setReturnType(
-                  new ReturnType().setType(nameCTTwoPrim).setCollection(true))
-          );
-
-    } else if (functionName.equals(nameUFNRTESMixPrimCollCompTwoParam)) {
-      return Arrays.asList(
-          new Function()
-              .setName("UFNRTESMixPrimCollCompTwoParam")
-              .setParameters(Arrays.asList(
-                  new Parameter().setName("ParameterString").setType(nameString),
-                  new Parameter().setName("ParameterInt16").setType(nameInt16)))
-              .setComposable(false)
-              .setReturnType(
-                  new ReturnType().setType(nameETMixPrimCollComp).setCollection(true))
-          );
-
-    } else if (functionName.equals(nameUFCRTETAllPrimTwoParam)) {
-      return Arrays.asList(
-          new Function()
-              .setName("UFCRTETAllPrimTwoParam")
-              .setParameters(Arrays.asList(
-                  new Parameter().setName("ParameterString").setType(nameString),
-                  new Parameter().setName("ParameterInt16").setType(nameInt16)))
-              .setComposable(true)
-              .setReturnType(
-                  new ReturnType().setType(nameETAllPrim))
-          );
-
-    } else if (functionName.equals(nameUFCRTESMixPrimCollCompTwoParam)) {
-      return Arrays.asList(
-          new Function()
-              .setName("UFCRTESMixPrimCollCompTwoParam")
-              .setParameters(Arrays.asList(
-                  new Parameter().setName("ParameterString").setType(nameString),
-                  new Parameter().setName("ParameterInt16").setType(nameInt16)
-                  ))
-              .setComposable(true)
-              .setReturnType(
-                  new ReturnType().setType(nameETMixPrimCollComp).setCollection(true))
-          );
-
-    } else if (functionName.equals(nameBFCESTwoKeyNavRTESTwoKeyNav)) {
-      return Arrays.asList(
-          new Function()
-              .setName("BFCESTwoKeyNavRTESTwoKeyNav")
-              .setBound(true)
-              .setParameters(Arrays.asList(
-                  new Parameter().setName("BindingParam").setType(nameETTwoKeyNav).setCollection(true)))
-              .setComposable(true)
-              .setReturnType(
-                  new ReturnType().setType(nameETTwoKeyNav).setCollection(true)),
-
-          new Function()
-              .setName("BFCESTwoKeyNavRTESTwoKeyNav")
-              .setBound(true)
-              .setParameters(Arrays.asList(
-                  new Parameter().setName("BindingParam").setType(nameETTwoKeyNav).setCollection(true),
-                  new Parameter().setName("ParameterString").setType(nameString).setCollection(false)))
-              .setComposable(true)
-              .setReturnType(
-                  new ReturnType().setType(nameETTwoKeyNav).setCollection(true)),
-          new Function()
-              .setName("BFCESTwoKeyNavRTESTwoKeyNav")
-              .setBound(true)
-              .setParameters(Arrays.asList(
-                  new Parameter().setName("BindingParam").setType(nameETKeyNav).setCollection(true)))
-              .setComposable(true)
-              .setReturnType(
-                  new ReturnType().setType(nameETTwoKeyNav).setCollection(true)),
-          new Function()
-              .setName("BFCESTwoKeyNavRTESTwoKeyNav")
-              .setBound(true)
-              .setParameters(
-                  Arrays.asList(new Parameter().setName("BindingParam").setType(nameETKeyNav).setCollection(true),
-                      new Parameter().setName("ParameterString").setType(nameString).setCollection(false)))
-              .setComposable(true)
-              .setReturnType(
-                  new ReturnType().setType(nameETTwoKeyNav).setCollection(true))
-          );
-
-    } else if (functionName.equals(nameBFCStringRTESTwoKeyNav)) {
-      return Arrays.asList(
-          new Function().setName("BFCStringRTESTwoKeyNav")
-              .setBound(true)
-              .setParameters(Arrays.asList(
-                  new Parameter().setName("BindingParam").setType(nameString)))
-              .setComposable(true)
-              .setReturnType(
-                  new ReturnType().setType(nameETTwoKeyNav).setCollection(true))
-          );
-
-    } else if (functionName.equals(nameBFCETBaseTwoKeyNavRTETTwoKeyNav)) {
-      return Arrays.asList(
-          new Function()
-              .setName("BFCETBaseTwoKeyNavRTETTwoKeyNav")
-              .setBound(true)
-              .setParameters(Arrays.asList(
-                  new Parameter().setName("BindingParam").setType(nameETBaseTwoKeyNav)))
-              .setComposable(true)
-              .setReturnType(
-                  new ReturnType().setType(nameETTwoKeyNav)
-              )
-          );
-
-    } else if (functionName.equals(nameBFCESBaseTwoKeyNavRTESBaseTwoKey)) {
-      return Arrays.asList(
-          new Function()
-              .setName("BFCESBaseTwoKeyNavRTESBaseTwoKey")
-              .setBound(true)
-              .setParameters(Arrays.asList(
-                  new Parameter().setName("BindingParam").setType(nameETBaseTwoKeyNav)
-                      .setCollection(true)))
-              .setComposable(true)
-              .setReturnType(
-                  new ReturnType().setType(nameETBaseTwoKeyNav).setCollection(true))
-          );
-
-    } else if (functionName.equals(nameBFCESAllPrimRTCTAllPrim)) {
-      return Arrays.asList(
-          new Function()
-              .setName("BFCESAllPrimRTCTAllPrim")
-              .setBound(true)
-              .setParameters(Arrays.asList(
-                  new Parameter().setName("BindingParam").setType(nameETAllPrim).setCollection(true)))
-              .setComposable(true)
-              .setReturnType(
-                  new ReturnType().setType(nameCTAllPrim))
-          );
-
-    } else if (functionName.equals(nameBFCESTwoKeyNavRTCTTwoPrim)) {
-      return Arrays.asList(
-          new Function()
-              .setName("BFCESTwoKeyNavRTCTTwoPrim")
-              .setBound(true)
-              .setParameters(Arrays.asList(
-                  new Parameter().setName("BindingParam").setType(nameETTwoKeyNav).setCollection(true)))
-              .setComposable(true)
-              .setReturnType(
-                  new ReturnType().setType(nameCTTwoPrim))
-          );
-
-    } else if (functionName.equals(nameBFCESTwoKeyNavRTCollCTTwoPrim)) {
-      return Arrays.asList(
-          new Function()
-              .setName("BFCESTwoKeyNavRTCollCTTwoPrim")
-              .setBound(true)
-              .setParameters(Arrays.asList(
-                  new Parameter().setName("BindingParam").setType(nameETTwoKeyNav).setCollection(true)))
-              .setComposable(true)
-              .setReturnType(
-                  new ReturnType().setType(nameCTTwoPrim).setCollection(true))
-          );
-
-    } else if (functionName.equals(nameBFCESTwoKeyNavRTString)) {
-      return Arrays.asList(
-          new Function()
-              .setName("BFCESTwoKeyNavRTString")
-              .setBound(true)
-              .setParameters(Arrays.asList(
-                  new Parameter().setName("BindingParam").setType(nameETTwoKeyNav).setCollection(true)))
-              .setComposable(true)
-              .setReturnType(
-                  new ReturnType().setType(nameString))
-          );
-
-    } else if (functionName.equals(nameBFCESTwoKeyNavRTCollString)) {
-      return Arrays.asList(
-          new Function()
-              .setName("BFCESTwoKeyNavRTCollString")
-              .setBound(true)
-              .setParameters(Arrays.asList(
-                  new Parameter().setName("BindingParam").setType(nameETTwoKeyNav).setCollection(true)))
-              .setComposable(true)
-              .setReturnType(
-                  new ReturnType().setType(nameString).setCollection(true))
-          );
-
-    } else if (functionName.equals(nameBFCETTwoKeyNavRTESTwoKeyNav)) {
-      return Arrays.asList(
-          new Function()
-              .setName("BFCETTwoKeyNavRTESTwoKeyNav")
-              .setBound(true)
-              .setParameters(Arrays.asList(
-                  new Parameter().setName("BindingParam").setType(nameETTwoKeyNav)))
-              .setComposable(true)
-              .setReturnType(
-                  new ReturnType().setType(nameETTwoKeyNav).setCollection(true))
-          );
-
-    } else if (functionName.equals(nameBFCETBaseTwoKeyNavRTESTwoKeyNav)) {
-      return Arrays.asList(
-          new Function()
-              .setName("BFCETBaseTwoKeyNavRTESTwoKeyNav")
-              .setBound(true)
-              .setParameters(Arrays.asList(
-                  new Parameter().setName("BindingParam").setType(nameETBaseTwoKeyNav)))
-              .setComposable(true)
-             

<TRUNCATED>