You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@olingo.apache.org by ar...@apache.org on 2018/08/20 06:01:25 UTC

[1/3] olingo-odata4 git commit: [OLINGO-1062]Cannot consume Odata Reference Services with Annotations

Repository: olingo-odata4
Updated Branches:
  refs/heads/master 58ec0358c -> 8cbe468c2


http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/8cbe468c/lib/commons-api/src/main/java/org/apache/olingo/commons/api/edm/provider/annotation/CsdlLabeledElementReference.java
----------------------------------------------------------------------
diff --git a/lib/commons-api/src/main/java/org/apache/olingo/commons/api/edm/provider/annotation/CsdlLabeledElementReference.java b/lib/commons-api/src/main/java/org/apache/olingo/commons/api/edm/provider/annotation/CsdlLabeledElementReference.java
index b9b9483..36379f6 100644
--- a/lib/commons-api/src/main/java/org/apache/olingo/commons/api/edm/provider/annotation/CsdlLabeledElementReference.java
+++ b/lib/commons-api/src/main/java/org/apache/olingo/commons/api/edm/provider/annotation/CsdlLabeledElementReference.java
@@ -38,4 +38,25 @@ public class CsdlLabeledElementReference extends CsdlDynamicExpression {
     this.value = value;
     return this;
   }
+  
+  @Override
+  public boolean equals (Object obj) {
+    if (obj == null) {
+      return false;
+    }
+    if (!(obj instanceof CsdlLabeledElementReference)) {
+      return false;
+    }
+    CsdlLabeledElementReference csdlLabelledEleRef = (CsdlLabeledElementReference) obj;
+    return (this.getValue() == null ? csdlLabelledEleRef.getValue() == null :
+        this.getValue().equals(csdlLabelledEleRef.getValue()));
+  }
+  
+  @Override
+  public int hashCode() {
+    final int prime = 31;
+    int result = 1;
+    result = prime * result + ((value == null) ? 0 : value.hashCode());
+    return result;
+  }
 }

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/8cbe468c/lib/commons-api/src/main/java/org/apache/olingo/commons/api/edm/provider/annotation/CsdlLogicalOrComparisonExpression.java
----------------------------------------------------------------------
diff --git a/lib/commons-api/src/main/java/org/apache/olingo/commons/api/edm/provider/annotation/CsdlLogicalOrComparisonExpression.java b/lib/commons-api/src/main/java/org/apache/olingo/commons/api/edm/provider/annotation/CsdlLogicalOrComparisonExpression.java
index bbf50f4..e14c944 100644
--- a/lib/commons-api/src/main/java/org/apache/olingo/commons/api/edm/provider/annotation/CsdlLogicalOrComparisonExpression.java
+++ b/lib/commons-api/src/main/java/org/apache/olingo/commons/api/edm/provider/annotation/CsdlLogicalOrComparisonExpression.java
@@ -145,4 +145,51 @@ public class CsdlLogicalOrComparisonExpression extends CsdlDynamicExpression imp
     }
     return this;
   }
+  
+  @Override
+  public boolean equals (Object obj) {
+    if (obj == null) {
+      return false;
+    }
+    if (!(obj instanceof CsdlLogicalOrComparisonExpression)) {
+      return false;
+    }
+    CsdlLogicalOrComparisonExpression csdlLogComp = (CsdlLogicalOrComparisonExpression) obj;
+    return (this.getLeft() == null ? csdlLogComp.getLeft() == null :
+      this.getLeft().equals(csdlLogComp.getLeft()))
+        && (this.getRight() == null ? csdlLogComp.getRight() == null : 
+          this.getRight().equals(csdlLogComp.getRight()))
+        && (this.getType() == null ? csdlLogComp.getType() == null : 
+          this.getType().equals(csdlLogComp.getType()))
+        && (this.getAnnotations() == null ? csdlLogComp.getAnnotations() == null : 
+            checkAnnotations(csdlLogComp.getAnnotations()));
+  }
+  
+  private boolean checkAnnotations(List<CsdlAnnotation> csdlLogCompAnnot) {
+    if (csdlLogCompAnnot == null) {
+      return false;
+    }
+    if (this.getAnnotations().size() == csdlLogCompAnnot.size()) {
+      for (int i = 0; i < this.getAnnotations().size() ; i++) {
+        if (!this.getAnnotations().get(i).equals(csdlLogCompAnnot.get(i))) {
+          return false;
+        }
+      }
+    } else {
+      return false;
+    }
+    return true;
+  }
+
+  @Override
+  public int hashCode() {
+    final int prime = 31;
+    int result = 1;
+    result = prime * result + ((type == null) ? 0 : type.hashCode());
+    result = prime * result + ((left == null) ? 0 : left.hashCode());
+    result = prime * result + ((right == null) ? 0 : right.hashCode());
+    result = prime * result + ((annotations == null) ? 0 : 
+      annotations.hashCode());
+    return result;
+  }
 }

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/8cbe468c/lib/commons-api/src/main/java/org/apache/olingo/commons/api/edm/provider/annotation/CsdlNavigationPropertyPath.java
----------------------------------------------------------------------
diff --git a/lib/commons-api/src/main/java/org/apache/olingo/commons/api/edm/provider/annotation/CsdlNavigationPropertyPath.java b/lib/commons-api/src/main/java/org/apache/olingo/commons/api/edm/provider/annotation/CsdlNavigationPropertyPath.java
index f600c0a..32a1b8f 100644
--- a/lib/commons-api/src/main/java/org/apache/olingo/commons/api/edm/provider/annotation/CsdlNavigationPropertyPath.java
+++ b/lib/commons-api/src/main/java/org/apache/olingo/commons/api/edm/provider/annotation/CsdlNavigationPropertyPath.java
@@ -39,4 +39,25 @@ public class CsdlNavigationPropertyPath extends CsdlDynamicExpression {
     this.value = value;
     return this;
   }
+  
+  @Override
+  public boolean equals (Object obj) {
+    if (obj == null) {
+      return false;
+    }
+    if (!(obj instanceof CsdlNavigationPropertyPath)) {
+      return false;
+    }
+    CsdlNavigationPropertyPath csdlNavPropPath = (CsdlNavigationPropertyPath) obj;
+    return (this.getValue() == null ? csdlNavPropPath.getValue() == null :
+      this.getValue().equals(csdlNavPropPath.getValue()));
+  }
+  
+  @Override
+  public int hashCode() {
+    final int prime = 31;
+    int result = 1;
+    result = prime * result + ((value == null) ? 0 : value.hashCode());
+    return result;
+  }
 }

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/8cbe468c/lib/commons-api/src/main/java/org/apache/olingo/commons/api/edm/provider/annotation/CsdlNull.java
----------------------------------------------------------------------
diff --git a/lib/commons-api/src/main/java/org/apache/olingo/commons/api/edm/provider/annotation/CsdlNull.java b/lib/commons-api/src/main/java/org/apache/olingo/commons/api/edm/provider/annotation/CsdlNull.java
index b7c85d7..b75ffb2 100644
--- a/lib/commons-api/src/main/java/org/apache/olingo/commons/api/edm/provider/annotation/CsdlNull.java
+++ b/lib/commons-api/src/main/java/org/apache/olingo/commons/api/edm/provider/annotation/CsdlNull.java
@@ -40,4 +40,42 @@ public class CsdlNull extends CsdlDynamicExpression implements CsdlAnnotatable {
     this.annotations = annotations;
     return this;
   }
+  
+  @Override
+  public boolean equals (Object obj) {
+    if (obj == null) {
+      return false;
+    }
+    if (!(obj instanceof CsdlNull)) {
+      return false;
+    }
+    CsdlNull csdlNull = (CsdlNull) obj;
+    return (this.getAnnotations() == null ? csdlNull.getAnnotations() == null :
+        checkAnnotations(csdlNull.getAnnotations()));
+  }
+  
+  private boolean checkAnnotations(List<CsdlAnnotation> csdlNullAnnot) {
+    if (csdlNullAnnot == null) {
+      return false;
+    }
+    if (this.getAnnotations().size() == csdlNullAnnot.size()) {
+      for (int i = 0; i < this.getAnnotations().size() ; i++) {
+        if (!this.getAnnotations().get(i).equals(csdlNullAnnot.get(i))) {
+          return false;
+        }
+      }
+    } else {
+      return false;
+    }
+    return true;
+  }
+
+  @Override
+  public int hashCode() {
+    final int prime = 31;
+    int result = 1;
+    result = prime * result + ((annotations == null) ? 0 : 
+      annotations.hashCode());
+    return result;
+  }
 }

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/8cbe468c/lib/commons-api/src/main/java/org/apache/olingo/commons/api/edm/provider/annotation/CsdlPath.java
----------------------------------------------------------------------
diff --git a/lib/commons-api/src/main/java/org/apache/olingo/commons/api/edm/provider/annotation/CsdlPath.java b/lib/commons-api/src/main/java/org/apache/olingo/commons/api/edm/provider/annotation/CsdlPath.java
index 4d1d2e1..01087ff 100644
--- a/lib/commons-api/src/main/java/org/apache/olingo/commons/api/edm/provider/annotation/CsdlPath.java
+++ b/lib/commons-api/src/main/java/org/apache/olingo/commons/api/edm/provider/annotation/CsdlPath.java
@@ -40,4 +40,25 @@ public class CsdlPath extends CsdlDynamicExpression {
     this.value = value;
     return this;
   }
+  
+  @Override
+  public boolean equals (Object obj) {
+    if (obj == null) {
+      return false;
+    }
+    if (!(obj instanceof CsdlPath)) {
+      return false;
+    }
+    CsdlPath csdlPath = (CsdlPath) obj;
+    return (this.getValue() == null ? csdlPath.getValue() == null :
+      this.getValue().equals(csdlPath.getValue()));
+  }
+  
+  @Override
+  public int hashCode() {
+    final int prime = 31;
+    int result = 1;
+    result = prime * result + ((value == null) ? 0 : value.hashCode());
+    return result;
+  }
 }

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/8cbe468c/lib/commons-api/src/main/java/org/apache/olingo/commons/api/edm/provider/annotation/CsdlPropertyPath.java
----------------------------------------------------------------------
diff --git a/lib/commons-api/src/main/java/org/apache/olingo/commons/api/edm/provider/annotation/CsdlPropertyPath.java b/lib/commons-api/src/main/java/org/apache/olingo/commons/api/edm/provider/annotation/CsdlPropertyPath.java
index f1d562f..5160889 100644
--- a/lib/commons-api/src/main/java/org/apache/olingo/commons/api/edm/provider/annotation/CsdlPropertyPath.java
+++ b/lib/commons-api/src/main/java/org/apache/olingo/commons/api/edm/provider/annotation/CsdlPropertyPath.java
@@ -38,4 +38,25 @@ public class CsdlPropertyPath extends CsdlDynamicExpression {
     this.value = value;
     return this;
   }
+  
+  @Override
+  public boolean equals (Object obj) {
+    if (obj == null) {
+      return false;
+    }
+    if (!(obj instanceof CsdlPropertyPath)) {
+      return false;
+    }
+    CsdlPropertyPath csdlPropPath = (CsdlPropertyPath) obj;
+    return this.getValue() == null ? csdlPropPath.getValue() == null : 
+      this.getValue().equals(csdlPropPath.getValue());
+  }
+  
+  @Override
+  public int hashCode() {
+    final int prime = 31;
+    int result = 1;
+    result = prime * result + ((value == null) ? 0 : value.hashCode());
+    return result;
+  }
 }

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/8cbe468c/lib/commons-api/src/main/java/org/apache/olingo/commons/api/edm/provider/annotation/CsdlPropertyValue.java
----------------------------------------------------------------------
diff --git a/lib/commons-api/src/main/java/org/apache/olingo/commons/api/edm/provider/annotation/CsdlPropertyValue.java b/lib/commons-api/src/main/java/org/apache/olingo/commons/api/edm/provider/annotation/CsdlPropertyValue.java
index 4ee4b79..35524eb 100644
--- a/lib/commons-api/src/main/java/org/apache/olingo/commons/api/edm/provider/annotation/CsdlPropertyValue.java
+++ b/lib/commons-api/src/main/java/org/apache/olingo/commons/api/edm/provider/annotation/CsdlPropertyValue.java
@@ -71,4 +71,50 @@ public class CsdlPropertyValue extends CsdlAbstractEdmItem implements CsdlAnnota
     this.value = value;
     return this;
   }
+  
+  @Override
+  public boolean equals (Object obj) {
+    if (obj == null) {
+      return false;
+    }
+    if (!(obj instanceof CsdlPropertyValue)) {
+      return false;
+    }
+    CsdlPropertyValue csdlPropertyValue = (CsdlPropertyValue) obj;
+    
+    return (this.getProperty() == null ? csdlPropertyValue.getProperty() == null :
+      this.getProperty().equalsIgnoreCase(csdlPropertyValue.getProperty()))
+        && (this.getValue() == null ? csdlPropertyValue.getValue() == null :
+          this.getValue().equals(csdlPropertyValue.getValue()))
+        && (this.getAnnotations() == null ? csdlPropertyValue.getAnnotations() == null :
+            checkAnnotations(csdlPropertyValue.getAnnotations()));
+  }
+  
+  private boolean checkAnnotations(List<CsdlAnnotation> csdlPropertyValueAnnot) {
+    if (csdlPropertyValueAnnot == null) {
+      return false;
+    }
+    if (this.getAnnotations().size() == csdlPropertyValueAnnot.size()) {
+      for (int i = 0; i < this.getAnnotations().size() ; i++) {
+        if (!this.getAnnotations().get(i).equals(
+            csdlPropertyValueAnnot.get(i))) {
+          return false;
+        }
+      }
+    } else {
+      return false;
+    }
+    return true;
+  }
+
+  @Override
+  public int hashCode() {
+    final int prime = 31;
+    int result = 1;
+    result = prime * result + ((property == null) ? 0 : property.hashCode());
+    result = prime * result + ((value == null) ? 0 : value.hashCode());
+    result = prime * result + ((annotations == null) ? 0 : 
+      annotations.hashCode());
+    return result;
+  }
 }

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/8cbe468c/lib/commons-api/src/main/java/org/apache/olingo/commons/api/edm/provider/annotation/CsdlRecord.java
----------------------------------------------------------------------
diff --git a/lib/commons-api/src/main/java/org/apache/olingo/commons/api/edm/provider/annotation/CsdlRecord.java b/lib/commons-api/src/main/java/org/apache/olingo/commons/api/edm/provider/annotation/CsdlRecord.java
index 772e97e..a0fa747 100644
--- a/lib/commons-api/src/main/java/org/apache/olingo/commons/api/edm/provider/annotation/CsdlRecord.java
+++ b/lib/commons-api/src/main/java/org/apache/olingo/commons/api/edm/provider/annotation/CsdlRecord.java
@@ -69,4 +69,66 @@ public class CsdlRecord extends CsdlDynamicExpression implements CsdlAnnotatable
     this.propertyValues = propertyValues;
     return this;
   }
+  
+  @Override
+  public boolean equals (Object obj) {
+    if (obj == null) {
+      return false;
+    }
+    if (!(obj instanceof CsdlRecord)) {
+      return false;
+    }
+    CsdlRecord csdlRecord = (CsdlRecord) obj;
+    return (this.getType() == null ? csdlRecord.getType() == null :
+      this.getType().equals(csdlRecord.getType()))
+        && (this.getAnnotations() == null ? csdlRecord.getAnnotations() == null :
+            checkAnnotations(csdlRecord.getAnnotations()))
+        && (this.getPropertyValues() == null ? csdlRecord.getPropertyValues() == null :
+            checkPropertyValues(csdlRecord.getPropertyValues()));
+  }
+  
+  private boolean checkPropertyValues(List<CsdlPropertyValue> csdlRecordpropertyValues) {
+    if (csdlRecordpropertyValues == null) {
+      return false;
+    }
+    if (this.getPropertyValues().size() == csdlRecordpropertyValues.size()) {
+      for (int i = 0; i < this.getPropertyValues().size(); i++) {
+        if (!this.getPropertyValues().get(i).equals(
+            csdlRecordpropertyValues.get(i))) {
+          return false;
+        }
+      }
+    } else {
+      return false;
+    }
+    return true;
+  }
+
+  private boolean checkAnnotations(List<CsdlAnnotation> csdlRecordAnnot) {
+    if (csdlRecordAnnot == null) {
+      return false;
+    }
+    if (this.getAnnotations().size() == csdlRecordAnnot.size()) {
+      for (int i = 0; i < this.getAnnotations().size() ; i++) {
+        if (!this.getAnnotations().get(i).equals(csdlRecordAnnot.get(i))) {
+          return false;
+        }
+      }
+    } else {
+      return false;
+    }
+    return true;
+  }
+
+  @Override
+  public int hashCode() {
+    final int prime = 31;
+    int result = 1;
+    result = prime * result + ((type == null) ? 0 : type.hashCode());
+    result = prime * result + ((propertyValues == null) ? 0 : 
+      propertyValues.hashCode());
+    result = prime * result + ((annotations == null) ? 0 : 
+      annotations.hashCode());
+    return result;
+  }
 }

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/8cbe468c/lib/commons-api/src/main/java/org/apache/olingo/commons/api/edm/provider/annotation/CsdlUrlRef.java
----------------------------------------------------------------------
diff --git a/lib/commons-api/src/main/java/org/apache/olingo/commons/api/edm/provider/annotation/CsdlUrlRef.java b/lib/commons-api/src/main/java/org/apache/olingo/commons/api/edm/provider/annotation/CsdlUrlRef.java
index a08a279..b90ceba 100644
--- a/lib/commons-api/src/main/java/org/apache/olingo/commons/api/edm/provider/annotation/CsdlUrlRef.java
+++ b/lib/commons-api/src/main/java/org/apache/olingo/commons/api/edm/provider/annotation/CsdlUrlRef.java
@@ -55,4 +55,44 @@ public class CsdlUrlRef extends CsdlDynamicExpression implements CsdlAnnotatable
     this.value = value;
     return this;
   }
+  
+  @Override
+  public boolean equals (Object obj) {
+    if (obj == null) {
+      return false;
+    }
+    if (!(obj instanceof CsdlUrlRef)) {
+      return false;
+    }
+    CsdlUrlRef csdlUrlRef = (CsdlUrlRef) obj;
+    return (this.getValue() == null ? csdlUrlRef.getValue() == null :
+      this.getValue().equals(csdlUrlRef.getValue()))
+        && (this.getAnnotations() == null ? csdlUrlRef.getAnnotations() == null :
+            checkAnnotations(csdlUrlRef.getAnnotations()));
+  }
+  
+  private boolean checkAnnotations(List<CsdlAnnotation> csdlUrlRefAnnot) {
+    if (csdlUrlRefAnnot == null) {
+      return false;
+    }
+    if (this.getAnnotations().size() == csdlUrlRefAnnot.size()) {
+      for (int i = 0; i < this.getAnnotations().size() ; i++) {
+        if (!this.getAnnotations().get(i).equals(csdlUrlRefAnnot.get(i))) {
+          return false;
+        }
+      }
+    } else {
+      return false;
+    }
+    return true;
+  }
+
+  @Override
+  public int hashCode() {
+    final int prime = 31;
+    int result = 1;
+    result = prime * result + ((value == null) ? 0 : value.hashCode());
+    result = prime * result + ((annotations == null) ? 0 : annotations.hashCode());
+    return result;
+  }
 }

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/8cbe468c/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/AbstractEdm.java
----------------------------------------------------------------------
diff --git a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/AbstractEdm.java b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/AbstractEdm.java
index bcfd394..06d053e 100644
--- a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/AbstractEdm.java
+++ b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/AbstractEdm.java
@@ -42,6 +42,9 @@ public abstract class AbstractEdm implements Edm {
 
   protected Map<String, EdmSchema> schemas;
   protected List<EdmSchema> schemaList;
+  private boolean isEntityDerivedFromES;
+  private boolean isComplexDerivedFromES;
+  private boolean isPreviousES;
 
   private final Map<FullQualifiedName, EdmEntityContainer> entityContainers =
       Collections.synchronizedMap(new HashMap<FullQualifiedName, EdmEntityContainer>());
@@ -80,6 +83,18 @@ public abstract class AbstractEdm implements Edm {
       Collections.synchronizedMap(new HashMap<TargetQualifierMapKey, EdmAnnotations>());
 
   private Map<String, String> aliasToNamespaceInfo = null;
+  
+  private final Map<FullQualifiedName, EdmEntityType> entityTypesWithAnnotations =
+      Collections.synchronizedMap(new HashMap<FullQualifiedName, EdmEntityType>());
+  
+  private final Map<FullQualifiedName, EdmEntityType> entityTypesDerivedFromES =
+      Collections.synchronizedMap(new HashMap<FullQualifiedName, EdmEntityType>());
+  
+  private final Map<FullQualifiedName, EdmComplexType> complexTypesWithAnnotations =
+      Collections.synchronizedMap(new HashMap<FullQualifiedName, EdmComplexType>());
+  
+  private final Map<FullQualifiedName, EdmComplexType> complexTypesDerivedFromES =
+      Collections.synchronizedMap(new HashMap<FullQualifiedName, EdmComplexType>());
 
   @Override
   public List<EdmSchema> getSchemas() {
@@ -176,6 +191,56 @@ public abstract class AbstractEdm implements Edm {
   }
 
   @Override
+  public EdmEntityType getEntityTypeWithAnnotations(final FullQualifiedName namespaceOrAliasFQN) {
+    final FullQualifiedName fqn = resolvePossibleAlias(namespaceOrAliasFQN);
+    EdmEntityType entityType = entityTypesWithAnnotations.get(fqn);
+    if (entityType == null) {
+      entityType = createEntityType(fqn);
+      if (entityType != null) {
+          entityTypesWithAnnotations.put(fqn, entityType);
+      }
+    }
+    setIsPreviousES(false);
+    return entityType;
+  }
+  
+  protected EdmEntityType getEntityTypeWithAnnotations(final FullQualifiedName namespaceOrAliasFQN, 
+      boolean isEntityDerivedFromES) {
+    this.isEntityDerivedFromES = isEntityDerivedFromES;
+    final FullQualifiedName fqn = resolvePossibleAlias(namespaceOrAliasFQN);
+    if (!isPreviousES() && getEntityContainer() != null) {
+       getEntityContainer().getEntitySetsWithAnnotations();
+    }
+    EdmEntityType entityType = entityTypesDerivedFromES.get(fqn);
+    if (entityType == null) {
+      entityType = createEntityType(fqn);
+      if (entityType != null) {
+          entityTypesDerivedFromES.put(fqn, entityType);
+      }
+    }
+    this.isEntityDerivedFromES = false;
+    return entityType;
+  }
+  
+  protected EdmComplexType getComplexTypeWithAnnotations(final FullQualifiedName namespaceOrAliasFQN, 
+      boolean isComplexDerivedFromES) {
+    this.isComplexDerivedFromES = isComplexDerivedFromES;
+    final FullQualifiedName fqn = resolvePossibleAlias(namespaceOrAliasFQN);
+    if (!isPreviousES() && getEntityContainer() != null) {
+       getEntityContainer().getEntitySetsWithAnnotations();
+    }
+    EdmComplexType complexType = complexTypesDerivedFromES.get(fqn);
+    if (complexType == null) {
+      complexType = createComplexType(fqn);
+      if (complexType != null) {
+          complexTypesDerivedFromES.put(fqn, complexType);
+      }
+    }
+    this.isComplexDerivedFromES = false;
+    return complexType;
+  }
+  
+  @Override
   public EdmComplexType getComplexType(final FullQualifiedName namespaceOrAliasFQN) {
     final FullQualifiedName fqn = resolvePossibleAlias(namespaceOrAliasFQN);
     EdmComplexType complexType = complexTypes.get(fqn);
@@ -189,6 +254,20 @@ public abstract class AbstractEdm implements Edm {
   }
 
   @Override
+  public EdmComplexType getComplexTypeWithAnnotations(final FullQualifiedName namespaceOrAliasFQN) {
+    final FullQualifiedName fqn = resolvePossibleAlias(namespaceOrAliasFQN);
+    EdmComplexType complexType = complexTypesWithAnnotations.get(fqn);
+    if (complexType == null) {
+      complexType = createComplexType(fqn);
+      if (complexType != null) {
+          complexTypesWithAnnotations.put(fqn, complexType);
+      }
+    }
+    setIsPreviousES(false);
+    return complexType;
+  }
+  
+  @Override
   public EdmAction getUnboundAction(final FullQualifiedName actionName) {
     final FullQualifiedName fqn = resolvePossibleAlias(actionName);
     EdmAction action = unboundActions.get(fqn);
@@ -452,4 +531,20 @@ public abstract class AbstractEdm implements Edm {
     }
     return functions;
   }
+  
+  protected boolean isEntityDerivedFromES() {
+    return isEntityDerivedFromES;
+  }
+  
+  protected boolean isComplexDerivedFromES() {
+    return isComplexDerivedFromES;
+  }
+  
+  protected void setIsPreviousES(boolean isPreviousES) {
+    this.isPreviousES = isPreviousES;
+  }
+  
+  protected boolean isPreviousES() {
+    return isPreviousES;
+  }
 }

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/8cbe468c/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/AbstractEdmBindingTarget.java
----------------------------------------------------------------------
diff --git a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/AbstractEdmBindingTarget.java b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/AbstractEdmBindingTarget.java
index cade5a6..786285c 100644
--- a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/AbstractEdmBindingTarget.java
+++ b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/AbstractEdmBindingTarget.java
@@ -79,6 +79,17 @@ public abstract class AbstractEdmBindingTarget extends AbstractEdmNamed implemen
   }
 
   @Override
+  public EdmEntityType getEntityTypeWithAnnotations() {
+    final EdmEntityType entityType = ((AbstractEdm)edm).
+        getEntityTypeWithAnnotations(target.getTypeFQN(), true);
+    if (entityType == null) {
+      throw new EdmException("Can´t find entity type: " + target.getTypeFQN() + " for entity set or singleton: "
+          + getName());
+    }
+    return entityType;
+  }
+  
+  @Override
   public EdmBindingTarget getRelatedBindingTarget(final String path) {
     if (path == null) {
       return null;

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/8cbe468c/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/EdmEntityContainerImpl.java
----------------------------------------------------------------------
diff --git a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/EdmEntityContainerImpl.java b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/EdmEntityContainerImpl.java
index 1ff83fe..9255cda 100644
--- a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/EdmEntityContainerImpl.java
+++ b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/EdmEntityContainerImpl.java
@@ -34,12 +34,20 @@ import org.apache.olingo.commons.api.edm.EdmFunctionImport;
 import org.apache.olingo.commons.api.edm.EdmSingleton;
 import org.apache.olingo.commons.api.edm.FullQualifiedName;
 import org.apache.olingo.commons.api.edm.provider.CsdlActionImport;
+import org.apache.olingo.commons.api.edm.provider.CsdlAnnotation;
+import org.apache.olingo.commons.api.edm.provider.CsdlAnnotations;
+import org.apache.olingo.commons.api.edm.provider.CsdlComplexType;
 import org.apache.olingo.commons.api.edm.provider.CsdlEdmProvider;
 import org.apache.olingo.commons.api.edm.provider.CsdlEntityContainer;
 import org.apache.olingo.commons.api.edm.provider.CsdlEntityContainerInfo;
 import org.apache.olingo.commons.api.edm.provider.CsdlEntitySet;
+import org.apache.olingo.commons.api.edm.provider.CsdlEntityType;
 import org.apache.olingo.commons.api.edm.provider.CsdlFunctionImport;
+import org.apache.olingo.commons.api.edm.provider.CsdlNavigationProperty;
+import org.apache.olingo.commons.api.edm.provider.CsdlProperty;
+import org.apache.olingo.commons.api.edm.provider.CsdlSchema;
 import org.apache.olingo.commons.api.edm.provider.CsdlSingleton;
+import org.apache.olingo.commons.api.ex.ODataException;
 
 public class EdmEntityContainerImpl extends AbstractEdmNamed implements EdmEntityContainer {
 
@@ -61,6 +69,12 @@ public class EdmEntityContainerImpl extends AbstractEdmNamed implements EdmEntit
   private List<EdmFunctionImport> functionImports;
   private final Map<String, EdmFunctionImport> functionImportCache = Collections.synchronizedMap(
       new LinkedHashMap<String, EdmFunctionImport>());
+	  private boolean isAnnotationsIncluded = false;
+  private final Map<String, EdmEntitySet> entitySetWithAnnotationsCache = Collections.synchronizedMap(
+      new LinkedHashMap<String, EdmEntitySet>());
+  private final Map<String, EdmSingleton> singletonWithAnnotationsCache = Collections.synchronizedMap(
+      new LinkedHashMap<String, EdmSingleton>());
+  private boolean isSingletonAnnotationsIncluded = false;
 
   public EdmEntityContainerImpl(final Edm edm, final CsdlEdmProvider provider,
       final CsdlEntityContainerInfo entityContainerInfo) {
@@ -76,7 +90,8 @@ public class EdmEntityContainerImpl extends AbstractEdmNamed implements EdmEntit
     this.provider = provider;
     container = entityContainer;
     entityContainerName = containerFQN;
-    parentContainerName = entityContainer.getExtendsContainerFQN();
+    parentContainerName = entityContainer == null ? null : 
+      entityContainer.getExtendsContainerFQN();
   }
 
   @Override
@@ -91,11 +106,18 @@ public class EdmEntityContainerImpl extends AbstractEdmNamed implements EdmEntit
 
   @Override
   public EdmSingleton getSingleton(final String singletonName) {
-    EdmSingleton singleton = singletonCache.get(singletonName);
+    EdmSingleton singleton = singletonWithAnnotationsCache.get(singletonName);
     if (singleton == null) {
-      singleton = createSingleton(singletonName);
-      if (singleton != null) {
-        singletonCache.put(singletonName, singleton);
+      singleton = singletonCache.get(singletonName);
+      if (singleton == null) {
+        singleton = createSingleton(singletonName);
+        if (singleton != null) {
+          if (isSingletonAnnotationsIncluded) {
+            singletonWithAnnotationsCache.put(singletonName, singleton);
+          } else {
+            singletonCache.put(singletonName, singleton);
+          }
+        }
       }
     }
     return singleton;
@@ -103,13 +125,21 @@ public class EdmEntityContainerImpl extends AbstractEdmNamed implements EdmEntit
 
   @Override
   public EdmEntitySet getEntitySet(final String entitySetName) {
-    EdmEntitySet entitySet = entitySetCache.get(entitySetName);
+    EdmEntitySet entitySet = entitySetWithAnnotationsCache.get(entitySetName);
     if (entitySet == null) {
-      entitySet = createEntitySet(entitySetName);
-      if (entitySet != null) {
-        entitySetCache.put(entitySetName, entitySet);
+      entitySet = entitySetCache.get(entitySetName);
+      if (entitySet == null) {
+        entitySet = createEntitySet(entitySetName);
+        if (entitySet != null) {
+          if (isAnnotationsIncluded) {
+            entitySetWithAnnotationsCache.put(entitySetName, entitySet);
+          } else {
+            entitySetCache.put(entitySetName, entitySet);
+          }
+        }
       }
     }
+    ((EdmProviderImpl)edm).setIsPreviousES(true);
     return entitySet;
   }
 
@@ -146,6 +176,12 @@ public class EdmEntityContainerImpl extends AbstractEdmNamed implements EdmEntit
   }
 
   @Override
+  public List<EdmEntitySet> getEntitySetsWithAnnotations() {
+    loadAllEntitySets();
+    return Collections.unmodifiableList(entitySets);
+  }
+  
+  @Override
   public List<EdmFunctionImport> getFunctionImports() {
     if (functionImports == null) {
       loadAllFunctionImports();
@@ -180,6 +216,7 @@ public class EdmEntityContainerImpl extends AbstractEdmNamed implements EdmEntit
     try {
       final CsdlSingleton providerSingleton = provider.getSingleton(entityContainerName, singletonName);
       if (providerSingleton != null) {
+		addAnnotations(providerSingleton, entityContainerName);
         singleton = new EdmSingletonImpl(edm, this, providerSingleton);
       }
     } catch (ODataException e) {
@@ -189,12 +226,112 @@ public class EdmEntityContainerImpl extends AbstractEdmNamed implements EdmEntit
     return singleton;
   }
 
+  private void addAnnotations(CsdlSingleton singleton, FullQualifiedName entityContainerName) {
+    boolean isPropAnnotationsCleared = false;
+    boolean isNavPropAnnotationsCleared = false;
+    CsdlEntityType entityType = fetchEntityTypeFromSingleton(singleton);
+    if (entityType == null) {
+      return;
+    }
+    
+    List<CsdlSchema> termSchemaDefinition = ((EdmProviderImpl)edm).getTermSchemaDefinitions();
+    for (CsdlSchema schema : termSchemaDefinition) {
+      List<CsdlAnnotations> annotationGrps = schema.getAnnotationGroups();
+      for (CsdlAnnotations annotationGrp : annotationGrps) {
+        if (annotationGrp.getTarget().
+            equalsIgnoreCase(entityContainerName + "/" + singleton.getName())) {
+          isSingletonAnnotationsIncluded = true;
+          addAnnotationsToSingleton(singleton, annotationGrp);
+        } else {
+          addAnnotationsToPropertiesDerivedFromSingleton(singleton, isPropAnnotationsCleared,
+              isNavPropAnnotationsCleared, entityType, annotationGrp);
+          isPropAnnotationsCleared = true;
+          isNavPropAnnotationsCleared = true;
+        }
+      }
+    }
+   }
+
+  /** adds annotations to entity type properties derived from singleton
+   * @param singleton
+   * @param isPropAnnotationsCleared
+   * @param isNavPropAnnotationsCleared
+   * @param entityType
+   * @param annotationGrp
+   */
+  private void addAnnotationsToPropertiesDerivedFromSingleton(CsdlSingleton singleton, boolean isPropAnnotationsCleared,
+      boolean isNavPropAnnotationsCleared, CsdlEntityType entityType, CsdlAnnotations annotationGrp) {
+    for (CsdlProperty propertyName : entityType.getProperties()) {
+      if (!isPropAnnotationsCleared) {
+        entityType.getProperty(propertyName.getName()).getAnnotations().clear();
+      }
+      if (isPropertyComplex(propertyName)) {
+        CsdlComplexType complexType = getComplexTypeFromProperty(propertyName);
+        addAnnotationsToComplexTypeIncludedFromSingleton(singleton, 
+           annotationGrp, propertyName, isNavPropAnnotationsCleared, complexType);
+      }
+    }
+  }
+
+  /** Adds annotation to singleton
+   * @param singleton
+   * @param annotationGrp
+   */
+  private void addAnnotationsToSingleton(CsdlSingleton singleton, CsdlAnnotations annotationGrp) {
+    for (CsdlAnnotation annotation : annotationGrp.getAnnotations()) {
+      if (!compareAnnotations(singleton.getAnnotations(), annotation)) {
+        singleton.getAnnotations().add(annotation);
+      }
+    }
+  }
+
+  /**
+   * @param singleton
+   * @return
+   */
+  private CsdlEntityType fetchEntityTypeFromSingleton(CsdlSingleton singleton) {
+    CsdlEntityType entityType;
+    try {
+      entityType = singleton.getTypeFQN() != null ? this.provider.getEntityType(new FullQualifiedName(
+          singleton.getTypeFQN().getFullQualifiedNameAsString())) : null;
+   } catch (ODataException e) {
+     throw new EdmException(e);
+   }
+    return entityType;
+  }
+  
+  /**
+   * 
+   * @param singleton
+   * @param entityContainerName2
+   * @param annotationGrp
+   * @param propertyName
+   * @param isComplexNavPropAnnotationsCleared
+   * @param complexType
+   */
+  private void addAnnotationsToComplexTypeIncludedFromSingleton(CsdlSingleton singleton,
+      CsdlAnnotations annotationGrp, CsdlProperty propertyName,
+      boolean isComplexNavPropAnnotationsCleared, CsdlComplexType complexType) {
+    for (CsdlNavigationProperty complexNavPropertyName : complexType.getNavigationProperties()) {
+      if (!isComplexNavPropAnnotationsCleared) {
+        complexType.getNavigationProperty(complexNavPropertyName.getName()).getAnnotations().clear();
+      }
+      if (annotationGrp.getTarget().
+          equalsIgnoreCase(entityContainerName + "/" + singleton.getName() + "/" + 
+      propertyName.getName() + "/" + complexNavPropertyName.getName())) {
+        isSingletonAnnotationsIncluded = true;
+        addAnnotationsToComplexTypeNavProperties(annotationGrp, complexType, complexNavPropertyName);
+      }
+    }    
+  }
+  
   protected EdmEntitySet createEntitySet(final String entitySetName) {
     EdmEntitySet entitySet = null;
 
     try {
       final CsdlEntitySet providerEntitySet = provider.getEntitySet(entityContainerName, entitySetName);
       if (providerEntitySet != null) {
+		addAnnotations(providerEntitySet, entityContainerName);
         entitySet = new EdmEntitySetImpl(edm, this, providerEntitySet);
       }
     } catch (ODataException e) {
@@ -204,12 +341,228 @@ public class EdmEntityContainerImpl extends AbstractEdmNamed implements EdmEntit
     return entitySet;
   }
 
+  private void addAnnotations(CsdlEntitySet entitySet, FullQualifiedName entityContainerName) {
+    boolean isPropAnnotationsCleared = false;
+    boolean isNavPropAnnotationsCleared = false;
+    CsdlEntityType entityType = getCsdlEntityTypeFromEntitySet(entitySet);
+    if (entityType == null) {
+      return;
+    }
+    
+   List<CsdlSchema> termSchemaDefinition = ((EdmProviderImpl)edm).getTermSchemaDefinitions();
+   for (CsdlSchema schema : termSchemaDefinition) {
+     List<CsdlAnnotations> annotationGrps = schema.getAnnotationGroups();
+     for (CsdlAnnotations annotationGrp : annotationGrps) {
+       if (annotationGrp.getTarget().
+           equalsIgnoreCase(entityContainerName + "/" + entitySet.getName())) {
+         isAnnotationsIncluded = true;
+         addAnnotationsToEntitySet(entitySet, annotationGrp);
+       } else {
+         addAnnotationsToEntityTypeIncludedFromES(entitySet, entityContainerName,
+             annotationGrp, isPropAnnotationsCleared, isNavPropAnnotationsCleared, entityType);
+         isPropAnnotationsCleared = true;
+         isNavPropAnnotationsCleared = true;
+       }
+     }
+   }
+  }
+
+  /**
+   * @param entitySet
+   * @param annotationGrp
+   */
+  private void addAnnotationsToEntitySet(CsdlEntitySet entitySet, CsdlAnnotations annotationGrp) {
+    for (CsdlAnnotation annotation : annotationGrp.getAnnotations()) {
+       if (!compareAnnotations(entitySet.getAnnotations(), annotation)) {
+         entitySet.getAnnotations().add(annotation);
+       }
+     }
+  }
+
+  /**
+   * @param entitySet
+   * @return
+   */
+  private CsdlEntityType getCsdlEntityTypeFromEntitySet(CsdlEntitySet entitySet) {
+    CsdlEntityType entityType;
+    try {
+      entityType = entitySet.getTypeFQN() != null ? this.provider.getEntityType(new FullQualifiedName(
+          entitySet.getTypeFQN().getFullQualifiedNameAsString())) : null;
+   } catch (ODataException e) {
+     throw new EdmException(e);
+   }
+    return entityType;
+  }
+
+  /** Adds annotations to Entity type Properties derived from entity set
+   * @param entitySet
+   * @param entityContainerName
+   * @param annotationGrp
+   * @param entityType 
+   * @param isNavPropAnnotationsCleared 
+   * @param isPropAnnotationsCleared
+   * @return
+   */
+  private void addAnnotationsToEntityTypeIncludedFromES(CsdlEntitySet entitySet,
+      FullQualifiedName entityContainerName, CsdlAnnotations annotationGrp, 
+      boolean isPropAnnotationsCleared, boolean isNavPropAnnotationsCleared, CsdlEntityType entityType) {
+     for (CsdlProperty propertyName : entityType.getProperties()) {
+       if (!isPropAnnotationsCleared) {
+         entityType.getProperty(propertyName.getName()).getAnnotations().clear();
+       }
+       if (isPropertyComplex(propertyName)) {
+         CsdlComplexType complexType = getComplexTypeFromProperty(propertyName);
+         addAnnotationsToComplexTypeIncludedFromES(entitySet, entityContainerName,
+            annotationGrp, propertyName, isPropAnnotationsCleared, isNavPropAnnotationsCleared, complexType);
+       } else {
+         if (annotationGrp.getTarget().
+             equalsIgnoreCase(entityContainerName + "/" + entitySet.getName() + "/" + 
+         propertyName.getName())) {
+           isAnnotationsIncluded = true;
+           addAnnotationsToEntityTypeProperties(annotationGrp, entityType, propertyName);
+         }
+       }
+     }
+     for (CsdlNavigationProperty navPropertyName : entityType.getNavigationProperties()) {
+       if (!isNavPropAnnotationsCleared) {
+         entityType.getNavigationProperty(navPropertyName.getName()).getAnnotations().clear();
+       }
+       if (annotationGrp.getTarget().
+           equalsIgnoreCase(entityContainerName + "/" + entitySet.getName() + "/" + 
+       navPropertyName.getName())) {
+         isAnnotationsIncluded = true;
+         addAnnotationsToEntityTypeNavProperties(annotationGrp, entityType, navPropertyName);
+       }
+     }
+  }
+
+  /** Adds annotations to Entity type Navigation Properties derived from entity set
+   * @param annotationGrp
+   * @param entityType
+   * @param navPropertyName
+   */
+  private void addAnnotationsToEntityTypeNavProperties(CsdlAnnotations annotationGrp, CsdlEntityType entityType,
+      CsdlNavigationProperty navPropertyName) {
+    for (CsdlAnnotation annotation : annotationGrp.getAnnotations()) {
+       if (!compareAnnotations(entityType.getNavigationProperty(
+           navPropertyName.getName()).getAnnotations(), annotation)) {
+         entityType.getNavigationProperty(navPropertyName.getName()).getAnnotations().add(annotation); 
+       }
+     }
+  }
+
+  /** Adds annotations to Entity type Properties derived from entity set
+   * @param annotationGrp
+   * @param entityType
+   * @param propertyName
+   */
+  private void addAnnotationsToEntityTypeProperties(CsdlAnnotations annotationGrp, CsdlEntityType entityType,
+      CsdlProperty propertyName) {
+    for (CsdlAnnotation annotation : annotationGrp.getAnnotations()) {
+       if (!compareAnnotations(entityType.getProperty(
+           propertyName.getName()).getAnnotations(), annotation)) {
+         entityType.getProperty(propertyName.getName()).getAnnotations().add(annotation); 
+       }
+     }
+  }
+
+  /**
+   * @param propertyName
+   * @return
+   */
+  private CsdlComplexType getComplexTypeFromProperty(CsdlProperty propertyName) {
+    CsdlComplexType complexType;
+     try {
+      complexType = this.provider.getComplexType(propertyName.getTypeAsFQNObject());
+    } catch (ODataException e) {
+      throw new EdmException(e);
+    }
+    return complexType;
+  }
+
+  /**
+   * @param entitySet
+   * @param entityContainerName
+   * @param annotationGrp
+   * @param propertyName
+   * @param complexType 
+   * @param isComplexNavPropAnnotationsCleared2 
+   * @param isComplexPropAnnotationsCleared2 
+   * @return
+   */
+  private void addAnnotationsToComplexTypeIncludedFromES(CsdlEntitySet entitySet,
+      FullQualifiedName entityContainerName, CsdlAnnotations annotationGrp, 
+      CsdlProperty propertyName, boolean isComplexPropAnnotationsCleared, 
+      boolean isComplexNavPropAnnotationsCleared, CsdlComplexType complexType) {
+     for (CsdlProperty complexPropertyName : complexType.getProperties()) {
+       if (!isComplexPropAnnotationsCleared) {
+         complexType.getProperty(complexPropertyName.getName()).getAnnotations().clear();
+       }
+       if (annotationGrp.getTarget().
+           equalsIgnoreCase(entityContainerName + "/" + entitySet.getName() + "/" + 
+       propertyName.getName() + "/" + complexPropertyName.getName())) {
+         isAnnotationsIncluded = true;
+         addAnnotationsToComplexTypeProperties(annotationGrp, complexType, complexPropertyName);
+       }
+     }
+     for (CsdlNavigationProperty complexNavPropertyName : complexType.getNavigationProperties()) {
+       if (!isComplexNavPropAnnotationsCleared) {
+         complexType.getNavigationProperty(complexNavPropertyName.getName()).getAnnotations().clear();
+       }
+       if (annotationGrp.getTarget().
+           equalsIgnoreCase(entityContainerName + "/" + entitySet.getName() + "/" + 
+       propertyName.getName() + "/" + complexNavPropertyName.getName())) {
+         isAnnotationsIncluded = true;
+         addAnnotationsToComplexTypeNavProperties(annotationGrp, complexType, complexNavPropertyName);
+       }
+     }
+  }
+
+  /**
+   * @param annotationGrp
+   * @param complexType
+   * @param complexNavPropertyName
+   */
+  private void addAnnotationsToComplexTypeNavProperties(CsdlAnnotations annotationGrp, CsdlComplexType complexType,
+      CsdlNavigationProperty complexNavPropertyName) {
+    for (CsdlAnnotation annotation : annotationGrp.getAnnotations()) {
+       if (!compareAnnotations(complexType.getNavigationProperty(
+           complexNavPropertyName.getName()).getAnnotations(), annotation)) {
+         complexType.getNavigationProperty(complexNavPropertyName.getName()).getAnnotations().add(annotation); 
+       }
+     }
+  }
+
+  /**
+   * @param annotationGrp
+   * @param complexType
+   * @param complexPropertyName
+   */
+  private void addAnnotationsToComplexTypeProperties(CsdlAnnotations annotationGrp, CsdlComplexType complexType,
+      CsdlProperty complexPropertyName) {
+    for (CsdlAnnotation annotation : annotationGrp.getAnnotations()) {
+       if (!compareAnnotations(complexType.getProperty(
+           complexPropertyName.getName()).getAnnotations(), annotation)) {
+         complexType.getProperty(complexPropertyName.getName()).getAnnotations().add(annotation); 
+       }
+     }
+  }
+
+  private boolean isPropertyComplex(CsdlProperty propertyName) {
+    try {
+      return this.provider.getComplexType(propertyName.getTypeAsFQNObject()) != null ? true : false;
+    } catch (ODataException e) {
+      throw new EdmException(e);
+    }
+  }
+  
   protected EdmActionImport createActionImport(final String actionImportName) {
     EdmActionImport actionImport = null;
 
     try {
       final CsdlActionImport providerImport = provider.getActionImport(entityContainerName, actionImportName);
       if (providerImport != null) {
+		addAnnotations(providerImport, entityContainerName);
         actionImport = new EdmActionImportImpl(edm, this, providerImport);
       }
     } catch (ODataException e) {
@@ -219,12 +572,31 @@ public class EdmEntityContainerImpl extends AbstractEdmNamed implements EdmEntit
     return actionImport;
   }
 
+  private void addAnnotations(CsdlActionImport actionImport, FullQualifiedName entityContainerName) {
+    List<CsdlSchema> termSchemaDefinition = ((EdmProviderImpl)edm).getTermSchemaDefinitions();
+    for (CsdlSchema schema : termSchemaDefinition) {
+      List<CsdlAnnotations> annotationGrps = schema.getAnnotationGroups();
+      for (CsdlAnnotations annotationGrp : annotationGrps) {
+        if (annotationGrp.getTarget().
+            equalsIgnoreCase(entityContainerName + "/" + actionImport.getName())) {
+          for (CsdlAnnotation annotation : annotationGrp.getAnnotations()) {
+            if (!compareAnnotations(actionImport.getAnnotations(), annotation)) {
+              actionImport.getAnnotations().add(annotation);
+            }
+          }
+          break;
+        }
+      }
+    }
+   }
+   
   protected EdmFunctionImport createFunctionImport(final String functionImportName) {
     EdmFunctionImport functionImport = null;
 
     try {
       final CsdlFunctionImport providerImport = provider.getFunctionImport(entityContainerName, functionImportName);
       if (providerImport != null) {
+		addAnnotations(providerImport, entityContainerName);
         functionImport = new EdmFunctionImportImpl(edm, this, providerImport);
       }
     } catch (ODataException e) {
@@ -234,6 +606,24 @@ public class EdmEntityContainerImpl extends AbstractEdmNamed implements EdmEntit
     return functionImport;
   }
 
+  private void addAnnotations(CsdlFunctionImport functionImport, FullQualifiedName entityContainerName) {
+    List<CsdlSchema> termSchemaDefinition = ((EdmProviderImpl)edm).getTermSchemaDefinitions();
+    for (CsdlSchema schema : termSchemaDefinition) {
+      List<CsdlAnnotations> annotationGrps = schema.getAnnotationGroups();
+      for (CsdlAnnotations annotationGrp : annotationGrps) {
+        if (annotationGrp.getTarget().
+            equalsIgnoreCase(entityContainerName + "/" + functionImport.getName())) {
+          for (CsdlAnnotation annotation : annotationGrp.getAnnotations()) {
+            if (!compareAnnotations(functionImport.getAnnotations(), annotation)) {
+              functionImport.getAnnotations().add(annotation);
+            }
+          }
+          break;
+        }
+      }
+    }
+   }
+   
   protected void loadAllEntitySets() {
     loadContainer();
     final List<CsdlEntitySet> providerEntitySets = container.getEntitySets();
@@ -241,11 +631,17 @@ public class EdmEntityContainerImpl extends AbstractEdmNamed implements EdmEntit
 
     if (providerEntitySets != null) {
       for (CsdlEntitySet entitySet : providerEntitySets) {
+		addAnnotations(entitySet, entityContainerName);
         final EdmEntitySetImpl impl = new EdmEntitySetImpl(edm, this, entitySet);
-        entitySetCache.put(impl.getName(), impl);
+        if (isAnnotationsIncluded) {
+          entitySetWithAnnotationsCache.put(impl.getName(), impl);
+        } else {
+          entitySetCache.put(impl.getName(), impl);
+        }
         entitySetsLocal.add(impl);
       }
       entitySets = entitySetsLocal;
+	  ((EdmProviderImpl)edm).setIsPreviousES(true);
     }
   }
 
@@ -256,6 +652,7 @@ public class EdmEntityContainerImpl extends AbstractEdmNamed implements EdmEntit
 
     if (providerFunctionImports != null) {
       for (CsdlFunctionImport functionImport : providerFunctionImports) {
+		addAnnotations(functionImport, entityContainerName);
         EdmFunctionImportImpl impl = new EdmFunctionImportImpl(edm, this, functionImport);
         functionImportCache.put(impl.getName(), impl);
         functionImportsLocal.add(impl);
@@ -271,6 +668,7 @@ public class EdmEntityContainerImpl extends AbstractEdmNamed implements EdmEntit
 
     if (providerSingletons != null) {
       for (CsdlSingleton singleton : providerSingletons) {
+		addAnnotations(singleton, entityContainerName);
         final EdmSingletonImpl impl = new EdmSingletonImpl(edm, this, singleton);
         singletonCache.put(singleton.getName(), impl);
         singletonsLocal.add(impl);
@@ -286,7 +684,8 @@ public class EdmEntityContainerImpl extends AbstractEdmNamed implements EdmEntit
 
     if (providerActionImports != null) {
       for (CsdlActionImport actionImport : providerActionImports) {
-        final EdmActionImportImpl impl = new EdmActionImportImpl(edm, this, actionImport);
+        addAnnotations(actionImport, entityContainerName);
+		final EdmActionImportImpl impl = new EdmActionImportImpl(edm, this, actionImport);
         actionImportCache.put(actionImport.getName(), impl);
         actionImportsLocal.add(impl);
       }
@@ -302,11 +701,20 @@ public class EdmEntityContainerImpl extends AbstractEdmNamed implements EdmEntit
         if (containerLocal == null) {
           containerLocal = new CsdlEntityContainer().setName(getName());
         }
-
+		((EdmProviderImpl)edm).addAnnotations(containerLocal, entityContainerName);
         container = containerLocal;
       } catch (ODataException e) {
         throw new EdmException(e);
       }
     }
   }
+  
+  private boolean compareAnnotations(List<CsdlAnnotation> annotations, CsdlAnnotation annotation) {
+    for (CsdlAnnotation annot : annotations) {
+      if (annot.equals(annotation)) {
+        return true;
+      }
+    }
+    return false;
+  }
 }

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/8cbe468c/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/EdmPropertyImpl.java
----------------------------------------------------------------------
diff --git a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/EdmPropertyImpl.java b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/EdmPropertyImpl.java
index 67d0a21..b74292a 100644
--- a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/EdmPropertyImpl.java
+++ b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/EdmPropertyImpl.java
@@ -54,6 +54,21 @@ public class EdmPropertyImpl extends AbstractEdmNamed implements EdmProperty {
     return propertyType;
   }
 
+  @Override
+  public EdmType getTypeWithAnnotations() {
+    if (propertyType == null) {
+      if (typeInfo == null) {
+        buildTypeInfoWithAnnotations();
+      }
+      propertyType = typeInfo.getType();
+      if (propertyType == null) {
+        throw new EdmException("Cannot find type with name: " + typeInfo.getFullQualifiedName());
+      }
+    }
+
+    return propertyType;
+  }
+  
   private void buildTypeInfo() {
     if (property.getType() == null) {
       throw new EdmException("Property " + property.getName() + " must hava a full qualified type.");
@@ -61,6 +76,14 @@ public class EdmPropertyImpl extends AbstractEdmNamed implements EdmProperty {
     typeInfo = new EdmTypeInfo.Builder().setEdm(edm).setTypeExpression(property.getType()).build();
   }
 
+  private void buildTypeInfoWithAnnotations() {
+    if (property.getType() == null) {
+      throw new EdmException("Property " + property.getName() + " must hava a full qualified type.");
+    }
+    typeInfo = new EdmTypeInfo.Builder().setEdm(edm).setIncludeAnnotations(true)
+        .setTypeExpression(property.getType()).build();
+  }
+  
   @Override
   public boolean isCollection() {
     return property.isCollection();

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/8cbe468c/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/EdmProviderImpl.java
----------------------------------------------------------------------
diff --git a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/EdmProviderImpl.java b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/EdmProviderImpl.java
index 6f8e7f4..e4ad840 100644
--- a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/EdmProviderImpl.java
+++ b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/EdmProviderImpl.java
@@ -39,16 +39,20 @@ import org.apache.olingo.commons.api.edm.EdmTypeDefinition;
 import org.apache.olingo.commons.api.edm.FullQualifiedName;
 import org.apache.olingo.commons.api.edm.provider.CsdlAction;
 import org.apache.olingo.commons.api.edm.provider.CsdlAliasInfo;
+import org.apache.olingo.commons.api.edm.provider.CsdlAnnotation;
 import org.apache.olingo.commons.api.edm.provider.CsdlAnnotations;
 import org.apache.olingo.commons.api.edm.provider.CsdlComplexType;
 import org.apache.olingo.commons.api.edm.provider.CsdlEdmProvider;
+import org.apache.olingo.commons.api.edm.provider.CsdlEntityContainer;
 import org.apache.olingo.commons.api.edm.provider.CsdlEntityContainerInfo;
 import org.apache.olingo.commons.api.edm.provider.CsdlEntityType;
 import org.apache.olingo.commons.api.edm.provider.CsdlEnumType;
 import org.apache.olingo.commons.api.edm.provider.CsdlFunction;
+import org.apache.olingo.commons.api.edm.provider.CsdlNavigationProperty;
 import org.apache.olingo.commons.api.edm.provider.CsdlParameter;
 import org.apache.olingo.commons.api.edm.provider.CsdlProperty;
 import org.apache.olingo.commons.api.edm.provider.CsdlSchema;
+import org.apache.olingo.commons.api.edm.provider.CsdlStructuralType;
 import org.apache.olingo.commons.api.edm.provider.CsdlTerm;
 import org.apache.olingo.commons.api.edm.provider.CsdlTypeDefinition;
 import org.apache.olingo.commons.api.ex.ODataException;
@@ -60,7 +64,7 @@ public class EdmProviderImpl extends AbstractEdm {
       Collections.synchronizedMap(new HashMap<FullQualifiedName, List<CsdlAction>>());
   private final Map<FullQualifiedName, List<CsdlFunction>> functionsMap =
       Collections.synchronizedMap(new HashMap<FullQualifiedName, List<CsdlFunction>>());
-  private List<CsdlSchema> termSchemaDefinition = null;
+  private List<CsdlSchema> termSchemaDefinition = new ArrayList<CsdlSchema>();
 
   public EdmProviderImpl(final CsdlEdmProvider provider) {
     this.provider = provider;
@@ -76,7 +80,9 @@ public class EdmProviderImpl extends AbstractEdm {
     try {
       CsdlEntityContainerInfo entityContainerInfo = provider.getEntityContainerInfo(containerName);
       if (entityContainerInfo != null) {
-        return new EdmEntityContainerImpl(this, provider, entityContainerInfo);
+		addAnnotations(provider.getEntityContainer(), entityContainerInfo.getContainerName());
+        return new EdmEntityContainerImpl(this, provider, entityContainerInfo.getContainerName(), 
+            provider.getEntityContainer());
       }
       return null;
     } catch (ODataException e) {
@@ -84,11 +90,28 @@ public class EdmProviderImpl extends AbstractEdm {
     }
   }
 
+  public void addAnnotations(CsdlEntityContainer csdlEntityContainer, FullQualifiedName containerName) {
+    for (CsdlSchema schema : termSchemaDefinition) {
+      List<CsdlAnnotations> annotationGrps = schema.getAnnotationGroups();
+      for (CsdlAnnotations annotationGrp : annotationGrps) {
+        if (annotationGrp.getTarget().equalsIgnoreCase(containerName.getFullQualifiedNameAsString())) {
+          for (CsdlAnnotation annotation : annotationGrp.getAnnotations()) {
+            if (!compareAnnotations(csdlEntityContainer.getAnnotations(), annotation)) {
+              csdlEntityContainer.getAnnotations().addAll(annotationGrp.getAnnotations());
+            }
+          }
+          break;
+        }
+      }
+    }
+  }
+  
   @Override
   public EdmEnumType createEnumType(final FullQualifiedName enumName) {
     try {
       CsdlEnumType enumType = provider.getEnumType(enumName);
       if (enumType != null) {
+		addAnnotations(enumType, enumName);
         return new EdmEnumTypeImpl(this, enumName, enumType);
       }
       return null;
@@ -97,11 +120,28 @@ public class EdmProviderImpl extends AbstractEdm {
     }
   }
 
+  public void addAnnotations(CsdlEnumType enumType, FullQualifiedName enumName) {
+    for (CsdlSchema schema : termSchemaDefinition) {
+      List<CsdlAnnotations> annotationGrps = schema.getAnnotationGroups();
+      for (CsdlAnnotations annotationGrp : annotationGrps) {
+        if (annotationGrp.getTarget().equalsIgnoreCase(enumName.getFullQualifiedNameAsString())) {
+          for (CsdlAnnotation annotation : annotationGrp.getAnnotations()) {
+            if (!compareAnnotations(enumType.getAnnotations(), annotation)) {
+              enumType.getAnnotations().addAll(annotationGrp.getAnnotations());
+            }
+          }
+          break;
+        }
+      }
+    }
+  }
+  
   @Override
   public EdmTypeDefinition createTypeDefinition(final FullQualifiedName typeDefinitionName) {
     try {
       CsdlTypeDefinition typeDefinition = provider.getTypeDefinition(typeDefinitionName);
       if (typeDefinition != null) {
+		addAnnotations(typeDefinition, typeDefinitionName);
         return new EdmTypeDefinitionImpl(this, typeDefinitionName, typeDefinition);
       }
       return null;
@@ -109,12 +149,31 @@ public class EdmProviderImpl extends AbstractEdm {
       throw new EdmException(e);
     }
   }
+  
+  public void addAnnotations(CsdlTypeDefinition typeDefinition, FullQualifiedName typeDefinitionName) {
+    for (CsdlSchema schema : termSchemaDefinition) {
+      List<CsdlAnnotations> annotationGrps = schema.getAnnotationGroups();
+      for (CsdlAnnotations annotationGrp : annotationGrps) {
+        if (annotationGrp.getTarget().equalsIgnoreCase(typeDefinitionName.getFullQualifiedNameAsString())) {
+          for (CsdlAnnotation annotation : annotationGrp.getAnnotations()) {
+            if (!compareAnnotations(typeDefinition.getAnnotations(), annotation)) {
+              typeDefinition.getAnnotations().addAll(annotationGrp.getAnnotations());
+            }
+          }
+          break;
+        }
+      }
+    }
+  }
 
   @Override
   public EdmEntityType createEntityType(final FullQualifiedName entityTypeName) {
     try {
       CsdlEntityType entityType = provider.getEntityType(entityTypeName);
       if (entityType != null) {
+		  if (!isEntityDerivedFromES()) {
+          addAnnotations(entityType, entityTypeName);
+        }
         return new EdmEntityTypeImpl(this, entityTypeName, entityType);
       }
       return null;
@@ -123,11 +182,121 @@ public class EdmProviderImpl extends AbstractEdm {
     }
   }
 
+  /**
+   * Add the annotations defined in an external file to the property/
+   * navigation property and the entity
+   * @param structuralType
+   * @param typeName
+   */
+  public void addAnnotations(CsdlStructuralType structuralType, FullQualifiedName typeName) {
+    boolean isPropAnnotationsCleared = false;
+    boolean isNavPropAnnotationsCleared = false;
+    for (CsdlSchema schema : termSchemaDefinition) {
+      List<CsdlAnnotations> annotationGrps = schema.getAnnotationGroups();
+      for (CsdlAnnotations annotationGrp : annotationGrps) {
+        if (annotationGrp.getTarget().equalsIgnoreCase(typeName.getFullQualifiedNameAsString())) {
+          addAnnotationsToStructuralTypes(structuralType, annotationGrp);
+        } else {
+          checkAnnotationsOnStructuralProperties(structuralType, typeName, isPropAnnotationsCleared, annotationGrp);
+          checkAnnotationsOnStructuralNavProperties(structuralType, typeName, isNavPropAnnotationsCleared,
+              annotationGrp);
+          isPropAnnotationsCleared = true;
+          isNavPropAnnotationsCleared = true;
+        }
+      }
+    }
+  }
+
+  /** Check if annotations are added on navigation properties of a structural type
+   * @param structuralType
+   * @param typeName
+   * @param isNavPropAnnotationsCleared
+   * @param annotationGrp
+   */
+  private void checkAnnotationsOnStructuralNavProperties(CsdlStructuralType structuralType, FullQualifiedName typeName,
+      boolean isNavPropAnnotationsCleared, CsdlAnnotations annotationGrp) {
+    List<CsdlNavigationProperty> navProperties = structuralType.getNavigationProperties();
+    for (CsdlNavigationProperty navProperty : navProperties) {
+      if (!isNavPropAnnotationsCleared) {
+        structuralType.getNavigationProperty(navProperty.getName()).getAnnotations().clear();
+      }
+      if (annotationGrp.getTarget().equalsIgnoreCase(typeName + "/" + navProperty.getName())) {
+        addAnnotationsToStructuralTypeNavProperties(structuralType, annotationGrp, navProperty);
+      }
+    }
+  }
+
+  /** Check if annotations are added on properties of a structural type
+   * @param structuralType
+   * @param typeName
+   * @param isPropAnnotationsCleared
+   * @param annotationGrp
+   */
+  private void checkAnnotationsOnStructuralProperties(CsdlStructuralType structuralType, FullQualifiedName typeName,
+      boolean isPropAnnotationsCleared, CsdlAnnotations annotationGrp) {
+    List<CsdlProperty> properties = structuralType.getProperties();
+    for (CsdlProperty property : properties) {
+      if (!isPropAnnotationsCleared) {
+        structuralType.getProperty(property.getName()).getAnnotations().clear();
+      }
+      if (annotationGrp.getTarget().equalsIgnoreCase(
+          typeName.getFullQualifiedNameAsString() + "/" + property.getName())) {
+        addAnnotationsToStructuralTypeProperties(structuralType, annotationGrp, property);
+      }
+    }
+  }
+
+  /**
+   * @param structuralType
+   * @param annotationGrp
+   * @param navProperty
+   */
+  private void addAnnotationsToStructuralTypeNavProperties(CsdlStructuralType structuralType,
+      CsdlAnnotations annotationGrp, CsdlNavigationProperty navProperty) {
+    for (CsdlAnnotation annotation : annotationGrp.getAnnotations()) {
+      if (!compareAnnotations(structuralType.getNavigationProperty(
+          navProperty.getName()).getAnnotations(), annotation)) {
+        structuralType.getNavigationProperty(navProperty.getName()).getAnnotations().
+        add(annotation);
+      }
+    }
+  }
+
+  /**
+   * @param structuralType
+   * @param annotationGrp
+   * @param property
+   */
+  private void addAnnotationsToStructuralTypeProperties(CsdlStructuralType structuralType,
+      CsdlAnnotations annotationGrp, CsdlProperty property) {
+    for (CsdlAnnotation annotation : annotationGrp.getAnnotations()) {
+      if (!compareAnnotations(structuralType.getProperty(
+          property.getName()).getAnnotations(), annotation)) {
+        structuralType.getProperty(property.getName()).getAnnotations().add(annotation); 
+      }
+    }
+  }
+
+  /**
+   * @param structuralType
+   * @param annotationGrp
+   */
+  private void addAnnotationsToStructuralTypes(CsdlStructuralType structuralType, CsdlAnnotations annotationGrp) {
+    for (CsdlAnnotation annotation : annotationGrp.getAnnotations()) {
+      if (!compareAnnotations(structuralType.getAnnotations(), annotation)) {
+        structuralType.getAnnotations().addAll(annotationGrp.getAnnotations());
+      }
+    }
+  }
+  
   @Override
   public EdmComplexType createComplexType(final FullQualifiedName complexTypeName) {
     try {
       final CsdlComplexType complexType = provider.getComplexType(complexTypeName);
       if (complexType != null) {
+		  if (!isComplexDerivedFromES()) {
+          addAnnotations(complexType, complexTypeName);
+        }
         return new EdmComplexTypeImpl(this, complexTypeName, complexType);
       }
       return null;
@@ -160,7 +329,7 @@ public class EdmProviderImpl extends AbstractEdm {
               isComplexPreviousTypeCompatibleToBindingParam(bindingParameterTypeName, parameter, 
                   isBindingParameterCollection))
               && isBindingParameterCollection.booleanValue() == parameter.isCollection()) {
-
+			addAnnotations(action, actionName);
             return new EdmActionImpl(this, actionName, action);
           }
 
@@ -172,6 +341,52 @@ public class EdmProviderImpl extends AbstractEdm {
     }
   }
 
+  public void addAnnotations(CsdlAction action, FullQualifiedName actionName) {
+    for (CsdlSchema schema : termSchemaDefinition) {
+      List<CsdlAnnotations> annotationGrps = schema.getAnnotationGroups();
+      for (CsdlAnnotations annotationGrp : annotationGrps) {
+        if (annotationGrp.getTarget().equalsIgnoreCase(
+            actionName.getFullQualifiedNameAsString())) {
+          addAnnotationsToActions(action, annotationGrp);
+        } else {
+          addAnnotationsToParamsOfActions(action, actionName, annotationGrp);
+        }
+      }
+    }
+  }
+  
+  /** Adds annotations to actions
+   * @param action
+   * @param actionName
+   * @param annotationGrp
+   */
+  private void addAnnotationsToParamsOfActions(CsdlAction action, FullQualifiedName actionName,
+      CsdlAnnotations annotationGrp) {
+    final List<CsdlParameter> parameters = action.getParameters();
+    for (CsdlParameter parameter : parameters) {
+      if (annotationGrp.getTarget().equalsIgnoreCase(
+          actionName.getFullQualifiedNameAsString() + "/" + parameter.getName())) {
+        for (CsdlAnnotation annotation : annotationGrp.getAnnotations()) {
+          if (!compareAnnotations(action.getParameter(parameter.getName()).getAnnotations(), annotation)) {
+            action.getParameter(parameter.getName()).getAnnotations().add(annotation);
+          }
+        }
+      }
+    }
+  }
+
+  /** Adds annotations to parameters of action
+   * @param action
+   * @param annotationGrp
+   */
+  private void addAnnotationsToActions(CsdlAction action, CsdlAnnotations annotationGrp) {
+    for (CsdlAnnotation annotation : annotationGrp.getAnnotations()) {
+      if (!compareAnnotations(action.getAnnotations(), annotation)) {
+        action.getAnnotations().add(annotation);
+      }
+    }
+  }
+  
   /**
    * @param bindingParameterTypeName
    * @param parameter 
@@ -249,6 +464,7 @@ public class EdmProviderImpl extends AbstractEdm {
               providerParameterNames.add(providerParameters.get(i).getName());
             }
             if (parameterNamesCopy.containsAll(providerParameterNames)) {
+			  addAnnotations(function, functionName);
               return new EdmFunctionImpl(this, functionName, function);
             }
           }
@@ -260,6 +476,52 @@ public class EdmProviderImpl extends AbstractEdm {
     }
   }
 
+  public void addAnnotations(CsdlFunction function, FullQualifiedName functionName) {
+    for (CsdlSchema schema : termSchemaDefinition) {
+      List<CsdlAnnotations> annotationGrps = schema.getAnnotationGroups();
+      for (CsdlAnnotations annotationGrp : annotationGrps) {
+        if (annotationGrp.getTarget().equalsIgnoreCase(
+            functionName.getFullQualifiedNameAsString())) {
+          addAnnotationsToFunctions(function, annotationGrp);
+        } else {
+          addAnnotationsToParamsOFunctions(function, functionName, annotationGrp);
+        }
+      }
+    }
+  }
+
+  /** Adds annotations of function parameters
+   * @param function
+   * @param functionName
+   * @param annotationGrp
+   */
+  private void addAnnotationsToParamsOFunctions(CsdlFunction function, FullQualifiedName functionName,
+      CsdlAnnotations annotationGrp) {
+    final List<CsdlParameter> parameters = function.getParameters();
+    for (CsdlParameter parameter : parameters) {
+      if (annotationGrp.getTarget().equalsIgnoreCase(
+          functionName.getFullQualifiedNameAsString() + "/" + parameter.getName())) {
+        for (CsdlAnnotation annotation : annotationGrp.getAnnotations()) {
+          if (!compareAnnotations(function.getParameter(parameter.getName()).getAnnotations(), annotation)) {
+            function.getParameter(parameter.getName()).getAnnotations().add(annotation);
+          }
+        }
+      }
+    }
+  }
+
+  /**Add annotations to functions
+   * @param function
+   * @param annotationGrp
+   */
+  private void addAnnotationsToFunctions(CsdlFunction function, CsdlAnnotations annotationGrp) {
+    for (CsdlAnnotation annotation : annotationGrp.getAnnotations()) {
+      if (!compareAnnotations(function.getAnnotations(), annotation)) {
+        function.getAnnotations().add(annotation);
+      }
+    }
+  }
+  
   @Override
   protected Map<String, String> createAliasToNamespaceInfo() {
     final Map<String, String> aliasToNamespaceInfos = new HashMap<String, String>();
@@ -375,6 +637,10 @@ public class EdmProviderImpl extends AbstractEdm {
           providerSchemas.put(schema.getNamespace(), new EdmSchemaImpl(this, provider, schema));
         }
       }
+	  for (CsdlSchema termSchemaDefn : termSchemaDefinition) {
+        providerSchemas.put(termSchemaDefn.getNamespace(), 
+            new EdmSchemaImpl(this, provider, termSchemaDefn));
+      }
       return providerSchemas;
     } catch (ODataException e) {
       throw new EdmException(e);
@@ -387,9 +653,11 @@ public class EdmProviderImpl extends AbstractEdm {
       CsdlTerm providerTerm = provider.getTerm(termName);
       if (providerTerm != null) {
         return new EdmTermImpl(this, termName.getNamespace(), providerTerm);
-      } else if (termSchemaDefinition != null && !termSchemaDefinition.isEmpty()) {
+      } else {
           for (CsdlSchema schema : termSchemaDefinition) {
-              if (schema.getNamespace().equalsIgnoreCase(termName.getNamespace())) {
+              if (schema.getNamespace().equalsIgnoreCase(termName.getNamespace()) ||
+                  (null != schema.getAlias() && 
+                  schema.getAlias().equalsIgnoreCase(termName.getNamespace()))) {
                 List<CsdlTerm> terms = schema.getTerms();
                 for (CsdlTerm term : terms) {
                   if (term.getName().equals(termName.getName())) {
@@ -417,4 +685,17 @@ public class EdmProviderImpl extends AbstractEdm {
       throw new EdmException(e);
     }
   }
+  
+  public List<CsdlSchema> getTermSchemaDefinitions() {
+    return termSchemaDefinition;
+  }
+  
+  private boolean compareAnnotations(List<CsdlAnnotation> annotations, CsdlAnnotation annotation) {
+    for (CsdlAnnotation annot : annotations) {
+      if (annot.equals(annotation)) {
+        return true;
+      }
+    }
+    return false;
+  }
 }

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/8cbe468c/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/EdmTypeInfo.java
----------------------------------------------------------------------
diff --git a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/EdmTypeInfo.java b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/EdmTypeInfo.java
index 75e0bff..b196b84 100644
--- a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/EdmTypeInfo.java
+++ b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/EdmTypeInfo.java
@@ -41,6 +41,7 @@ public class EdmTypeInfo {
 
     private String typeExpression;
     private Edm edm;
+	private boolean includeAnnotations;
 
     public Builder setTypeExpression(final String typeExpression) {
       this.typeExpression = typeExpression;
@@ -52,8 +53,13 @@ public class EdmTypeInfo {
       return this;
     }
 
+	public Builder setIncludeAnnotations(final boolean includeAnnotations) {
+      this.includeAnnotations = includeAnnotations;
+      return this;
+    }
+	
     public EdmTypeInfo build() {
-      return new EdmTypeInfo(edm, typeExpression);
+      return new EdmTypeInfo(edm, typeExpression, includeAnnotations);
     }
   }
 
@@ -65,7 +71,7 @@ public class EdmTypeInfo {
   private EdmComplexType complexType;
   private EdmEntityType entityType;
 
-  private EdmTypeInfo(final Edm edm, final String typeExpression) {
+  private EdmTypeInfo(final Edm edm, final String typeExpression, final boolean includeAnnotations) {
     String baseType;
     final int collStartIdx = typeExpression.indexOf("Collection(");
     final int collEndIdx = typeExpression.lastIndexOf(')');
@@ -113,7 +119,12 @@ public class EdmTypeInfo {
       if (typeDefinition == null) {
         enumType = edm.getEnumType(fullQualifiedName);
         if (enumType == null) {
-          complexType = edm.getComplexType(fullQualifiedName);
+          if (includeAnnotations) {
+            complexType = ((AbstractEdm)edm).
+                getComplexTypeWithAnnotations(fullQualifiedName, true);
+          } else {
+            complexType = edm.getComplexType(fullQualifiedName);
+          }
           if (complexType == null) {
             entityType = edm.getEntityType(fullQualifiedName);
           }

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/8cbe468c/lib/commons-core/src/test/java/org/apache/olingo/commons/core/edm/EdmImplCallCreateTest.java
----------------------------------------------------------------------
diff --git a/lib/commons-core/src/test/java/org/apache/olingo/commons/core/edm/EdmImplCallCreateTest.java b/lib/commons-core/src/test/java/org/apache/olingo/commons/core/edm/EdmImplCallCreateTest.java
index f4a4c27..038410b 100644
--- a/lib/commons-core/src/test/java/org/apache/olingo/commons/core/edm/EdmImplCallCreateTest.java
+++ b/lib/commons-core/src/test/java/org/apache/olingo/commons/core/edm/EdmImplCallCreateTest.java
@@ -319,4 +319,45 @@ public class EdmImplCallCreateTest {
       return null;
     }
   }
+  @Test
+  public void callCreateComplexTypeWithAnnotations() {
+    EdmComplexType complexType = edm.getComplexTypeWithAnnotations(FQN);
+    assertNotNull(complexType);
+    assertEquals(FQN.getNamespace(), complexType.getNamespace());
+    assertEquals(FQN.getName(), complexType.getName());
+
+    assertNull(edm.getComplexType(WRONG_FQN));
+  }
+  
+  @Test
+  public void callCreateComplexTypeWithAnnotationsDerivedFromES() {
+    EdmComplexType complexType = ((AbstractEdm)edm).
+        getComplexTypeWithAnnotations(FQN, true);
+    assertNotNull(complexType);
+    assertEquals(FQN.getNamespace(), complexType.getNamespace());
+    assertEquals(FQN.getName(), complexType.getName());
+
+    assertNull(edm.getComplexType(WRONG_FQN));
+  }
+  
+  @Test
+  public void callCreateEntityTypeWithAnnotation() {
+    EdmEntityType entityType = edm.getEntityTypeWithAnnotations(FQN);
+    assertNotNull(entityType);
+    assertEquals(FQN.getNamespace(), entityType.getNamespace());
+    assertEquals(FQN.getName(), entityType.getName());
+
+    assertNull(edm.getEntityType(WRONG_FQN));
+  }
+  
+  @Test
+  public void callCreateEntityTypeWithAnnotationDerivedFromES() {
+    EdmEntityType entityType = ((AbstractEdm)edm).
+        getEntityTypeWithAnnotations(FQN, true);
+    assertNotNull(entityType);
+    assertEquals(FQN.getNamespace(), entityType.getNamespace());
+    assertEquals(FQN.getName(), entityType.getName());
+
+    assertNull(edm.getEntityType(WRONG_FQN));
+  }
 }

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/8cbe468c/lib/commons-core/src/test/java/org/apache/olingo/server/core/edm/provider/EdmSchemaImplTest.java
----------------------------------------------------------------------
diff --git a/lib/commons-core/src/test/java/org/apache/olingo/server/core/edm/provider/EdmSchemaImplTest.java b/lib/commons-core/src/test/java/org/apache/olingo/server/core/edm/provider/EdmSchemaImplTest.java
index 2c95ce1..0f29315 100644
--- a/lib/commons-core/src/test/java/org/apache/olingo/server/core/edm/provider/EdmSchemaImplTest.java
+++ b/lib/commons-core/src/test/java/org/apache/olingo/server/core/edm/provider/EdmSchemaImplTest.java
@@ -246,7 +246,7 @@ public class EdmSchemaImplTest {
 
     @Override
     public CsdlEntityType getEntityType(final FullQualifiedName entityTypeName) throws ODataException {
-      throw new RuntimeException("Provider must not be called in the schema case");
+      return null;
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/8cbe468c/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/queryoption/apply/DynamicProperty.java
----------------------------------------------------------------------
diff --git a/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/queryoption/apply/DynamicProperty.java b/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/queryoption/apply/DynamicProperty.java
index d9fbde9..2cfe063 100644
--- a/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/queryoption/apply/DynamicProperty.java
+++ b/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/queryoption/apply/DynamicProperty.java
@@ -115,4 +115,9 @@ public class DynamicProperty implements EdmProperty {
   public List<EdmAnnotation> getAnnotations() {
     return Collections.emptyList();
   }
+  
+  @Override
+  public EdmType getTypeWithAnnotations() {
+    return propertyType;
+  }
 }


[2/3] olingo-odata4 git commit: [OLINGO-1062]Cannot consume Odata Reference Services with Annotations

Posted by ar...@apache.org.
http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/8cbe468c/lib/client-core/src/test/resources/org/apache/olingo/client/core/annotations.xml
----------------------------------------------------------------------
diff --git a/lib/client-core/src/test/resources/org/apache/olingo/client/core/annotations.xml b/lib/client-core/src/test/resources/org/apache/olingo/client/core/annotations.xml
new file mode 100644
index 0000000..a89467d
--- /dev/null
+++ b/lib/client-core/src/test/resources/org/apache/olingo/client/core/annotations.xml
@@ -0,0 +1,1276 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+
+    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.
+
+-->
+<edmx:Edmx xmlns:edmx="http://docs.oasis-open.org/odata/ns/edmx" Version="4.0">
+  <edmx:Reference Uri="../v4.0/cs02/vocabularies/Org.OData.Common.V1.xml">
+    <edmx:Include Namespace="Org.OData.Common.V1" Alias="Common"/>
+  </edmx:Reference>
+  <edmx:Reference Uri="../v4.0/cs02/vocabularies/Org.OData.UI.V1.xml">
+    <edmx:Include Namespace="Org.OData.UI.V1" Alias="UI"/>
+  </edmx:Reference>
+  <edmx:Reference Uri="../v4.0/cs02/vocabularies/Org.OData.Communication.V1.xml">
+    <edmx:Include Namespace="Org.OData.Communication.V1" Alias="Communication"/>
+  </edmx:Reference>
+  <edmx:DataServices>
+    <Schema xmlns="http://docs.oasis-open.org/odata/ns/edm" Namespace="sepmra_so_man2_anno_mdl.v1">
+    <Annotations Target="SEPMRA_SO_MAN2.SEPMRA_SO_MAN2_Entities/I_DraftAdministrativeData/ComplexProperty/PropertyInt16">
+        <Annotation Term="UI.AdditionalInfo"/>
+    </Annotations>
+    <Annotations Target="SEPMRA_SO_MAN2.SEPMRA_SO_MAN2_Entities/I_DraftAdministrativeData/ComplexProperty/NavPropertyDraftAdministrativeDataType">
+        <Annotation Term="UI.AdditionalInfo"/>
+    </Annotations>
+    <Annotations Target="SEPMRA_SO_MAN2.SEPMRA_SO_MAN2_Entities/SINav/ComplexProperty/NavPropertyDraftAdministrativeDataType">
+        <Annotation Term="UI.AdditionalInfo"/>
+    </Annotations>
+    <Annotations Target="SEPMRA_SO_MAN2.SEPMRA_SO_MAN2_Entities/SEPMRA_C_SalesOrderCustCntctVH/to_Customer">
+        <Annotation Term="UI.AdditionalInfo"/>
+    </Annotations>
+    <Annotations Target="SEPMRA_SO_MAN2.SEPMRA_SO_MAN2_Entities/SEPMRA_C_SalesOrderCustCntctVH/to_Customer">
+        <Annotation Term="UI.HeaderInfo"/>
+    </Annotations>
+    <Annotations Target="SEPMRA_SO_MAN2.SEPMRA_SO_MAN2_Entities/I_DraftAdministrativeData/DraftUUID">
+        <Annotation Term="UI.AdditionalInfo"/>
+    </Annotations>
+    <Annotations Target="SEPMRA_SO_MAN2.SEPMRA_SO_MAN2_Entities/I_DraftAdministrativeData/DraftUUID">
+        <Annotation Term="UI.HeaderInfo"/>
+    </Annotations>
+    <Annotations Target="SEPMRA_SO_MAN2.I_DraftAdministrativeDataType/DraftUUID">
+        <Annotation Term="UI.HeaderInfo"/>
+      </Annotations>
+    <Annotations Target="SEPMRA_SO_MAN2.BA_RTCountryVHType">
+        <Annotation Term="UI.HeaderInfo"/>
+    </Annotations>
+    <Annotations Target="SEPMRA_SO_MAN2.BA_RTCountryVHType/ParameterCTPrim">
+        <Annotation Term="UI.HeaderInfo"/>
+    </Annotations>
+    <Annotations Target="SEPMRA_SO_MAN2._FC_RTTimeOfDay_">
+        <Annotation Term="UI.HeaderInfo"/>
+    </Annotations>
+    <Annotations Target="SEPMRA_SO_MAN2._FC_RTTimeOfDay_/ParameterTimeOfDay">
+        <Annotation Term="UI.HeaderInfo"/>
+    </Annotations>
+    <Annotations Target="SEPMRA_SO_MAN2.SEPMRA_SO_MAN2_Entities/AIRTString">
+        <Annotation Term="UI.HeaderInfo"/>
+      </Annotations>
+    <Annotations Target="SEPMRA_SO_MAN2.SEPMRA_SO_MAN2_Entities/SINav">
+      <Annotation Term="UI.HeaderInfo"/>
+    </Annotations>
+    <Annotations Target="SEPMRA_SO_MAN2.TDString">
+        <Annotation Term="UI.HeaderInfo"/>
+      </Annotations>
+      <Annotations Target="SEPMRA_SO_MAN2.CTPrim">
+        <Annotation Term="UI.HeaderInfo"/>
+      </Annotations>
+      <Annotations Target="SEPMRA_SO_MAN2.CTPrim/PropertyInt16">
+        <Annotation Term="UI.HeaderInfo"/>
+      </Annotations>
+      <Annotations Target="SEPMRA_SO_MAN2.CTPrim/NavPropertyDraftAdministrativeDataType">
+        <Annotation Term="UI.HeaderInfo"/>
+      </Annotations>
+      <Annotations Target="SEPMRA_SO_MAN2.SEPMRA_SO_MAN2_Entities/I_DraftAdministrativeData">
+        <Annotation Term="UI.HeaderInfo"/>
+      </Annotations>
+      <Annotations Target="SEPMRA_SO_MAN2.SEPMRA_SO_MAN2_Entities">
+        <Annotation Term="UI.HeaderInfo"/>
+      </Annotations>
+      <Annotations Target="SEPMRA_SO_MAN2.I_DraftAdministrativeDataType/DraftEntityType">
+        <Annotation Term="UI.Hidden"/>
+      </Annotations>
+      <Annotations Target="SEPMRA_SO_MAN2.I_DraftAdministrativeDataType/DraftAccessType">
+        <Annotation Term="UI.Hidden"/>
+      </Annotations>
+      <Annotations Target="SEPMRA_SO_MAN2.I_DraftAdministrativeDataType/ProcessingStartDateTime">
+        <Annotation Term="UI.Hidden"/>
+      </Annotations>
+      <Annotations Target="SEPMRA_SO_MAN2.I_DraftAdministrativeDataType/DraftIsKeptByUser">
+        <Annotation Term="UI.Hidden"/>
+      </Annotations>
+      <Annotations Target="SEPMRA_SO_MAN2.I_DraftAdministrativeDataType/EnqueueStartDateTime">
+        <Annotation Term="UI.Hidden"/>
+      </Annotations>
+      <Annotations Target="SEPMRA_SO_MAN2.I_DraftAdministrativeDataType/DraftIsCreatedByMe">
+        <Annotation Term="UI.Hidden"/>
+      </Annotations>
+      <Annotations Target="SEPMRA_SO_MAN2.I_DraftAdministrativeDataType/DraftIsLastChangedByMe">
+        <Annotation Term="UI.Hidden"/>
+      </Annotations>
+      <Annotations Target="SEPMRA_SO_MAN2.I_DraftAdministrativeDataType/DraftIsProcessedByMe">
+        <Annotation Term="UI.Hidden"/>
+      </Annotations>
+      <Annotations Target="SEPMRA_SO_MAN2.I_DraftAdministrativeDataType/CreatedByUserDescription">
+        <Annotation Term="UI.Hidden"/>
+      </Annotations>
+      <Annotations Target="SEPMRA_SO_MAN2.I_DraftAdministrativeDataType/LastChangedByUserDescription">
+        <Annotation Term="UI.Hidden"/>
+      </Annotations>
+      <Annotations Target="SEPMRA_SO_MAN2.I_DraftAdministrativeDataType/InProcessByUserDescription">
+        <Annotation Term="UI.Hidden"/>
+      </Annotations>
+      <Annotations Target="SEPMRA_SO_MAN2.SEPMRA_C_CountryVHType">
+        <Annotation Term="UI.HeaderInfo">
+          <Record>
+            <PropertyValue Property="TypeName" String="Country"/>
+            <PropertyValue Property="TypeNamePlural" String="Countries"/>
+            <PropertyValue Property="Title">
+              <Record Type="UI.DataField">
+                <PropertyValue Property="Value" Path="Country"/>
+              </Record>
+            </PropertyValue>
+          </Record>
+        </Annotation>
+      </Annotations>
+      <Annotations Target="SEPMRA_SO_MAN2.SEPMRA_C_SalesOrderCustCntctVHType/"/>
+      <Annotations Target="SEPMRA_SO_MAN2.SEPMRA_C_SalesOrderCustCntctVHType/EmailAddress">
+        <Annotation Term="Common.IsEmailAddress"/>
+      </Annotations>
+      <Annotations Target="SEPMRA_SO_MAN2.SEPMRA_C_SalesOrderCustCntctVHType/Customer">
+        <Annotation Term="UI.HiddenFilter"/>
+      </Annotations>
+      <Annotations Target="SEPMRA_SO_MAN2.SEPMRA_C_SalesOrderCustCntctVHType/to_Customer">
+        <Annotation Term="UI.ThingPerspective"/>
+      </Annotations>
+      <Annotations Target="SEPMRA_SO_MAN2.SEPMRA_C_SalesOrderCustCntctVHType">
+        <Annotation Term="UI.FieldGroup" Qualifier="ContactPerson">
+          <Record>
+            <PropertyValue Property="Data">
+              <Collection>
+                <Record Type="UI.DataField">
+                  <PropertyValue Property="Value" Path="ContactPerson"/>
+                  <Annotation Term="UI.Importance" EnumMember="UI.ImportanceType/High"/>
+                </Record>
+                <Record Type="UI.DataField">
+                  <PropertyValue Property="Value" Path="FirstName"/>
+                  <Annotation Term="UI.Importance" EnumMember="UI.ImportanceType/High"/>
+                </Record>
+                <Record Type="UI.DataField">
+                  <PropertyValue Property="Value" Path="LastName"/>
+                  <Annotation Term="UI.Importance" EnumMember="UI.ImportanceType/High"/>
+                </Record>
+                <Record Type="UI.DataField">
+                  <PropertyValue Property="Value" Path="EmailAddress"/>
+                  <Annotation Term="UI.Importance" EnumMember="UI.ImportanceType/High"/>
+                </Record>
+              </Collection>
+            </PropertyValue>
+            <PropertyValue Property="Label" String="Contact Person"/>
+          </Record>
+        </Annotation>
+        <Annotation Term="UI.HeaderInfo">
+          <Record>
+            <PropertyValue Property="TypeName" String="Contact Person"/>
+            <PropertyValue Property="TypeNamePlural" String="Contact Persons"/>
+            <PropertyValue Property="Title">
+              <Record Type="UI.DataField">
+                <PropertyValue Property="Value" Path="ContactPerson"/>
+              </Record>
+            </PropertyValue>
+          </Record>
+        </Annotation>
+        <Annotation Term="UI.Identification">
+          <Collection>
+            <Record Type="UI.DataField">
+              <PropertyValue Property="Value" Path="ContactPerson"/>
+              <Annotation Term="UI.Importance" EnumMember="UI.ImportanceType/High"/>
+            </Record>
+          </Collection>
+        </Annotation>
+        <Annotation Term="UI.LineItem">
+          <Collection>
+            <Record Type="UI.DataField">
+              <PropertyValue Property="Value" Path="ContactPerson"/>
+              <Annotation Term="UI.Importance" EnumMember="UI.ImportanceType/High"/>
+            </Record>
+          </Collection>
+          <Annotation Term="UI.Criticality" Path="abc"/>
+        </Annotation>
+        <Annotation Term="Communication.Contact">
+          <Record>
+            <PropertyValue Property="n">
+              <Record>
+                <PropertyValue Property="given" Path="FirstName"/>
+                <PropertyValue Property="surname" Path="LastName"/>
+              </Record>
+            </PropertyValue>
+          </Record>
+        </Annotation>
+      </Annotations>
+      <Annotations Target="SEPMRA_SO_MAN2.SEPMRA_C_SalesOrderCustContactType/"/>
+      <Annotations Target="SEPMRA_SO_MAN2.SEPMRA_C_SalesOrderCustContactType/EmailAddress">
+        <Annotation Term="Common.IsEmailAddress"/>
+      </Annotations>
+      <Annotations Target="SEPMRA_SO_MAN2.SEPMRA_C_SalesOrderCustContactType">
+        <Annotation Term="UI.FieldGroup" Qualifier="ContactDetails">
+          <Record>
+            <PropertyValue Property="Data">
+              <Collection>
+                <Record Type="UI.DataFieldForAnnotation">
+                  <PropertyValue Property="Target" AnnotationPath="@Communication.Contact"/>
+                </Record>
+                <Record Type="UI.DataField">
+                  <PropertyValue Property="Value" Path="PhoneNumber"/>
+                </Record>
+                <Record Type="UI.DataField">
+                  <PropertyValue Property="Value" Path="EmailAddress"/>
+                </Record>
+              </Collection>
+            </PropertyValue>
+            <PropertyValue Property="Label" String="Contact"/>
+          </Record>
+        </Annotation>
+        <Annotation Term="UI.HeaderInfo">
+          <Record>
+            <PropertyValue Property="TypeName" String="Contact"/>
+            <PropertyValue Property="TypeNamePlural" String="Contacts"/>
+            <PropertyValue Property="Title">
+              <Record Type="UI.DataField">
+                <PropertyValue Property="Value" Path="FullName"/>
+              </Record>
+            </PropertyValue>
+          </Record>
+        </Annotation>
+        <Annotation Term="UI.Identification">
+          <Collection>
+            <Record Type="UI.DataField">
+              <PropertyValue Property="Value" Path="ContactPerson"/>
+            </Record>
+          </Collection>
+        </Annotation>
+        <Annotation Term="Communication.Contact">
+          <Record>
+            <PropertyValue Property="fn" Path="FullName"/>
+            <PropertyValue Property="n">
+              <Record>
+                <PropertyValue Property="given" Path="FirstName"/>
+                <PropertyValue Property="surname" Path="LastName"/>
+              </Record>
+            </PropertyValue>
+            <PropertyValue Property="adr">
+              <Collection>
+                <Record>
+                  <PropertyValue Property="type" EnumMember="Communication.ContactInformationType/preferred"/>
+                  <PropertyValue Property="label" Path="Address"/>
+                </Record>
+              </Collection>
+            </PropertyValue>
+            <PropertyValue Property="tel">
+              <Collection>
+                <Record>
+                  <PropertyValue Property="type" EnumMember="Communication.PhoneType/fax"/>
+                  <PropertyValue Property="uri" Path="FaxNumber"/>
+                </Record>
+                <Record>
+                  <PropertyValue Property="type" EnumMember="Communication.PhoneType/cell"/>
+                  <PropertyValue Property="uri" Path="MobilePhoneNumber"/>
+                </Record>
+                <Record>
+                  <PropertyValue Property="type" EnumMember="Communication.PhoneType/preferred Communication.PhoneType/work"/>
+                  <PropertyValue Property="uri" Path="PhoneNumber"/>
+                </Record>
+              </Collection>
+            </PropertyValue>
+          </Record>
+        </Annotation>
+        <Annotation Term="Communication.Address">
+          <Record>
+            <PropertyValue Property="type" EnumMember="Communication.ContactInformationType/preferred"/>
+            <PropertyValue Property="label" Path="Address"/>
+          </Record>
+        </Annotation>
+      </Annotations>
+      <Annotations Target="SEPMRA_SO_MAN2.SEPMRA_C_SalesOrderCustomerType/"/>
+      <Annotations Target="SEPMRA_SO_MAN2.SEPMRA_C_SalesOrderCustomerType/EmailAddress">
+        <Annotation Term="Common.IsEmailAddress"/>
+      </Annotations>
+      <Annotations Target="SEPMRA_SO_MAN2.SEPMRA_C_SalesOrderCustomerType/Customer">
+        <Annotation Term="Common.Text" Path="CompanyName">
+          <Annotation Term="UI.TextArrangement" EnumMember="UI.TextArrangementType/TextOnly"/>
+        </Annotation>
+      </Annotations>
+      <Annotations Target="SEPMRA_SO_MAN2.SEPMRA_C_SalesOrderCustomerType">
+        <Annotation Term="Communication.Contact">
+          <Record>
+            <PropertyValue Property="fn" Path="CompanyName"/>
+            <PropertyValue Property="adr">
+              <Collection>
+                <Record>
+                  <PropertyValue Property="type" EnumMember="Communication.ContactInformationType/preferred"/>
+                  <PropertyValue Property="label" Path="Address"/>
+                </Record>
+              </Collection>
+            </PropertyValue>
+            <PropertyValue Property="tel">
+              <Collection>
+                <Record>
+                  <PropertyValue Property="type" EnumMember="Communication.PhoneType/fax"/>
+                  <PropertyValue Property="uri" Path="FaxNumber"/>
+                </Record>
+                <Record>
+                  <PropertyValue Property="type" EnumMember="Communication.PhoneType/preferred Communication.PhoneType/work"/>
+                  <PropertyValue Property="uri" Path="PhoneNumber"/>
+                </Record>
+              </Collection>
+            </PropertyValue>
+          </Record>
+        </Annotation>
+        <Annotation Term="Communication.Address">
+          <Record>
+            <PropertyValue Property="type" EnumMember="Communication.ContactInformationType/preferred"/>
+            <PropertyValue Property="label" Path="Address"/>
+          </Record>
+        </Annotation>
+      </Annotations>
+      <Annotations Target="SEPMRA_SO_MAN2.SEPMRA_C_SalesOrderCustomerVHType/Country">
+        <Annotation Term="UI.HiddenFilter"/>
+        <Annotation Term="UI.Hidden"/>
+      </Annotations>
+      <Annotations Target="SEPMRA_SO_MAN2.SEPMRA_C_SalesOrderCustomerVHType/CountryT">
+        <Annotation Term="UI.HiddenFilter"/>
+      </Annotations>
+      <Annotations Target="SEPMRA_SO_MAN2.SEPMRA_C_SalesOrderCustomerVHType">
+        <Annotation Term="Communication.Contact">
+          <Record>
+            <PropertyValue Property="adr">
+              <Collection>
+                <Record>
+                  <PropertyValue Property="type" EnumMember="Communication.ContactInformationType/preferred"/>
+                  <PropertyValue Property="locality" Path="CityName"/>
+                  <PropertyValue Property="country" Path="Country"/>
+                </Record>
+              </Collection>
+            </PropertyValue>
+          </Record>
+        </Annotation>
+        <Annotation Term="Communication.Address">
+          <Record>
+            <PropertyValue Property="type" EnumMember="Communication.ContactInformationType/preferred"/>
+            <PropertyValue Property="locality" Path="CityName"/>
+            <PropertyValue Property="country" Path="Country"/>
+          </Record>
+        </Annotation>
+      </Annotations>
+      <Annotations Target="SEPMRA_SO_MAN2.SEPMRA_C_SalesOrderItemTPType/DraftUUID">
+        <Annotation Term="UI.HiddenFilter"/>
+        <Annotation Term="UI.Hidden"/>
+      </Annotations>
+      <Annotations Target="SEPMRA_SO_MAN2.SEPMRA_C_SalesOrderItemTPType/HasActiveEntity">
+        <Annotation Term="UI.HiddenFilter"/>
+        <Annotation Term="UI.Hidden"/>
+      </Annotations>
+      <Annotations Target="SEPMRA_SO_MAN2.SEPMRA_C_SalesOrderItemTPType/HasDraftEntity">
+        <Annotation Term="UI.HiddenFilter"/>
+        <Annotation Term="UI.Hidden"/>
+      </Annotations>
+      <Annotations Target="SEPMRA_SO_MAN2.SEPMRA_C_SalesOrderItemTPType/IsActiveEntity">
+        <Annotation Term="UI.HiddenFilter"/>
+        <Annotation Term="UI.Hidden"/>
+      </Annotations>
+      <Annotations Target="SEPMRA_SO_MAN2.SEPMRA_C_SalesOrderItemTPType/DraftEntityCreationDateTime">
+        <Annotation Term="UI.Hidden"/>
+      </Annotations>
+      <Annotations Target="SEPMRA_SO_MAN2.SEPMRA_C_SalesOrderItemTPType/DraftEntityLastChangeDateTime">
+        <Annotation Term="UI.Hidden"/>
+      </Annotations>
+      <Annotations Target="SEPMRA_SO_MAN2.SEPMRA_C_SalesOrderItemTPType/ParentDraftUUID">
+        <Annotation Term="UI.Hidden"/>
+      </Annotations>
+      <Annotations Target="SEPMRA_SO_MAN2.SEPMRA_C_SalesOrderItemTPType/Preparation_ac">
+        <Annotation Term="UI.Hidden"/>
+      </Annotations>
+      <Annotations Target="SEPMRA_SO_MAN2.SEPMRA_C_SalesOrderItemTPType/Validation_ac">
+        <Annotation Term="UI.Hidden"/>
+      </Annotations>
+      <Annotations Target="SEPMRA_SO_MAN2.SEPMRA_C_SalesOrderItemTPType/Product">
+        <Annotation Term="Common.SemanticObject" String="EPMProduct"/>
+        <Annotation Term="Common.SemanticObjectMapping">
+          <Collection>
+            <Record>
+              <PropertyValue Property="LocalProperty" PropertyPath="Product"/>
+              <PropertyValue Property="SemanticObjectProperty" String="Product"/>
+            </Record>
+          </Collection>
+        </Annotation>
+      </Annotations>
+      <Annotations Target="SEPMRA_SO_MAN2.SEPMRA_C_SalesOrderItemTPType">
+        <Annotation Term="UI.DataPoint" Qualifier="NetAmountInTransactionCurrency">
+          <Record>
+            <PropertyValue Property="Value" Path="NetAmountInTransactionCurrency"/>
+            <PropertyValue Property="Title" String="Net Amount"/>
+          </Record>
+        </Annotation>
+        <Annotation Term="UI.HeaderFacets">
+          <Collection>
+            <Record Type="UI.ReferenceFacet">
+              <PropertyValue Property="Target" AnnotationPath="@UI.DataPoint#NetAmountInTransactionCurrency"/>
+              <Annotation Term="UI.Importance" EnumMember="UI.ImportanceType/High"/>
+            </Record>
+          </Collection>
+        </Annotation>
+        <Annotation Term="UI.Facets">
+          <Collection>
+            <Record Type="UI.CollectionFacet">
+              <PropertyValue Property="Label" String="Sales Order Item"/>
+              <PropertyValue Property="ID" String="SalesOrderItemStableID"/>
+              <PropertyValue Property="Facets">
+                <Collection>
+                  <Record Type="UI.ReferenceFacet">
+                    <PropertyValue Property="Label" String="General Information"/>
+                    <PropertyValue Property="Target" AnnotationPath="@UI.Identification"/>
+                    <Annotation Term="UI.Importance" EnumMember="UI.ImportanceType/High"/>
+                  </Record>
+                </Collection>
+              </PropertyValue>
+              <Annotation Term="UI.Importance" EnumMember="UI.ImportanceType/High"/>
+            </Record>
+          </Collection>
+        </Annotation>
+        <Annotation Term="UI.HeaderInfo">
+          <Record>
+            <PropertyValue Property="TypeName" String="Sales Order Item"/>
+            <PropertyValue Property="TypeNamePlural" String="Sales Order Items"/>
+            <PropertyValue Property="ImageUrl" Path="to_Product/ProductPictureURL"/>
+            <PropertyValue Property="Title">
+              <Record Type="UI.DataField">
+                <PropertyValue Property="Value" Path="Product"/>
+              </Record>
+            </PropertyValue>
+            <PropertyValue Property="Description">
+              <Record Type="UI.DataField">
+                <PropertyValue Property="Value" Path="SalesOrderItem"/>
+              </Record>
+            </PropertyValue>
+          </Record>
+        </Annotation>
+        <Annotation Term="UI.Identification">
+          <Collection>
+            <Record Type="UI.DataField">
+              <PropertyValue Property="Value" Path="SalesOrderItem"/>
+              <Annotation Term="UI.Importance" EnumMember="UI.ImportanceType/High"/>
+            </Record>
+            <Record Type="UI.DataField">
+              <PropertyValue Property="Value" Path="Product"/>
+              <Annotation Term="UI.Importance" EnumMember="UI.ImportanceType/High"/>
+            </Record>
+            <Record Type="UI.DataField">
+              <PropertyValue Property="Value" Path="to_ScheduleLine/Quantity"/>
+              <Annotation Term="UI.Importance" EnumMember="UI.ImportanceType/High"/>
+            </Record>
+            <Record Type="UI.DataField">
+              <PropertyValue Property="Value" Path="to_ScheduleLine/DeliveryDate"/>
+              <Annotation Term="UI.Importance" EnumMember="UI.ImportanceType/High"/>
+            </Record>
+          </Collection>
+        </Annotation>
+        <Annotation Term="UI.LineItem">
+          <Collection>
+            <Record Type="UI.DataField">
+              <PropertyValue Property="Value" Path="to_Product/ProductPictureURL"/>
+              <Annotation Term="UI.Importance" EnumMember="UI.ImportanceType/High"/>
+            </Record>
+            <Record Type="UI.DataField">
+              <PropertyValue Property="Value" Path="Product"/>
+              <Annotation Term="UI.Importance" EnumMember="UI.ImportanceType/High"/>
+            </Record>
+            <Record Type="UI.DataField">
+              <PropertyValue Property="Value" Path="to_ScheduleLine/DeliveryDate"/>
+              <Annotation Term="UI.Importance" EnumMember="UI.ImportanceType/High"/>
+            </Record>
+            <Record Type="UI.DataField">
+              <PropertyValue Property="Value" Path="to_ScheduleLine/Quantity"/>
+              <Annotation Term="UI.Importance" EnumMember="UI.ImportanceType/High"/>
+            </Record>
+            <Record Type="UI.DataField">
+              <PropertyValue Property="Value" Path="to_Product/Price"/>
+              <Annotation Term="UI.Importance" EnumMember="UI.ImportanceType/High"/>
+            </Record>
+            <Record Type="UI.DataField">
+              <PropertyValue Property="Value" Path="NetAmountInTransactionCurrency"/>
+              <Annotation Term="UI.Importance" EnumMember="UI.ImportanceType/High"/>
+            </Record>
+          </Collection>
+          <Annotation Term="UI.Criticality" Path="abc"/>
+        </Annotation>
+        <Annotation Term="UI.LineItem" Qualifier="QuickCreate">
+          <Collection>
+            <Record Type="UI.DataField">
+              <PropertyValue Property="Value" Path="Product"/>
+              <Annotation Term="UI.Importance" EnumMember="UI.ImportanceType/High"/>
+            </Record>
+            <Record Type="UI.DataField">
+              <PropertyValue Property="Value" Path="to_ScheduleLine/Quantity"/>
+              <Annotation Term="UI.Importance" EnumMember="UI.ImportanceType/High"/>
+            </Record>
+          </Collection>
+        </Annotation>
+        <Annotation Term="UI.LineItem" Qualifier="QuickView">
+          <Collection>
+            <Record Type="UI.DataField">
+              <PropertyValue Property="Value" Path="Product"/>
+              <Annotation Term="UI.Importance" EnumMember="UI.ImportanceType/High"/>
+            </Record>
+            <Record Type="UI.DataField">
+              <PropertyValue Property="Value" Path="to_ScheduleLine/Quantity"/>
+              <Annotation Term="UI.Importance" EnumMember="UI.ImportanceType/High"/>
+            </Record>
+          </Collection>
+        </Annotation>
+      </Annotations>
+      <Annotations Target="SEPMRA_SO_MAN2.SEPMRA_C_SalesOrderPartyType/HouseNumber">
+        <Annotation Term="UI.HiddenFilter"/>
+      </Annotations>
+      <Annotations Target="SEPMRA_SO_MAN2.SEPMRA_C_SalesOrderPartyType">
+        <Annotation Term="UI.HeaderInfo">
+          <Record>
+            <PropertyValue Property="TypeName" String="Party"/>
+            <PropertyValue Property="TypeNamePlural" String="Parties"/>
+            <PropertyValue Property="Title">
+              <Record Type="UI.DataField">
+                <PropertyValue Property="Value" Path="PartyName"/>
+              </Record>
+            </PropertyValue>
+          </Record>
+        </Annotation>
+        <Annotation Term="UI.Identification">
+          <Collection>
+            <Record Type="UI.DataField">
+              <PropertyValue Property="Value" Path="Party"/>
+              <Annotation Term="UI.Importance" EnumMember="UI.ImportanceType/High"/>
+            </Record>
+            <Record Type="UI.DataField">
+              <PropertyValue Property="Value" Path="Address"/>
+              <Annotation Term="UI.Importance" EnumMember="UI.ImportanceType/Medium"/>
+            </Record>
+          </Collection>
+        </Annotation>
+        <Annotation Term="Communication.Contact">
+          <Record>
+            <PropertyValue Property="fn" Path="PartyName"/>
+            <PropertyValue Property="adr">
+              <Collection>
+                <Record>
+                  <PropertyValue Property="type" EnumMember="Communication.ContactInformationType/preferred"/>
+                  <PropertyValue Property="locality" Path="CityName"/>
+                  <PropertyValue Property="street" Path="StreetName"/>
+                  <PropertyValue Property="country" Path="Country"/>
+                  <PropertyValue Property="code" Path="PostalCode"/>
+                  <PropertyValue Property="label" Path="Address"/>
+                </Record>
+              </Collection>
+            </PropertyValue>
+          </Record>
+        </Annotation>
+        <Annotation Term="Communication.Address">
+          <Record>
+            <PropertyValue Property="type" EnumMember="Communication.ContactInformationType/preferred"/>
+            <PropertyValue Property="locality" Path="CityName"/>
+            <PropertyValue Property="street" Path="StreetName"/>
+            <PropertyValue Property="country" Path="Country"/>
+            <PropertyValue Property="code" Path="PostalCode"/>
+            <PropertyValue Property="label" Path="Address"/>
+          </Record>
+        </Annotation>
+      </Annotations>
+      <Annotations Target="SEPMRA_SO_MAN2.SEPMRA_C_SalesOrderPartyVHType/Customer">
+        <Annotation Term="UI.HiddenFilter"/>
+      </Annotations>
+      <Annotations Target="SEPMRA_SO_MAN2.SEPMRA_C_SalesOrderPartyVHType/Country">
+        <Annotation Term="UI.HiddenFilter"/>
+        <Annotation Term="UI.Hidden"/>
+      </Annotations>
+      <Annotations Target="SEPMRA_SO_MAN2.SEPMRA_C_SalesOrderPartyVHType/CountryT">
+        <Annotation Term="UI.HiddenFilter"/>
+      </Annotations>
+      <Annotations Target="SEPMRA_SO_MAN2.SEPMRA_C_SalesOrderPartyVHType">
+        <Annotation Term="UI.HeaderInfo">
+          <Record>
+            <PropertyValue Property="TypeName" String="Party"/>
+            <PropertyValue Property="TypeNamePlural" String="Parties"/>
+            <PropertyValue Property="Title">
+              <Record Type="UI.DataField">
+                <PropertyValue Property="Value" Path="Party"/>
+              </Record>
+            </PropertyValue>
+          </Record>
+        </Annotation>
+        <Annotation Term="UI.Identification">
+          <Collection>
+            <Record Type="UI.DataField">
+              <PropertyValue Property="Value" Path="Party"/>
+              <Annotation Term="UI.Importance" EnumMember="UI.ImportanceType/High"/>
+            </Record>
+          </Collection>
+        </Annotation>
+        <Annotation Term="UI.LineItem">
+          <Collection>
+            <Record Type="UI.DataField">
+              <PropertyValue Property="Value" Path="Party"/>
+              <Annotation Term="UI.Importance" EnumMember="UI.ImportanceType/High"/>
+            </Record>
+          </Collection>
+          <Annotation Term="UI.Criticality" Path="abc"/>
+        </Annotation>
+        <Annotation Term="Communication.Contact">
+          <Record>
+            <PropertyValue Property="fn" Path="PartyName"/>
+            <PropertyValue Property="adr">
+              <Collection>
+                <Record>
+                  <PropertyValue Property="type" EnumMember="Communication.ContactInformationType/preferred"/>
+                  <PropertyValue Property="locality" Path="CityName"/>
+                  <PropertyValue Property="country" Path="Country"/>
+                </Record>
+              </Collection>
+            </PropertyValue>
+          </Record>
+        </Annotation>
+        <Annotation Term="Communication.Address">
+          <Record>
+            <PropertyValue Property="type" EnumMember="Communication.ContactInformationType/preferred"/>
+            <PropertyValue Property="locality" Path="CityName"/>
+            <PropertyValue Property="country" Path="Country"/>
+          </Record>
+        </Annotation>
+      </Annotations>
+      <Annotations Target="SEPMRA_SO_MAN2.SEPMRA_C_SalesOrderProductType/ProductPictureURL">
+        <Annotation Term="UI.IsImageURL"/>
+      </Annotations>
+      <Annotations Target="SEPMRA_SO_MAN2.SEPMRA_C_SalesOrderProductType/Product">
+        <Annotation Term="Common.SemanticObject" String="EPMProduct"/>
+        <Annotation Term="Common.Text" Path="Product_Text">
+          <Annotation Term="UI.TextArrangement" EnumMember="UI.TextArrangementType/TextOnly"/>
+        </Annotation>
+      </Annotations>
+      <Annotations Target="SEPMRA_SO_MAN2.SEPMRA_C_SalesOrderProductType">
+        <Annotation Term="Common.SemanticObject" String="EPMProduct"/>
+      </Annotations>
+      <Annotations Target="SEPMRA_SO_MAN2.SEPMRA_C_SalesOrderProductVHType/Product">
+        <Annotation Term="UI.HiddenFilter"/>
+        <Annotation Term="Common.SemanticObject" String="EPMProduct"/>
+      </Annotations>
+      <Annotations Target="SEPMRA_SO_MAN2.SEPMRA_C_SalesOrderProductVHType/Name">
+        <Annotation Term="UI.HiddenFilter"/>
+      </Annotations>
+      <Annotations Target="SEPMRA_SO_MAN2.SEPMRA_C_SalesOrderProductVHType/MainProductCategory">
+        <Annotation Term="UI.HiddenFilter"/>
+      </Annotations>
+      <Annotations Target="SEPMRA_SO_MAN2.SEPMRA_C_SalesOrderProductVHType/Supplier">
+        <Annotation Term="UI.HiddenFilter"/>
+        <Annotation Term="Common.SemanticObject" String="EPMSupplier"/>
+      </Annotations>
+      <Annotations Target="SEPMRA_SO_MAN2.SEPMRA_C_SalesOrderProductVHType/SupplierName">
+        <Annotation Term="UI.HiddenFilter"/>
+      </Annotations>
+      <Annotations Target="SEPMRA_SO_MAN2.SEPMRA_C_SalesOrderProductVHType">
+        <Annotation Term="UI.FieldGroup" Qualifier="Product">
+          <Record>
+            <PropertyValue Property="Data">
+              <Collection>
+                <Record Type="UI.DataField">
+                  <PropertyValue Property="Value" Path="Product"/>
+                </Record>
+                <Record Type="UI.DataField">
+                  <PropertyValue Property="Value" Path="Name"/>
+                </Record>
+                <Record Type="UI.DataField">
+                  <PropertyValue Property="Value" Path="MainProductCategory"/>
+                </Record>
+              </Collection>
+            </PropertyValue>
+            <PropertyValue Property="Label" String="Product"/>
+          </Record>
+        </Annotation>
+        <Annotation Term="UI.FieldGroup" Qualifier="Supplier">
+          <Record>
+            <PropertyValue Property="Data">
+              <Collection>
+                <Record Type="UI.DataField">
+                  <PropertyValue Property="Value" Path="Supplier"/>
+                </Record>
+                <Record Type="UI.DataField">
+                  <PropertyValue Property="Value" Path="SupplierName"/>
+                </Record>
+              </Collection>
+            </PropertyValue>
+            <PropertyValue Property="Label" String="Supplier"/>
+          </Record>
+        </Annotation>
+        <Annotation Term="Communication.Contact">
+          <Record>
+            <PropertyValue Property="fn" Path="SupplierName"/>
+          </Record>
+        </Annotation>
+      </Annotations>
+      <Annotations Target="SEPMRA_SO_MAN2.SEPMRA_C_SalesOrderReviserType/"/>
+      <Annotations Target="SEPMRA_SO_MAN2.SEPMRA_C_SalesOrderReviserType/EmailAddress">
+        <Annotation Term="Common.IsEmailAddress"/>
+      </Annotations>
+      <Annotations Target="SEPMRA_SO_MAN2.SEPMRA_C_SalesOrderReviserType">
+        <Annotation Term="Communication.Contact">
+          <Record>
+            <PropertyValue Property="fn" Path="FullName"/>
+            <PropertyValue Property="tel">
+              <Collection>
+                <Record>
+                  <PropertyValue Property="type" EnumMember="Communication.PhoneType/cell"/>
+                  <PropertyValue Property="uri" Path="MobilePhoneNumber"/>
+                </Record>
+                <Record>
+                  <PropertyValue Property="type" EnumMember="Communication.PhoneType/preferred Communication.PhoneType/work"/>
+                  <PropertyValue Property="uri" Path="PhoneNumber"/>
+                </Record>
+              </Collection>
+            </PropertyValue>
+          </Record>
+        </Annotation>
+      </Annotations>
+      <Annotations Target="SEPMRA_SO_MAN2.SEPMRA_C_SalesOrderStatusType/SalesOrderOverallStatus">
+        <Annotation Term="Common.Text" Path="SalesOrderOverallStatus_Text">
+          <Annotation Term="UI.TextArrangement" EnumMember="UI.TextArrangementType/TextOnly"/>
+        </Annotation>
+      </Annotations>
+      <Annotations Target="SEPMRA_SO_MAN2.SEPMRA_C_SalesOrderStatusType">
+        <Annotation Term="UI.DataPoint" Qualifier="SalesOrderOverallStatus">
+          <Record>
+            <PropertyValue Property="Value" Path="SalesOrderOverallStatus"/>
+            <PropertyValue Property="Title" String="Status"/>
+            <PropertyValue Property="Criticality" Path="StatusCriticality"/>
+          </Record>
+        </Annotation>
+      </Annotations>
+      <Annotations Target="SEPMRA_SO_MAN2.SEPMRA_C_SalesOrderTPType/DraftUUID">
+        <Annotation Term="UI.HiddenFilter"/>
+        <Annotation Term="UI.Hidden"/>
+      </Annotations>
+      <Annotations Target="SEPMRA_SO_MAN2.SEPMRA_C_SalesOrderTPType/HasActiveEntity">
+        <Annotation Term="UI.HiddenFilter"/>
+        <Annotation Term="UI.Hidden"/>
+      </Annotations>
+      <Annotations Target="SEPMRA_SO_MAN2.SEPMRA_C_SalesOrderTPType/HasDraftEntity">
+        <Annotation Term="UI.HiddenFilter"/>
+        <Annotation Term="UI.Hidden"/>
+      </Annotations>
+      <Annotations Target="SEPMRA_SO_MAN2.SEPMRA_C_SalesOrderTPType/IsActiveEntity">
+        <Annotation Term="UI.HiddenFilter"/>
+        <Annotation Term="UI.Hidden"/>
+      </Annotations>
+      <Annotations Target="SEPMRA_SO_MAN2.SEPMRA_C_SalesOrderTPType/DraftEntityCreationDateTime">
+        <Annotation Term="UI.Hidden"/>
+      </Annotations>
+      <Annotations Target="SEPMRA_SO_MAN2.SEPMRA_C_SalesOrderTPType/DraftEntityLastChangeDateTime">
+        <Annotation Term="UI.Hidden"/>
+      </Annotations>
+      <Annotations Target="SEPMRA_SO_MAN2.SEPMRA_C_SalesOrderTPType/Activation_ac">
+        <Annotation Term="UI.Hidden"/>
+      </Annotations>
+      <Annotations Target="SEPMRA_SO_MAN2.SEPMRA_C_SalesOrderTPType/Copy_ac">
+        <Annotation Term="UI.Hidden"/>
+      </Annotations>
+      <Annotations Target="SEPMRA_SO_MAN2.SEPMRA_C_SalesOrderTPType/Edit_ac">
+        <Annotation Term="UI.Hidden"/>
+      </Annotations>
+      <Annotations Target="SEPMRA_SO_MAN2.SEPMRA_C_SalesOrderTPType/Preparation_ac">
+        <Annotation Term="UI.Hidden"/>
+      </Annotations>
+      <Annotations Target="SEPMRA_SO_MAN2.SEPMRA_C_SalesOrderTPType/Validation_ac">
+        <Annotation Term="UI.Hidden"/>
+      </Annotations>
+      <Annotations Target="SEPMRA_SO_MAN2.SEPMRA_C_SalesOrderTPType/BillToParty_fc">
+        <Annotation Term="UI.Hidden"/>
+      </Annotations>
+      <Annotations Target="SEPMRA_SO_MAN2.SEPMRA_C_SalesOrderTPType/CustomerContact_fc">
+        <Annotation Term="UI.Hidden"/>
+      </Annotations>
+      <Annotations Target="SEPMRA_SO_MAN2.SEPMRA_C_SalesOrderTPType/ShipToParty_fc">
+        <Annotation Term="UI.Hidden"/>
+      </Annotations>
+      <Annotations Target="SEPMRA_SO_MAN2.SEPMRA_C_SalesOrderTPType/SoldToParty_fc">
+        <Annotation Term="UI.Hidden"/>
+      </Annotations>
+      <Annotations Target="SEPMRA_SO_MAN2.SEPMRA_C_SalesOrderTPType/Delete_mc">
+        <Annotation Term="UI.Hidden"/>
+      </Annotations>
+      <Annotations Target="SEPMRA_SO_MAN2.SEPMRA_C_SalesOrderTPType/Update_mc">
+        <Annotation Term="UI.Hidden"/>
+      </Annotations>
+      <Annotations Target="SEPMRA_SO_MAN2.SEPMRA_C_SalesOrderTPType/SalesOrder">
+        <Annotation Term="Common.SemanticObject" String="EPMSalesOrder"/>
+      </Annotations>
+      <Annotations Target="SEPMRA_SO_MAN2.SEPMRA_C_SalesOrderTPType/CustomerContact">
+        <Annotation Term="Common.Text" Path="to_CustomerContact/FullName">
+          <Annotation Term="UI.TextArrangement" EnumMember="UI.TextArrangementType/TextOnly"/>
+        </Annotation>
+      </Annotations>
+      <Annotations Target="SEPMRA_SO_MAN2.SEPMRA_C_SalesOrderTPType/SalesOrderOverallStatus">
+        <Annotation Term="Common.Text" Path="to_OverallStatus/SalesOrderOverallStatus_Text">
+          <Annotation Term="UI.TextArrangement" EnumMember="UI.TextArrangementType/TextOnly"/>
+        </Annotation>
+      </Annotations>
+      <Annotations Target="SEPMRA_SO_MAN2.SEPMRA_C_SalesOrderTPType">
+        <Annotation Term="UI.DataPoint" Qualifier="NetAmountInTransactionCurrency">
+          <Record>
+            <PropertyValue Property="Value" Path="NetAmountInTransactionCurrency"/>
+            <PropertyValue Property="Title" String="Order Volume"/>
+          </Record>
+        </Annotation>
+        <Annotation Term="UI.QuickCreateFacets">
+          <Collection>
+            <Record Type="UI.ReferenceFacet">
+              <PropertyValue Property="Label" String="Create Sales Order"/>
+              <PropertyValue Property="Target" AnnotationPath="@UI.FieldGroup#QuickCreate"/>
+              <Annotation Term="UI.Importance" EnumMember="UI.ImportanceType/High"/>
+            </Record>
+            <Record Type="UI.ReferenceFacet">
+              <PropertyValue Property="Label" String="Create Sales Order Item"/>
+              <PropertyValue Property="Target" AnnotationPath="to_SalesOrderItem/@UI.LineItem#QuickCreate"/>
+              <Annotation Term="UI.Importance" EnumMember="UI.ImportanceType/High"/>
+            </Record>
+          </Collection>
+        </Annotation>
+        <Annotation Term="UI.QuickViewFacets">
+          <Collection>
+            <Record Type="UI.ReferenceFacet">
+              <PropertyValue Property="Label" String="Sales Order"/>
+              <PropertyValue Property="Target" AnnotationPath="@UI.FieldGroup#QuickView"/>
+              <Annotation Term="UI.Importance" EnumMember="UI.ImportanceType/High"/>
+            </Record>
+            <Record Type="UI.ReferenceFacet">
+              <PropertyValue Property="Label" String="Sales Order Item"/>
+              <PropertyValue Property="Target" AnnotationPath="to_SalesOrderItem/@UI.LineItem#QuickView"/>
+              <Annotation Term="UI.Importance" EnumMember="UI.ImportanceType/High"/>
+            </Record>
+          </Collection>
+        </Annotation>
+        <Annotation Term="UI.HeaderFacets">
+          <Collection>
+            <Record Type="UI.ReferenceFacet">
+              <PropertyValue Property="Target" AnnotationPath="@UI.FieldGroup#HeaderInfoCustomer"/>
+              <Annotation Term="UI.Importance" EnumMember="UI.ImportanceType/High"/>
+            </Record>
+            <Record Type="UI.ReferenceFacet">
+              <PropertyValue Property="Target" AnnotationPath="@UI.DataPoint#NetAmountInTransactionCurrency"/>
+              <Annotation Term="UI.Importance" EnumMember="UI.ImportanceType/High"/>
+            </Record>
+            <Record Type="UI.ReferenceFacet">
+              <PropertyValue Property="Target" AnnotationPath="to_OverallStatus/@UI.DataPoint#SalesOrderOverallStatus"/>
+              <Annotation Term="UI.Importance" EnumMember="UI.ImportanceType/High"/>
+            </Record>
+            <Record Type="UI.ReferenceFacet">
+              <PropertyValue Property="Target" AnnotationPath="@UI.FieldGroup#AdminDataCreated"/>
+              <Annotation Term="UI.Importance" EnumMember="UI.ImportanceType/High"/>
+            </Record>
+          </Collection>
+        </Annotation>
+        <Annotation Term="UI.Facets">
+          <Collection>
+            <Record Type="UI.CollectionFacet">
+              <PropertyValue Property="Label" String="Customer Details"/>
+              <PropertyValue Property="ID" String="SalesOrderStableID"/>
+              <PropertyValue Property="Facets">
+                <Collection>
+                  <Record Type="UI.ReferenceFacet">
+                    <PropertyValue Property="Label" String="Customer Details"/>
+                    <PropertyValue Property="Target" AnnotationPath="@UI.FieldGroup#Customer"/>
+                    <Annotation Term="UI.Importance" EnumMember="UI.ImportanceType/High"/>
+                  </Record>
+                  <Record Type="UI.ReferenceFacet">
+                    <PropertyValue Property="Label" String="Contact Details"/>
+                    <PropertyValue Property="Target" AnnotationPath="@UI.FieldGroup#CustomerContact"/>
+                    <Annotation Term="UI.Importance" EnumMember="UI.ImportanceType/High"/>
+                  </Record>
+                </Collection>
+              </PropertyValue>
+              <Annotation Term="UI.Importance" EnumMember="UI.ImportanceType/High"/>
+            </Record>
+            <Record Type="UI.CollectionFacet">
+              <PropertyValue Property="Label" String="General Information"/>
+              <PropertyValue Property="ID" String="GeneralInformationFacetID"/>
+              <PropertyValue Property="Facets">
+                <Collection>
+                  <Record Type="UI.ReferenceFacet">
+                    <PropertyValue Property="Label" String="Payment Details"/>
+                    <PropertyValue Property="Target" AnnotationPath="@UI.FieldGroup#Payment"/>
+                    <Annotation Term="UI.Importance" EnumMember="UI.ImportanceType/High"/>
+                  </Record>
+                  <Record Type="UI.ReferenceFacet">
+                    <PropertyValue Property="Label" String="Billing Details"/>
+                    <PropertyValue Property="Target" AnnotationPath="@UI.FieldGroup#BillTo"/>
+                    <Annotation Term="UI.Importance" EnumMember="UI.ImportanceType/High"/>
+                  </Record>
+                  <Record Type="UI.ReferenceFacet">
+                    <PropertyValue Property="Label" String="Shipping Details"/>
+                    <PropertyValue Property="Target" AnnotationPath="@UI.FieldGroup#ShipTo"/>
+                    <Annotation Term="UI.Importance" EnumMember="UI.ImportanceType/High"/>
+                  </Record>
+                  <Record Type="UI.ReferenceFacet">
+                    <PropertyValue Property="Label" String="Modified"/>
+                    <PropertyValue Property="Target" AnnotationPath="@UI.FieldGroup#AdminDataLastChanged"/>
+                    <Annotation Term="UI.Importance" EnumMember="UI.ImportanceType/High"/>
+                  </Record>
+                </Collection>
+              </PropertyValue>
+              <Annotation Term="UI.Importance" EnumMember="UI.ImportanceType/High"/>
+            </Record>
+            <Record Type="UI.ReferenceFacet">
+              <PropertyValue Property="Label" String="Products"/>
+              <PropertyValue Property="ID" String="LineItemFacet"/>
+              <PropertyValue Property="Target" AnnotationPath="to_SalesOrderItem/@UI.LineItem"/>
+              <Annotation Term="UI.Importance" EnumMember="UI.ImportanceType/High"/>
+            </Record>
+          </Collection>
+        </Annotation>
+        <Annotation Term="UI.FieldGroup" Qualifier="AdminDataCreated">
+          <Record>
+            <PropertyValue Property="Data">
+              <Collection>
+                <Record Type="UI.DataField">
+                  <PropertyValue Property="Value" Path="CreationDateTime"/>
+                  <Annotation Term="UI.Importance" EnumMember="UI.ImportanceType/Medium"/>
+                </Record>
+                <Record Type="UI.DataFieldForAnnotation">
+                  <PropertyValue Property="Label" String="Created By"/>
+                  <PropertyValue Property="Target" AnnotationPath="to_CreatedByUser/@Communication.Contact"/>
+                  <Annotation Term="UI.Importance" EnumMember="UI.ImportanceType/Medium"/>
+                </Record>
+              </Collection>
+            </PropertyValue>
+          </Record>
+        </Annotation>
+        <Annotation Term="UI.FieldGroup" Qualifier="AdminDataLastChanged">
+          <Record>
+            <PropertyValue Property="Data">
+              <Collection>
+                <Record Type="UI.DataField">
+                  <PropertyValue Property="Value" Path="LastChangedDateTime"/>
+                  <Annotation Term="UI.Importance" EnumMember="UI.ImportanceType/High"/>
+                </Record>
+                <Record Type="UI.DataField">
+                  <PropertyValue Property="Value" Path="LastChangedByUser"/>
+                  <Annotation Term="UI.Importance" EnumMember="UI.ImportanceType/High"/>
+                </Record>
+              </Collection>
+            </PropertyValue>
+          </Record>
+        </Annotation>
+        <Annotation Term="UI.FieldGroup" Qualifier="BillTo">
+          <Record>
+            <PropertyValue Property="Data">
+              <Collection>
+                <Record Type="UI.DataField">
+                  <PropertyValue Property="Value" Path="BillToParty"/>
+                  <Annotation Term="UI.Importance" EnumMember="UI.ImportanceType/High"/>
+                </Record>
+                <Record Type="UI.DataField">
+                  <PropertyValue Property="Value" Path="to_BillToParty/Address"/>
+                  <Annotation Term="UI.Importance" EnumMember="UI.ImportanceType/High"/>
+                </Record>
+              </Collection>
+            </PropertyValue>
+          </Record>
+        </Annotation>
+        <Annotation Term="UI.FieldGroup" Qualifier="Customer">
+          <Record>
+            <PropertyValue Property="Data">
+              <Collection>
+                <Record Type="UI.DataField">
+                  <PropertyValue Property="Value" Path="SoldToParty"/>
+                  <Annotation Term="UI.Importance" EnumMember="UI.ImportanceType/High"/>
+                </Record>
+                <Record Type="UI.DataField">
+                  <PropertyValue Property="Value" Path="to_Customer/Address"/>
+                  <Annotation Term="UI.Importance" EnumMember="UI.ImportanceType/Low"/>
+                </Record>
+              </Collection>
+            </PropertyValue>
+          </Record>
+        </Annotation>
+        <Annotation Term="UI.FieldGroup" Qualifier="CustomerContact">
+          <Record>
+            <PropertyValue Property="Data">
+              <Collection>
+                <Record Type="UI.DataField">
+                  <PropertyValue Property="Value" Path="CustomerContact"/>
+                  <Annotation Term="UI.Importance" EnumMember="UI.ImportanceType/High"/>
+                </Record>
+                <Record Type="UI.DataField">
+                  <PropertyValue Property="Value" Path="to_CustomerContact/PhoneNumber"/>
+                  <Annotation Term="UI.Importance" EnumMember="UI.ImportanceType/Low"/>
+                </Record>
+                <Record Type="UI.DataField">
+                  <PropertyValue Property="Value" Path="to_CustomerContact/EmailAddress"/>
+                  <Annotation Term="UI.Importance" EnumMember="UI.ImportanceType/Low"/>
+                </Record>
+              </Collection>
+            </PropertyValue>
+          </Record>
+        </Annotation>
+        <Annotation Term="UI.FieldGroup" Qualifier="HeaderInfoCustomer">
+          <Record>
+            <PropertyValue Property="Data">
+              <Collection>
+                <Record Type="UI.DataFieldForAnnotation">
+                  <PropertyValue Property="Label" String="Customer"/>
+                  <PropertyValue Property="Target" AnnotationPath="to_Customer/@Communication.Contact"/>
+                  <Annotation Term="UI.Importance" EnumMember="UI.ImportanceType/Medium"/>
+                </Record>
+              </Collection>
+            </PropertyValue>
+          </Record>
+        </Annotation>
+        <Annotation Term="UI.FieldGroup" Qualifier="Payment">
+          <Record>
+            <PropertyValue Property="Data">
+              <Collection>
+                <Record Type="UI.DataField">
+                  <PropertyValue Property="Value" Path="SalesOrderPaymentMethod"/>
+                  <Annotation Term="UI.Importance" EnumMember="UI.ImportanceType/High"/>
+                </Record>
+                <Record Type="UI.DataField">
+                  <PropertyValue Property="Value" Path="SalesOrderPaymentTerms"/>
+                  <Annotation Term="UI.Importance" EnumMember="UI.ImportanceType/High"/>
+                </Record>
+              </Collection>
+            </PropertyValue>
+          </Record>
+        </Annotation>
+        <Annotation Term="UI.FieldGroup" Qualifier="QuickCreate">
+          <Record>
+            <PropertyValue Property="Data">
+              <Collection>
+                <Record Type="UI.DataField">
+                  <PropertyValue Property="Value" Path="SoldToParty"/>
+                  <Annotation Term="UI.Importance" EnumMember="UI.ImportanceType/High"/>
+                </Record>
+                <Record Type="UI.DataField">
+                  <PropertyValue Property="Label" String="Customer Name"/>
+                  <PropertyValue Property="Value" Path="to_Customer/Customer"/>
+                  <Annotation Term="UI.Importance" EnumMember="UI.ImportanceType/High"/>
+                </Record>
+              </Collection>
+            </PropertyValue>
+            <PropertyValue Property="Label" String="Create Sales Order"/>
+          </Record>
+        </Annotation>
+        <Annotation Term="UI.FieldGroup" Qualifier="QuickView">
+          <Record>
+            <PropertyValue Property="Data">
+              <Collection>
+                <Record Type="UI.DataField">
+                  <PropertyValue Property="Value" Path="SoldToParty"/>
+                  <Annotation Term="UI.Importance" EnumMember="UI.ImportanceType/High"/>
+                </Record>
+                <Record Type="UI.DataField">
+                  <PropertyValue Property="Value" Path="CustomerContact"/>
+                  <Annotation Term="UI.Importance" EnumMember="UI.ImportanceType/High"/>
+                </Record>
+                <Record Type="UI.DataField">
+                  <PropertyValue Property="Value" Path="BillToParty"/>
+                  <Annotation Term="UI.Importance" EnumMember="UI.ImportanceType/High"/>
+                </Record>
+              </Collection>
+            </PropertyValue>
+            <PropertyValue Property="Label" String="Sales Order"/>
+          </Record>
+        </Annotation>
+        <Annotation Term="UI.FieldGroup" Qualifier="ShipTo">
+          <Record>
+            <PropertyValue Property="Data">
+              <Collection>
+                <Record Type="UI.DataField">
+                  <PropertyValue Property="Value" Path="ShipToParty"/>
+                  <Annotation Term="UI.Importance" EnumMember="UI.ImportanceType/High"/>
+                </Record>
+                <Record Type="UI.DataField">
+                  <PropertyValue Property="Value" Path="to_ShipToParty/Address"/>
+                  <Annotation Term="UI.Importance" EnumMember="UI.ImportanceType/High"/>
+                </Record>
+              </Collection>
+            </PropertyValue>
+          </Record>
+        </Annotation>
+        <Annotation Term="UI.HeaderInfo">
+          <Record>
+            <PropertyValue Property="TypeName" String="Sales Order"/>
+            <PropertyValue Property="TypeNamePlural" String="Sales Orders"/>
+            <PropertyValue Property="Title">
+              <Record Type="UI.DataField">
+                <PropertyValue Property="Value" Path="SalesOrder"/>
+              </Record>
+            </PropertyValue>
+            <PropertyValue Property="Description">
+              <Record Type="UI.DataField">
+                <PropertyValue Property="Value" Path="to_Customer/CompanyName"/>
+              </Record>
+            </PropertyValue>
+          </Record>
+        </Annotation>
+        <Annotation Term="UI.Identification">
+          <Collection>
+            <Record Type="UI.DataField">
+              <PropertyValue Property="Label" String="Sales Order"/>
+              <PropertyValue Property="Value" Path="SalesOrder"/>
+              <Annotation Term="UI.Importance" EnumMember="UI.ImportanceType/High"/>
+            </Record>
+            <Record Type="UI.DataFieldForAction">
+              <PropertyValue Property="Label" String="Copy"/>
+              <PropertyValue Property="Action" String="SEPMRA_SO_MAN2.SEPMRA_SO_MAN2_Entities/SEPMRA_C_SalesOrderTPCopy"/>
+              <PropertyValue Property="InvocationGrouping" EnumMember="UI.OperationGroupingType/Isolated"/>
+              <Annotation Term="UI.Importance" EnumMember="UI.ImportanceType/Medium"/>
+            </Record>
+          </Collection>
+        </Annotation>
+        <Annotation Term="UI.LineItem">
+          <Collection>
+            <Record Type="UI.DataField">
+              <PropertyValue Property="Value" Path="SalesOrder"/>
+              <Annotation Term="UI.Importance" EnumMember="UI.ImportanceType/High"/>
+            </Record>
+            <Record Type="UI.DataField">
+              <PropertyValue Property="Value" Path="SalesOrderOverallStatus"/>
+              <Annotation Term="UI.Importance" EnumMember="UI.ImportanceType/High"/>
+            </Record>
+            <Record Type="UI.DataFieldForAction">
+              <PropertyValue Property="Label" String="Copy"/>
+              <PropertyValue Property="Action" String="SEPMRA_SO_MAN2.SEPMRA_SO_MAN2_Entities/SEPMRA_C_SalesOrderTPCopy"/>
+              <PropertyValue Property="InvocationGrouping" EnumMember="UI.OperationGroupingType/Isolated"/>
+              <Annotation Term="UI.Importance" EnumMember="UI.ImportanceType/Medium"/>
+            </Record>
+            <Record Type="UI.DataField">
+              <PropertyValue Property="Value" Path="LastChangedDateTime"/>
+              <Annotation Term="UI.Importance" EnumMember="UI.ImportanceType/High"/>
+            </Record>
+            <Record Type="UI.DataField">
+              <PropertyValue Property="Value" Path="SoldToParty"/>
+              <Annotation Term="UI.Importance" EnumMember="UI.ImportanceType/High"/>
+            </Record>
+            <Record Type="UI.DataField">
+              <PropertyValue Property="Value" Path="CustomerContact"/>
+              <Annotation Term="UI.Importance" EnumMember="UI.ImportanceType/High"/>
+            </Record>
+            <Record Type="UI.DataField">
+              <PropertyValue Property="Value" Path="Quantity"/>
+              <Annotation Term="UI.Importance" EnumMember="UI.ImportanceType/High"/>
+            </Record>
+            <Record Type="UI.DataField">
+              <PropertyValue Property="Value" Path="NetAmountInTransactionCurrency"/>
+              <Annotation Term="UI.Importance" EnumMember="UI.ImportanceType/High"/>
+            </Record>
+          </Collection>
+          <Annotation Term="UI.Criticality" Path="abc"/>
+        </Annotation>
+        <Annotation Term="UI.PresentationVariant">
+          <Record>
+            <PropertyValue Property="SortOrder">
+              <Collection>
+                <Record Type="Common.SortOrderType">
+                  <PropertyValue Property="Property" PropertyPath="LastChangedDateTime"/>
+                  <PropertyValue Property="Descending" Bool="true"/>
+                </Record>
+              </Collection>
+            </PropertyValue>
+            <PropertyValue Property="Visualizations">
+              <Collection>
+                <AnnotationPath>@UI.LineItem</AnnotationPath>
+              </Collection>
+            </PropertyValue>
+          </Record>
+        </Annotation>
+        <Annotation Term="UI.SelectionFields">
+          <Collection>
+            <PropertyPath>SalesOrder</PropertyPath>
+            <PropertyPath>SalesOrderOverallStatus</PropertyPath>
+            <PropertyPath>LastChangedDateTime</PropertyPath>
+          </Collection>
+        </Annotation>
+        <Annotation Term="Common.SemanticObject" String="EPMSalesOrder"/>
+      </Annotations>
+      <Annotations Target="SEPMRA_SO_MAN2.SEPMRA_C_ScheduleLineTPType/DraftUUID">
+        <Annotation Term="UI.HiddenFilter"/>
+        <Annotation Term="UI.Hidden"/>
+      </Annotations>
+      <Annotations Target="SEPMRA_SO_MAN2.SEPMRA_C_ScheduleLineTPType/HasActiveEntity">
+        <Annotation Term="UI.HiddenFilter"/>
+        <Annotation Term="UI.Hidden"/>
+      </Annotations>
+      <Annotations Target="SEPMRA_SO_MAN2.SEPMRA_C_ScheduleLineTPType/HasDraftEntity">
+        <Annotation Term="UI.HiddenFilter"/>
+        <Annotation Term="UI.Hidden"/>
+      </Annotations>
+      <Annotations Target="SEPMRA_SO_MAN2.SEPMRA_C_ScheduleLineTPType/IsActiveEntity">
+        <Annotation Term="UI.HiddenFilter"/>
+        <Annotation Term="UI.Hidden"/>
+      </Annotations>
+      <Annotations Target="SEPMRA_SO_MAN2.SEPMRA_C_ScheduleLineTPType/DraftEntityCreationDateTime">
+        <Annotation Term="UI.Hidden"/>
+      </Annotations>
+      <Annotations Target="SEPMRA_SO_MAN2.SEPMRA_C_ScheduleLineTPType/DraftEntityLastChangeDateTime">
+        <Annotation Term="UI.Hidden"/>
+      </Annotations>
+      <Annotations Target="SEPMRA_SO_MAN2.SEPMRA_C_ScheduleLineTPType/ParentDraftUUID">
+        <Annotation Term="UI.Hidden"/>
+      </Annotations>
+      <Annotations Target="SEPMRA_SO_MAN2.SEPMRA_C_ScheduleLineTPType/RootDraftUUID">
+        <Annotation Term="UI.Hidden"/>
+      </Annotations>
+      <Annotations Target="SEPMRA_SO_MAN2.SEPMRA_C_ScheduleLineTPType/Preparation_ac">
+        <Annotation Term="UI.Hidden"/>
+      </Annotations>
+      <Annotations Target="SEPMRA_SO_MAN2.SEPMRA_C_ScheduleLineTPType/Validation_ac">
+        <Annotation Term="UI.Hidden"/>
+      </Annotations>
+      <Annotations Target="SEPMRA_SO_MAN2.SEPMRA_I_QuantityUnitType/UnitOfMeasureISOCode">
+        <Annotation Term="UI.HiddenFilter"/>
+      </Annotations>
+      <Annotations Target="SEPMRA_SO_MAN2.SEPMRA_I_QuantityUnitType">
+        <Annotation Term="UI.HeaderInfo">
+          <Record>
+            <PropertyValue Property="TypeName" String="Quantity Unit"/>
+            <PropertyValue Property="TypeNamePlural" String="Quantity Units"/>
+            <PropertyValue Property="Title">
+              <Record Type="UI.DataField">
+                <PropertyValue Property="Value" Path="UnitOfMeasure"/>
+              </Record>
+            </PropertyValue>
+          </Record>
+        </Annotation>
+        <Annotation Term="UI.Identification">
+          <Collection>
+            <Record Type="UI.DataField">
+              <PropertyValue Property="Value" Path="UnitOfMeasure"/>
+              <Annotation Term="UI.Importance" EnumMember="UI.ImportanceType/High"/>
+            </Record>
+          </Collection>
+        </Annotation>
+        <Annotation Term="UI.LineItem">
+          <Collection>
+            <Record Type="UI.DataField">
+              <PropertyValue Property="Value" Path="UnitOfMeasure"/>
+              <Annotation Term="UI.Importance" EnumMember="UI.ImportanceType/High"/>
+            </Record>
+          </Collection>
+          <Annotation Term="UI.Criticality" Path="abc"/>
+        </Annotation>
+      </Annotations>
+      <Annotations Target="SEPMRA_SO_MAN2.SEPMRA_I_SalesOrderAgeType/SalesOrder">
+        <Annotation Term="UI.HiddenFilter"/>
+        <Annotation Term="Common.SemanticObject" String="EPMSalesOrder"/>
+      </Annotations>
+    </Schema>
+  </edmx:DataServices>
+</edmx:Edmx>

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/8cbe468c/lib/commons-api/src/main/java/org/apache/olingo/commons/api/edm/Edm.java
----------------------------------------------------------------------
diff --git a/lib/commons-api/src/main/java/org/apache/olingo/commons/api/edm/Edm.java b/lib/commons-api/src/main/java/org/apache/olingo/commons/api/edm/Edm.java
index 1efdaca..b24f82a 100644
--- a/lib/commons-api/src/main/java/org/apache/olingo/commons/api/edm/Edm.java
+++ b/lib/commons-api/src/main/java/org/apache/olingo/commons/api/edm/Edm.java
@@ -92,6 +92,16 @@ public interface Edm {
   EdmEntityType getEntityType(FullQualifiedName name);
 
   /**
+   * Get entity type with annotations by full qualified name.
+   * <br/>
+   * See {@link EdmEntityType} for more information.
+   *
+   * @param name full qualified name of entity type
+   * @return {@link EdmEntityType}
+   */
+  EdmEntityType getEntityTypeWithAnnotations(FullQualifiedName name);
+  
+  /**
    * Get complex type by full qualified name..
    * <br/>
    * See {@link EdmComplexType} for more information.
@@ -102,6 +112,16 @@ public interface Edm {
   EdmComplexType getComplexType(FullQualifiedName name);
 
   /**
+   * Get complex type with annotations by full qualified name..
+   * <br/>
+   * See {@link EdmComplexType} for more information.
+   *
+   * @param name full qualified name of complex type
+   * @return {@link EdmComplexType}
+   */
+  EdmComplexType getComplexTypeWithAnnotations(FullQualifiedName name);
+  
+  /**
    * Get unbound Action by full qualified name.
    *
    * @param actionName must not be null

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/8cbe468c/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 48c2078..dc7df5e 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
@@ -58,4 +58,11 @@ public interface EdmBindingTarget extends EdmNamed, EdmAnnotatable, EdmMappable
    * @return {@link EdmEntityType}
    */
   EdmEntityType getEntityType();
+  
+  /**
+   * Get the entity type with annotations defined in external file.
+   *
+   * @return {@link EdmEntityType}
+   */
+  EdmEntityType getEntityTypeWithAnnotations();
 }

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/8cbe468c/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 f84b9ed..c65eae2 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
@@ -76,6 +76,14 @@ public interface EdmEntityContainer extends EdmNamed, EdmAnnotatable {
    * @return returns all entity sets for this container.
    */
   List<EdmEntitySet> getEntitySets();
+  
+  /**
+   * This method <b>DOES NOT</b> support lazy loading
+   *
+   * @return returns all entity sets for this container with 
+   * annotations defined in external file.
+   */
+  List<EdmEntitySet> getEntitySetsWithAnnotations();
 
   /**
    * This method <b>DOES NOT</b> support lazy loading

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/8cbe468c/lib/commons-api/src/main/java/org/apache/olingo/commons/api/edm/EdmProperty.java
----------------------------------------------------------------------
diff --git a/lib/commons-api/src/main/java/org/apache/olingo/commons/api/edm/EdmProperty.java b/lib/commons-api/src/main/java/org/apache/olingo/commons/api/edm/EdmProperty.java
index a351e48..6d4baec 100644
--- a/lib/commons-api/src/main/java/org/apache/olingo/commons/api/edm/EdmProperty.java
+++ b/lib/commons-api/src/main/java/org/apache/olingo/commons/api/edm/EdmProperty.java
@@ -75,4 +75,11 @@ public interface EdmProperty extends EdmElement, EdmMappable, EdmAnnotatable {
    * @return the default value as a String or null if not specified
    */
   String getDefaultValue();
+  
+  /**
+   * See {@link EdmType} for more information about possible types.
+   *
+   * @return {@link EdmType}
+   */
+  EdmType getTypeWithAnnotations();
 }

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/8cbe468c/lib/commons-api/src/main/java/org/apache/olingo/commons/api/edm/provider/CsdlAnnotation.java
----------------------------------------------------------------------
diff --git a/lib/commons-api/src/main/java/org/apache/olingo/commons/api/edm/provider/CsdlAnnotation.java b/lib/commons-api/src/main/java/org/apache/olingo/commons/api/edm/provider/CsdlAnnotation.java
index eb551aa..e24671b 100644
--- a/lib/commons-api/src/main/java/org/apache/olingo/commons/api/edm/provider/CsdlAnnotation.java
+++ b/lib/commons-api/src/main/java/org/apache/olingo/commons/api/edm/provider/CsdlAnnotation.java
@@ -103,4 +103,51 @@ public class CsdlAnnotation extends CsdlAbstractEdmItem implements CsdlAnnotatab
   public List<CsdlAnnotation> getAnnotations() {
     return annotations;
   }
+  
+  @Override
+  public boolean equals (Object obj) {
+    if (obj == null) {
+      return false;
+    }
+    if (!(obj instanceof CsdlAnnotation)) {
+      return false;
+    }
+    CsdlAnnotation csdlAnnot = (CsdlAnnotation) obj;
+    return (this.getTerm() == null ? csdlAnnot.getTerm() == null : 
+      this.getTerm().equals(csdlAnnot.getTerm()))
+        && (this.getQualifier() == null ? csdlAnnot.getQualifier() == null :
+          this.getQualifier().equals(csdlAnnot.getQualifier()))
+        && (this.getExpression() == null ? csdlAnnot.getExpression() == null :
+          this.getExpression().equals(csdlAnnot.getExpression()))
+        && (this.getAnnotations() == null ? csdlAnnot.getAnnotations() == null : 
+          checkAnnotations(csdlAnnot.getAnnotations()));
+  }
+  
+  private boolean checkAnnotations(List<CsdlAnnotation> csdlAnnots) {
+    if (csdlAnnots == null) {
+      return false;
+    }
+    if (this.getAnnotations().size() == csdlAnnots.size()) {
+      for (int i = 0; i < this.getAnnotations().size(); i++) {
+        if (!this.getAnnotations().get(i).equals(csdlAnnots.get(i))) {
+          return false;
+        }
+      }
+    } else {
+      return false;
+    }
+    return true;
+  }
+
+  @Override
+  public int hashCode() {
+    final int prime = 31;
+    int result = 1;
+    result = prime * result + ((term == null) ? 0 : term.hashCode());
+    result = prime * result + ((qualifier == null) ? 0 : qualifier.hashCode());
+    result = prime * result + ((annotationExpression == null) ? 0 : 
+      annotationExpression.hashCode());
+    result = prime * result + ((annotations == null) ? 0 : annotations.hashCode());
+    return result;
+  }
 }

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/8cbe468c/lib/commons-api/src/main/java/org/apache/olingo/commons/api/edm/provider/annotation/CsdlAnnotationPath.java
----------------------------------------------------------------------
diff --git a/lib/commons-api/src/main/java/org/apache/olingo/commons/api/edm/provider/annotation/CsdlAnnotationPath.java b/lib/commons-api/src/main/java/org/apache/olingo/commons/api/edm/provider/annotation/CsdlAnnotationPath.java
index 1a9935a..0efad60 100644
--- a/lib/commons-api/src/main/java/org/apache/olingo/commons/api/edm/provider/annotation/CsdlAnnotationPath.java
+++ b/lib/commons-api/src/main/java/org/apache/olingo/commons/api/edm/provider/annotation/CsdlAnnotationPath.java
@@ -37,4 +37,26 @@ public class CsdlAnnotationPath extends CsdlDynamicExpression {
   public String getValue() {
     return value;
   }
+  
+  @Override
+  public boolean equals (Object obj) {
+    if (obj == null) {
+      return false;
+    }
+    if (!(obj instanceof CsdlAnnotationPath)) {
+      return false;
+    }
+    CsdlAnnotationPath csdlAnnotPath = (CsdlAnnotationPath) obj;
+     
+    return this.getValue() == null ? csdlAnnotPath.getValue() == null : 
+      this.getValue().equals(csdlAnnotPath.getValue());
+  }
+  
+  @Override
+  public int hashCode() {
+    final int prime = 31;
+    int result = 1;
+    result = prime * result + ((value == null) ? 0 : value.hashCode());
+    return result;
+  }
 }

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/8cbe468c/lib/commons-api/src/main/java/org/apache/olingo/commons/api/edm/provider/annotation/CsdlApply.java
----------------------------------------------------------------------
diff --git a/lib/commons-api/src/main/java/org/apache/olingo/commons/api/edm/provider/annotation/CsdlApply.java b/lib/commons-api/src/main/java/org/apache/olingo/commons/api/edm/provider/annotation/CsdlApply.java
index 8bfb596..929165b 100644
--- a/lib/commons-api/src/main/java/org/apache/olingo/commons/api/edm/provider/annotation/CsdlApply.java
+++ b/lib/commons-api/src/main/java/org/apache/olingo/commons/api/edm/provider/annotation/CsdlApply.java
@@ -73,4 +73,63 @@ public class CsdlApply extends CsdlDynamicExpression implements CsdlAnnotatable
     this.parameters = parameters;
     return this;
   }
+  
+  @Override
+  public boolean equals (Object obj) {
+    if (obj == null) {
+      return false;
+    }
+    if (!(obj instanceof CsdlApply)) {
+      return false;
+    }
+    CsdlApply annotApply = (CsdlApply) obj;
+    return (this.getFunction() == null ? annotApply.getFunction() == null :
+      this.getFunction().equals(annotApply.getFunction()))
+      && (this.getParameters() == null ? annotApply.getParameters() == null :
+        checkParamaters(annotApply.getParameters()))
+        && (this.getAnnotations() == null ? annotApply.getAnnotations() == null :
+          checkAnnotations(annotApply.getAnnotations()));
+  }
+  
+  private boolean checkAnnotations(List<CsdlAnnotation> annotApplyannotations) {
+    if (annotApplyannotations == null) {
+      return false;
+    }
+    if (this.getAnnotations().size() == annotApplyannotations.size()) {
+      for (int i = 0; i < this.getAnnotations().size(); i++) {
+        if (!this.getAnnotations().get(i).equals(annotApplyannotations.get(i))) {
+          return false;
+        }
+      }
+    } else {
+      return false;
+    }
+    return true;
+  }
+
+  private boolean checkParamaters(List<CsdlExpression> annotApplyParams) {
+    if (annotApplyParams == null) {
+      return false;
+    }
+    if (this.getParameters().size() == annotApplyParams.size()) {
+      for (int i = 0; i < this.getParameters().size(); i++) {
+        if (!this.getParameters().get(i).equals(annotApplyParams.get(i))) {
+          return false;
+        }
+      }
+    } else {
+      return false;
+    }
+    return true;
+  }
+
+  @Override
+  public int hashCode() {
+    final int prime = 31;
+    int result = 1;
+    result = prime * result + ((function == null) ? 0 : function.hashCode());
+    result = prime * result + ((parameters == null) ? 0 : parameters.hashCode());
+    result = prime * result + ((annotations == null) ? 0 : annotations.hashCode());
+    return result;
+  }
 }

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/8cbe468c/lib/commons-api/src/main/java/org/apache/olingo/commons/api/edm/provider/annotation/CsdlCast.java
----------------------------------------------------------------------
diff --git a/lib/commons-api/src/main/java/org/apache/olingo/commons/api/edm/provider/annotation/CsdlCast.java b/lib/commons-api/src/main/java/org/apache/olingo/commons/api/edm/provider/annotation/CsdlCast.java
index d3b650c..806718b 100644
--- a/lib/commons-api/src/main/java/org/apache/olingo/commons/api/edm/provider/annotation/CsdlCast.java
+++ b/lib/commons-api/src/main/java/org/apache/olingo/commons/api/edm/provider/annotation/CsdlCast.java
@@ -126,4 +126,59 @@ public class CsdlCast extends CsdlDynamicExpression implements CsdlAnnotatable {
     this.value = value;
     return this;
   }
+  
+  @Override
+  public boolean equals (Object obj) {
+    if (obj == null) {
+      return false;
+    }
+    if (!(obj instanceof CsdlCast)) {
+      return false;
+    }
+    CsdlCast csdlCast = (CsdlCast) obj;
+    return (this.getValue() == null ? csdlCast.getValue() == null :
+      this.getValue().equals(csdlCast.getValue()))
+        && (this.getType() == null ? csdlCast.getType() == null :
+        this.getType().equals(csdlCast.getType()))
+        && (this.getMaxLength() == null ? csdlCast.getMaxLength() == null :
+          this.getMaxLength().equals(csdlCast.getMaxLength()))
+        && (this.getPrecision() == null ? csdlCast.getPrecision() == null :
+          this.getPrecision().equals(csdlCast.getPrecision()))
+        && (this.getScale() == null ? csdlCast.getScale() == null :
+         this.getScale().equals(csdlCast.getScale()))
+        && (this.getSrid() == null ? csdlCast.getSrid() == null :
+          String.valueOf(this.getSrid()).equals(String.valueOf(csdlCast.getSrid())))
+        && (this.getAnnotations() == null ? csdlCast.getAnnotations() == null :
+          checkAnnotations(csdlCast.getAnnotations()));
+  }
+  
+  private boolean checkAnnotations(List<CsdlAnnotation> csdlCastAnnotations) {
+    if (csdlCastAnnotations == null) {
+      return false;
+    }
+    if (this.getAnnotations().size() == csdlCastAnnotations.size()) {
+      for (int i = 0; i < this.getAnnotations().size(); i++) {
+        if (!this.getAnnotations().get(i).equals(csdlCastAnnotations.get(i))) {
+          return false;
+        }
+      }
+    } else {
+      return false;
+    }
+    return true;
+  }
+
+  @Override
+  public int hashCode() {
+    final int prime = 31;
+    int result = 1;
+    result = prime * result + ((type == null) ? 0 : type.hashCode());
+    result = prime * result + ((maxLength == null) ? 0 : maxLength.hashCode());
+    result = prime * result + ((precision == null) ? 0 : precision.hashCode());
+    result = prime * result + ((scale == null) ? 0 : scale.hashCode());
+    result = prime * result + ((srid == null) ? 0 : srid.hashCode());
+    result = prime * result + ((value == null) ? 0 : value.hashCode());
+    result = prime * result + ((annotations == null) ? 0 : annotations.hashCode());
+    return result;
+  }
 }

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/8cbe468c/lib/commons-api/src/main/java/org/apache/olingo/commons/api/edm/provider/annotation/CsdlCollection.java
----------------------------------------------------------------------
diff --git a/lib/commons-api/src/main/java/org/apache/olingo/commons/api/edm/provider/annotation/CsdlCollection.java b/lib/commons-api/src/main/java/org/apache/olingo/commons/api/edm/provider/annotation/CsdlCollection.java
index 285508b..926c660 100644
--- a/lib/commons-api/src/main/java/org/apache/olingo/commons/api/edm/provider/annotation/CsdlCollection.java
+++ b/lib/commons-api/src/main/java/org/apache/olingo/commons/api/edm/provider/annotation/CsdlCollection.java
@@ -46,4 +46,41 @@ public class CsdlCollection extends CsdlDynamicExpression {
     this.items = items;
     return this;
   }
+  
+  @Override
+  public boolean equals (Object obj) {
+    if (obj == null) {
+      return false;
+    }
+    if (!(obj instanceof CsdlCollection)) {
+      return false;
+    }
+    CsdlCollection annotColl = (CsdlCollection) obj;
+    return (this.getItems() == null ? annotColl.getItems() == null :
+      checkItems(annotColl.getItems()));
+  }
+  
+  private boolean checkItems(List<CsdlExpression> annotCollItems) {
+    if (annotCollItems == null) {
+      return false;
+    }
+    if (this.getItems().size() == annotCollItems.size()) {
+      for (int i = 0; i < this.getItems().size(); i++) {
+        if (!this.getItems().get(i).equals(annotCollItems.get(i))) {
+          return false;
+        }
+      }
+    } else {
+      return false;
+    }
+    return true;
+  }
+
+  @Override
+  public int hashCode() {
+    final int prime = 31;
+    int result = 1;
+    result = prime * result + ((items == null) ? 0 : items.hashCode());
+    return result;
+  }
 }

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/8cbe468c/lib/commons-api/src/main/java/org/apache/olingo/commons/api/edm/provider/annotation/CsdlConstantExpression.java
----------------------------------------------------------------------
diff --git a/lib/commons-api/src/main/java/org/apache/olingo/commons/api/edm/provider/annotation/CsdlConstantExpression.java b/lib/commons-api/src/main/java/org/apache/olingo/commons/api/edm/provider/annotation/CsdlConstantExpression.java
index e8090e0..23f1a84 100644
--- a/lib/commons-api/src/main/java/org/apache/olingo/commons/api/edm/provider/annotation/CsdlConstantExpression.java
+++ b/lib/commons-api/src/main/java/org/apache/olingo/commons/api/edm/provider/annotation/CsdlConstantExpression.java
@@ -128,4 +128,28 @@ public class CsdlConstantExpression extends CsdlExpression {
     return this;
   }
 
+  @Override
+  public boolean equals (Object obj) {
+    if (obj == null) {
+      return false;
+    }
+    if (!(obj instanceof CsdlConstantExpression)) {
+      return false;
+    }
+    CsdlConstantExpression csdlConstExp = (CsdlConstantExpression) obj;
+    
+    return (this.getValue() == null ? csdlConstExp.getValue() == null :
+      this.getValue().equals(csdlConstExp.getValue()))
+        && (this.getType() == null ? csdlConstExp.getType() == null :
+          this.getType().equals(csdlConstExp.getType()));
+  }
+  
+  @Override
+  public int hashCode() {
+    final int prime = 31;
+    int result = 1;
+    result = prime * result + ((type == null) ? 0 : type.hashCode());
+    result = prime * result + ((value == null) ? 0 : value.hashCode());
+    return result;
+  }
 }

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/8cbe468c/lib/commons-api/src/main/java/org/apache/olingo/commons/api/edm/provider/annotation/CsdlIf.java
----------------------------------------------------------------------
diff --git a/lib/commons-api/src/main/java/org/apache/olingo/commons/api/edm/provider/annotation/CsdlIf.java b/lib/commons-api/src/main/java/org/apache/olingo/commons/api/edm/provider/annotation/CsdlIf.java
index fa191b3..789fdc4 100644
--- a/lib/commons-api/src/main/java/org/apache/olingo/commons/api/edm/provider/annotation/CsdlIf.java
+++ b/lib/commons-api/src/main/java/org/apache/olingo/commons/api/edm/provider/annotation/CsdlIf.java
@@ -90,4 +90,50 @@ public class CsdlIf extends CsdlDynamicExpression implements CsdlAnnotatable {
     this._else = _else;
     return this;
   }
+  
+  @Override
+  public boolean equals (Object obj) {
+    if (obj == null) {
+      return false;
+    }
+    if (!(obj instanceof CsdlIf)) {
+      return false;
+    }
+    CsdlIf csdlIf = (CsdlIf) obj;
+    return (this.getGuard() == null ? csdlIf.getGuard() == null :
+      this.getGuard().equals(csdlIf.getGuard()))
+        && (this.getThen() == null ? csdlIf.getThen() == null :
+          this.getThen().equals(csdlIf.getThen()))
+        && (this.getElse() == null ? csdlIf.getElse() == null :
+          this.getElse().equals(csdlIf.getElse()))
+        && (this.getAnnotations() == null ? csdlIf.getAnnotations() == null :
+            checkAnnotations(csdlIf.getAnnotations()));
+  }
+  
+  private boolean checkAnnotations(List<CsdlAnnotation> csdlIfAnnotations) {
+    if (csdlIfAnnotations == null) {
+      return false;
+    }
+    if (this.getAnnotations().size() == csdlIfAnnotations.size()) {
+      for (int i = 0; i < this.getAnnotations().size(); i++) {
+        if (!this.getAnnotations().get(i).equals(csdlIfAnnotations.get(i))) {
+          return false;
+        }
+      }
+    } else {
+      return false;
+    }
+    return true;
+  }
+
+  @Override
+  public int hashCode() {
+    final int prime = 31;
+    int result = 1;
+    result = prime * result + ((guard == null) ? 0 : guard.hashCode());
+    result = prime * result + ((_then == null) ? 0 : _then.hashCode());
+    result = prime * result + ((_else == null) ? 0 : _else.hashCode());
+    result = prime * result + ((annotations == null) ? 0 : annotations.hashCode());
+    return result;
+  }
 }

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/8cbe468c/lib/commons-api/src/main/java/org/apache/olingo/commons/api/edm/provider/annotation/CsdlIsOf.java
----------------------------------------------------------------------
diff --git a/lib/commons-api/src/main/java/org/apache/olingo/commons/api/edm/provider/annotation/CsdlIsOf.java b/lib/commons-api/src/main/java/org/apache/olingo/commons/api/edm/provider/annotation/CsdlIsOf.java
index 5785f6b..0c0022f 100644
--- a/lib/commons-api/src/main/java/org/apache/olingo/commons/api/edm/provider/annotation/CsdlIsOf.java
+++ b/lib/commons-api/src/main/java/org/apache/olingo/commons/api/edm/provider/annotation/CsdlIsOf.java
@@ -126,4 +126,58 @@ return this;
     return this;
   }
 
+  @Override
+  public boolean equals (Object obj) {
+    if (obj == null) {
+      return false;
+    }
+    if (!(obj instanceof CsdlIsOf)) {
+      return false;
+    }
+    CsdlIsOf csdlIsOf = (CsdlIsOf) obj;
+    return (this.getType() == null ? csdlIsOf.getType() == null :
+      this.getType().equals(csdlIsOf.getType()))
+        && (this.getMaxLength() == null ? csdlIsOf.getMaxLength() == null :
+          this.getMaxLength().equals(csdlIsOf.getMaxLength()))
+        && (this.getPrecision() == null ? csdlIsOf.getPrecision() == null : 
+          this.getPrecision().equals(csdlIsOf.getPrecision()))
+        && (this.getScale() == null ? csdlIsOf.getScale() == null :
+          this.getScale().equals(csdlIsOf.getScale()))
+        && (this.getSrid() == null ? csdlIsOf.getSrid() == null :
+          this.getSrid().equals(csdlIsOf.getSrid()))
+        && (this.getValue() == null ? csdlIsOf.getValue() == null :
+          this.getValue().equals(csdlIsOf.getValue()))
+        && (this.getAnnotations() == null ? csdlIsOf.getAnnotations() == null :
+            checkAnnotations(csdlIsOf.getAnnotations()));
+  }
+  
+  private boolean checkAnnotations(List<CsdlAnnotation> csdlIsOfannot) {
+    if (csdlIsOfannot == null) {
+      return false;
+    }
+    if (this.getAnnotations().size() == csdlIsOfannot.size()) {
+      for (int i = 0; i < this.getAnnotations().size(); i++) {
+        if (!this.getAnnotations().get(i).equals(csdlIsOfannot.get(i))) {
+          return false;
+        }
+      }
+    } else {
+      return false;
+    }
+    return true;
+  }
+
+  @Override
+  public int hashCode() {
+    final int prime = 31;
+    int result = 1;
+    result = prime * result + ((type == null) ? 0 : type.hashCode());
+    result = prime * result + ((maxLength == null) ? 0 : maxLength.hashCode());
+    result = prime * result + ((precision == null) ? 0 : precision.hashCode());
+    result = prime * result + ((scale == null) ? 0 : scale.hashCode());
+    result = prime * result + ((srid == null) ? 0 : srid.hashCode());
+    result = prime * result + ((value == null) ? 0 : value.hashCode());
+    result = prime * result + ((annotations == null) ? 0 : annotations.hashCode());
+    return result;
+  }
 }

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/8cbe468c/lib/commons-api/src/main/java/org/apache/olingo/commons/api/edm/provider/annotation/CsdlLabeledElement.java
----------------------------------------------------------------------
diff --git a/lib/commons-api/src/main/java/org/apache/olingo/commons/api/edm/provider/annotation/CsdlLabeledElement.java b/lib/commons-api/src/main/java/org/apache/olingo/commons/api/edm/provider/annotation/CsdlLabeledElement.java
index 2c31698..022c421 100644
--- a/lib/commons-api/src/main/java/org/apache/olingo/commons/api/edm/provider/annotation/CsdlLabeledElement.java
+++ b/lib/commons-api/src/main/java/org/apache/olingo/commons/api/edm/provider/annotation/CsdlLabeledElement.java
@@ -69,4 +69,48 @@ public class CsdlLabeledElement extends CsdlDynamicExpression implements CsdlAnn
     this.value = value;
     return this;
   }
+  
+  @Override
+  public boolean equals (Object obj) {
+    if (obj == null) {
+      return false;
+    }
+    if (!(obj instanceof CsdlLabeledElement)) {
+      return false;
+    }
+    CsdlLabeledElement csdlLabelledEle = (CsdlLabeledElement) obj;
+    return (this.getName() == null ? csdlLabelledEle.getName() == null :
+      this.getName().equals(csdlLabelledEle.getName()))
+        && (this.getValue() == null ? csdlLabelledEle.getValue() == null :
+          this.getValue().equals(csdlLabelledEle.getValue()))
+        && (this.getAnnotations() == null ? csdlLabelledEle.getAnnotations() == null :
+            checkAnnotations(csdlLabelledEle.getAnnotations()));
+  }
+  
+  private boolean checkAnnotations(List<CsdlAnnotation> csdlLabelledEleAnnotations) {
+    if (csdlLabelledEleAnnotations == null) {
+      return false;
+    }
+    if (this.getAnnotations().size() == csdlLabelledEleAnnotations.size()) {
+      for (int i = 0; i < this.getAnnotations().size() ; i++) {
+        if (!this.getAnnotations().get(i).equals(
+            csdlLabelledEleAnnotations.get(i))) {
+          return false;
+        }
+      }
+    } else {
+      return false;
+    }
+    return true;
+  }
+
+  @Override
+  public int hashCode() {
+    final int prime = 31;
+    int result = 1;
+    result = prime * result + ((name == null) ? 0 : name.hashCode());
+    result = prime * result + ((value == null) ? 0 : value.hashCode());
+    result = prime * result + ((annotations == null) ? 0 : annotations.hashCode());
+    return result;
+  }
 }


[3/3] olingo-odata4 git commit: [OLINGO-1062]Cannot consume Odata Reference Services with Annotations

Posted by ar...@apache.org.
[OLINGO-1062]Cannot consume Odata Reference Services with Annotations


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

Branch: refs/heads/master
Commit: 8cbe468c2a9c9063c41aba46726f744843ca127d
Parents: 58ec035
Author: Archana Rai <ar...@sap.com>
Authored: Mon Aug 20 11:31:08 2018 +0530
Committer: Archana Rai <ar...@sap.com>
Committed: Mon Aug 20 11:31:08 2018 +0530

----------------------------------------------------------------------
 .../apache/olingo/client/core/MetadataTest.java |  242 ++++
 .../org/apache/olingo/client/core/$metadata.xml |  779 +++++++++++
 .../org/apache/olingo/client/core/UI.xml        |  467 +++++++
 .../apache/olingo/client/core/annotations.xml   | 1276 ++++++++++++++++++
 .../org/apache/olingo/commons/api/edm/Edm.java  |   20 +
 .../commons/api/edm/EdmBindingTarget.java       |    7 +
 .../commons/api/edm/EdmEntityContainer.java     |    8 +
 .../olingo/commons/api/edm/EdmProperty.java     |    7 +
 .../api/edm/provider/CsdlAnnotation.java        |   47 +
 .../provider/annotation/CsdlAnnotationPath.java |   22 +
 .../api/edm/provider/annotation/CsdlApply.java  |   59 +
 .../api/edm/provider/annotation/CsdlCast.java   |   55 +
 .../edm/provider/annotation/CsdlCollection.java |   37 +
 .../annotation/CsdlConstantExpression.java      |   24 +
 .../api/edm/provider/annotation/CsdlIf.java     |   46 +
 .../api/edm/provider/annotation/CsdlIsOf.java   |   54 +
 .../provider/annotation/CsdlLabeledElement.java |   44 +
 .../annotation/CsdlLabeledElementReference.java |   21 +
 .../CsdlLogicalOrComparisonExpression.java      |   47 +
 .../annotation/CsdlNavigationPropertyPath.java  |   21 +
 .../api/edm/provider/annotation/CsdlNull.java   |   38 +
 .../api/edm/provider/annotation/CsdlPath.java   |   21 +
 .../provider/annotation/CsdlPropertyPath.java   |   21 +
 .../provider/annotation/CsdlPropertyValue.java  |   46 +
 .../api/edm/provider/annotation/CsdlRecord.java |   62 +
 .../api/edm/provider/annotation/CsdlUrlRef.java |   40 +
 .../olingo/commons/core/edm/AbstractEdm.java    |   95 ++
 .../core/edm/AbstractEdmBindingTarget.java      |   11 +
 .../core/edm/EdmEntityContainerImpl.java        |  432 +++++-
 .../commons/core/edm/EdmPropertyImpl.java       |   23 +
 .../commons/core/edm/EdmProviderImpl.java       |  291 +++-
 .../olingo/commons/core/edm/EdmTypeInfo.java    |   17 +-
 .../commons/core/edm/EdmImplCallCreateTest.java |   41 +
 .../core/edm/provider/EdmSchemaImplTest.java    |    2 +-
 .../uri/queryoption/apply/DynamicProperty.java  |    5 +
 35 files changed, 4407 insertions(+), 21 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/8cbe468c/lib/client-core/src/test/java/org/apache/olingo/client/core/MetadataTest.java
----------------------------------------------------------------------
diff --git a/lib/client-core/src/test/java/org/apache/olingo/client/core/MetadataTest.java b/lib/client-core/src/test/java/org/apache/olingo/client/core/MetadataTest.java
index 0e2dd0f..3fc21d9 100644
--- a/lib/client-core/src/test/java/org/apache/olingo/client/core/MetadataTest.java
+++ b/lib/client-core/src/test/java/org/apache/olingo/client/core/MetadataTest.java
@@ -32,6 +32,7 @@ import org.apache.olingo.client.api.edm.xml.XMLMetadata;
 import org.apache.olingo.commons.api.Constants;
 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.EdmAnnotation;
 import org.apache.olingo.commons.api.edm.EdmAnnotations;
 import org.apache.olingo.commons.api.edm.EdmComplexType;
@@ -41,13 +42,17 @@ import org.apache.olingo.commons.api.edm.EdmEntityType;
 import org.apache.olingo.commons.api.edm.EdmEnumType;
 import org.apache.olingo.commons.api.edm.EdmFunction;
 import org.apache.olingo.commons.api.edm.EdmFunctionImport;
+import org.apache.olingo.commons.api.edm.EdmNavigationProperty;
 import org.apache.olingo.commons.api.edm.EdmPrimitiveTypeKind;
 import org.apache.olingo.commons.api.edm.EdmProperty;
 import org.apache.olingo.commons.api.edm.EdmSchema;
+import org.apache.olingo.commons.api.edm.EdmSingleton;
 import org.apache.olingo.commons.api.edm.EdmTerm;
 import org.apache.olingo.commons.api.edm.EdmTypeDefinition;
 import org.apache.olingo.commons.api.edm.FullQualifiedName;
 import org.apache.olingo.commons.api.edm.annotation.EdmExpression;
+import org.apache.olingo.commons.api.edm.annotation.EdmPropertyValue;
+import org.apache.olingo.commons.api.edm.annotation.EdmRecord;
 import org.apache.olingo.commons.api.edm.annotation.EdmUrlRef;
 import org.apache.olingo.commons.api.edm.constants.EdmTypeKind;
 import org.apache.olingo.commons.api.edm.provider.CsdlAnnotation;
@@ -525,4 +530,241 @@ public class MetadataTest extends AbstractTest {
       assertEquals("AnnotationPath", expression.asDynamic().getExpressionName());
     }
   }
+  
+  @Test
+ public void readAnnotationOnAnEntityType() {
+   final Edm edm = fetchEdm();
+   assertNotNull(edm);
+   EdmEntityType entity = edm.getEntityTypeWithAnnotations(
+       new FullQualifiedName("SEPMRA_SO_MAN2", "SEPMRA_C_CountryVHType"));
+   assertEquals(1, entity.getAnnotations().size());
+   assertNotNull(entity.getAnnotations().get(0).getTerm());
+   assertEquals("HeaderInfo", entity.getAnnotations().get(0).getTerm().getName());
+   assertNotNull(entity.getAnnotations().get(0).getExpression());
+   
+   EdmEntityType entity1 = edm.getEntityTypeWithAnnotations(
+       new FullQualifiedName("SEPMRA_SO_MAN2", "SEPMRA_C_SalesOrderCustCntctVHType"));
+   EdmAnnotation annotation = entity1.getAnnotations().get(0);
+   assertNotNull(annotation);
+   assertEquals(5, entity1.getAnnotations().size());
+   assertEquals("FieldGroup", annotation.getTerm().getName());
+   assertEquals("ContactPerson", annotation.getQualifier());
+   EdmExpression expression = annotation.getExpression();
+   assertNotNull(expression);
+   assertTrue(expression.isDynamic());
+   EdmRecord record = expression.asDynamic().asRecord();
+   assertNotNull(record);
+   assertEquals(2, record.asRecord().getPropertyValues().size());
+   List<EdmPropertyValue> propertyValues = record.asRecord().getPropertyValues();
+   assertEquals("Data", propertyValues.get(0).getProperty());
+   assertTrue(propertyValues.get(0).getValue().isDynamic());
+   List<EdmExpression> items = propertyValues.get(0).getValue().asDynamic().asCollection().getItems();
+   assertEquals(4, items.size());
+   assertEquals("Label", propertyValues.get(1).getProperty());
+   assertEquals("Contact Person", propertyValues.get(1).getValue().asConstant().asPrimitive());
+   
+   assertEquals(1, entity1.getNavigationProperty("to_Customer").getAnnotations().size());
+   EdmNavigationProperty navProperty = entity1.getNavigationProperty("to_Customer");
+   assertEquals("ThingPerspective", navProperty.
+       getAnnotations().get(0).getTerm().getName());
+ }
+ 
+ @Test
+ public void readAnnotationOnAProperty() {
+   final Edm edm = fetchEdm();
+   assertNotNull(edm);
+   EdmEntityType entity = edm.getEntityTypeWithAnnotations(
+       new FullQualifiedName("SEPMRA_SO_MAN2", "I_DraftAdministrativeDataType"));
+   EdmProperty property = (EdmProperty) entity.getProperty("DraftUUID");
+   assertNotNull(property.getAnnotations());
+   assertEquals(1, property.getAnnotations().size());
+   assertEquals("UI.HeaderInfo", property.getAnnotations().get(0).getTerm().
+       getFullQualifiedName().getFullQualifiedNameAsString());
+ }
+ 
+ @Test
+ public void readAnnotationOnActionImport() {
+   final Edm edm = fetchEdm();
+   assertNotNull(edm);
+   EdmEntityContainer container = edm.getEntityContainer();
+   EdmActionImport actionImport = container.getActionImport("AIRTString");
+   assertEquals(3, actionImport.getAnnotations().size());
+   assertEquals("Description", actionImport.getAnnotations().get(0).getTerm().getName());
+   assertEquals("HeaderInfo", actionImport.getAnnotations().get(2).getTerm().getName());
+ }
+ 
+ @Test
+ public void readAnnotationOnASingleton() {
+   final Edm edm = fetchEdm();
+   assertNotNull(edm);
+   EdmEntityContainer container = edm.getEntityContainer();
+   EdmSingleton singleton = container.getSingleton("SINav");
+   assertEquals(1, singleton.getAnnotations().size());
+   assertEquals("HeaderInfo", singleton.getAnnotations().get(0).getTerm().getName());
+   
+   EdmEntityType singletonET = singleton.getEntityType();
+   EdmProperty singlComplexProp = (EdmProperty)singletonET.getProperty("ComplexProperty");
+   EdmComplexType singlCompType = (EdmComplexType) singlComplexProp.getTypeWithAnnotations();
+   EdmNavigationProperty singlNavProp = (EdmNavigationProperty) singlCompType.
+       getNavigationProperty("NavPropertyDraftAdministrativeDataType");
+   assertEquals(1, singlNavProp.getAnnotations().size());
+   assertEquals("AdditionalInfo", singlNavProp.getAnnotations().get(0).getTerm().getName());
+ }
+ 
+ @Test
+ public void readAnnotationOnBoundFunction() {
+   final Edm edm = fetchEdm();
+   assertNotNull(edm);
+   List<String> parameterNames = new ArrayList<String>();
+   EdmFunction function = edm.getBoundFunction(new FullQualifiedName("SEPMRA_SO_MAN2", "_FC_RTTimeOfDay_"), 
+       new FullQualifiedName("Edm","TimeOfDay"), false, parameterNames);
+   assertEquals(1, function.getAnnotations().size());
+   assertEquals("HeaderInfo", function.getAnnotations().get(0).getTerm().getName());
+   
+   // Annotations on Bound Function parameter
+   assertEquals(1, function.getParameter("ParameterTimeOfDay").getAnnotations().size());
+   assertEquals("HeaderInfo", function.getParameter("ParameterTimeOfDay")
+       .getAnnotations().get(0).getTerm().getName());
+ }
+ 
+ @Test
+ public void readAnnotationOnSchema() {
+   final Edm edm = fetchEdm();
+   assertNotNull(edm);
+   EdmSchema schema = edm.getSchema("sepmra_so_man2_anno_mdl.v1");
+   assertNotNull(schema);
+   assertEquals(112, schema.getAnnotationGroups().size());
+   
+   EdmAnnotations annotations = edm.getSchema("SEPMRA_SO_MAN2").getAnnotationGroups().get(22);
+   assertEquals("SEPMRA_SO_MAN2.SEPMRA_C_SalesOrderCustCntctVHType", annotations.getTargetPath());
+   assertEquals(1, annotations.getAnnotations().size());
+   assertEquals("SelectionFields", annotations.getAnnotations()
+       .get(0).getTerm().getName());
+   assertTrue(annotations.getAnnotations().get(0).getExpression().isDynamic());
+ }
+ 
+ @Test
+ public void readAnnotationOnContainer() {
+   final Edm edm = fetchEdm();
+   assertNotNull(edm);
+   EdmEntityContainer container = edm.getEntityContainer();
+   assertEquals(1, container.getAnnotations().size());
+   assertEquals("HeaderInfo", container.getAnnotations().get(0).getTerm().getName());
+ }
+ 
+ @Test
+ public void readAnnotationOnComplexType() {
+   final Edm edm = fetchEdm();
+   assertNotNull(edm);
+   EdmComplexType complexType = edm.getComplexTypeWithAnnotations(
+       new FullQualifiedName("SEPMRA_SO_MAN2", "CTPrim"));
+   assertEquals(1, complexType.getAnnotations().size());
+   assertEquals("HeaderInfo", complexType.getAnnotations().get(0).getTerm().getName());
+   // Annotations on complex type property
+   EdmProperty complexTypeProp = (EdmProperty) complexType.getProperty("PropertyInt16");
+   assertEquals(1, complexTypeProp.getAnnotations().size());
+   assertEquals("HeaderInfo", complexTypeProp.getAnnotations().get(0).getTerm().getName());
+   // Annotations on complex type navigation property
+   EdmNavigationProperty complexTypeNavProp = complexType.
+       getNavigationProperty("NavPropertyDraftAdministrativeDataType");
+   assertEquals(1, complexTypeNavProp.getAnnotations().size());
+   assertEquals("HeaderInfo", complexTypeNavProp.getAnnotations().get(0).getTerm().getName());
+ }
+ 
+ @Test
+ public void readAnnotationOnTypeDefinitions() {
+   final Edm edm = fetchEdm();
+   assertNotNull(edm);
+   EdmTypeDefinition typeDefn = edm.getTypeDefinition(new FullQualifiedName("SEPMRA_SO_MAN2", "TDString"));
+   assertEquals(1, typeDefn.getAnnotations().size());
+   assertEquals("HeaderInfo", typeDefn.getAnnotations().get(0).getTerm().getName());
+ }
+ 
+ @Test
+ public void readAnnotationOnBoundActions() {
+   final Edm edm = fetchEdm();
+   assertNotNull(edm);
+   EdmAction action = edm.getBoundAction(new FullQualifiedName("SEPMRA_SO_MAN2", "BA_RTCountryVHType"), 
+       new FullQualifiedName("SEPMRA_SO_MAN2","I_DraftAdministrativeDataType"), false);
+   assertEquals(1, action.getAnnotations().size());
+   assertEquals("HeaderInfo", action.getAnnotations().get(0).getTerm().getName());
+   
+   //Annotations on Bound Action parameter
+   assertEquals(1, action.getParameter("ParameterCTPrim").getAnnotations().size());
+   assertEquals("HeaderInfo", action.getParameter("ParameterCTPrim")
+       .getAnnotations().get(0).getTerm().getName());
+ }
+ 
+ @Test
+ public void readAnnotationOnEntitySet() {
+   final Edm edm = fetchEdm();
+   assertNotNull(edm);
+   EdmEntityContainer container = edm.getEntityContainer();
+   EdmEntitySet entitySet = container.getEntitySet("I_DraftAdministrativeData");
+   assertEquals(1, entitySet.getAnnotations().size());
+   assertEquals("HeaderInfo", entitySet.getAnnotations().get(0).getTerm().getName());
+   
+   
+   
+   EdmEntityType entityType50 = edm.getEntityTypeWithAnnotations(
+       new FullQualifiedName("SEPMRA_SO_MAN2", "I_DraftAdministrativeDataType"));
+   assertEquals(1, ((EdmProperty)entityType50.getProperty("DraftUUID")).getAnnotations().size());
+   assertEquals("UI.HeaderInfo", ((EdmProperty)entityType50.getProperty("DraftUUID")).
+       getAnnotations().get(0).getTerm().getFullQualifiedName().getFullQualifiedNameAsString());
+   
+   
+   
+   // Annotations on properties of entity type included in EntitySet
+   EdmEntityType entityType3 = entitySet.getEntityTypeWithAnnotations();
+   assertEquals(2, ((EdmProperty)entityType3.getProperty("DraftUUID")).getAnnotations().size());
+   assertEquals("AdditionalInfo", ((EdmProperty)entityType3.getProperty("DraftUUID"))
+       .getAnnotations().get(0).getTerm().getName());
+   assertEquals("HeaderInfo", ((EdmProperty)entityType3.getProperty("DraftUUID"))
+       .getAnnotations().get(1).getTerm().getName());
+   
+   // Annotations on navigation properties of entity type included in EntitySet
+   EdmEntitySet entitySet1 = container.getEntitySet("SEPMRA_C_SalesOrderCustCntctVH");
+   EdmEntityType entityType5 = entitySet1.getEntityTypeWithAnnotations();
+   assertEquals(2, ((EdmNavigationProperty)entityType5.getNavigationProperty("to_Customer"))
+       .getAnnotations().size());
+   assertEquals("AdditionalInfo", ((EdmNavigationProperty)entityType5
+       .getNavigationProperty("to_Customer"))
+       .getAnnotations().get(0).getTerm().getName());
+   assertEquals("HeaderInfo", ((EdmNavigationProperty)entityType5
+       .getNavigationProperty("to_Customer"))
+       .getAnnotations().get(1).getTerm().getName());
+   
+   
+   
+   EdmComplexType complexType = edm.getComplexTypeWithAnnotations(
+       new FullQualifiedName("SEPMRA_SO_MAN2", "CTPrim"));
+   EdmProperty complexTypeProp = (EdmProperty) complexType.getProperty("PropertyInt16");
+   assertEquals(1, complexTypeProp.getAnnotations().size());
+   assertEquals("HeaderInfo", complexTypeProp.getAnnotations().get(0).getTerm().getName());
+   
+   
+   
+   // Annotations on properties of complex properties of entity type included in EntitySet
+   EdmProperty complexProp = (EdmProperty) entityType3.getProperty("ComplexProperty");
+   EdmComplexType compType = (EdmComplexType) complexProp.getTypeWithAnnotations();
+   EdmProperty prop = (EdmProperty) compType.getProperty("PropertyInt16");
+   assertEquals(1, prop.getAnnotations().size());
+   assertEquals("AdditionalInfo", prop.getAnnotations().get(0).getTerm().getName());
+   
+   // Annotations on navigation properties of complex properties of entity type included in EntitySet
+   EdmNavigationProperty navProp = (EdmNavigationProperty) compType
+       .getProperty("NavPropertyDraftAdministrativeDataType");
+   assertEquals(1, navProp.getAnnotations().size());
+   assertEquals("AdditionalInfo", navProp.getAnnotations().get(0).getTerm().getName());
+ }
+ 
+ private Edm fetchEdm() {
+   List<InputStream> streams = new ArrayList<InputStream>();
+   streams.add(getClass().getResourceAsStream("annotations.xml"));
+   streams.add(getClass().getResourceAsStream("VOC_Core.xml"));
+   streams.add(getClass().getResourceAsStream("UI.xml"));
+   final Edm edm = client.getReader().readMetadata(getClass().getResourceAsStream("$metadata.xml"),
+       streams);
+  return edm;
+ }
 }

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/8cbe468c/lib/client-core/src/test/resources/org/apache/olingo/client/core/$metadata.xml
----------------------------------------------------------------------
diff --git a/lib/client-core/src/test/resources/org/apache/olingo/client/core/$metadata.xml b/lib/client-core/src/test/resources/org/apache/olingo/client/core/$metadata.xml
new file mode 100644
index 0000000..4a29589
--- /dev/null
+++ b/lib/client-core/src/test/resources/org/apache/olingo/client/core/$metadata.xml
@@ -0,0 +1,779 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+
+    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.
+
+-->
+<edmx:Edmx xmlns:edmx="http://schemas.microsoft.com/ado/2007/06/edmx" xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata" Version="1.0">
+  <edmx:Reference xmlns:edmx="http://docs.oasis-open.org/odata/ns/edmx" Uri="../v4.0/cs02/vocabularies/Org.OData.Common.V1.xml">
+    <edmx:Include Namespace="com.vocabularies.Common.v1" Alias="Common"/>
+  </edmx:Reference>
+  <edmx:Reference xmlns:edmx="http://docs.oasis-open.org/odata/ns/edmx" Uri="../v4.0/cs02/vocabularies/Org.OData.Core.V1.xml">
+    <edmx:Include Namespace="Org.OData.Core.V1" Alias="Core"/>
+  </edmx:Reference>
+  <edmx:DataServices m:DataServiceVersion="2.0">
+    <Schema xmlns="http://schemas.microsoft.com/ado/2008/09/edm" Namespace="SEPMRA_SO_MAN2" xml:lang="en">
+    <EnumType Name="ENString" IsFlags="true" UnderlyingType="Edm.Int16">
+		<Member Name="String1" Value="1"/>
+		<Member Name="String2" Value="2"/>
+		<Member Name="String3" Value="4"/>
+		</EnumType>
+	<TypeDefinition Name="TDString" UnderlyingType="Edm.String" MaxLength="15"/>
+	  <ComplexType Name="CTPrim">
+		<Property Name="PropertyInt16" Type="Edm.Int16"/>
+		<NavigationProperty Name="NavPropertyDraftAdministrativeDataType" Type="SEPMRA_SO_MAN2.I_DraftAdministrativeDataType"/>
+	  </ComplexType>
+      <EntityType Name="I_DraftAdministrativeDataType">
+        <Key>
+          <PropertyRef Name="DraftUUID"/>
+        </Key>
+        <Property Name="DraftUUID" Type="Edm.Guid" Nullable="false"/>
+        <Property Name="ComplexProperty" Type="SEPMRA_SO_MAN2.CTPrim" Nullable="true"/>
+        <Property Name="DraftEntityType" Type="Edm.String" MaxLength="30"/>
+        <Property Name="CreationDateTime" Type="Edm.DateTimeOffset" Precision="7"/>
+        <Property Name="CreatedByUser" Type="Edm.String" MaxLength="12"/>
+        <Property Name="LastChangeDateTime" Type="Edm.DateTimeOffset" Precision="7"/>
+        <Property Name="LastChangedByUser" Type="Edm.String" MaxLength="12"/>
+        <Property Name="DraftAccessType" Type="Edm.String" MaxLength="1"/>
+        <Property Name="ProcessingStartDateTime" Type="Edm.DateTimeOffset" Precision="7"/>
+        <Property Name="InProcessByUser" Type="Edm.String" MaxLength="12"/>
+        <Property Name="DraftIsKeptByUser" Type="Edm.Boolean"/>
+        <Property Name="EnqueueStartDateTime" Type="Edm.DateTimeOffset" Precision="7"/>
+        <Property Name="DraftIsCreatedByMe" Type="Edm.Boolean"/>
+        <Property Name="DraftIsLastChangedByMe" Type="Edm.Boolean"/>
+        <Property Name="DraftIsProcessedByMe" Type="Edm.Boolean"/>
+        <Property Name="CreatedByUserDescription" Type="Edm.String" MaxLength="80"/>
+        <Property Name="LastChangedByUserDescription" Type="Edm.String" MaxLength="80"/>
+        <Property Name="InProcessByUserDescription" Type="Edm.String" MaxLength="80"/>
+      </EntityType>
+      <EntityType Name="SEPMRA_C_SalesOrderCustCntctVHType">
+        <Key>
+          <PropertyRef Name="ContactPerson"/>
+        </Key>
+        <Property Name="ContactPerson" Type="Edm.String" Nullable="false" MaxLength="10"/>
+        <Property Name="Customer" Type="Edm.String" MaxLength="10"/>
+        <Property Name="FirstName" Type="Edm.String" MaxLength="40"/>
+        <Property Name="LastName" Type="Edm.String" MaxLength="40"/>
+        <Property Name="EmailAddress" Type="Edm.String" MaxLength="255"/>
+        <NavigationProperty Name="to_Customer" Type="SEPMRA_SO_MAN2.SEPMRA_C_CountryVHType"/>
+      </EntityType>
+      <EntityType Name="SEPMRA_C_CountryVHType">
+        <Key>
+          <PropertyRef Name="Country"/>
+        </Key>
+        <Property Name="Country" Type="Edm.String" Nullable="false" MaxLength="3"/>
+        <Property Name="CountryT" Type="Edm.String" MaxLength="50"/>
+      </EntityType>
+      <Action Name="BA_RTCountryVHType" IsBound="true">
+		<Parameter Name="ParameterCountryType" Type="SEPMRA_SO_MAN2.SEPMRA_C_CountryVHType" Nullable="false"/>
+		<ReturnType Type="SEPMRA_SO_MAN2.SEPMRA_C_CountryVHType"/>
+	  </Action>
+	  <Action Name="BA_RTCountryVHType" IsBound="true">
+		<Parameter Name="ParameterSalesOrder" Type="SEPMRA_SO_MAN2.SEPMRA_C_SalesOrderCustCntctVHType" Nullable="false"/>
+		<Parameter Name="ParameterCTPrim" Type="SEPMRA_SO_MAN2.CTPrim" Nullable="false"/>
+		<ReturnType Type="SEPMRA_SO_MAN2.SEPMRA_C_CountryVHType"/>
+	  </Action>
+	  <Action Name="BA_RTCountryVHType" IsBound="true">
+		<Parameter Name="ParameterDraftAdministrativeDataType" Type="SEPMRA_SO_MAN2.I_DraftAdministrativeDataType" Nullable="false"/>
+		<Parameter Name="ParameterCTPrim" Type="SEPMRA_SO_MAN2.CTPrim" Nullable="false"/>
+		<ReturnType Type="SEPMRA_SO_MAN2.I_DraftAdministrativeDataType"/>
+	  </Action>
+	  <Function Name="_FC_RTTimeOfDay_" IsBound="true" IsComposable="true">
+		<Parameter Name="ParameterTimeOfDay" Type="Edm.TimeOfDay" Nullable="false"/>
+		<ReturnType Type="Edm.TimeOfDay"/>
+	  </Function>
+	  <Function Name="_FC_RTTimeOfDay_" IsBound="true" IsComposable="true">
+		<Parameter Name="ParameterTimeOfDay" Type="Edm.TimeOfDay" Nullable="false"/>
+		<Parameter Name="ParameterAny" Type="Edm.String" Nullable="false"/>
+		<ReturnType Type="Edm.TimeOfDay"/>
+	  </Function>
+      <EntityContainer Name="SEPMRA_SO_MAN2_Entities" m:IsDefaultEntityContainer="true">
+        <EntitySet Name="I_DraftAdministrativeData" EntityType="SEPMRA_SO_MAN2.I_DraftAdministrativeDataType"/>
+        <EntitySet Name="SEPMRA_C_SalesOrderCustCntctVH" EntityType="SEPMRA_SO_MAN2.SEPMRA_C_SalesOrderCustCntctVHType">
+        <NavigationPropertyBinding Path="Customer" Target="SEPMRA_C_CountryVH" />
+        </EntitySet>
+        <EntitySet Name="SEPMRA_C_CountryVH" EntityType="SEPMRA_SO_MAN2.SEPMRA_C_CountryVHType"/>
+        <ActionImport Name="AIRTString" Action="Namespace1_Alias.UARTString">
+			<Annotation Term="Core.Description">
+				<String>Action Import returns a simple String</String>
+			</Annotation>
+			<Annotation Term="SEPMRA_SO_MAN2.Data">
+				<Bool>true</Bool>
+			</Annotation>
+		</ActionImport>
+		<Singleton Name="SINav" Type="SEPMRA_SO_MAN2.I_DraftAdministrativeDataType">
+			<NavigationPropertyBinding Path="NavPropertyDraftAdministrativeDataType" Target="I_DraftAdministrativeData"/>
+		</Singleton>
+      </EntityContainer>
+      <Annotations xmlns="http://docs.oasis-open.org/odata/ns/edm" Target="SEPMRA_SO_MAN2.SEPMRA_SO_MAN2_Entities/SEPMRA_C_SalesOrderTP">
+        <Annotation Term="Common.DraftRoot">
+          <Record>
+            <PropertyValue Property="ActivationAction" String="SEPMRA_SO_MAN2.SEPMRA_SO_MAN2_Entities/SEPMRA_C_SalesOrderTPActivation"/>
+            <PropertyValue Property="EditAction" String="SEPMRA_SO_MAN2.SEPMRA_SO_MAN2_Entities/SEPMRA_C_SalesOrderTPEdit"/>
+            <PropertyValue Property="PreparationAction" String="SEPMRA_SO_MAN2.SEPMRA_SO_MAN2_Entities/SEPMRA_C_SalesOrderTPPreparation"/>
+            <PropertyValue Property="ValidationFunction" String="SEPMRA_SO_MAN2.SEPMRA_SO_MAN2_Entities/SEPMRA_C_SalesOrderTPValidation"/>
+          </Record>
+        </Annotation>
+      </Annotations>
+      <Annotations xmlns="http://docs.oasis-open.org/odata/ns/edm" Target="SEPMRA_SO_MAN2.SEPMRA_SO_MAN2_Entities/SEPMRA_C_ScheduleLineTP">
+        <Annotation Term="Common.DraftNode">
+          <Record>
+            <PropertyValue Property="PreparationAction" String="SEPMRA_SO_MAN2.SEPMRA_SO_MAN2_Entities/SEPMRA_C_ScheduleLineTPPreparation"/>
+            <PropertyValue Property="ValidationFunction" String="SEPMRA_SO_MAN2.SEPMRA_SO_MAN2_Entities/SEPMRA_C_ScheduleLineTPValidation"/>
+          </Record>
+        </Annotation>
+        <Annotation Term="Common.DraftActivationVia">
+          <Collection>
+            <String>SEPMRA_SO_MAN2.SEPMRA_SO_MAN2_Entities/SEPMRA_C_SalesOrderTP</String>
+          </Collection>
+        </Annotation>
+      </Annotations>
+      <Annotations xmlns="http://docs.oasis-open.org/odata/ns/edm" Target="SEPMRA_SO_MAN2.SEPMRA_SO_MAN2_Entities/SEPMRA_C_SalesOrderItemTP">
+        <Annotation Term="Common.DraftNode">
+          <Record>
+            <PropertyValue Property="PreparationAction" String="SEPMRA_SO_MAN2.SEPMRA_SO_MAN2_Entities/SEPMRA_C_SalesOrderItemTPPreparation"/>
+            <PropertyValue Property="ValidationFunction" String="SEPMRA_SO_MAN2.SEPMRA_SO_MAN2_Entities/SEPMRA_C_SalesOrderItemTPValidation"/>
+          </Record>
+        </Annotation>
+        <Annotation Term="Common.DraftActivationVia">
+          <Collection>
+            <String>SEPMRA_SO_MAN2.SEPMRA_SO_MAN2_Entities/SEPMRA_C_SalesOrderTP</String>
+          </Collection>
+        </Annotation>
+      </Annotations>
+      <Annotations xmlns="http://docs.oasis-open.org/odata/ns/edm" Target="SEPMRA_SO_MAN2.SEPMRA_C_SalesOrderCustCntctVHType/Customer">
+        <Annotation Term="Common.ValueList">
+          <Record>
+            <PropertyValue Property="Label" String="Sales Order Customer"/>
+            <PropertyValue Property="CollectionPath" String="SEPMRA_C_SalesOrderCustomer"/>
+            <PropertyValue Property="SearchSupported" Bool="true"/>
+            <PropertyValue Property="Parameters">
+              <Collection>
+                <Record Type="Common.ValueListParameterInOut">
+                  <PropertyValue Property="LocalDataProperty" PropertyPath="Customer"/>
+                  <PropertyValue Property="ValueListProperty" String="Customer"/>
+                </Record>
+                <Record Type="Common.ValueListParameterDisplayOnly">
+                  <PropertyValue Property="ValueListProperty" String="CompanyName"/>
+                </Record>
+              </Collection>
+            </PropertyValue>
+          </Record>
+        </Annotation>
+      </Annotations>
+      <Annotations xmlns="http://docs.oasis-open.org/odata/ns/edm" Target="SEPMRA_SO_MAN2.SEPMRA_C_SalesOrderCustomerVHType/Country">
+        <Annotation Term="Common.ValueList">
+          <Record>
+            <PropertyValue Property="Label" String="Country"/>
+            <PropertyValue Property="CollectionPath" String="SEPMRA_C_CountryVH"/>
+            <PropertyValue Property="SearchSupported" Bool="true"/>
+            <PropertyValue Property="Parameters">
+              <Collection>
+                <Record Type="Common.ValueListParameterInOut">
+                  <PropertyValue Property="LocalDataProperty" PropertyPath="Country"/>
+                  <PropertyValue Property="ValueListProperty" String="Country"/>
+                </Record>
+                <Record Type="Common.ValueListParameterDisplayOnly">
+                  <PropertyValue Property="ValueListProperty" String="CountryT"/>
+                </Record>
+              </Collection>
+            </PropertyValue>
+          </Record>
+        </Annotation>
+      </Annotations>
+      <Annotations xmlns="http://docs.oasis-open.org/odata/ns/edm" Target="SEPMRA_SO_MAN2.SEPMRA_C_SalesOrderItemTPType/SalesOrder">
+        <Annotation Term="Common.ValueList">
+          <Record>
+            <PropertyValue Property="Label" String="Sales Order"/>
+            <PropertyValue Property="CollectionPath" String="SEPMRA_C_SalesOrderTP"/>
+            <PropertyValue Property="SearchSupported" Bool="true"/>
+            <PropertyValue Property="Parameters">
+              <Collection>
+                <Record Type="Common.ValueListParameterInOut">
+                  <PropertyValue Property="LocalDataProperty" PropertyPath="SalesOrder"/>
+                  <PropertyValue Property="ValueListProperty" String="SalesOrder"/>
+                </Record>
+              </Collection>
+            </PropertyValue>
+          </Record>
+        </Annotation>
+      </Annotations>
+      <Annotations xmlns="http://docs.oasis-open.org/odata/ns/edm" Target="SEPMRA_SO_MAN2.SEPMRA_C_SalesOrderItemTPType/Product">
+        <Annotation Term="Common.ValueList">
+          <Record>
+            <PropertyValue Property="Label" String="Product Value Help"/>
+            <PropertyValue Property="CollectionPath" String="SEPMRA_C_SalesOrderProductVH"/>
+            <PropertyValue Property="SearchSupported" Bool="true"/>
+            <PropertyValue Property="Parameters">
+              <Collection>
+                <Record Type="Common.ValueListParameterInOut">
+                  <PropertyValue Property="LocalDataProperty" PropertyPath="Product"/>
+                  <PropertyValue Property="ValueListProperty" String="Product"/>
+                </Record>
+                <Record Type="Common.ValueListParameterDisplayOnly">
+                  <PropertyValue Property="ValueListProperty" String="Name"/>
+                </Record>
+                <Record Type="Common.ValueListParameterDisplayOnly">
+                  <PropertyValue Property="ValueListProperty" String="MainProductCategory"/>
+                </Record>
+                <Record Type="Common.ValueListParameterDisplayOnly">
+                  <PropertyValue Property="ValueListProperty" String="Supplier"/>
+                </Record>
+                <Record Type="Common.ValueListParameterDisplayOnly">
+                  <PropertyValue Property="ValueListProperty" String="SupplierName"/>
+                </Record>
+              </Collection>
+            </PropertyValue>
+          </Record>
+        </Annotation>
+      </Annotations>
+      <Annotations xmlns="http://docs.oasis-open.org/odata/ns/edm" Target="SEPMRA_SO_MAN2.SEPMRA_C_SalesOrderItemTPType/TransactionCurrency">
+        <Annotation Term="Common.ValueList">
+          <Record>
+            <PropertyValue Property="Label" String="Currency"/>
+            <PropertyValue Property="CollectionPath" String="I_Currency"/>
+            <PropertyValue Property="SearchSupported" Bool="true"/>
+            <PropertyValue Property="Parameters">
+              <Collection>
+                <Record Type="Common.ValueListParameterInOut">
+                  <PropertyValue Property="LocalDataProperty" PropertyPath="TransactionCurrency"/>
+                  <PropertyValue Property="ValueListProperty" String="Currency"/>
+                </Record>
+                <Record Type="Common.ValueListParameterDisplayOnly">
+                  <PropertyValue Property="ValueListProperty" String="Currency_Text"/>
+                </Record>
+              </Collection>
+            </PropertyValue>
+          </Record>
+        </Annotation>
+      </Annotations>
+      <Annotations xmlns="http://docs.oasis-open.org/odata/ns/edm" Target="SEPMRA_SO_MAN2.SEPMRA_C_SalesOrderPartyVHType/Country">
+        <Annotation Term="Common.ValueList">
+          <Record>
+            <PropertyValue Property="Label" String="Country"/>
+            <PropertyValue Property="CollectionPath" String="SEPMRA_C_CountryVH"/>
+            <PropertyValue Property="SearchSupported" Bool="true"/>
+            <PropertyValue Property="Parameters">
+              <Collection>
+                <Record Type="Common.ValueListParameterInOut">
+                  <PropertyValue Property="LocalDataProperty" PropertyPath="Country"/>
+                  <PropertyValue Property="ValueListProperty" String="Country"/>
+                </Record>
+                <Record Type="Common.ValueListParameterDisplayOnly">
+                  <PropertyValue Property="ValueListProperty" String="CountryT"/>
+                </Record>
+              </Collection>
+            </PropertyValue>
+          </Record>
+        </Annotation>
+      </Annotations>
+      <Annotations xmlns="http://docs.oasis-open.org/odata/ns/edm" Target="SEPMRA_SO_MAN2.SEPMRA_C_SalesOrderTPType/CustomerContact">
+        <Annotation Term="Common.ValueList">
+          <Record>
+            <PropertyValue Property="Label" String="Customer Contact Person"/>
+            <PropertyValue Property="CollectionPath" String="SEPMRA_C_SalesOrderCustCntctVH"/>
+            <PropertyValue Property="SearchSupported" Bool="true"/>
+            <PropertyValue Property="Parameters">
+              <Collection>
+                <Record Type="Common.ValueListParameterInOut">
+                  <PropertyValue Property="LocalDataProperty" PropertyPath="SoldToParty"/>
+                  <PropertyValue Property="ValueListProperty" String="Customer"/>
+                </Record>
+                <Record Type="Common.ValueListParameterInOut">
+                  <PropertyValue Property="LocalDataProperty" PropertyPath="CustomerContact"/>
+                  <PropertyValue Property="ValueListProperty" String="ContactPerson"/>
+                </Record>
+                <Record Type="Common.ValueListParameterDisplayOnly">
+                  <PropertyValue Property="ValueListProperty" String="FirstName"/>
+                </Record>
+                <Record Type="Common.ValueListParameterDisplayOnly">
+                  <PropertyValue Property="ValueListProperty" String="LastName"/>
+                </Record>
+                <Record Type="Common.ValueListParameterDisplayOnly">
+                  <PropertyValue Property="ValueListProperty" String="EmailAddress"/>
+                </Record>
+              </Collection>
+            </PropertyValue>
+          </Record>
+        </Annotation>
+      </Annotations>
+      <Annotations xmlns="http://docs.oasis-open.org/odata/ns/edm" Target="SEPMRA_SO_MAN2.SEPMRA_C_SalesOrderTPType/SoldToParty">
+        <Annotation Term="Common.ValueList">
+          <Record>
+            <PropertyValue Property="Label" String="Customer"/>
+            <PropertyValue Property="CollectionPath" String="SEPMRA_C_SalesOrderCustomerVH"/>
+            <PropertyValue Property="SearchSupported" Bool="true"/>
+            <PropertyValue Property="Parameters">
+              <Collection>
+                <Record Type="Common.ValueListParameterInOut">
+                  <PropertyValue Property="LocalDataProperty" PropertyPath="SoldToParty"/>
+                  <PropertyValue Property="ValueListProperty" String="Customer"/>
+                </Record>
+                <Record Type="Common.ValueListParameterDisplayOnly">
+                  <PropertyValue Property="ValueListProperty" String="CompanyName"/>
+                </Record>
+                <Record Type="Common.ValueListParameterDisplayOnly">
+                  <PropertyValue Property="ValueListProperty" String="CityName"/>
+                </Record>
+                <Record Type="Common.ValueListParameterDisplayOnly">
+                  <PropertyValue Property="ValueListProperty" String="Country"/>
+                </Record>
+                <Record Type="Common.ValueListParameterDisplayOnly">
+                  <PropertyValue Property="ValueListProperty" String="CountryT"/>
+                </Record>
+              </Collection>
+            </PropertyValue>
+          </Record>
+        </Annotation>
+      </Annotations>
+      <Annotations xmlns="http://docs.oasis-open.org/odata/ns/edm" Target="SEPMRA_SO_MAN2.SEPMRA_C_SalesOrderTPType/BillToParty">
+        <Annotation Term="Common.ValueList">
+          <Record>
+            <PropertyValue Property="Label" String="Party"/>
+            <PropertyValue Property="CollectionPath" String="SEPMRA_C_SalesOrderPartyVH"/>
+            <PropertyValue Property="SearchSupported" Bool="true"/>
+            <PropertyValue Property="Parameters">
+              <Collection>
+                <Record Type="Common.ValueListParameterInOut">
+                  <PropertyValue Property="LocalDataProperty" PropertyPath="BillToParty"/>
+                  <PropertyValue Property="ValueListProperty" String="Party"/>
+                </Record>
+                <Record Type="Common.ValueListParameterInOut">
+                  <PropertyValue Property="LocalDataProperty" PropertyPath="SoldToParty"/>
+                  <PropertyValue Property="ValueListProperty" String="Customer"/>
+                </Record>
+                <Record Type="Common.ValueListParameterDisplayOnly">
+                  <PropertyValue Property="ValueListProperty" String="PartyName"/>
+                </Record>
+                <Record Type="Common.ValueListParameterDisplayOnly">
+                  <PropertyValue Property="ValueListProperty" String="CityName"/>
+                </Record>
+                <Record Type="Common.ValueListParameterDisplayOnly">
+                  <PropertyValue Property="ValueListProperty" String="Country"/>
+                </Record>
+                <Record Type="Common.ValueListParameterDisplayOnly">
+                  <PropertyValue Property="ValueListProperty" String="CountryT"/>
+                </Record>
+              </Collection>
+            </PropertyValue>
+          </Record>
+        </Annotation>
+      </Annotations>
+      <Annotations xmlns="http://docs.oasis-open.org/odata/ns/edm" Target="SEPMRA_SO_MAN2.SEPMRA_C_SalesOrderTPType/ShipToParty">
+        <Annotation Term="Common.ValueList">
+          <Record>
+            <PropertyValue Property="Label" String="Party"/>
+            <PropertyValue Property="CollectionPath" String="SEPMRA_C_SalesOrderPartyVH"/>
+            <PropertyValue Property="SearchSupported" Bool="true"/>
+            <PropertyValue Property="Parameters">
+              <Collection>
+                <Record Type="Common.ValueListParameterInOut">
+                  <PropertyValue Property="LocalDataProperty" PropertyPath="ShipToParty"/>
+                  <PropertyValue Property="ValueListProperty" String="Party"/>
+                </Record>
+                <Record Type="Common.ValueListParameterInOut">
+                  <PropertyValue Property="LocalDataProperty" PropertyPath="SoldToParty"/>
+                  <PropertyValue Property="ValueListProperty" String="Customer"/>
+                </Record>
+                <Record Type="Common.ValueListParameterDisplayOnly">
+                  <PropertyValue Property="ValueListProperty" String="PartyName"/>
+                </Record>
+                <Record Type="Common.ValueListParameterDisplayOnly">
+                  <PropertyValue Property="ValueListProperty" String="CityName"/>
+                </Record>
+                <Record Type="Common.ValueListParameterDisplayOnly">
+                  <PropertyValue Property="ValueListProperty" String="Country"/>
+                </Record>
+                <Record Type="Common.ValueListParameterDisplayOnly">
+                  <PropertyValue Property="ValueListProperty" String="CountryT"/>
+                </Record>
+              </Collection>
+            </PropertyValue>
+          </Record>
+        </Annotation>
+      </Annotations>
+      <Annotations xmlns="http://docs.oasis-open.org/odata/ns/edm" Target="SEPMRA_SO_MAN2.SEPMRA_C_SalesOrderTPType/CreatedByUser">
+        <Annotation Term="Common.ValueList">
+          <Record>
+            <PropertyValue Property="Label" String="Sales Order Reviser"/>
+            <PropertyValue Property="CollectionPath" String="SEPMRA_C_SalesOrderReviser"/>
+            <PropertyValue Property="SearchSupported" Bool="false"/>
+            <PropertyValue Property="Parameters">
+              <Collection>
+                <Record Type="Common.ValueListParameterInOut">
+                  <PropertyValue Property="LocalDataProperty" PropertyPath="CreatedByUser"/>
+                  <PropertyValue Property="ValueListProperty" String="UserID"/>
+                </Record>
+              </Collection>
+            </PropertyValue>
+          </Record>
+        </Annotation>
+      </Annotations>
+      <Annotations xmlns="http://docs.oasis-open.org/odata/ns/edm" Target="SEPMRA_SO_MAN2.SEPMRA_C_SalesOrderTPType/LastChangedByUser">
+        <Annotation Term="Common.ValueList">
+          <Record>
+            <PropertyValue Property="Label" String="Sales Order Reviser"/>
+            <PropertyValue Property="CollectionPath" String="SEPMRA_C_SalesOrderReviser"/>
+            <PropertyValue Property="SearchSupported" Bool="false"/>
+            <PropertyValue Property="Parameters">
+              <Collection>
+                <Record Type="Common.ValueListParameterInOut">
+                  <PropertyValue Property="LocalDataProperty" PropertyPath="LastChangedByUser"/>
+                  <PropertyValue Property="ValueListProperty" String="UserID"/>
+                </Record>
+              </Collection>
+            </PropertyValue>
+          </Record>
+        </Annotation>
+      </Annotations>
+      <Annotations xmlns="http://docs.oasis-open.org/odata/ns/edm" Target="SEPMRA_SO_MAN2.SEPMRA_C_SalesOrderTPType/TransactionCurrency">
+        <Annotation Term="Common.ValueList">
+          <Record>
+            <PropertyValue Property="Label" String="Currency"/>
+            <PropertyValue Property="CollectionPath" String="I_Currency"/>
+            <PropertyValue Property="SearchSupported" Bool="true"/>
+            <PropertyValue Property="Parameters">
+              <Collection>
+                <Record Type="Common.ValueListParameterInOut">
+                  <PropertyValue Property="LocalDataProperty" PropertyPath="TransactionCurrency"/>
+                  <PropertyValue Property="ValueListProperty" String="Currency"/>
+                </Record>
+                <Record Type="Common.ValueListParameterDisplayOnly">
+                  <PropertyValue Property="ValueListProperty" String="Currency_Text"/>
+                </Record>
+              </Collection>
+            </PropertyValue>
+          </Record>
+        </Annotation>
+      </Annotations>
+      <Annotations xmlns="http://docs.oasis-open.org/odata/ns/edm" Target="SEPMRA_SO_MAN2.SEPMRA_C_SalesOrderTPType/SalesOrderOverallStatus">
+        <Annotation Term="Common.ValueList">
+          <Record>
+            <PropertyValue Property="Label" String="Status"/>
+            <PropertyValue Property="CollectionPath" String="SEPMRA_C_SalesOrderStatus"/>
+            <PropertyValue Property="SearchSupported" Bool="false"/>
+            <PropertyValue Property="Parameters">
+              <Collection>
+                <Record Type="Common.ValueListParameterInOut">
+                  <PropertyValue Property="LocalDataProperty" PropertyPath="SalesOrderOverallStatus"/>
+                  <PropertyValue Property="ValueListProperty" String="SalesOrderOverallStatus"/>
+                </Record>
+                <Record Type="Common.ValueListParameterDisplayOnly">
+                  <PropertyValue Property="ValueListProperty" String="SalesOrderOverallStatus_Text"/>
+                </Record>
+              </Collection>
+            </PropertyValue>
+          </Record>
+        </Annotation>
+      </Annotations>
+      <Annotations xmlns="http://docs.oasis-open.org/odata/ns/edm" Target="SEPMRA_SO_MAN2.SEPMRA_C_SalesOrderTPType/SalesOrderPaymentMethod">
+        <Annotation Term="Common.ValueList">
+          <Record>
+            <PropertyValue Property="Label" String="EPM Demo: Sales Order Payment Method Values"/>
+            <PropertyValue Property="CollectionPath" String="Sepm_I_SlsordPaymentMethod"/>
+            <PropertyValue Property="SearchSupported" Bool="false"/>
+            <PropertyValue Property="Parameters">
+              <Collection>
+                <Record Type="Common.ValueListParameterInOut">
+                  <PropertyValue Property="LocalDataProperty" PropertyPath="SalesOrderPaymentMethod"/>
+                  <PropertyValue Property="ValueListProperty" String="SalesOrderPaymentMethod"/>
+                </Record>
+                <Record Type="Common.ValueListParameterDisplayOnly">
+                  <PropertyValue Property="ValueListProperty" String="SalesOrderPaymentMethod_Text"/>
+                </Record>
+              </Collection>
+            </PropertyValue>
+          </Record>
+        </Annotation>
+      </Annotations>
+      <Annotations xmlns="http://docs.oasis-open.org/odata/ns/edm" Target="SEPMRA_SO_MAN2.SEPMRA_C_SalesOrderTPType/SalesOrderPaymentTerms">
+        <Annotation Term="Common.ValueList">
+          <Record>
+            <PropertyValue Property="Label" String="EPM Demo: Sales Order Payment Terms"/>
+            <PropertyValue Property="CollectionPath" String="Sepm_I_SlsordPaymentTerms"/>
+            <PropertyValue Property="SearchSupported" Bool="false"/>
+            <PropertyValue Property="Parameters">
+              <Collection>
+                <Record Type="Common.ValueListParameterInOut">
+                  <PropertyValue Property="LocalDataProperty" PropertyPath="SalesOrderPaymentTerms"/>
+                  <PropertyValue Property="ValueListProperty" String="SalesOrderPaymentTerms"/>
+                </Record>
+                <Record Type="Common.ValueListParameterDisplayOnly">
+                  <PropertyValue Property="ValueListProperty" String="SalesOrderPaymentTerms_Text"/>
+                </Record>
+              </Collection>
+            </PropertyValue>
+          </Record>
+        </Annotation>
+      </Annotations>
+      <Annotations xmlns="http://docs.oasis-open.org/odata/ns/edm" Target="SEPMRA_SO_MAN2.SEPMRA_C_ScheduleLineTPType/SalesOrder">
+        <Annotation Term="Common.ValueList">
+          <Record>
+            <PropertyValue Property="Label" String="Sales Order"/>
+            <PropertyValue Property="CollectionPath" String="SEPMRA_C_SalesOrderTP"/>
+            <PropertyValue Property="SearchSupported" Bool="true"/>
+            <PropertyValue Property="Parameters">
+              <Collection>
+                <Record Type="Common.ValueListParameterInOut">
+                  <PropertyValue Property="LocalDataProperty" PropertyPath="SalesOrder"/>
+                  <PropertyValue Property="ValueListProperty" String="SalesOrder"/>
+                </Record>
+              </Collection>
+            </PropertyValue>
+          </Record>
+        </Annotation>
+      </Annotations>
+      <Annotations xmlns="http://docs.oasis-open.org/odata/ns/edm" Target="SEPMRA_SO_MAN2.SEPMRA_C_ScheduleLineTPType/SalesOrderItem">
+        <Annotation Term="Common.ValueList">
+          <Record>
+            <PropertyValue Property="Label" String="Sales Order Item"/>
+            <PropertyValue Property="CollectionPath" String="SEPMRA_C_SalesOrderItemTP"/>
+            <PropertyValue Property="SearchSupported" Bool="true"/>
+            <PropertyValue Property="Parameters">
+              <Collection>
+                <Record Type="Common.ValueListParameterInOut">
+                  <PropertyValue Property="LocalDataProperty" PropertyPath="SalesOrder"/>
+                  <PropertyValue Property="ValueListProperty" String="SalesOrder"/>
+                </Record>
+                <Record Type="Common.ValueListParameterInOut">
+                  <PropertyValue Property="LocalDataProperty" PropertyPath="SalesOrderItem"/>
+                  <PropertyValue Property="ValueListProperty" String="SalesOrderItem"/>
+                </Record>
+              </Collection>
+            </PropertyValue>
+          </Record>
+        </Annotation>
+      </Annotations>
+      <Annotations xmlns="http://docs.oasis-open.org/odata/ns/edm" Target="SEPMRA_SO_MAN2.SEPMRA_C_ScheduleLineTPType/QuantityUnit">
+        <Annotation Term="Common.ValueList">
+          <Record>
+            <PropertyValue Property="Label" String="Quantity Unit"/>
+            <PropertyValue Property="CollectionPath" String="SEPMRA_I_QuantityUnit"/>
+            <PropertyValue Property="SearchSupported" Bool="true"/>
+            <PropertyValue Property="Parameters">
+              <Collection>
+                <Record Type="Common.ValueListParameterInOut">
+                  <PropertyValue Property="LocalDataProperty" PropertyPath="QuantityUnit"/>
+                  <PropertyValue Property="ValueListProperty" String="UnitOfMeasure"/>
+                </Record>
+                <Record Type="Common.ValueListParameterDisplayOnly">
+                  <PropertyValue Property="ValueListProperty" String="UnitOfMeasure_Text"/>
+                </Record>
+              </Collection>
+            </PropertyValue>
+          </Record>
+        </Annotation>
+      </Annotations>
+      <Annotations xmlns="http://docs.oasis-open.org/odata/ns/edm" Target="SEPMRA_SO_MAN2.SEPMRA_C_SalesOrderCustCntctVHType">
+        <Annotation Term="UI.SelectionFields">
+          <Collection>
+            <PropertyPath>ContactPerson</PropertyPath>
+          </Collection>
+        </Annotation>
+      </Annotations>
+      <Annotations xmlns="http://docs.oasis-open.org/odata/ns/edm" Target="SEPMRA_SO_MAN2.SEPMRA_C_SalesOrderItemTPType">
+        <Annotation Term="Common.SemanticKey">
+          <Collection>
+            <PropertyPath>SalesOrderItem</PropertyPath>
+            <PropertyPath>SalesOrder</PropertyPath>
+          </Collection>
+        </Annotation>
+      </Annotations>
+      <Annotations xmlns="http://docs.oasis-open.org/odata/ns/edm" Target="SEPMRA_SO_MAN2.SEPMRA_C_SalesOrderPartyVHType">
+        <Annotation Term="Common.SemanticKey">
+          <Collection>
+            <PropertyPath>Party</PropertyPath>
+          </Collection>
+        </Annotation>
+      </Annotations>
+      <Annotations xmlns="http://docs.oasis-open.org/odata/ns/edm" Target="SEPMRA_SO_MAN2.SEPMRA_C_SalesOrderTPType">
+        <Annotation Term="Common.SemanticKey">
+          <Collection>
+            <PropertyPath>SalesOrder</PropertyPath>
+          </Collection>
+        </Annotation>
+      </Annotations>
+      <Annotations xmlns="http://docs.oasis-open.org/odata/ns/edm" Target="SEPMRA_SO_MAN2.SEPMRA_C_ScheduleLineTPType">
+        <Annotation Term="Common.SemanticKey">
+          <Collection>
+            <PropertyPath>ScheduleLine</PropertyPath>
+            <PropertyPath>SalesOrderItem</PropertyPath>
+            <PropertyPath>SalesOrder</PropertyPath>
+          </Collection>
+        </Annotation>
+      </Annotations>
+      <Annotations xmlns="http://docs.oasis-open.org/odata/ns/edm" Target="SEPMRA_SO_MAN2.SEPMRA_SO_MAN2_Entities/SEPMRA_C_SalesOrderCustomer">
+        <Annotation Term="Capabilities.FilterRestrictions">
+          <Record>
+            <PropertyValue Property="FilterExpressionRestrictions">
+              <Collection>
+                <Record>
+                  <PropertyValue Property="Property" PropertyPath="URL"/>
+                  <PropertyValue Property="AllowedExpressions" String="SearchExpression"/>
+                </Record>
+              </Collection>
+            </PropertyValue>
+          </Record>
+        </Annotation>
+      </Annotations>
+      <Annotations xmlns="http://docs.oasis-open.org/odata/ns/edm" Target="SEPMRA_SO_MAN2.SEPMRA_C_SalesOrderTPType">
+        <Annotation Term="Common.SideEffects" Qualifier="AdminData">
+          <Record>
+            <PropertyValue Property="SourceEntities">
+              <Collection>
+                <NavigationPropertyPath/>
+              </Collection>
+            </PropertyValue>
+            <PropertyValue Property="TargetProperties">
+              <Collection>
+                <PropertyPath>LastChangedByUser</PropertyPath>
+                <PropertyPath>LastChangedDateTime</PropertyPath>
+              </Collection>
+            </PropertyValue>
+            <PropertyValue Property="EffectTypes" EnumMember="Common.EffectType/ValueChange"/>
+          </Record>
+        </Annotation>
+        <Annotation Term="Common.SideEffects" Qualifier="SoldToPartyChange">
+          <Record>
+            <PropertyValue Property="SourceProperties">
+              <Collection>
+                <PropertyPath>SoldToParty</PropertyPath>
+              </Collection>
+            </PropertyValue>
+            <PropertyValue Property="TargetEntities">
+              <Collection>
+                <NavigationPropertyPath>to_Customer</NavigationPropertyPath>
+                <NavigationPropertyPath>to_CustomerContact</NavigationPropertyPath>
+                <NavigationPropertyPath>to_BillToParty</NavigationPropertyPath>
+                <NavigationPropertyPath>to_ShipToParty</NavigationPropertyPath>
+                <NavigationPropertyPath>to_TransactionCurrency</NavigationPropertyPath>
+              </Collection>
+            </PropertyValue>
+            <PropertyValue Property="TargetProperties">
+              <Collection>
+                <PropertyPath>CustomerContact</PropertyPath>
+                <PropertyPath>BillToParty</PropertyPath>
+                <PropertyPath>ShipToParty</PropertyPath>
+                <PropertyPath>NetAmountInTransactionCurrency</PropertyPath>
+                <PropertyPath>TransactionCurrency</PropertyPath>
+                <PropertyPath>CustomerContact_fc</PropertyPath>
+                <PropertyPath>BillToParty_fc</PropertyPath>
+                <PropertyPath>ShipToParty_fc</PropertyPath>
+              </Collection>
+            </PropertyValue>
+            <PropertyValue Property="EffectTypes" EnumMember="Common.EffectType/ValueChange"/>
+          </Record>
+        </Annotation>
+        <Annotation Term="Common.SideEffects" Qualifier="BillToPartyChange">
+          <Record>
+            <PropertyValue Property="SourceProperties">
+              <Collection>
+                <PropertyPath>BillToParty</PropertyPath>
+              </Collection>
+            </PropertyValue>
+            <PropertyValue Property="TargetEntities">
+              <Collection>
+                <NavigationPropertyPath>to_BillToParty</NavigationPropertyPath>
+              </Collection>
+            </PropertyValue>
+            <PropertyValue Property="EffectTypes" EnumMember="Common.EffectType/ValueChange"/>
+          </Record>
+        </Annotation>
+        <Annotation Term="Common.SideEffects" Qualifier="ShipToPartyChange">
+          <Record>
+            <PropertyValue Property="SourceProperties">
+              <Collection>
+                <PropertyPath>ShipToParty</PropertyPath>
+              </Collection>
+            </PropertyValue>
+            <PropertyValue Property="TargetEntities">
+              <Collection>
+                <NavigationPropertyPath>to_ShipToParty</NavigationPropertyPath>
+              </Collection>
+            </PropertyValue>
+            <PropertyValue Property="EffectTypes" EnumMember="Common.EffectType/ValueChange"/>
+          </Record>
+        </Annotation>
+        <Annotation Term="Common.SideEffects" Qualifier="CustomerContactChange">
+          <Record>
+            <PropertyValue Property="SourceProperties">
+              <Collection>
+                <PropertyPath>CustomerContact</PropertyPath>
+              </Collection>
+            </PropertyValue>
+            <PropertyValue Property="TargetEntities">
+              <Collection>
+                <NavigationPropertyPath>to_CustomerContact</NavigationPropertyPath>
+              </Collection>
+            </PropertyValue>
+            <PropertyValue Property="EffectTypes" EnumMember="Common.EffectType/ValueChange"/>
+          </Record>
+        </Annotation>
+      </Annotations>
+      <Annotations xmlns="http://docs.oasis-open.org/odata/ns/edm" Target="SEPMRA_SO_MAN2.SEPMRA_C_SalesOrderItemTPType">
+        <Annotation Term="Common.SideEffects" Qualifier="ProductChange">
+          <Record>
+            <PropertyValue Property="SourceProperties">
+              <Collection>
+                <PropertyPath>Product</PropertyPath>
+              </Collection>
+            </PropertyValue>
+            <PropertyValue Property="TargetEntities">
+              <Collection>
+                <NavigationPropertyPath>to_Product</NavigationPropertyPath>
+              </Collection>
+            </PropertyValue>
+            <PropertyValue Property="TargetProperties">
+              <Collection>
+                <PropertyPath>GrossAmountInTransacCurrency</PropertyPath>
+                <PropertyPath>NetAmountInTransactionCurrency</PropertyPath>
+                <PropertyPath>TaxAmountInTransactionCurrency</PropertyPath>
+                <PropertyPath>to_SalesOrder/GrossAmountInTransacCurrency</PropertyPath>
+                <PropertyPath>to_SalesOrder/NetAmountInTransactionCurrency</PropertyPath>
+                <PropertyPath>to_SalesOrder/TaxAmountInTransactionCurrency</PropertyPath>
+              </Collection>
+            </PropertyValue>
+            <PropertyValue Property="EffectTypes" EnumMember="Common.EffectType/ValueChange"/>
+          </Record>
+        </Annotation>
+      </Annotations>
+      <Annotations xmlns="http://docs.oasis-open.org/odata/ns/edm" Target="SEPMRA_SO_MAN2.SEPMRA_C_ScheduleLineTPType">
+        <Annotation Term="Common.SideEffects" Qualifier="QuantityChange">
+          <Record>
+            <PropertyValue Property="SourceProperties">
+              <Collection>
+                <PropertyPath>Quantity</PropertyPath>
+              </Collection>
+            </PropertyValue>
+            <PropertyValue Property="TargetProperties">
+              <Collection>
+                <PropertyPath>to_SalesOrderItem/GrossAmountInTransacCurrency</PropertyPath>
+                <PropertyPath>to_SalesOrderItem/TaxAmountInTransactionCurrency</PropertyPath>
+                <PropertyPath>to_SalesOrderItem/NetAmountInTransactionCurrency</PropertyPath>
+                <PropertyPath>to_SalesOrder/GrossAmountInTransacCurrency</PropertyPath>
+                <PropertyPath>to_SalesOrder/NetAmountInTransactionCurrency</PropertyPath>
+                <PropertyPath>to_SalesOrder/TaxAmountInTransactionCurrency</PropertyPath>
+              </Collection>
+            </PropertyValue>
+            <PropertyValue Property="EffectTypes" EnumMember="Common.EffectType/ValueChange"/>
+          </Record>
+        </Annotation>
+      </Annotations>
+    </Schema>
+  </edmx:DataServices>
+</edmx:Edmx>

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/8cbe468c/lib/client-core/src/test/resources/org/apache/olingo/client/core/UI.xml
----------------------------------------------------------------------
diff --git a/lib/client-core/src/test/resources/org/apache/olingo/client/core/UI.xml b/lib/client-core/src/test/resources/org/apache/olingo/client/core/UI.xml
new file mode 100644
index 0000000..6a084d7
--- /dev/null
+++ b/lib/client-core/src/test/resources/org/apache/olingo/client/core/UI.xml
@@ -0,0 +1,467 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+
+    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.
+
+-->
+<edmx:Edmx Version="4.0" xmlns:edmx="http://docs.oasis-open.org/odata/ns/edmx">
+  <edmx:Reference Uri="http://docs.oasis-open.org/odata/odata/v4.0/os/vocabularies/Org.OData.Core.V1.xml">
+    <edmx:Include Namespace="Org.OData.Core.V1" Alias="Core" />
+  </edmx:Reference>
+  <edmx:Reference Uri="/coco/vocabularies/Communication.xml">
+    <edmx:Include Namespace="Org.OData.Communication.V1" Alias="vCard" />
+  </edmx:Reference>
+  <edmx:Reference Uri="/coco/vocabularies/Common.xml">
+    <edmx:Include Namespace="Org.OData.Common.V1" Alias="Common" />
+  </edmx:Reference>
+  <edmx:DataServices>
+    <Schema xmlns="http://docs.oasis-open.org/odata/ns/edm" Alias="UI" Namespace="com.vocabularies.UI.v1">
+      <Annotation Term="Core.Description">
+        <String>Terms for presenting data in user interfaces</String>
+      </Annotation>
+      <Annotation Term="Core.Description" Qualifier="Published">
+        <String>2013-10-16 © Copyright 2013</String>
+      </Annotation>
+
+      <!-- Semantic Views / Perspectives -->
+
+      <Term Name="HeaderInfo" Type="UI.HeaderInfoType" AppliesTo="EntityType">
+        <Annotation Term="UI.ThingPerspective" />
+        <Annotation Term="Core.Description">
+          <String>HeaderInfos are mandatory and must be exposed on every thing of the model</String>
+        </Annotation>
+      </Term>
+      <ComplexType Name="HeaderInfoType">
+        <Property Name="TypeName" Type="Edm.String">
+          <Annotation Term="Core.IsLanguageDependent" />
+        </Property>
+        <Property Name="TypeNamePlural" Type="Edm.String" Nullable="false">
+          <Annotation Term="Core.IsLanguageDependent" />
+        </Property>
+        <Property Name="TypeImageUrl" Type="Edm.String" Nullable="true">
+          <Annotation Term="Core.IsURL" />
+        </Property>
+        <Property Name="Title" Type="UI.DataField" Nullable="false" />
+        <Property Name="Description" Type="UI.DataField" Nullable="true" />
+        <Property Name="ImageUrl" Type="Edm.String" Nullable="true">
+          <Annotation Term="Core.IsURL" />
+        </Property>
+      </ComplexType>
+
+      <Term Name="Identification" Type="Collection(UI.DataFieldAbstract)" AppliesTo="EntityType">
+        <Annotation Term="UI.ThingPerspective" />
+        <Annotation Term="Core.Description">
+          <String>HeaderInfo plus this set of attributes identifies the object</String>
+        </Annotation>
+      </Term>
+
+      <Term Name="Badge" Type="UI.BadgeType" AppliesTo="EntityType">
+        <Annotation Term="UI.ThingPerspective" />
+        <Annotation Term="Core.Description">
+          <String>Badge is similar to a business card view</String>
+        </Annotation>
+      </Term>
+      <ComplexType Name="BadgeType">
+        <Property Name="HeadLine" Type="UI.DataField" Nullable="false" />
+        <Property Name="Title" Type="UI.DataField" Nullable="false" />
+        <Property Name="ImageUrl" Type="Edm.String" Nullable="true">
+          <Annotation Term="Core.IsURL" />
+        </Property>
+        <Property Name="TypeImageUrl" Type="Edm.String" Nullable="true">
+          <Annotation Term="Core.IsURL" />
+        </Property>
+        <Property Name="MainInfo" Type="UI.DataField" Nullable="true" />
+        <Property Name="SecondaryInfo" Type="UI.DataField" Nullable="true" />
+      </ComplexType>
+
+      <Term Name="LineItem" Type="Collection(UI.DataFieldAbstract)" AppliesTo="EntityType">
+        <Annotation Term="UI.ThingPerspective" />
+      </Term>
+
+      <Term Name="StatusInfo" Type="Collection(UI.DataFieldAbstract)" AppliesTo="EntityType">
+        <Annotation Term="UI.ThingPerspective" />
+      </Term>
+
+      <Term Name="FieldGroup" Type="UI.FieldGroupType" AppliesTo="EntityType">
+        <Annotation Term="UI.ThingPerspective" />
+      </Term>
+      <ComplexType Name="FieldGroupType">
+        <Property Name="Label" Type="Edm.String" Nullable="true">
+          <Annotation Term="Core.IsLanguageDependent" />
+        </Property>
+        <Property Name="Data" Type="Collection(UI.DataFieldAbstract)" />
+      </ComplexType>
+
+      <!-- To be discussed, please don't deliver -->
+      <Term Name="GeoPoints" Type="Collection(Edm.AnnotationPath)" AppliesTo="EntityType">
+        <Annotation Term="Core.Description">
+          <String>
+            Each collection element MUST reference an annotation of a
+              vCard.Contact or
+              collection of vCard.ContactData or
+              UI.Contacts or
+              UI.GeoLocation or
+               of UI.GeoLocationType
+          </String>
+        </Annotation>
+        <Annotation Term="UI.ThingPerspective" />
+      </Term>
+      <!-- To be discussed, please don't deliver -->
+
+      <Term Name="GeoLocations" Type="Collection(UI.GeoLocationType)" AppliesTo="EntityType">
+        <Annotation Term="UI.ThingPerspective" />
+      </Term>
+      <Term Name="GeoLocation" Type="UI.GeoLocationType" AppliesTo="EntityType">
+        <Annotation Term="UI.ThingPerspective" />
+      </Term>
+      <ComplexType Name="GeoLocationType">
+        <Annotation Term="Core.Description">
+          <String>Set of Attributes which defines the Localization of the object</String>
+        </Annotation>
+        <Property Name="Latitude" Type="Edm.Double" Nullable="true" />
+        <Property Name="Longitude" Type="Edm.Double" Nullable="true" />
+        <Property Name="Location" Type="Edm.GeographyPoint" Nullable="true" />
+        <Property Name="Address" Type="vCard.AddressType" Nullable="true" />
+      </ComplexType>
+
+      <Term Name="Contacts" Type="Collection(Edm.AnnotationPath)" AppliesTo="EntityType">
+        <Annotation Term="Core.Description" String="Each collection element MUST reference an annotation of a vCard.Contact" />
+        <Annotation Term="UI.ThingPerspective" />
+      </Term>
+
+      <!-- To be discussed, please don't deliver -->
+      <Term Name="MediaResource" Type="UI.MediaResourceType" AppliesTo="EntityType">
+        <Annotation Term="UI.ThingPerspective" />
+        <Annotation Term="Core.Description" String="Properties that are relevant for Media Resources" />
+      </Term>
+      <ComplexType Name="MediaResourceType">
+        <Property Name="Url" Type="Edm.String" Nullable="false">
+          <Annotation Term="Core.IsURL" />
+        </Property>
+        <Property Name="ContentType" Type="Edm.String" Nullable="true">
+          <Annotation Term="Core.IsMediaType" />
+        </Property>
+        <Property Name="ByteSize" Type="Edm.Int64" Nullable="true" />
+        <Property Name="ChangedAt" Type="Edm.DateTimeOffset" Nullable="true" />
+        <Property Name="Thumbnail" Type="UI.ImageType" Nullable="true" />
+        <Property Name="Title" Type="UI.DataField" Nullable="false" />
+        <Property Name="Description" Type="UI.DataField" Nullable="true" />
+      </ComplexType>
+      <ComplexType Name="ImageType">
+        <Property Name="Url" Type="Edm.String" Nullable="false">
+          <Annotation Term="Core.IsURL" />
+        </Property>
+        <Property Name="Width" Type="Edm.String" Nullable="true" />
+        <Property Name="Height" Type="Edm.String" Nullable="true" />
+      </ComplexType>
+      <!-- To be discussed, please don't deliver -->
+
+      <!-- To be discussed, please don't deliver -->
+      <Term Name="AdditionalInfo" Type="Edm.AnnotationPath" AppliesTo="Annotation">
+        <Annotation Term="Core.Description">
+          <String>
+            Applies to UI.GeoLocation and vCard.Contact annotations only
+            Provides additional related information for a UI.GeoLocation or vCard.Contact
+            Reference to UI.HeaderInfo, UI.Badge, a qualified UI.FieldGroup, or a dedicated property tagged with Core.IsUrl
+          </String>
+        </Annotation>
+      </Term>
+      <!-- To be discussed, please don't deliver -->
+
+      <Term Name="DataPoint" Type="UI.DataPointType" AppliesTo="EntityType">
+        <Annotation Term="UI.ThingPerspective" />
+      </Term>
+      <ComplexType Name="DataPointType">
+        <Property Name="Title" Type="Edm.String" Nullable="false">
+          <Annotation Term="Core.IsLanguageDependent" />
+        </Property>
+        <Property Name="Description" Type="Edm.String" Nullable="true">
+          <Annotation Term="Core.IsLanguageDependent" />
+        </Property>
+        <Property Name="LongDescription" Type="Edm.String" Nullable="true">
+          <Annotation Term="Core.IsLanguageDependent" />
+        </Property>
+        <Property Name="Value" Type="Edm.PrimitiveType" Nullable="false">
+          <Annotation Term="Core.Description" String="The numeric value of the DataPoint" />
+          <Annotation Term="Core.LongDescription">
+            <String>
+              It could be annotated with either UoM.ISOCurrency or UoM.Unit.
+              Percentage values are annotated with UoM.Unit = '%'.
+              A renderer should take an optional Common.Text annotation into consideration.
+            </String>
+          </Annotation>
+        </Property>
+        <Property Name="ValueFormat" Type="UI.NumberFormat" Nullable="true" />
+        <Property Name="ReferencePeriod" Type="UI.ReferencePeriod" Nullable="true" />
+        <Property Name="Criticality" Type="UI.CriticalityType" Nullable="true" />
+        <Property Name="CriticalityCalculation" Type="UI.CriticalityCalculationType" Nullable="true" />
+        <Property Name="Trend" Type="UI.TrendType" Nullable="true" />
+        <Property Name="TrendCalculation" Type="UI.TrendCalculationType" Nullable="true" />
+        <Property Name="Responsible" Type="vCard.ContactType" Nullable="true" />
+      </ComplexType>
+
+      <ComplexType Name="NumberFormat">
+        <Property Name="ScaleFactor" Type="Edm.Decimal" Scale="variable" Nullable="true" />
+        <Property Name="NumberOfFractionalDigits" Type="Edm.Byte" Nullable="true" />
+      </ComplexType>
+
+      <ComplexType Name="ReferencePeriod">
+        <Property Name="Description" Type="Edm.String" Nullable="true">
+          <Annotation Term="Core.IsLanguageDependent" />
+        </Property>
+        <Property Name="Start" Type="Edm.DateTimeOffset" Nullable="true" />
+        <Property Name="End" Type="Edm.DateTimeOffset" Nullable="true" />
+      </ComplexType>
+
+      <EnumType Name="CriticalityType">
+        <Member Name="Negative" />
+        <Member Name="Critical" />
+        <Member Name="Positive" />
+      </EnumType>
+
+      <ComplexType Name="CriticalityCalculationType">
+        <Annotation Term="Core.Description">
+          <String>
+              Direction: Target
+               - Positive: ge ToleranceRangeLowValue and le ToleranceRangeHighValue
+               - Critical: ge DeviationRangeLowValue  and lt ToleranceRangeLowValue or
+                           gt ToleranceRangeHighValue and le DeviationRangeHighValue
+               - Negative: lt DeviationRangeLowValue and gt DeviationRangeHighValue
+              Direction: Minimize
+               - Positive: le ToleranceRangeHighValue
+               - Critical: gt ToleranceRangeHighValue and le DeviationRangeHighValue
+               - Negative: gt DeviationRangeHighValue
+              Direction: Maximize
+               - Positive: ge ToleranceRangeLowValue
+               - Critical: lt ToleranceRangeLowValue and ge DeviationRangeLowValue
+               - Negative: lt DeviationRangeLowValue
+            </String>
+        </Annotation>
+        <Property Name="ImprovementDirection" Type="UI.ImprovementDirectionType" Nullable="false">
+        </Property>
+        <Property Name="ToleranceRangeLowValue" Type="Edm.PrimitiveType" Nullable="true" />
+        <Property Name="ToleranceRangeHighValue" Type="Edm.PrimitiveType" Nullable="true" />
+        <Property Name="DeviationRangeLowValue" Type="Edm.PrimitiveType" Nullable="true" />
+        <Property Name="DeviationRangeHighValue" Type="Edm.PrimitiveType" Nullable="true" />
+      </ComplexType>
+
+      <EnumType Name="ImprovementDirectionType">
+        <Member Name="Minimize" />
+        <Member Name="Target" />
+        <Member Name="Maximize" />
+      </EnumType>
+
+      <EnumType Name="TrendType">
+        <Member Name="StrongUp" />
+        <Member Name="Up" />
+        <Member Name="Sideways" />
+        <Member Name="Down" />
+        <Member Name="StrongDown" />
+      </EnumType>
+
+      <ComplexType Name="TrendCalculationType">
+        <Annotation Term="Core.Description">
+          <String>
+            Value sub ReferenceValue ( div ReferenceValue if IsRelativeDifference ) must be
+             - StrongUp:   ge StrongUpDifference
+             - Up:         lt StrongUpDifference and ge UpDifference
+             - Sideways:   lt UpDifference         and gt DownDifference
+             - Down:       gt StrongDownDifference and le DownDifference
+             - StrongDown: le StrongDownDifference
+          </String>
+        </Annotation>
+        <Property Name="ReferenceValue" Type="Edm.PrimitiveType" Nullable="false" />
+        <Property Name="IsRelativeDifference" Type="Edm.Boolean" DefaultValue="false" />
+        <Property Name="UpDifference" Type="Edm.Decimal" Nullable="false" />
+        <Property Name="StrongUpDifference" Type="Edm.Decimal" Nullable="false" />
+        <Property Name="DownDifference" Type="Edm.Decimal" Nullable="false" />
+        <Property Name="StrongDownDifference" Type="Edm.Decimal" Nullable="false" />
+      </ComplexType>
+
+      <Term Name="Chart" Type="UI.ChartDefinitionType" AppliesTo="EntityType">
+        <Annotation Term="UI.ThingPerspective" />
+      </Term>
+      <ComplexType Name="ChartDefinitionType">
+        <Property Name="Title" Type="Edm.String" Nullable="true">
+          <Annotation Term="Core.IsLanguageDependent" />
+        </Property>
+        <Property Name="Description" Type="Edm.String" Nullable="true">
+          <Annotation Term="Core.IsLanguageDependent" />
+        </Property>
+        <Property Name="ChartType" Type="UI.ChartType" Nullable="false" />
+        <Property Name="Measures" Type="Collection(Edm.PropertyPath)" />
+        <Property Name="Dimensions" Type="Collection(Edm.PropertyPath)" />
+      </ComplexType>
+
+      <EnumType Name="ChartType">
+        <Member Name="Column" />
+        <Member Name="ColumnStacked" />
+        <Member Name="ColumnStacked100" />
+        <Member Name="Bar" />
+        <Member Name="BarStacked" />
+        <Member Name="BarStacked100" />
+        <Member Name="Area" />
+        <Member Name="AreaStacked" />
+        <Member Name="AreaStacked100" />
+        <Member Name="HorizontalArea" />
+        <Member Name="HorizontalAreaStacked" />
+        <Member Name="HorizontalAreaStacked100" />
+        <Member Name="Line" />
+        <Member Name="Pie" />
+        <Member Name="Donut" />
+        <Member Name="Scatter" />
+        <Member Name="Bubble" />
+        <Member Name="Radar" />
+        <Member Name="HeatMap" />
+        <Member Name="TreeMap" />
+        <Member Name="Waterfall" />
+        <!-- Future: GeoPie, GeoBubble, ChoroplethMap -->
+      </EnumType>
+
+      <Term Name="SelectionFields" Type="Collection(Edm.PropertyPath)" AppliesTo="EntityType">
+        <Annotation Term="UI.ThingPerspective" />
+        <Annotation Term="Core.Description" String="Properties that might be relevant for filtering a listof entity instances" />
+      </Term>
+
+      <!-- Segmentation of content according to facets of the Object -->
+
+      <Term Name="Facets" Type="Collection(UI.Facet)" AppliesTo="EntityType">
+      </Term>
+
+      <ComplexType Name="Facet" Abstract="true">
+        <Annotation Term="Core.Description" String="Base type for facets" />
+        <Property Name="Label" Type="Edm.String" Nullable="true">
+          <Annotation Term="Core.IsLanguageDependent" />
+        </Property>
+      </ComplexType>
+      <ComplexType Name="CollectionFacet" BaseType="UI.Facet">
+        <Annotation Term="Core.Description" String="Collection of Facets" />
+        <Property Name="Facets" Type="Collection(UI.Facet)" />
+      </ComplexType>
+      <ComplexType Name="ReferenceFacet" BaseType="UI.Facet">
+        <Annotation Term="Core.Description" String="Facet that refers to a thing perspective, e.g. LineItem" />
+        <Property Name="Target" Type="Edm.AnnotationPath" Nullable="false">
+          <Annotation Term="Core.Description">
+            <String>Path MUST end in vCard.Contact or vCard.Address or a term that is tagged with UI.ThingPerspective, e.g.  UI.StatusInfo, UI.LineItem, UI.Identification, UI.FieldGroup, UI.Badge</String>
+          </Annotation>
+        </Property>
+      </ComplexType>
+      <ComplexType Name="ReferenceURLFacet" BaseType="UI.Facet">
+        <Property Name="Url" Type="Edm.String" Nullable="false">
+          <Annotation Term="Core.IsURL" />
+        </Property>
+        <Property Name="UrlContentType" Type="Edm.String" Nullable="true">
+          <Annotation Term="Core.IsMediaType" />
+        </Property>
+      </ComplexType>
+
+
+      <!-- basic type definitions for reuse goes here -->
+
+      <Term Name="ThingPerspective" Type="Core.Tag" DefaultValue="true" AppliesTo="Term">
+        <Annotation Term="Core.Description" String="This Term is a Thing Perspective" />
+      </Term>
+      <Term Name="IsSummary" Type="Core.Tag" DefaultValue="true" AppliesTo="Record">
+        <Annotation Term="Core.Description"
+          String="This Facet and all included Facets are the summary of the thing. At most one Facet of a thing can be tagged with this term" />
+        <Annotation Term="Core.RequiresType" String="UI.Facet" />
+      </Term>
+      <Term Name="PartOfPreview" Type="Core.Tag" DefaultValue="true" AppliesTo="Record">
+        <Annotation Term="Core.Description" String="This Facet and all included Facets are part of the Thing preview" />
+        <Annotation Term="Core.RequiresType" String="UI.Facet" />
+      </Term>
+      <Term Name="Map" Type="Core.Tag" DefaultValue="true" AppliesTo="Record">
+        <Annotation Term="Core.Description" String="Target MUST reference a UI.GeoLocation, vCard.Address or a collection of these" />
+        <Annotation Term="Core.RequiresType" String="UI.ReferenceFacet" />
+      </Term>
+      <!-- To be discussed, please don't deliver -->
+      <Term Name="Gallery" Type="Core.Tag" DefaultValue="true" AppliesTo="Record">
+        <Annotation Term="Core.Description" String="Target MUST reference a UI.MediaResource" />
+        <Annotation Term="Core.RequiresType" String="UI.ReferenceFacet" />
+      </Term>
+      <!-- To be discussed, please don't deliver -->
+
+      <Term Name="IsImageURL" Type="Core.Tag" DefaultValue="true" AppliesTo="Property Term">
+        <Annotation Term="Core.Description"
+          String="Properties and terms annotated with this term MUST contain a valid URL referencing an resource with a MIME type image" />
+        <Annotation Term="Core.RequiresType" String="Edm.String" />
+      </Term>
+      <Term Name="MultiLineText" Type="Core.Tag" DefaultValue="true" AppliesTo="Property">
+        <Annotation Term="Core.Description"
+          String="Properties annotated with this annotation should be rendered as multi-line text (e.g. text area)" />
+        <Annotation Term="Core.RequiresType" String="Edm.String" />
+      </Term>
+      <!-- To be discussed, please don't deliver -->
+      <!-- not ready yet, wait for UI5 concerning the format of that value -->
+      <Term Name="DisplayTimeZone" Type="Edm.Int32" AppliesTo="Property">
+        <Annotation Term="Core.Description">
+          <String>Contains information for time- or date-time-fields in which time zone the time value should be displayed.</String>
+        </Annotation>
+      </Term>
+      <!-- To be discussed, please don't deliver -->
+
+      <Term Name="Importance" Type="UI.ImportanceType" AppliesTo="Annotation Record">
+        <Annotation Term="Core.Description"
+          String="Expresses the importance, e.g. importance of a DataField or a the importance of a annotation" />
+      </Term>
+      <EnumType Name="ImportanceType">
+        <Member Name="High" />
+        <Member Name="Medium" />
+        <Member Name="Low" />
+      </EnumType>
+
+      <ComplexType Name="DataFieldAbstract" Abstract="true">
+        <Property Name="Label" Type="Edm.String" Nullable="true">
+          <Annotation Term="Core.IsLanguageDependent" />
+        </Property>
+      </ComplexType>
+
+      <ComplexType Name="DataFieldForAnnotation" BaseType="UI.DataFieldAbstract">
+        <Property Name="Target" Type="Edm.AnnotationPath">
+          <Annotation Term="Core.Description" String="Annotation path MUST end in vCard.Address or UI.DataPoint" />
+        </Property>
+      </ComplexType>
+      <ComplexType Name="DataFieldForAction" BaseType="UI.DataFieldAbstract">
+        <Property Name="Action" Type="Common.QualifiedName">
+          <Annotation Term="Core.Description" String="Qualified name of an Action, Function, ActionImport or FunctionImport in scope" />
+        </Property>
+      </ComplexType>
+      <ComplexType Name="DataField" BaseType="UI.DataFieldAbstract">
+        <Property Name="Value" Type="Edm.PrimitiveType" Nullable="false">
+          <Annotation Term="Core.IsLanguageDependent" />
+        </Property>
+      </ComplexType>
+      <ComplexType Name="DataFieldWithNavigationPath" BaseType="UI.DataField">
+        <Property Name="Target" Type="Edm.NavigationPropertyPath" Nullable="false">
+          <Annotation Term="Core.Description">
+            <String>Contains either a navigation property or a term cast, where term is of type Edm.EntityType or a concrete entity type or a collection of these types</String>
+          </Annotation>
+        </Property>
+      </ComplexType>
+      <ComplexType Name="DataFieldWithUrl" BaseType="UI.DataField">
+        <Property Name="Url" Type="Edm.String" Nullable="false">
+          <Annotation Term="Core.IsURL" />
+        </Property>
+        <Property Name="UrlContentType" Type="Edm.String" Nullable="true">
+          <Annotation Term="Core.IsMediaType" />
+        </Property>
+      </ComplexType>
+
+    </Schema>
+  </edmx:DataServices>
+</edmx:Edmx>
\ No newline at end of file