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:29 UTC

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

[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();
   }