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

[07/15] [OLINGO-263][OLINGO-264] First draft Edm annotation interfaces + client-side implementation (server components have TODO)

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/726fbe52/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/EdmSchemaImpl.java
----------------------------------------------------------------------
diff --git a/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/EdmSchemaImpl.java b/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/EdmSchemaImpl.java
index 8e0f9d6..17d6824 100644
--- a/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/EdmSchemaImpl.java
+++ b/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/EdmSchemaImpl.java
@@ -22,7 +22,6 @@ import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
-
 import org.apache.olingo.client.api.edm.xml.ComplexType;
 import org.apache.olingo.client.api.edm.xml.EntityContainer;
 import org.apache.olingo.client.api.edm.xml.EntityType;
@@ -30,16 +29,22 @@ import org.apache.olingo.client.api.edm.xml.EnumType;
 import org.apache.olingo.client.api.edm.xml.Schema;
 import org.apache.olingo.client.api.edm.xml.v3.FunctionImport;
 import org.apache.olingo.client.api.edm.xml.v4.Action;
+import org.apache.olingo.client.api.edm.xml.v4.Annotation;
+import org.apache.olingo.client.api.edm.xml.v4.Annotations;
 import org.apache.olingo.client.api.edm.xml.v4.Function;
+import org.apache.olingo.client.api.edm.xml.v4.Term;
 import org.apache.olingo.client.api.edm.xml.v4.TypeDefinition;
 import org.apache.olingo.client.core.edm.v3.EdmFunctionProxy;
 import org.apache.olingo.commons.api.edm.Edm;
 import org.apache.olingo.commons.api.edm.EdmAction;
+import org.apache.olingo.commons.api.edm.EdmAnnotation;
+import org.apache.olingo.commons.api.edm.EdmAnnotations;
 import org.apache.olingo.commons.api.edm.EdmComplexType;
 import org.apache.olingo.commons.api.edm.EdmEntityContainer;
 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.EdmTerm;
 import org.apache.olingo.commons.api.edm.EdmTypeDefinition;
 import org.apache.olingo.commons.api.edm.FullQualifiedName;
 import org.apache.olingo.commons.api.edm.constants.ODataServiceVersion;
@@ -92,6 +97,7 @@ public class EdmSchemaImpl extends AbstractEdmSchema {
 
   @Override
   public EdmEntityContainer getEntityContainer(final FullQualifiedName name) {
+    getEntityContainers();
     return entityContainerByName.get(name);
   }
 
@@ -210,4 +216,48 @@ public class EdmSchemaImpl extends AbstractEdmSchema {
     }
     return functions;
   }
+
+  @Override
+  protected List<EdmTerm> createTerms() {
+    final List<EdmTerm> terms = new ArrayList<EdmTerm>();
+    if (schema instanceof org.apache.olingo.client.api.edm.xml.v4.Schema) {
+      final List<Term> providerTerms = ((org.apache.olingo.client.api.edm.xml.v4.Schema) schema).getTerms();
+      if (providerTerms != null) {
+        for (Term term : providerTerms) {
+          terms.add(new EdmTermImpl(edm, term));
+        }
+      }
+    }
+    return terms;
+  }
+
+  @Override
+  protected List<EdmAnnotations> createAnnotationGroups() {
+    final List<EdmAnnotations> annotationGroups = new ArrayList<EdmAnnotations>();
+    if (schema instanceof org.apache.olingo.client.api.edm.xml.v4.Schema) {
+      final List<Annotations> providerAnnotations =
+              ((org.apache.olingo.client.api.edm.xml.v4.Schema) schema).getAnnotationGroups();
+      if (providerAnnotations != null) {
+        for (Annotations annotationGroup : providerAnnotations) {
+          annotationGroups.add(new EdmAnnotationsImpl(edm, this, annotationGroup));
+        }
+      }
+    }
+    return annotationGroups;
+  }
+
+  @Override
+  protected List<EdmAnnotation> createAnnotations() {
+    final List<EdmAnnotation> annotations = new ArrayList<EdmAnnotation>();
+    if (schema instanceof org.apache.olingo.client.api.edm.xml.v4.Schema) {
+      final List<Annotation> providerAnnotations =
+              ((org.apache.olingo.client.api.edm.xml.v4.Schema) schema).getAnnotations();
+      if (providerAnnotations != null) {
+        for (Annotation annotation : providerAnnotations) {
+          annotations.add(new EdmAnnotationImpl(edm, annotation));
+        }
+      }
+    }
+    return annotations;
+  }
 }

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/726fbe52/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/EdmSingletonImpl.java
----------------------------------------------------------------------
diff --git a/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/EdmSingletonImpl.java b/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/EdmSingletonImpl.java
index b91340e..403c28f 100644
--- a/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/EdmSingletonImpl.java
+++ b/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/EdmSingletonImpl.java
@@ -32,4 +32,9 @@ public class EdmSingletonImpl extends EdmBindingTargetImpl implements EdmSinglet
     super(edm, container, name, type, singleton);
   }
 
+  @Override
+  public TargetType getAnnotationsTargetType() {
+    return TargetType.Singleton;
+  }
+
 }

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/726fbe52/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/EdmStructuredTypeHelperImpl.java
----------------------------------------------------------------------
diff --git a/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/EdmStructuredTypeHelperImpl.java b/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/EdmStructuredTypeHelperImpl.java
index 77d92df..c0b0cab 100644
--- a/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/EdmStructuredTypeHelperImpl.java
+++ b/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/EdmStructuredTypeHelperImpl.java
@@ -31,12 +31,15 @@ import org.apache.olingo.client.core.edm.v3.EdmNavigationPropertyProxy;
 import org.apache.olingo.commons.api.edm.Edm;
 import org.apache.olingo.commons.api.edm.EdmNavigationProperty;
 import org.apache.olingo.commons.api.edm.EdmProperty;
+import org.apache.olingo.commons.api.edm.FullQualifiedName;
 import org.apache.olingo.commons.core.edm.EdmStructuredTypeHelper;
 
 public class EdmStructuredTypeHelperImpl implements EdmStructuredTypeHelper {
 
   private final Edm edm;
 
+  private final FullQualifiedName structuredTypeName;
+
   private final ComplexType complexType;
 
   private final List<? extends Schema> xmlSchemas;
@@ -45,10 +48,11 @@ public class EdmStructuredTypeHelperImpl implements EdmStructuredTypeHelper {
 
   private Map<String, EdmNavigationProperty> navigationProperties;
 
-  public EdmStructuredTypeHelperImpl(
-          final Edm edm, final List<? extends Schema> xmlSchemas, final ComplexType complexType) {
+  public EdmStructuredTypeHelperImpl(final Edm edm, final FullQualifiedName structuredTypeName,
+          final List<? extends Schema> xmlSchemas, final ComplexType complexType) {
 
     this.edm = edm;
+    this.structuredTypeName = structuredTypeName;
     this.complexType = complexType;
     this.xmlSchemas = xmlSchemas;
   }
@@ -58,7 +62,7 @@ public class EdmStructuredTypeHelperImpl implements EdmStructuredTypeHelper {
     if (properties == null) {
       properties = new LinkedHashMap<String, EdmProperty>();
       for (CommonProperty property : complexType.getProperties()) {
-        properties.put(property.getName(), new EdmPropertyImpl(edm, property));
+        properties.put(property.getName(), new EdmPropertyImpl(edm, structuredTypeName, property));
       }
     }
     return properties;
@@ -71,10 +75,12 @@ public class EdmStructuredTypeHelperImpl implements EdmStructuredTypeHelper {
       for (CommonNavigationProperty navigationProperty : complexType.getNavigationProperties()) {
         if (navigationProperty instanceof org.apache.olingo.client.api.edm.xml.v4.NavigationProperty) {
           navigationProperties.put(navigationProperty.getName(), new EdmNavigationPropertyImpl(
-                  edm, (org.apache.olingo.client.api.edm.xml.v4.NavigationProperty) navigationProperty));
+                  edm, structuredTypeName,
+                  (org.apache.olingo.client.api.edm.xml.v4.NavigationProperty) navigationProperty));
         } else if (navigationProperty instanceof org.apache.olingo.client.api.edm.xml.v3.NavigationProperty) {
           navigationProperties.put(navigationProperty.getName(), new EdmNavigationPropertyProxy(
-                  edm, xmlSchemas, (org.apache.olingo.client.api.edm.xml.v3.NavigationProperty) navigationProperty));
+                  edm, xmlSchemas,
+                  (org.apache.olingo.client.api.edm.xml.v3.NavigationProperty) navigationProperty));
         }
       }
     }

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/726fbe52/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/EdmTermImpl.java
----------------------------------------------------------------------
diff --git a/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/EdmTermImpl.java b/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/EdmTermImpl.java
new file mode 100644
index 0000000..a779369
--- /dev/null
+++ b/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/EdmTermImpl.java
@@ -0,0 +1,161 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.olingo.client.core.edm;
+
+import java.util.ArrayList;
+import java.util.List;
+import org.apache.commons.lang3.ClassUtils;
+import org.apache.olingo.client.api.edm.xml.v4.Term;
+import org.apache.olingo.commons.api.edm.Edm;
+import org.apache.olingo.commons.api.edm.EdmAnnotation;
+import org.apache.olingo.commons.api.edm.EdmException;
+import org.apache.olingo.commons.api.edm.EdmTerm;
+import org.apache.olingo.commons.api.edm.EdmType;
+import org.apache.olingo.commons.api.edm.FullQualifiedName;
+import org.apache.olingo.commons.api.edm.geo.SRID;
+import org.apache.olingo.commons.core.edm.EdmAnnotationHelper;
+import org.apache.olingo.commons.core.edm.EdmNamedImpl;
+import org.apache.olingo.commons.core.edm.EdmTypeInfo;
+import org.apache.olingo.commons.core.edm.primitivetype.EdmPrimitiveTypeFactory;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class EdmTermImpl extends EdmNamedImpl implements EdmTerm {
+
+  private static final Logger LOG = LoggerFactory.getLogger(EdmTermImpl.class);
+
+  private final Term term;
+
+  private final EdmTypeInfo typeInfo;
+
+  private final EdmAnnotationHelper helper;
+
+  private EdmType termType;
+
+  private EdmTerm baseTerm;
+
+  private List<Class<?>> appliesTo;
+
+  public EdmTermImpl(final Edm edm, final Term term) {
+    super(edm, term.getName());
+
+    this.term = term;
+    this.typeInfo = new EdmTypeInfo.Builder().setEdm(edm).setTypeExpression(term.getType()).build();
+    this.helper = new EdmAnnotationHelperImpl(edm, term);
+  }
+
+  @Override
+  public FullQualifiedName getFullQualifiedName() {
+    return typeInfo.getFullQualifiedName();
+  }
+
+  @Override
+  public EdmType getType() {
+    if (termType == null) {
+      termType = typeInfo.isPrimitiveType()
+              ? EdmPrimitiveTypeFactory.getInstance(typeInfo.getPrimitiveTypeKind())
+              : typeInfo.isTypeDefinition()
+              ? typeInfo.getTypeDefinition()
+              : typeInfo.isEnumType()
+              ? typeInfo.getEnumType()
+              : typeInfo.isComplexType()
+              ? typeInfo.getComplexType()
+              : null;
+      if (termType == null) {
+        throw new EdmException("Cannot find type with name: " + typeInfo.getFullQualifiedName());
+      }
+    }
+
+    return termType;
+  }
+
+  @Override
+  public EdmTerm getBaseTerm() {
+    if (baseTerm == null && term.getBaseTerm() != null) {
+      baseTerm = edm.getTerm(new FullQualifiedName(term.getBaseTerm()));
+    }
+    return baseTerm;
+  }
+
+  @Override
+  public List<Class<?>> getAppliesTo() {
+    if (appliesTo == null) {
+      appliesTo = new ArrayList<Class<?>>();
+      for (String element : term.getAppliesTo()) {
+        try {
+          appliesTo.add(ClassUtils.getClass(EdmTerm.class.getPackage().getName() + ".Edm" + element));
+        } catch (ClassNotFoundException e) {
+          LOG.error("Could not load Edm class for {}", element, e);
+        }
+      }
+    }
+    return appliesTo;
+  }
+
+  @Override
+  public Boolean isNullable() {
+    return term.isNullable();
+  }
+
+  @Override
+  public Integer getMaxLength() {
+    return term.getMaxLength();
+  }
+
+  @Override
+  public Integer getPrecision() {
+    return term.getPrecision();
+  }
+
+  @Override
+  public Integer getScale() {
+    return term.getScale();
+  }
+
+  @Override
+  public SRID getSrid() {
+    return term.getSrid();
+  }
+
+  @Override
+  public String getDefaultValue() {
+    return term.getDefaultValue();
+  }
+
+  @Override
+  public TargetType getAnnotationsTargetType() {
+    return TargetType.Term;
+  }
+
+  @Override
+  public FullQualifiedName getAnnotationsTargetFQN() {
+    return typeInfo.getFullQualifiedName();
+  }
+
+  @Override
+  public String getAnnotationsTargetPath() {
+    return null;
+  }
+
+  @Override
+  public List<EdmAnnotation> getAnnotations() {
+    return helper.getAnnotations();
+  }
+
+}

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/726fbe52/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/EdmTypeDefinitionImpl.java
----------------------------------------------------------------------
diff --git a/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/EdmTypeDefinitionImpl.java b/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/EdmTypeDefinitionImpl.java
index 3c146ec..1292151 100644
--- a/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/EdmTypeDefinitionImpl.java
+++ b/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/EdmTypeDefinitionImpl.java
@@ -18,22 +18,28 @@
  */
 package org.apache.olingo.client.core.edm;
 
+import java.util.List;
 import org.apache.olingo.client.api.edm.xml.v4.TypeDefinition;
 import org.apache.olingo.commons.api.edm.Edm;
+import org.apache.olingo.commons.api.edm.EdmAnnotation;
 import org.apache.olingo.commons.api.edm.EdmException;
 import org.apache.olingo.commons.api.edm.EdmPrimitiveType;
 import org.apache.olingo.commons.api.edm.EdmPrimitiveTypeKind;
 import org.apache.olingo.commons.api.edm.EdmTypeDefinition;
 import org.apache.olingo.commons.api.edm.FullQualifiedName;
 import org.apache.olingo.commons.api.edm.constants.ODataServiceVersion;
+import org.apache.olingo.commons.api.edm.geo.SRID;
 import org.apache.olingo.commons.core.edm.AbstractEdmTypeDefinition;
+import org.apache.olingo.commons.core.edm.EdmAnnotationHelper;
 import org.apache.olingo.commons.core.edm.primitivetype.EdmPrimitiveTypeFactory;
 
 public class EdmTypeDefinitionImpl extends AbstractEdmTypeDefinition implements EdmTypeDefinition {
 
-  private TypeDefinition typeDefinition;
+  private final TypeDefinition typeDefinition;
 
-  private EdmPrimitiveType edmPrimitiveTypeInstance;
+  private final EdmPrimitiveType edmPrimitiveTypeInstance;
+
+  private final EdmAnnotationHelper helper;
 
   public EdmTypeDefinitionImpl(final ODataServiceVersion version, final Edm edm,
           final FullQualifiedName typeDefinitionName, final TypeDefinition typeDefinition) {
@@ -46,6 +52,7 @@ public class EdmTypeDefinitionImpl extends AbstractEdmTypeDefinition implements
     } catch (IllegalArgumentException e) {
       throw new EdmException("Invalid underlying type: " + typeDefinition.getUnderlyingType(), e);
     }
+    this.helper = new EdmAnnotationHelperImpl(edm, typeDefinition);
   }
 
   @Override
@@ -69,7 +76,18 @@ public class EdmTypeDefinitionImpl extends AbstractEdmTypeDefinition implements
   }
 
   @Override
+  public SRID getSrid() {
+    return typeDefinition.getSrid();
+  }
+
+  @Override
   public Boolean isUnicode() {
     return typeDefinition.isUnicode();
   }
+
+  @Override
+  public List<EdmAnnotation> getAnnotations() {
+    return helper.getAnnotations();
+  }
+
 }

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/726fbe52/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/v3/EdmActionImportProxy.java
----------------------------------------------------------------------
diff --git a/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/v3/EdmActionImportProxy.java b/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/v3/EdmActionImportProxy.java
index cb9ae27..cb22d11 100644
--- a/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/v3/EdmActionImportProxy.java
+++ b/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/v3/EdmActionImportProxy.java
@@ -53,4 +53,9 @@ public class EdmActionImportProxy extends EdmOperationImportImpl implements EdmA
     return edm.getUnboundAction(getActionFQN());
   }
 
+  @Override
+  public TargetType getAnnotationsTargetType() {
+    return TargetType.ActionImport;
+  }
+
 }

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/726fbe52/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/v3/EdmEntitySetProxy.java
----------------------------------------------------------------------
diff --git a/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/v3/EdmEntitySetProxy.java b/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/v3/EdmEntitySetProxy.java
index 1af4889..079828f 100644
--- a/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/v3/EdmEntitySetProxy.java
+++ b/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/v3/EdmEntitySetProxy.java
@@ -29,6 +29,7 @@ import org.apache.olingo.client.api.edm.xml.v3.AssociationSet;
 import org.apache.olingo.client.core.edm.xml.v3.EntityContainerImpl;
 import org.apache.olingo.client.core.edm.xml.v3.SchemaImpl;
 import org.apache.olingo.commons.api.edm.Edm;
+import org.apache.olingo.commons.api.edm.EdmAnnotation;
 import org.apache.olingo.commons.api.edm.EdmBindingTarget;
 import org.apache.olingo.commons.api.edm.EdmEntityContainer;
 import org.apache.olingo.commons.api.edm.EdmEntitySet;
@@ -113,4 +114,14 @@ public class EdmEntitySetProxy extends AbstractEdmBindingTarget implements EdmEn
     return Collections.emptyList();
   }
 
+  @Override
+  public TargetType getAnnotationsTargetType() {
+    return TargetType.EntitySet;
+  }
+
+  @Override
+  public List<EdmAnnotation> getAnnotations() {
+    return Collections.<EdmAnnotation>emptyList();
+  }
+
 }

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/726fbe52/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/v3/EdmFunctionImportProxy.java
----------------------------------------------------------------------
diff --git a/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/v3/EdmFunctionImportProxy.java b/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/v3/EdmFunctionImportProxy.java
index b64c9bb..da6605d 100644
--- a/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/v3/EdmFunctionImportProxy.java
+++ b/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/v3/EdmFunctionImportProxy.java
@@ -65,4 +65,9 @@ public class EdmFunctionImportProxy extends EdmOperationImportImpl implements Ed
     return true;
   }
 
+  @Override
+  public TargetType getAnnotationsTargetType() {
+    return TargetType.FunctionImport;
+  }
+
 }

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/726fbe52/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/v3/EdmFunctionProxy.java
----------------------------------------------------------------------
diff --git a/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/v3/EdmFunctionProxy.java b/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/v3/EdmFunctionProxy.java
index d883f1d..1d184a0 100644
--- a/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/v3/EdmFunctionProxy.java
+++ b/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/v3/EdmFunctionProxy.java
@@ -40,4 +40,5 @@ public class EdmFunctionProxy extends EdmOperationProxy implements EdmFunction {
   public boolean isComposable() {
     return functionImport.isComposable();
   }
+
 }

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/726fbe52/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/v3/EdmNavigationPropertyProxy.java
----------------------------------------------------------------------
diff --git a/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/v3/EdmNavigationPropertyProxy.java b/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/v3/EdmNavigationPropertyProxy.java
index cadb3ae..77e2f59 100644
--- a/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/v3/EdmNavigationPropertyProxy.java
+++ b/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/v3/EdmNavigationPropertyProxy.java
@@ -19,20 +19,23 @@
 package org.apache.olingo.client.core.edm.v3;
 
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.List;
 import org.apache.olingo.client.api.edm.xml.Schema;
 import org.apache.olingo.client.api.edm.xml.v3.Association;
 import org.apache.olingo.client.api.edm.xml.v3.AssociationEnd;
 import org.apache.olingo.client.api.edm.xml.v3.NavigationProperty;
 import org.apache.olingo.client.api.edm.xml.v3.ReferentialConstraint;
+import org.apache.olingo.client.core.edm.EdmReferentialConstraintImpl;
 import org.apache.olingo.client.core.edm.xml.v3.SchemaImpl;
+import org.apache.olingo.client.core.edm.xml.v4.ReferentialConstraintImpl;
 import org.apache.olingo.commons.api.edm.Edm;
+import org.apache.olingo.commons.api.edm.EdmAnnotation;
 import org.apache.olingo.commons.api.edm.EdmEntityType;
 import org.apache.olingo.commons.api.edm.EdmNavigationProperty;
 import org.apache.olingo.commons.api.edm.EdmReferentialConstraint;
 import org.apache.olingo.commons.api.edm.FullQualifiedName;
 import org.apache.olingo.commons.core.edm.AbstractEdmNavigationProperty;
-import org.apache.olingo.commons.core.edm.EdmReferentialConstraintImpl;
 
 public class EdmNavigationPropertyProxy extends AbstractEdmNavigationProperty {
 
@@ -120,7 +123,7 @@ public class EdmNavigationPropertyProxy extends AbstractEdmNavigationProperty {
 
   @Override
   public EdmNavigationProperty getPartner() {
-    return partner == null ? this: partner;
+    return partner == null ? this : partner;
   }
 
   @Override
@@ -156,13 +159,24 @@ public class EdmNavigationPropertyProxy extends AbstractEdmNavigationProperty {
       referentialConstraints = new ArrayList<EdmReferentialConstraint>();
       if (constraint != null) {
         for (int i = 0; i < constraint.getPrincipal().getPropertyRefs().size(); i++) {
-          referentialConstraints.add(new EdmReferentialConstraintImpl(
-                  constraint.getPrincipal().getPropertyRefs().get(i).getName(),
-                  constraint.getDependent().getPropertyRefs().get(i).getName()));
+          final ReferentialConstraintImpl referentialConstraint = new ReferentialConstraintImpl();
+          referentialConstraint.setProperty(constraint.getPrincipal().getPropertyRefs().get(i).getName());
+          referentialConstraint.setReferencedProperty(constraint.getDependent().getPropertyRefs().get(i).getName());
+          referentialConstraints.add(new EdmReferentialConstraintImpl(edm, referentialConstraint));
         }
       }
     }
     return referentialConstraints;
   }
 
+  @Override
+  public FullQualifiedName getAnnotationsTargetFQN() {
+    return null;
+  }
+
+  @Override
+  public List<EdmAnnotation> getAnnotations() {
+    return Collections.<EdmAnnotation>emptyList();
+  }
+
 }

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/726fbe52/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/v3/EdmOperationProxy.java
----------------------------------------------------------------------
diff --git a/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/v3/EdmOperationProxy.java b/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/v3/EdmOperationProxy.java
index 353e916..b2dfa4b 100644
--- a/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/v3/EdmOperationProxy.java
+++ b/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/v3/EdmOperationProxy.java
@@ -18,7 +18,9 @@
  */
 package org.apache.olingo.client.core.edm.v3;
 
+import org.apache.olingo.client.core.edm.xml.v3.ReturnTypeProxy;
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.List;
 
 import org.apache.olingo.client.api.edm.xml.CommonParameter;
@@ -27,6 +29,7 @@ import org.apache.olingo.client.api.edm.xml.v3.Parameter;
 import org.apache.olingo.client.core.edm.EdmParameterImpl;
 import org.apache.olingo.client.core.edm.EdmReturnTypeImpl;
 import org.apache.olingo.commons.api.edm.Edm;
+import org.apache.olingo.commons.api.edm.EdmAnnotation;
 import org.apache.olingo.commons.api.edm.EdmParameter;
 import org.apache.olingo.commons.api.edm.FullQualifiedName;
 import org.apache.olingo.commons.api.edm.constants.EdmTypeKind;
@@ -40,7 +43,7 @@ public class EdmOperationProxy extends AbstractEdmOperation {
     final List<Parameter> parameters = instance.functionImport.getParameters();
     final List<EdmParameter> _parameters = new ArrayList<EdmParameter>(parameters.size());
     for (CommonParameter parameter : parameters) {
-      _parameters.add(EdmParameterImpl.getInstance(instance.edm, parameter));
+      _parameters.add(new EdmParameterImpl(instance.edm, parameter));
     }
     instance.setParameters(_parameters);
 
@@ -74,4 +77,9 @@ public class EdmOperationProxy extends AbstractEdmOperation {
     return null;
   }
 
+  @Override
+  public List<EdmAnnotation> getAnnotations() {
+    return Collections.<EdmAnnotation>emptyList();
+  }
+
 }

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/726fbe52/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/v3/EdmServiceMetadataImpl.java
----------------------------------------------------------------------
diff --git a/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/v3/EdmServiceMetadataImpl.java b/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/v3/EdmServiceMetadataImpl.java
index 9b7157b..01b4a87 100644
--- a/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/v3/EdmServiceMetadataImpl.java
+++ b/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/v3/EdmServiceMetadataImpl.java
@@ -43,8 +43,8 @@ public class EdmServiceMetadataImpl extends AbstractEdmServiceMetadataImpl {
   }
 
   @Override
-  public String getDataServiceVersion() {
-    return SERVICE_VERSION.toString();
+  public ODataServiceVersion getDataServiceVersion() {
+    return SERVICE_VERSION;
   }
 
   @Override

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/726fbe52/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/v3/ReturnTypeProxy.java
----------------------------------------------------------------------
diff --git a/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/v3/ReturnTypeProxy.java b/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/v3/ReturnTypeProxy.java
deleted file mode 100644
index 79baae3..0000000
--- a/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/v3/ReturnTypeProxy.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.olingo.client.core.edm.v3;
-
-import org.apache.olingo.client.api.edm.xml.v3.FunctionImport;
-import org.apache.olingo.client.api.edm.xml.v4.ReturnType;
-
-public class ReturnTypeProxy implements ReturnType {
-
-  private final FunctionImport functionImport;
-
-  public ReturnTypeProxy(final FunctionImport functionImport) {
-    this.functionImport = functionImport;
-  }
-
-  @Override
-  public Integer getMaxLength() {
-    return null;
-  }
-
-  @Override
-  public Integer getPrecision() {
-    return null;
-  }
-
-  @Override
-  public Integer getScale() {
-    return null;
-  }
-
-  @Override
-  public String getSrid() {
-    return null;
-  }
-
-  @Override
-  public String getType() {
-    return functionImport.getReturnType();
-  }
-
-  @Override
-  public boolean isNullable() {
-    return false;
-  }
-
-}

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/726fbe52/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/v4/EdmServiceMetadataImpl.java
----------------------------------------------------------------------
diff --git a/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/v4/EdmServiceMetadataImpl.java b/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/v4/EdmServiceMetadataImpl.java
index 25236be..d01b991 100644
--- a/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/v4/EdmServiceMetadataImpl.java
+++ b/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/v4/EdmServiceMetadataImpl.java
@@ -48,8 +48,8 @@ public class EdmServiceMetadataImpl extends AbstractEdmServiceMetadataImpl {
   }
 
   @Override
-  public String getDataServiceVersion() {
-    return SERVICE_VERSION.toString();
+  public ODataServiceVersion getDataServiceVersion() {
+    return SERVICE_VERSION;
   }
 
   @Override

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/726fbe52/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/v4/annotation/EdmCastImpl.java
----------------------------------------------------------------------
diff --git a/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/v4/annotation/EdmCastImpl.java b/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/v4/annotation/EdmCastImpl.java
new file mode 100644
index 0000000..0c05155
--- /dev/null
+++ b/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/v4/annotation/EdmCastImpl.java
@@ -0,0 +1,80 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.olingo.client.core.edm.v4.annotation;
+
+import org.apache.olingo.client.api.edm.xml.v4.annotation.Cast;
+import org.apache.olingo.commons.api.edm.Edm;
+import org.apache.olingo.commons.api.edm.EdmType;
+import org.apache.olingo.commons.api.edm.annotation.EdmCast;
+import org.apache.olingo.commons.api.edm.annotation.EdmDynamicAnnotationExpression;
+import org.apache.olingo.commons.api.edm.geo.SRID;
+import org.apache.olingo.commons.core.edm.EdmTypeInfo;
+import org.apache.olingo.commons.core.edm.annotation.AbstractEdmAnnotatableDynamicAnnotationExpression;
+
+public class EdmCastImpl extends AbstractEdmAnnotatableDynamicAnnotationExpression implements EdmCast {
+
+  private final Edm edm;
+
+  private final Cast cast;
+
+  private final EdmDynamicAnnotationExpression value;
+
+  private EdmType type;
+
+  public EdmCastImpl(final Edm edm, final Cast cast, final EdmDynamicAnnotationExpression value) {
+    this.edm = edm;
+    this.cast = cast;
+    this.value = value;
+  }
+
+  @Override
+  public Integer getMaxLength() {
+    return cast.getMaxLength();
+  }
+
+  @Override
+  public Integer getPrecision() {
+    return cast.getPrecision();
+  }
+
+  @Override
+  public Integer getScale() {
+    return cast.getScale();
+  }
+
+  @Override
+  public SRID getSrid() {
+    return cast.getSrid();
+  }
+
+  @Override
+  public EdmType getType() {
+    if (type == null) {
+      final EdmTypeInfo typeInfo = new EdmTypeInfo.Builder().setEdm(edm).setTypeExpression(cast.getType()).build();
+      type = typeInfo.getType();
+    }
+    return type;
+  }
+
+  @Override
+  public EdmDynamicAnnotationExpression getValue() {
+    return value;
+  }
+
+}

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/726fbe52/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/v4/annotation/EdmConstantAnnotationExpressionImpl.java
----------------------------------------------------------------------
diff --git a/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/v4/annotation/EdmConstantAnnotationExpressionImpl.java b/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/v4/annotation/EdmConstantAnnotationExpressionImpl.java
new file mode 100644
index 0000000..c53d0e8
--- /dev/null
+++ b/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/v4/annotation/EdmConstantAnnotationExpressionImpl.java
@@ -0,0 +1,137 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.olingo.client.core.edm.v4.annotation;
+
+import java.util.ArrayList;
+import java.util.List;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.olingo.client.api.edm.xml.v4.annotation.ConstantAnnotationExpression;
+import org.apache.olingo.commons.api.domain.v4.ODataEnumValue;
+import org.apache.olingo.commons.api.domain.v4.ODataValue;
+import org.apache.olingo.commons.api.edm.Edm;
+import org.apache.olingo.commons.api.edm.EdmPrimitiveTypeKind;
+import org.apache.olingo.commons.api.edm.annotation.EdmConstantAnnotationExpression;
+import org.apache.olingo.commons.api.edm.annotation.EdmDynamicAnnotationExpression;
+import org.apache.olingo.commons.core.domain.v4.ODataCollectionValueImpl;
+import org.apache.olingo.commons.core.domain.v4.ODataEnumValueImpl;
+import org.apache.olingo.commons.core.domain.v4.ODataPrimitiveValueImpl;
+
+public class EdmConstantAnnotationExpressionImpl implements EdmConstantAnnotationExpression {
+
+  private final ODataValue value;
+
+  public EdmConstantAnnotationExpressionImpl(final Edm edm, final ConstantAnnotationExpression constExprConstruct) {
+    if (constExprConstruct.getType() == ConstantAnnotationExpression.Type.EnumMember) {
+      final List<ODataEnumValue> enumValues = new ArrayList<ODataEnumValue>();
+      String enumTypeName = null;
+      for (String split : StringUtils.split(constExprConstruct.getValue(), ' ')) {
+        final String[] enumSplit = StringUtils.split(split, '/');
+        enumTypeName = enumSplit[0];
+        enumValues.add(new ODataEnumValueImpl(enumSplit[0], enumSplit[1]));
+      }
+      if (enumValues.size() == 1) {
+        value = enumValues.get(0);
+      } else {
+        final ODataCollectionValueImpl collValue = new ODataCollectionValueImpl(enumTypeName);
+        for (ODataValue enumValue : enumValues) {
+          collValue.add(enumValue);
+        }
+        value = collValue;
+      }
+    } else {
+      final ODataPrimitiveValueImpl.BuilderImpl primitiveValueBuilder =
+              new ODataPrimitiveValueImpl.BuilderImpl(edm.getServiceMetadata().getDataServiceVersion());
+      primitiveValueBuilder.setText(constExprConstruct.getValue());
+
+      switch (constExprConstruct.getType()) {
+        case Binary:
+          primitiveValueBuilder.setType(EdmPrimitiveTypeKind.Binary);
+          break;
+
+        case Bool:
+          primitiveValueBuilder.setType(EdmPrimitiveTypeKind.Boolean);
+          break;
+
+        case Date:
+          primitiveValueBuilder.setType(EdmPrimitiveTypeKind.Date);
+          break;
+
+        case DateTimeOffset:
+          primitiveValueBuilder.setType(EdmPrimitiveTypeKind.DateTimeOffset);
+          break;
+
+        case Decimal:
+          primitiveValueBuilder.setType(EdmPrimitiveTypeKind.Decimal);
+          break;
+
+        case Duration:
+          primitiveValueBuilder.setType(EdmPrimitiveTypeKind.Duration);
+          break;
+
+        case Float:
+          primitiveValueBuilder.setType(EdmPrimitiveTypeKind.Single);
+          break;
+
+        case Guid:
+          primitiveValueBuilder.setType(EdmPrimitiveTypeKind.Guid);
+          break;
+
+        case Int:
+          primitiveValueBuilder.setType(EdmPrimitiveTypeKind.Int32);
+          break;
+
+        case TimeOfDay:
+          primitiveValueBuilder.setType(EdmPrimitiveTypeKind.TimeOfDay);
+          break;
+
+        case String:
+        default:
+          primitiveValueBuilder.setType(EdmPrimitiveTypeKind.String);
+      }
+
+      value = primitiveValueBuilder.build();
+    }
+  }
+
+  @Override
+  public boolean isConstant() {
+    return true;
+  }
+
+  @Override
+  public EdmConstantAnnotationExpression asConstant() {
+    return this;
+  }
+
+  @Override
+  public boolean isDynamic() {
+    return false;
+  }
+
+  @Override
+  public EdmDynamicAnnotationExpression asDynamic() {
+    return null;
+  }
+
+  @Override
+  public ODataValue getValue() {
+    return value;
+  }
+
+}

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/726fbe52/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/v4/annotation/EdmIsOfImpl.java
----------------------------------------------------------------------
diff --git a/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/v4/annotation/EdmIsOfImpl.java b/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/v4/annotation/EdmIsOfImpl.java
new file mode 100644
index 0000000..2d00e79
--- /dev/null
+++ b/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/v4/annotation/EdmIsOfImpl.java
@@ -0,0 +1,80 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.olingo.client.core.edm.v4.annotation;
+
+import org.apache.olingo.client.api.edm.xml.v4.annotation.IsOf;
+import org.apache.olingo.commons.api.edm.Edm;
+import org.apache.olingo.commons.api.edm.EdmType;
+import org.apache.olingo.commons.api.edm.annotation.EdmDynamicAnnotationExpression;
+import org.apache.olingo.commons.api.edm.annotation.EdmIsOf;
+import org.apache.olingo.commons.api.edm.geo.SRID;
+import org.apache.olingo.commons.core.edm.EdmTypeInfo;
+import org.apache.olingo.commons.core.edm.annotation.AbstractEdmAnnotatableDynamicAnnotationExpression;
+
+public class EdmIsOfImpl extends AbstractEdmAnnotatableDynamicAnnotationExpression implements EdmIsOf {
+
+  private final Edm edm;
+
+  private final IsOf isOf;
+
+  private final EdmDynamicAnnotationExpression value;
+
+  private EdmType type;
+
+  public EdmIsOfImpl(final Edm edm, final IsOf isOf, final EdmDynamicAnnotationExpression value) {
+    this.edm = edm;
+    this.isOf = isOf;
+    this.value = value;
+  }
+
+  @Override
+  public Integer getMaxLength() {
+    return isOf.getMaxLength();
+  }
+
+  @Override
+  public Integer getPrecision() {
+    return isOf.getPrecision();
+  }
+
+  @Override
+  public Integer getScale() {
+    return isOf.getScale();
+  }
+
+  @Override
+  public SRID getSrid() {
+    return isOf.getSrid();
+  }
+
+  @Override
+  public EdmType getType() {
+    if (type == null) {
+      final EdmTypeInfo typeInfo = new EdmTypeInfo.Builder().setEdm(edm).setTypeExpression(isOf.getType()).build();
+      type = typeInfo.getType();
+    }
+    return type;
+  }
+
+  @Override
+  public EdmDynamicAnnotationExpression getValue() {
+    return value;
+  }
+
+}

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/726fbe52/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/v4/annotation/EdmRecordImpl.java
----------------------------------------------------------------------
diff --git a/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/v4/annotation/EdmRecordImpl.java b/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/v4/annotation/EdmRecordImpl.java
new file mode 100644
index 0000000..270cf87
--- /dev/null
+++ b/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/v4/annotation/EdmRecordImpl.java
@@ -0,0 +1,55 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.olingo.client.core.edm.v4.annotation;
+
+import java.util.List;
+import org.apache.olingo.commons.api.edm.Edm;
+import org.apache.olingo.commons.api.edm.EdmStructuredType;
+import org.apache.olingo.commons.api.edm.annotation.EdmPropertyValue;
+import org.apache.olingo.commons.api.edm.annotation.EdmRecord;
+import org.apache.olingo.commons.core.edm.EdmTypeInfo;
+import org.apache.olingo.commons.core.edm.annotation.AbstractEdmAnnotatableDynamicAnnotationExpression;
+
+public class EdmRecordImpl extends AbstractEdmAnnotatableDynamicAnnotationExpression implements EdmRecord {
+
+  private final Edm edm;
+
+  private final List<EdmPropertyValue> propertyValues;
+
+  private final EdmStructuredType type;
+
+  public EdmRecordImpl(final Edm edm, final String type, final List<EdmPropertyValue> propertyValues) {
+    this.edm = edm;
+    this.propertyValues = propertyValues;
+
+    final EdmTypeInfo typeInfo = new EdmTypeInfo.Builder().setEdm(edm).setTypeExpression(type).build();
+    this.type = typeInfo.getEntityType() == null ? typeInfo.getComplexType() : typeInfo.getEntityType();
+  }
+
+  @Override
+  public List<EdmPropertyValue> getPropertyValues() {
+    return propertyValues;
+  }
+
+  @Override
+  public EdmStructuredType getType() {
+    return type;
+  }
+
+}

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/726fbe52/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/xml/AbstractEdmDeserializer.java
----------------------------------------------------------------------
diff --git a/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/xml/AbstractEdmDeserializer.java b/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/xml/AbstractEdmDeserializer.java
index e21436f..edfda03 100644
--- a/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/xml/AbstractEdmDeserializer.java
+++ b/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/xml/AbstractEdmDeserializer.java
@@ -27,7 +27,7 @@ import com.fasterxml.jackson.dataformat.xml.deser.FromXmlParser;
 import java.io.IOException;
 
 import org.apache.olingo.client.core.edm.xml.v4.ReturnTypeImpl;
-import org.apache.olingo.client.core.edm.xml.v4.annotation.ConstExprConstructImpl;
+import org.apache.olingo.client.core.edm.xml.v4.annotation.ConstantAnnotationExpressionImpl;
 import org.apache.olingo.commons.api.edm.constants.ODataServiceVersion;
 
 public abstract class AbstractEdmDeserializer<T> extends JsonDeserializer<T> {
@@ -35,12 +35,12 @@ public abstract class AbstractEdmDeserializer<T> extends JsonDeserializer<T> {
   protected ODataServiceVersion version;
 
   protected boolean isAnnotationConstExprConstruct(final JsonParser jp) throws IOException {
-    return ConstExprConstructImpl.Type.fromString(jp.getCurrentName()) != null;
+    return ConstantAnnotationExpressionImpl.Type.fromString(jp.getCurrentName()) != null;
   }
 
-  protected ConstExprConstructImpl parseAnnotationConstExprConstruct(final JsonParser jp) throws IOException {
-    final ConstExprConstructImpl constExpr = new ConstExprConstructImpl();
-    constExpr.setType(ConstExprConstructImpl.Type.fromString(jp.getCurrentName()));
+  protected ConstantAnnotationExpressionImpl parseAnnotationConstExprConstruct(final JsonParser jp) throws IOException {
+    final ConstantAnnotationExpressionImpl constExpr = new ConstantAnnotationExpressionImpl();
+    constExpr.setType(ConstantAnnotationExpressionImpl.Type.fromString(jp.getCurrentName()));
     constExpr.setValue(jp.nextTextValue());
     return constExpr;
   }

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/726fbe52/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/xml/AbstractProperty.java
----------------------------------------------------------------------
diff --git a/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/xml/AbstractProperty.java b/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/xml/AbstractProperty.java
index 8d4da80..b4e88eb 100644
--- a/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/xml/AbstractProperty.java
+++ b/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/xml/AbstractProperty.java
@@ -21,6 +21,7 @@ package org.apache.olingo.client.core.edm.xml;
 import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
 
 import org.apache.olingo.client.api.edm.xml.CommonProperty;
+import org.apache.olingo.commons.api.edm.geo.SRID;
 
 @JsonDeserialize(using = PropertyDeserializer.class)
 public abstract class AbstractProperty extends AbstractEdmItem implements CommonProperty {
@@ -43,7 +44,7 @@ public abstract class AbstractProperty extends AbstractEdmItem implements Common
 
   private boolean unicode = true;
 
-  private String srid;
+  private SRID srid;
 
   @Override
   public String getName() {
@@ -118,11 +119,11 @@ public abstract class AbstractProperty extends AbstractEdmItem implements Common
   }
 
   @Override
-  public String getSrid() {
+  public SRID getSrid() {
     return srid;
   }
 
-  public void setSrid(final String srid) {
+  public void setSrid(final SRID srid) {
     this.srid = srid;
   }
 }

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/726fbe52/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/xml/ComplexTypeDeserializer.java
----------------------------------------------------------------------
diff --git a/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/xml/ComplexTypeDeserializer.java b/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/xml/ComplexTypeDeserializer.java
index ea62ba4..97d7d0b 100644
--- a/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/xml/ComplexTypeDeserializer.java
+++ b/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/xml/ComplexTypeDeserializer.java
@@ -71,8 +71,8 @@ public class ComplexTypeDeserializer extends AbstractEdmDeserializer<AbstractCom
                                   org.apache.olingo.client.core.edm.xml.v4.NavigationPropertyImpl.class));
         } else if ("Annotation".equals(jp.getCurrentName())) {
           jp.nextToken();
-          ((org.apache.olingo.client.core.edm.xml.v4.ComplexTypeImpl) complexType).
-                  setAnnotation(jp.readValueAs(AnnotationImpl.class));
+          ((org.apache.olingo.client.core.edm.xml.v4.ComplexTypeImpl) complexType).getAnnotations().
+                  add(jp.readValueAs(AnnotationImpl.class));
         }
       }
     }

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/726fbe52/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/xml/EntityContainerDeserializer.java
----------------------------------------------------------------------
diff --git a/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/xml/EntityContainerDeserializer.java b/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/xml/EntityContainerDeserializer.java
index f626365..5914060 100644
--- a/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/xml/EntityContainerDeserializer.java
+++ b/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/xml/EntityContainerDeserializer.java
@@ -90,8 +90,8 @@ public class EntityContainerDeserializer extends AbstractEdmDeserializer<Abstrac
           }
         } else if ("Annotation".equals(jp.getCurrentName())) {
           jp.nextToken();
-          ((org.apache.olingo.client.core.edm.xml.v4.EntityContainerImpl) entityContainer).
-                  setAnnotation(jp.readValueAs(AnnotationImpl.class));
+          ((org.apache.olingo.client.core.edm.xml.v4.EntityContainerImpl) entityContainer).getAnnotations().
+                  add(jp.readValueAs(AnnotationImpl.class));
         }
       }
     }

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/726fbe52/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/xml/EntitySetDeserializer.java
----------------------------------------------------------------------
diff --git a/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/xml/EntitySetDeserializer.java b/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/xml/EntitySetDeserializer.java
index c71f4de..5f913d4 100644
--- a/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/xml/EntitySetDeserializer.java
+++ b/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/xml/EntitySetDeserializer.java
@@ -57,8 +57,8 @@ public class EntitySetDeserializer extends AbstractEdmDeserializer<AbstractEntit
                           jp.readValueAs(NavigationPropertyBindingImpl.class));
         } else if ("Annotation".equals(jp.getCurrentName())) {
           jp.nextToken();
-          ((org.apache.olingo.client.core.edm.xml.v4.EntitySetImpl) entitySet).
-                  setAnnotation(jp.readValueAs(AnnotationImpl.class));
+          ((org.apache.olingo.client.core.edm.xml.v4.EntitySetImpl) entitySet).getAnnotations().
+                  add(jp.readValueAs(AnnotationImpl.class));
         }
       }
     }

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/726fbe52/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/xml/EntityTypeDeserializer.java
----------------------------------------------------------------------
diff --git a/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/xml/EntityTypeDeserializer.java b/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/xml/EntityTypeDeserializer.java
index a55a9e0..3b9b28d 100644
--- a/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/xml/EntityTypeDeserializer.java
+++ b/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/xml/EntityTypeDeserializer.java
@@ -59,12 +59,10 @@ public class EntityTypeDeserializer extends AbstractEdmDeserializer<AbstractEnti
           jp.nextToken();
           if (entityType instanceof org.apache.olingo.client.core.edm.xml.v3.EntityTypeImpl) {
             ((org.apache.olingo.client.core.edm.xml.v3.EntityTypeImpl) entityType).
-                    getProperties().add(jp.readValueAs(
-                                    org.apache.olingo.client.core.edm.xml.v3.PropertyImpl.class));
+                    getProperties().add(jp.readValueAs(org.apache.olingo.client.core.edm.xml.v3.PropertyImpl.class));
           } else {
             ((org.apache.olingo.client.core.edm.xml.v4.EntityTypeImpl) entityType).
-                    getProperties().add(jp.readValueAs(
-                                    org.apache.olingo.client.core.edm.xml.v4.PropertyImpl.class));
+                    getProperties().add(jp.readValueAs(org.apache.olingo.client.core.edm.xml.v4.PropertyImpl.class));
           }
         } else if ("NavigationProperty".equals(jp.getCurrentName())) {
           jp.nextToken();
@@ -79,8 +77,8 @@ public class EntityTypeDeserializer extends AbstractEdmDeserializer<AbstractEnti
           }
         } else if ("Annotation".equals(jp.getCurrentName())) {
           jp.nextToken();
-          ((org.apache.olingo.client.core.edm.xml.v4.EntityTypeImpl) entityType).
-                  setAnnotation(jp.readValueAs(AnnotationImpl.class));
+          ((org.apache.olingo.client.core.edm.xml.v4.EntityTypeImpl) entityType).getAnnotations().
+                  add(jp.readValueAs(AnnotationImpl.class));
         }
       }
     }

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/726fbe52/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/xml/EnumTypeDeserializer.java
----------------------------------------------------------------------
diff --git a/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/xml/EnumTypeDeserializer.java b/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/xml/EnumTypeDeserializer.java
index 7a8f888..954533f 100644
--- a/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/xml/EnumTypeDeserializer.java
+++ b/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/xml/EnumTypeDeserializer.java
@@ -61,8 +61,8 @@ public class EnumTypeDeserializer extends AbstractEdmDeserializer<AbstractEnumTy
           }
         } else if ("Annotation".equals(jp.getCurrentName())) {
           jp.nextToken();
-          ((org.apache.olingo.client.core.edm.xml.v4.EnumTypeImpl) enumType).
-                  setAnnotation(jp.readValueAs(AnnotationImpl.class));
+          ((org.apache.olingo.client.core.edm.xml.v4.EnumTypeImpl) enumType).getAnnotations().
+                  add(jp.readValueAs(AnnotationImpl.class));
         }
       }
     }

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/726fbe52/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/xml/ParameterDeserializer.java
----------------------------------------------------------------------
diff --git a/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/xml/ParameterDeserializer.java b/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/xml/ParameterDeserializer.java
index 68baf15..4980def 100644
--- a/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/xml/ParameterDeserializer.java
+++ b/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/xml/ParameterDeserializer.java
@@ -27,7 +27,9 @@ import java.io.IOException;
 
 import org.apache.commons.lang3.BooleanUtils;
 import org.apache.olingo.client.api.edm.xml.v3.ParameterMode;
+import org.apache.olingo.client.core.edm.xml.v4.AnnotationImpl;
 import org.apache.olingo.commons.api.edm.constants.ODataServiceVersion;
+import org.apache.olingo.commons.api.edm.geo.SRID;
 
 public class ParameterDeserializer extends AbstractEdmDeserializer<AbstractParameter> {
 
@@ -60,7 +62,14 @@ public class ParameterDeserializer extends AbstractEdmDeserializer<AbstractParam
           ((org.apache.olingo.client.core.edm.xml.v3.ParameterImpl) parameter).
                   setMode(ParameterMode.valueOf(jp.nextTextValue()));
         } else if ("SRID".equals(jp.getCurrentName())) {
-          ((org.apache.olingo.client.core.edm.xml.v4.ParameterImpl) parameter).setSrid(jp.nextTextValue());
+          final String srid = jp.nextTextValue();
+          if (srid != null) {
+            ((org.apache.olingo.client.core.edm.xml.v4.ParameterImpl) parameter).setSrid(SRID.valueOf(srid));
+          }
+        } else if ("Annotation".equals(jp.getCurrentName())) {
+          jp.nextToken();
+          ((org.apache.olingo.client.core.edm.xml.v4.ParameterImpl) parameter).getAnnotations().
+                  add(jp.readValueAs(AnnotationImpl.class));
         }
       }
     }

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/726fbe52/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/xml/PropertyDeserializer.java
----------------------------------------------------------------------
diff --git a/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/xml/PropertyDeserializer.java b/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/xml/PropertyDeserializer.java
index 4b6c2bd..7a40fad 100644
--- a/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/xml/PropertyDeserializer.java
+++ b/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/xml/PropertyDeserializer.java
@@ -31,6 +31,7 @@ import com.fasterxml.jackson.core.JsonParser;
 import com.fasterxml.jackson.core.JsonProcessingException;
 import com.fasterxml.jackson.core.JsonToken;
 import com.fasterxml.jackson.databind.DeserializationContext;
+import org.apache.olingo.commons.api.edm.geo.SRID;
 
 public class PropertyDeserializer extends AbstractEdmDeserializer<AbstractProperty> {
 
@@ -74,7 +75,10 @@ public class PropertyDeserializer extends AbstractEdmDeserializer<AbstractProper
                     setCollation(jp.nextTextValue());
           }
         } else if ("SRID".equals(jp.getCurrentName())) {
-          property.setSrid(jp.nextTextValue());
+          final String srid = jp.nextTextValue();
+          if (srid != null) {
+            property.setSrid(SRID.valueOf(srid));
+          }
         } else if ("ConcurrencyMode".equals(jp.getCurrentName())) {
           if (property instanceof org.apache.olingo.client.core.edm.xml.v3.PropertyImpl) {
             ((org.apache.olingo.client.core.edm.xml.v3.PropertyImpl) property).
@@ -116,8 +120,9 @@ public class PropertyDeserializer extends AbstractEdmDeserializer<AbstractProper
                     setFcKeepInContent(BooleanUtils.toBoolean(jp.nextTextValue()));
           }
         } else if ("Annotation".equals(jp.getCurrentName())) {
-          ((org.apache.olingo.client.core.edm.xml.v4.PropertyImpl) property).
-                  setAnnotation(jp.readValueAs(AnnotationImpl.class));
+          jp.nextToken();
+          ((org.apache.olingo.client.core.edm.xml.v4.PropertyImpl) property).getAnnotations().
+                  add(jp.readValueAs(AnnotationImpl.class));
         }
       }
     }

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/726fbe52/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/xml/SchemaDeserializer.java
----------------------------------------------------------------------
diff --git a/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/xml/SchemaDeserializer.java b/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/xml/SchemaDeserializer.java
index abdfa33..683e3ca 100644
--- a/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/xml/SchemaDeserializer.java
+++ b/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/xml/SchemaDeserializer.java
@@ -106,7 +106,7 @@ public class SchemaDeserializer extends AbstractEdmDeserializer<AbstractSchema>
                                     org.apache.olingo.client.core.edm.xml.v3.EntityContainerImpl.class));
           } else {
             org.apache.olingo.client.core.edm.xml.v4.EntityContainerImpl entityContainer =
-                     jp.readValueAs(
+                    jp.readValueAs(
                             org.apache.olingo.client.core.edm.xml.v4.EntityContainerImpl.class);
             entityContainer.setDefaultEntityContainer(true);
             ((org.apache.olingo.client.core.edm.xml.v4.SchemaImpl) schema).
@@ -115,13 +115,11 @@ public class SchemaDeserializer extends AbstractEdmDeserializer<AbstractSchema>
         } else if ("Annotations".equals(jp.getCurrentName())) {
           jp.nextToken();
           if (schema instanceof org.apache.olingo.client.core.edm.xml.v3.SchemaImpl) {
-            ((org.apache.olingo.client.core.edm.xml.v3.SchemaImpl) schema).getAnnotationsList().
-                    add(jp.readValueAs(
-                                    org.apache.olingo.client.core.edm.xml.v3.AnnotationsImpl.class));
+            ((org.apache.olingo.client.core.edm.xml.v3.SchemaImpl) schema).getAnnotationGroups().
+                    add(jp.readValueAs(org.apache.olingo.client.core.edm.xml.v3.AnnotationsImpl.class));
           } else {
-            ((org.apache.olingo.client.core.edm.xml.v4.SchemaImpl) schema).getAnnotationsList().
-                    add(jp.readValueAs(
-                                    org.apache.olingo.client.core.edm.xml.v4.AnnotationsImpl.class));
+            ((org.apache.olingo.client.core.edm.xml.v4.SchemaImpl) schema).getAnnotationGroups().
+                    add(jp.readValueAs(org.apache.olingo.client.core.edm.xml.v4.AnnotationsImpl.class));
           }
         } else if ("Action".equals(jp.getCurrentName())) {
           jp.nextToken();

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/726fbe52/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/xml/v3/ReturnTypeProxy.java
----------------------------------------------------------------------
diff --git a/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/xml/v3/ReturnTypeProxy.java b/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/xml/v3/ReturnTypeProxy.java
new file mode 100644
index 0000000..c10abb1
--- /dev/null
+++ b/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/xml/v3/ReturnTypeProxy.java
@@ -0,0 +1,63 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.olingo.client.core.edm.xml.v3;
+
+import org.apache.olingo.client.api.edm.xml.v3.FunctionImport;
+import org.apache.olingo.client.api.edm.xml.v4.ReturnType;
+import org.apache.olingo.commons.api.edm.geo.SRID;
+
+public class ReturnTypeProxy implements ReturnType {
+
+  private final FunctionImport functionImport;
+
+  public ReturnTypeProxy(final FunctionImport functionImport) {
+    this.functionImport = functionImport;
+  }
+
+  @Override
+  public Integer getMaxLength() {
+    return null;
+  }
+
+  @Override
+  public Integer getPrecision() {
+    return null;
+  }
+
+  @Override
+  public Integer getScale() {
+    return null;
+  }
+
+  @Override
+  public SRID getSrid() {
+    return null;
+  }
+
+  @Override
+  public String getType() {
+    return functionImport.getReturnType();
+  }
+
+  @Override
+  public boolean isNullable() {
+    return false;
+  }
+
+}

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/726fbe52/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/xml/v3/SchemaImpl.java
----------------------------------------------------------------------
diff --git a/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/xml/v3/SchemaImpl.java b/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/xml/v3/SchemaImpl.java
index 9f6bba4..e8a5650 100644
--- a/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/xml/v3/SchemaImpl.java
+++ b/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/xml/v3/SchemaImpl.java
@@ -57,14 +57,14 @@ public class SchemaImpl extends AbstractSchema implements Schema {
   }
 
   @Override
-  public List<Annotations> getAnnotationsList() {
+  public List<Annotations> getAnnotationGroups() {
     return annotationList;
   }
 
   @Override
-  public Annotations getAnnotationsList(final String target) {
+  public Annotations getAnnotationGroup(final String target) {
     Annotations result = null;
-    for (Annotations annots : getAnnotationsList()) {
+    for (Annotations annots : getAnnotationGroups()) {
       if (target.equals(annots.getTarget())) {
         result = annots;
       }

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/726fbe52/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/xml/v4/AbstractAnnotatable.java
----------------------------------------------------------------------
diff --git a/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/xml/v4/AbstractAnnotatable.java b/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/xml/v4/AbstractAnnotatable.java
new file mode 100644
index 0000000..ea6d837
--- /dev/null
+++ b/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/xml/v4/AbstractAnnotatable.java
@@ -0,0 +1,39 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.olingo.client.core.edm.xml.v4;
+
+import org.apache.olingo.client.api.edm.xml.v4.Annotatable;
+import org.apache.olingo.client.api.edm.xml.v4.Annotation;
+import org.apache.olingo.client.core.edm.xml.AbstractEdmItem;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public abstract class AbstractAnnotatable extends AbstractEdmItem implements Annotatable {
+
+  private static final long serialVersionUID = -8859729466090997718L;
+
+  private final List<Annotation> annotations = new ArrayList<Annotation>();
+
+  @Override
+  public List<Annotation> getAnnotations() {
+    return annotations;
+  }
+
+}

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/726fbe52/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/xml/v4/AbstractAnnotatedEdmItem.java
----------------------------------------------------------------------
diff --git a/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/xml/v4/AbstractAnnotatedEdmItem.java b/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/xml/v4/AbstractAnnotatedEdmItem.java
deleted file mode 100644
index 18b01be..0000000
--- a/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/xml/v4/AbstractAnnotatedEdmItem.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.olingo.client.core.edm.xml.v4;
-
-import org.apache.olingo.client.api.edm.xml.v4.AnnotatedEdmItem;
-import org.apache.olingo.client.api.edm.xml.v4.Annotation;
-import org.apache.olingo.client.core.edm.xml.AbstractEdmItem;
-
-import com.fasterxml.jackson.annotation.JsonIgnore;
-import com.fasterxml.jackson.annotation.JsonProperty;
-
-public abstract class AbstractAnnotatedEdmItem extends AbstractEdmItem implements AnnotatedEdmItem {
-
-  private static final long serialVersionUID = -8859729466090997718L;
-
-  @JsonProperty("Annotation")
-  private AnnotationImpl annotation;
-
-  @Override
-  public AnnotationImpl getAnnotation() {
-    return annotation;
-  }
-
-  @JsonIgnore
-  public void setAnnotation(final Annotation annotation) {
-    this.annotation = (AnnotationImpl) annotation;
-  }
-
-}

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/726fbe52/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/xml/v4/ActionDeserializer.java
----------------------------------------------------------------------
diff --git a/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/xml/v4/ActionDeserializer.java b/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/xml/v4/ActionDeserializer.java
index fd0c214..41399a9 100644
--- a/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/xml/v4/ActionDeserializer.java
+++ b/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/xml/v4/ActionDeserializer.java
@@ -52,7 +52,7 @@ public class ActionDeserializer extends AbstractEdmDeserializer<ActionImpl> {
           action.setReturnType(parseReturnType(jp, "Action"));
         } else if ("Annotation".equals(jp.getCurrentName())) {
           jp.nextToken();
-          action.setAnnotation(jp.readValueAs(AnnotationImpl.class));
+          action.getAnnotations().add(jp.readValueAs(AnnotationImpl.class));
         }
       }
     }

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/726fbe52/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/xml/v4/ActionImpl.java
----------------------------------------------------------------------
diff --git a/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/xml/v4/ActionImpl.java b/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/xml/v4/ActionImpl.java
index 9ad13c8..a09eea6 100644
--- a/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/xml/v4/ActionImpl.java
+++ b/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/xml/v4/ActionImpl.java
@@ -28,7 +28,7 @@ import org.apache.olingo.client.api.edm.xml.v4.Parameter;
 import org.apache.olingo.client.api.edm.xml.v4.ReturnType;
 
 @JsonDeserialize(using = ActionDeserializer.class)
-public class ActionImpl extends AbstractAnnotatedEdmItem implements Action {
+public class ActionImpl extends AbstractAnnotatable implements Action {
 
   private static final long serialVersionUID = -99977447455438193L;
 

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/726fbe52/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/xml/v4/ActionImportImpl.java
----------------------------------------------------------------------
diff --git a/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/xml/v4/ActionImportImpl.java b/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/xml/v4/ActionImportImpl.java
index d543998..5a06389 100644
--- a/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/xml/v4/ActionImportImpl.java
+++ b/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/xml/v4/ActionImportImpl.java
@@ -22,7 +22,7 @@ import com.fasterxml.jackson.annotation.JsonProperty;
 
 import org.apache.olingo.client.api.edm.xml.v4.ActionImport;
 
-public class ActionImportImpl extends AbstractAnnotatedEdmItem implements ActionImport {
+public class ActionImportImpl extends AbstractAnnotatable implements ActionImport {
 
   private static final long serialVersionUID = -866422101558426421L;
 

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/726fbe52/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/xml/v4/AnnotationDeserializer.java
----------------------------------------------------------------------
diff --git a/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/xml/v4/AnnotationDeserializer.java b/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/xml/v4/AnnotationDeserializer.java
index 129926d..d9d9e0c 100644
--- a/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/xml/v4/AnnotationDeserializer.java
+++ b/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/xml/v4/AnnotationDeserializer.java
@@ -25,7 +25,7 @@ import com.fasterxml.jackson.databind.DeserializationContext;
 
 import java.io.IOException;
 
-import org.apache.olingo.client.core.edm.xml.v4.annotation.DynExprConstructImpl;
+import org.apache.olingo.client.core.edm.xml.v4.annotation.AbstractDynamicAnnotationExpression;
 import org.apache.olingo.client.core.edm.xml.AbstractEdmDeserializer;
 
 public class AnnotationDeserializer extends AbstractEdmDeserializer<AnnotationImpl> {
@@ -43,12 +43,15 @@ public class AnnotationDeserializer extends AbstractEdmDeserializer<AnnotationIm
           annotation.setTerm(jp.nextTextValue());
         } else if ("Qualifier".equals(jp.getCurrentName())) {
           annotation.setQualifier(jp.nextTextValue());
+        } else if ("Annotation".equals(jp.getCurrentName())) {
+          jp.nextToken();
+          annotation.getAnnotations().add(jp.readValueAs(AnnotationImpl.class));
         } else if (isAnnotationConstExprConstruct(jp)) {
           // Constant Expressions
-          annotation.setConstExpr(parseAnnotationConstExprConstruct(jp));
+          annotation.setAnnotationExpression(parseAnnotationConstExprConstruct(jp));
         } else {
           // Dynamic Expressions
-          annotation.setDynExpr(jp.readValueAs(DynExprConstructImpl.class));
+          annotation.setAnnotationExpression(jp.readValueAs(AbstractDynamicAnnotationExpression.class));
         }
       }
     }

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/726fbe52/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/xml/v4/AnnotationImpl.java
----------------------------------------------------------------------
diff --git a/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/xml/v4/AnnotationImpl.java b/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/xml/v4/AnnotationImpl.java
index d495b8c..c75aa7a 100644
--- a/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/xml/v4/AnnotationImpl.java
+++ b/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/xml/v4/AnnotationImpl.java
@@ -21,12 +21,10 @@ package org.apache.olingo.client.core.edm.xml.v4;
 import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
 
 import org.apache.olingo.client.api.edm.xml.v4.Annotation;
-import org.apache.olingo.client.api.edm.xml.v4.annotation.ConstExprConstruct;
-import org.apache.olingo.client.api.edm.xml.v4.annotation.DynExprConstruct;
-import org.apache.olingo.client.core.edm.xml.AbstractEdmItem;
+import org.apache.olingo.client.api.edm.xml.v4.annotation.AnnotationExpression;
 
 @JsonDeserialize(using = AnnotationDeserializer.class)
-public class AnnotationImpl extends AbstractEdmItem implements Annotation {
+public class AnnotationImpl extends AbstractAnnotatable implements Annotation {
 
   private static final long serialVersionUID = -5600031479702563436L;
 
@@ -34,9 +32,7 @@ public class AnnotationImpl extends AbstractEdmItem implements Annotation {
 
   private String qualifier;
 
-  private ConstExprConstruct constExpr;
-
-  private DynExprConstruct dynExpr;
+  private AnnotationExpression annotationExpression;
 
   @Override
   public String getTerm() {
@@ -57,21 +53,12 @@ public class AnnotationImpl extends AbstractEdmItem implements Annotation {
   }
 
   @Override
-  public ConstExprConstruct getConstExpr() {
-    return constExpr;
-  }
-
-  public void setConstExpr(final ConstExprConstruct constExpr) {
-    this.constExpr = constExpr;
-  }
-
-  @Override
-  public DynExprConstruct getDynExpr() {
-    return dynExpr;
+  public AnnotationExpression getExpression() {
+    return annotationExpression;
   }
 
-  public void setDynExpr(final DynExprConstruct dynExpr) {
-    this.dynExpr = dynExpr;
+  public void setAnnotationExpression(final AnnotationExpression annotationExpression) {
+    this.annotationExpression = annotationExpression;
   }
 
 }

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/726fbe52/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/xml/v4/AnnotationsDeserializer.java
----------------------------------------------------------------------
diff --git a/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/xml/v4/AnnotationsDeserializer.java b/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/xml/v4/AnnotationsDeserializer.java
index 6c8a4f6..5ab7afb 100644
--- a/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/xml/v4/AnnotationsDeserializer.java
+++ b/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/xml/v4/AnnotationsDeserializer.java
@@ -35,7 +35,7 @@ public class AnnotationsDeserializer extends AbstractEdmDeserializer<Annotations
 
     final AnnotationsImpl annotations = new AnnotationsImpl();
 
-    for (; jp.getCurrentToken() != JsonToken.END_OBJECT; jp.nextToken()) {
+    for (; jp.getCurrentToken() != null && jp.getCurrentToken() != JsonToken.END_OBJECT; jp.nextToken()) {
       final JsonToken token = jp.getCurrentToken();
       if (token == JsonToken.FIELD_NAME) {
         if ("Target".equals(jp.getCurrentName())) {
@@ -44,7 +44,7 @@ public class AnnotationsDeserializer extends AbstractEdmDeserializer<Annotations
           annotations.setQualifier(jp.nextTextValue());
         } else if ("Annotation".equals(jp.getCurrentName())) {
           jp.nextToken();
-          annotations.getAnnotations().add(jp.readValueAs( AnnotationImpl.class));
+          annotations.getAnnotations().add(jp.readValueAs(AnnotationImpl.class));
         }
       }
     }

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/726fbe52/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/xml/v4/ComplexTypeImpl.java
----------------------------------------------------------------------
diff --git a/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/xml/v4/ComplexTypeImpl.java b/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/xml/v4/ComplexTypeImpl.java
index b91259a..8a16584 100644
--- a/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/xml/v4/ComplexTypeImpl.java
+++ b/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/xml/v4/ComplexTypeImpl.java
@@ -41,7 +41,7 @@ public class ComplexTypeImpl extends AbstractComplexType implements ComplexType
 
   private final List<NavigationProperty> navigationProperties = new ArrayList<NavigationProperty>();
 
-  private Annotation annotation;
+  private final List<Annotation> annotations = new ArrayList<Annotation>();
 
   @Override
   public boolean isAbstractEntityType() {
@@ -91,12 +91,8 @@ public class ComplexTypeImpl extends AbstractComplexType implements ComplexType
   }
 
   @Override
-  public Annotation getAnnotation() {
-    return annotation;
-  }
-
-  public void setAnnotation(final Annotation annotation) {
-    this.annotation = annotation;
+  public List<Annotation> getAnnotations() {
+    return annotations;
   }
 
 }

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/726fbe52/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/xml/v4/EntityContainerImpl.java
----------------------------------------------------------------------
diff --git a/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/xml/v4/EntityContainerImpl.java b/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/xml/v4/EntityContainerImpl.java
index c67e17d..41640eb 100644
--- a/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/xml/v4/EntityContainerImpl.java
+++ b/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/xml/v4/EntityContainerImpl.java
@@ -19,7 +19,7 @@
 package org.apache.olingo.client.core.edm.xml.v4;
 
 import org.apache.olingo.client.api.edm.xml.v4.ActionImport;
-import org.apache.olingo.client.api.edm.xml.v4.AnnotatedEdmItem;
+import org.apache.olingo.client.api.edm.xml.v4.Annotatable;
 import org.apache.olingo.client.api.edm.xml.v4.Annotation;
 import org.apache.olingo.client.api.edm.xml.v4.EntityContainer;
 import org.apache.olingo.client.api.edm.xml.v4.EntitySet;
@@ -30,7 +30,7 @@ import org.apache.olingo.client.core.edm.xml.AbstractEntityContainer;
 import java.util.ArrayList;
 import java.util.List;
 
-public class EntityContainerImpl extends AbstractEntityContainer implements AnnotatedEdmItem, EntityContainer {
+public class EntityContainerImpl extends AbstractEntityContainer implements Annotatable, EntityContainer {
 
   private static final long serialVersionUID = 2526002525927260320L;
 
@@ -42,7 +42,7 @@ public class EntityContainerImpl extends AbstractEntityContainer implements Anno
 
   private final List<FunctionImport> functionImports = new ArrayList<FunctionImport>();
 
-  private Annotation annotation;
+  private final List<Annotation> annotations = new ArrayList<Annotation>();
 
   @Override
   public void setDefaultEntityContainer(final boolean defaultEntityContainer) {
@@ -118,12 +118,8 @@ public class EntityContainerImpl extends AbstractEntityContainer implements Anno
   }
 
   @Override
-  public Annotation getAnnotation() {
-    return annotation;
-  }
-
-  public void setAnnotation(final Annotation annotation) {
-    this.annotation = annotation;
+  public List<Annotation> getAnnotations() {
+    return annotations;
   }
 
 }

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/726fbe52/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/xml/v4/EntitySetImpl.java
----------------------------------------------------------------------
diff --git a/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/xml/v4/EntitySetImpl.java b/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/xml/v4/EntitySetImpl.java
index 9ef33c7..b79e0eb 100644
--- a/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/xml/v4/EntitySetImpl.java
+++ b/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/xml/v4/EntitySetImpl.java
@@ -32,7 +32,7 @@ public class EntitySetImpl extends AbstractEntitySet implements EntitySet {
 
   private boolean includeInServiceDocument = true;
 
-  private Annotation annotation;
+  private final List<Annotation> annotations = new ArrayList<Annotation>();
 
   private final List<NavigationPropertyBinding> navigationPropertyBindings = new ArrayList<NavigationPropertyBinding>();
 
@@ -51,12 +51,8 @@ public class EntitySetImpl extends AbstractEntitySet implements EntitySet {
   }
 
   @Override
-  public Annotation getAnnotation() {
-    return annotation;
-  }
-
-  public void setAnnotation(final Annotation annotation) {
-    this.annotation = annotation;
+  public List<Annotation> getAnnotations() {
+    return annotations;
   }
 
 }

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/726fbe52/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/xml/v4/EntityTypeImpl.java
----------------------------------------------------------------------
diff --git a/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/xml/v4/EntityTypeImpl.java b/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/xml/v4/EntityTypeImpl.java
index 4de9101..cbe2eea 100644
--- a/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/xml/v4/EntityTypeImpl.java
+++ b/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/xml/v4/EntityTypeImpl.java
@@ -35,7 +35,7 @@ public class EntityTypeImpl extends AbstractEntityType implements EntityType {
 
   private final List<NavigationProperty> navigationProperties = new ArrayList<NavigationProperty>();
 
-  private Annotation annotation;
+  private final List<Annotation> annotations = new ArrayList<Annotation>();
 
   @Override
   public Property getProperty(final String name) {
@@ -58,12 +58,8 @@ public class EntityTypeImpl extends AbstractEntityType implements EntityType {
   }
 
   @Override
-  public Annotation getAnnotation() {
-    return annotation;
-  }
-
-  public void setAnnotation(final Annotation annotation) {
-    this.annotation = annotation;
+  public List<Annotation> getAnnotations() {
+    return annotations;
   }
 
 }

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/726fbe52/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/xml/v4/EnumTypeImpl.java
----------------------------------------------------------------------
diff --git a/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/xml/v4/EnumTypeImpl.java b/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/xml/v4/EnumTypeImpl.java
index 9c9b84d..44a3b89 100644
--- a/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/xml/v4/EnumTypeImpl.java
+++ b/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/xml/v4/EnumTypeImpl.java
@@ -18,23 +18,21 @@
  */
 package org.apache.olingo.client.core.edm.xml.v4;
 
-import org.apache.olingo.client.api.edm.xml.v4.AnnotatedEdmItem;
+import java.util.ArrayList;
+import java.util.List;
+import org.apache.olingo.client.api.edm.xml.v4.Annotatable;
 import org.apache.olingo.client.api.edm.xml.v4.Annotation;
 import org.apache.olingo.client.core.edm.xml.AbstractEnumType;
 
-public class EnumTypeImpl extends AbstractEnumType implements AnnotatedEdmItem {
+public class EnumTypeImpl extends AbstractEnumType implements Annotatable {
 
   private static final long serialVersionUID = -3329664331877556957L;
 
-  private Annotation annotation;
+  private final List<Annotation> annotations = new ArrayList<Annotation>();
 
   @Override
-  public Annotation getAnnotation() {
-    return annotation;
-  }
-
-  public void setAnnotation(final Annotation annotation) {
-    this.annotation = annotation;
+  public List<Annotation> getAnnotations() {
+    return annotations;
   }
 
 }