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/04 18:24:11 UTC

[8/9] [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-api/src/main/java/org/apache/olingo/client/api/edm/xml/v4/annotation/PropertyValue.java
----------------------------------------------------------------------
diff --git a/lib/client-api/src/main/java/org/apache/olingo/client/api/edm/xml/v4/annotation/PropertyValue.java b/lib/client-api/src/main/java/org/apache/olingo/client/api/edm/xml/v4/annotation/PropertyValue.java
new file mode 100644
index 0000000..74b7721
--- /dev/null
+++ b/lib/client-api/src/main/java/org/apache/olingo/client/api/edm/xml/v4/annotation/PropertyValue.java
@@ -0,0 +1,29 @@
+/*
+ * 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.api.edm.xml.v4.annotation;
+
+import org.apache.olingo.client.api.edm.xml.v4.Annotatable;
+
+public interface PropertyValue extends DynamicAnnotationExpression, Annotatable {
+
+  String getProperty();
+
+  AnnotationExpression getValue();
+
+}

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

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/726fbe52/lib/client-api/src/main/java/org/apache/olingo/client/api/edm/xml/v4/annotation/TwoParamsOpDynamicAnnotationExpression.java
----------------------------------------------------------------------
diff --git a/lib/client-api/src/main/java/org/apache/olingo/client/api/edm/xml/v4/annotation/TwoParamsOpDynamicAnnotationExpression.java b/lib/client-api/src/main/java/org/apache/olingo/client/api/edm/xml/v4/annotation/TwoParamsOpDynamicAnnotationExpression.java
new file mode 100644
index 0000000..15f56a1
--- /dev/null
+++ b/lib/client-api/src/main/java/org/apache/olingo/client/api/edm/xml/v4/annotation/TwoParamsOpDynamicAnnotationExpression.java
@@ -0,0 +1,50 @@
+/*
+ * 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.api.edm.xml.v4.annotation;
+
+public interface TwoParamsOpDynamicAnnotationExpression extends DynamicAnnotationExpression {
+
+  public static enum Type {
+
+    And,
+    Or,
+    Eq,
+    Ne,
+    Gt,
+    Ge,
+    Lt,
+    Le;
+
+    public static Type fromString(final String value) {
+      Type result = null;
+      for (Type type : values()) {
+        if (value.equals(type.name())) {
+          result = type;
+        }
+      }
+      return result;
+    }
+  }
+
+  Type getType();
+  
+  DynamicAnnotationExpression getLeftExpression();
+
+  DynamicAnnotationExpression getRightExpression();
+}

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/726fbe52/lib/client-api/src/main/java/org/apache/olingo/client/api/edm/xml/v4/annotation/UrlRef.java
----------------------------------------------------------------------
diff --git a/lib/client-api/src/main/java/org/apache/olingo/client/api/edm/xml/v4/annotation/UrlRef.java b/lib/client-api/src/main/java/org/apache/olingo/client/api/edm/xml/v4/annotation/UrlRef.java
new file mode 100644
index 0000000..9e67cfb
--- /dev/null
+++ b/lib/client-api/src/main/java/org/apache/olingo/client/api/edm/xml/v4/annotation/UrlRef.java
@@ -0,0 +1,25 @@
+/*
+ * 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.api.edm.xml.v4.annotation;
+
+public interface UrlRef extends DynamicAnnotationExpression {
+
+  AnnotationExpression getValue();
+
+}

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/726fbe52/lib/client-api/src/main/java/org/apache/olingo/client/api/v3/ODataClient.java
----------------------------------------------------------------------
diff --git a/lib/client-api/src/main/java/org/apache/olingo/client/api/v3/ODataClient.java b/lib/client-api/src/main/java/org/apache/olingo/client/api/v3/ODataClient.java
index db9b8c8..576d648 100644
--- a/lib/client-api/src/main/java/org/apache/olingo/client/api/v3/ODataClient.java
+++ b/lib/client-api/src/main/java/org/apache/olingo/client/api/v3/ODataClient.java
@@ -22,7 +22,6 @@ import org.apache.olingo.client.api.CommonODataClient;
 import org.apache.olingo.client.api.communication.request.batch.v3.BatchRequestFactory;
 import org.apache.olingo.client.api.communication.request.cud.v3.CUDRequestFactory;
 import org.apache.olingo.client.api.communication.request.cud.v3.UpdateType;
-import org.apache.olingo.client.api.communication.request.invoke.v3.InvokeRequestFactory;
 import org.apache.olingo.client.api.communication.request.retrieve.v3.RetrieveRequestFactory;
 import org.apache.olingo.client.api.communication.request.streamed.v3.StreamedRequestFactory;
 import org.apache.olingo.client.api.op.v3.ODataBinder;
@@ -65,8 +64,5 @@ public interface ODataClient extends CommonODataClient<UpdateType> {
   StreamedRequestFactory getStreamedRequestFactory();
 
   @Override
-  InvokeRequestFactory getInvokeRequestFactory();
-
-  @Override
   BatchRequestFactory getBatchRequestFactory();
 }

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/726fbe52/lib/client-api/src/main/java/org/apache/olingo/client/api/v4/ODataClient.java
----------------------------------------------------------------------
diff --git a/lib/client-api/src/main/java/org/apache/olingo/client/api/v4/ODataClient.java b/lib/client-api/src/main/java/org/apache/olingo/client/api/v4/ODataClient.java
index 7ee53bf..171f51f 100644
--- a/lib/client-api/src/main/java/org/apache/olingo/client/api/v4/ODataClient.java
+++ b/lib/client-api/src/main/java/org/apache/olingo/client/api/v4/ODataClient.java
@@ -22,7 +22,6 @@ import org.apache.olingo.client.api.CommonODataClient;
 import org.apache.olingo.client.api.communication.request.batch.v4.BatchRequestFactory;
 import org.apache.olingo.client.api.communication.request.cud.v4.CUDRequestFactory;
 import org.apache.olingo.client.api.communication.request.cud.v4.UpdateType;
-import org.apache.olingo.client.api.communication.request.invoke.v4.InvokeRequestFactory;
 import org.apache.olingo.client.api.communication.request.retrieve.v4.RetrieveRequestFactory;
 import org.apache.olingo.client.api.communication.request.streamed.v4.StreamedRequestFactory;
 import org.apache.olingo.client.api.communication.request.v4.AsyncRequestFactory;
@@ -68,8 +67,5 @@ public interface ODataClient extends CommonODataClient<UpdateType> {
   StreamedRequestFactory getStreamedRequestFactory();
 
   @Override
-  InvokeRequestFactory getInvokeRequestFactory();
-
-  @Override
   BatchRequestFactory getBatchRequestFactory();
 }

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/726fbe52/lib/client-core/src/main/java/org/apache/olingo/client/core/communication/request/invoke/AbstractInvokeRequestFactory.java
----------------------------------------------------------------------
diff --git a/lib/client-core/src/main/java/org/apache/olingo/client/core/communication/request/invoke/AbstractInvokeRequestFactory.java b/lib/client-core/src/main/java/org/apache/olingo/client/core/communication/request/invoke/AbstractInvokeRequestFactory.java
index a1a1b8c..08fc6f2 100644
--- a/lib/client-core/src/main/java/org/apache/olingo/client/core/communication/request/invoke/AbstractInvokeRequestFactory.java
+++ b/lib/client-core/src/main/java/org/apache/olingo/client/core/communication/request/invoke/AbstractInvokeRequestFactory.java
@@ -19,22 +19,15 @@
 package org.apache.olingo.client.core.communication.request.invoke;
 
 import java.net.URI;
-import org.apache.olingo.client.api.CommonODataClient;
-import org.apache.olingo.client.api.communication.request.invoke.CommonInvokeRequestFactory;
+import org.apache.olingo.client.api.communication.request.invoke.InvokeRequestFactory;
 import org.apache.olingo.client.api.communication.request.invoke.ODataInvokeRequest;
 import org.apache.olingo.commons.api.domain.ODataInvokeResult;
 import org.apache.olingo.commons.api.edm.EdmOperation;
 
-public abstract class AbstractInvokeRequestFactory implements CommonInvokeRequestFactory {
+public abstract class AbstractInvokeRequestFactory implements InvokeRequestFactory {
 
   private static final long serialVersionUID = -906760270085197249L;
 
-  protected final CommonODataClient client;
-
-  protected AbstractInvokeRequestFactory(final CommonODataClient client) {
-    this.client = client;
-  }
-
   @Override
   public <RES extends ODataInvokeResult> ODataInvokeRequest<RES> getInvokeRequest(
           final URI uri, final EdmOperation operation) {

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/726fbe52/lib/client-core/src/main/java/org/apache/olingo/client/core/communication/request/invoke/v3/InvokeRequestFactoryImpl.java
----------------------------------------------------------------------
diff --git a/lib/client-core/src/main/java/org/apache/olingo/client/core/communication/request/invoke/v3/InvokeRequestFactoryImpl.java b/lib/client-core/src/main/java/org/apache/olingo/client/core/communication/request/invoke/v3/InvokeRequestFactoryImpl.java
index 662f9db..0d71a4a 100644
--- a/lib/client-core/src/main/java/org/apache/olingo/client/core/communication/request/invoke/v3/InvokeRequestFactoryImpl.java
+++ b/lib/client-core/src/main/java/org/apache/olingo/client/core/communication/request/invoke/v3/InvokeRequestFactoryImpl.java
@@ -23,7 +23,6 @@ import java.util.Map;
 import org.apache.olingo.client.api.v3.ODataClient;
 import org.apache.olingo.client.api.communication.request.invoke.ODataInvokeRequest;
 import org.apache.olingo.client.api.communication.request.invoke.ODataNoContent;
-import org.apache.olingo.client.api.communication.request.invoke.v3.InvokeRequestFactory;
 import org.apache.olingo.commons.api.domain.ODataInvokeResult;
 import org.apache.olingo.commons.api.domain.ODataValue;
 import org.apache.olingo.client.api.http.HttpMethod;
@@ -36,12 +35,14 @@ import org.apache.olingo.commons.api.edm.EdmOperation;
 import org.apache.olingo.commons.api.edm.EdmReturnType;
 import org.apache.olingo.commons.api.edm.constants.EdmTypeKind;
 
-public class InvokeRequestFactoryImpl extends AbstractInvokeRequestFactory implements InvokeRequestFactory {
+public class InvokeRequestFactoryImpl extends AbstractInvokeRequestFactory {
 
   private static final long serialVersionUID = -659256862901915496L;
 
+  private final ODataClient client;
+  
   public InvokeRequestFactoryImpl(final ODataClient client) {
-    super(client);
+    this.client = client;
   }
 
   @Override

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/726fbe52/lib/client-core/src/main/java/org/apache/olingo/client/core/communication/request/invoke/v4/InvokeRequestFactoryImpl.java
----------------------------------------------------------------------
diff --git a/lib/client-core/src/main/java/org/apache/olingo/client/core/communication/request/invoke/v4/InvokeRequestFactoryImpl.java b/lib/client-core/src/main/java/org/apache/olingo/client/core/communication/request/invoke/v4/InvokeRequestFactoryImpl.java
index 4d5a4b1..ded9992 100644
--- a/lib/client-core/src/main/java/org/apache/olingo/client/core/communication/request/invoke/v4/InvokeRequestFactoryImpl.java
+++ b/lib/client-core/src/main/java/org/apache/olingo/client/core/communication/request/invoke/v4/InvokeRequestFactoryImpl.java
@@ -23,7 +23,6 @@ import java.util.Map;
 import org.apache.olingo.client.api.v4.ODataClient;
 import org.apache.olingo.client.api.communication.request.invoke.ODataInvokeRequest;
 import org.apache.olingo.client.api.communication.request.invoke.ODataNoContent;
-import org.apache.olingo.client.api.communication.request.invoke.v4.InvokeRequestFactory;
 import org.apache.olingo.client.api.http.HttpMethod;
 import org.apache.olingo.commons.api.domain.ODataInvokeResult;
 import org.apache.olingo.commons.api.domain.ODataValue;
@@ -36,12 +35,14 @@ import org.apache.olingo.commons.api.edm.EdmOperation;
 import org.apache.olingo.commons.api.edm.EdmReturnType;
 import org.apache.olingo.commons.api.edm.constants.EdmTypeKind;
 
-public class InvokeRequestFactoryImpl extends AbstractInvokeRequestFactory implements InvokeRequestFactory {
+public class InvokeRequestFactoryImpl extends AbstractInvokeRequestFactory {
 
   private static final long serialVersionUID = 8452737360003104372L;
 
+  private final ODataClient client;
+
   public InvokeRequestFactoryImpl(final ODataClient client) {
-    super(client);
+    this.client = client;
   }
 
   @SuppressWarnings("unchecked")

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/726fbe52/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/EdmActionImportImpl.java
----------------------------------------------------------------------
diff --git a/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/EdmActionImportImpl.java b/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/EdmActionImportImpl.java
index 15a9604..f95746e 100644
--- a/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/EdmActionImportImpl.java
+++ b/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/EdmActionImportImpl.java
@@ -18,18 +18,23 @@
  */
 package org.apache.olingo.client.core.edm;
 
+import java.util.List;
 import org.apache.olingo.client.api.edm.xml.v4.ActionImport;
 import org.apache.olingo.commons.core.edm.EdmTypeInfo;
 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.EdmEntityContainer;
 import org.apache.olingo.commons.api.edm.FullQualifiedName;
+import org.apache.olingo.commons.core.edm.EdmAnnotationHelper;
 
 public class EdmActionImportImpl extends EdmOperationImportImpl implements EdmActionImport {
 
   private final ActionImport actionImport;
 
+  private final EdmAnnotationHelper helper;
+
   private FullQualifiedName actionFQN;
 
   public EdmActionImportImpl(final Edm edm, final EdmEntityContainer container, final String name,
@@ -37,6 +42,7 @@ public class EdmActionImportImpl extends EdmOperationImportImpl implements EdmAc
 
     super(edm, container, name, actionImport.getEntitySet());
     this.actionImport = actionImport;
+    this.helper = new EdmAnnotationHelperImpl(edm, actionImport);
   }
 
   public FullQualifiedName getActionFQN() {
@@ -52,4 +58,13 @@ public class EdmActionImportImpl extends EdmOperationImportImpl implements EdmAc
     return edm.getUnboundAction(getActionFQN());
   }
 
+  @Override
+  public TargetType getAnnotationsTargetType() {
+    return TargetType.ActionImport;
+  }
+
+  @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/EdmAnnotationHelperImpl.java
----------------------------------------------------------------------
diff --git a/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/EdmAnnotationHelperImpl.java b/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/EdmAnnotationHelperImpl.java
new file mode 100644
index 0000000..6333bca
--- /dev/null
+++ b/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/EdmAnnotationHelperImpl.java
@@ -0,0 +1,53 @@
+/*
+ * 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.olingo.client.api.edm.xml.v4.Annotatable;
+import org.apache.olingo.client.api.edm.xml.v4.Annotation;
+import org.apache.olingo.commons.api.edm.Edm;
+import org.apache.olingo.commons.api.edm.EdmAnnotation;
+import org.apache.olingo.commons.core.edm.EdmAnnotationHelper;
+
+public class EdmAnnotationHelperImpl implements EdmAnnotationHelper {
+
+  private final Edm edm;
+
+  private final Annotatable annotatable;
+
+  private List<EdmAnnotation> annotations;
+
+  public EdmAnnotationHelperImpl(final Edm edm, final Annotatable annotatable) {
+    this.edm = edm;
+    this.annotatable = annotatable;
+  }
+
+  @Override
+  public List<EdmAnnotation> getAnnotations() {
+    if (annotations == null) {
+      annotations = new ArrayList<EdmAnnotation>();
+      for (Annotation annotation : annotatable.getAnnotations()) {
+        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/EdmAnnotationImpl.java
----------------------------------------------------------------------
diff --git a/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/EdmAnnotationImpl.java b/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/EdmAnnotationImpl.java
new file mode 100644
index 0000000..b219eb2
--- /dev/null
+++ b/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/EdmAnnotationImpl.java
@@ -0,0 +1,238 @@
+/*
+ * 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.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.annotation.AnnotationExpression;
+import org.apache.olingo.client.api.edm.xml.v4.annotation.DynamicAnnotationExpression;
+import org.apache.olingo.client.api.edm.xml.v4.annotation.PropertyValue;
+import org.apache.olingo.client.core.edm.v4.annotation.EdmCastImpl;
+import org.apache.olingo.commons.core.edm.annotation.EdmAnnotationPathImpl;
+import org.apache.olingo.client.core.edm.v4.annotation.EdmConstantAnnotationExpressionImpl;
+import org.apache.olingo.client.core.edm.v4.annotation.EdmIsOfImpl;
+import org.apache.olingo.client.core.edm.v4.annotation.EdmRecordImpl;
+import org.apache.olingo.commons.api.edm.Edm;
+import org.apache.olingo.commons.api.edm.EdmAnnotatable;
+import org.apache.olingo.commons.api.edm.EdmAnnotation;
+import org.apache.olingo.commons.api.edm.EdmTerm;
+import org.apache.olingo.commons.api.edm.FullQualifiedName;
+import org.apache.olingo.commons.api.edm.annotation.EdmAnnotationExpression;
+import org.apache.olingo.commons.api.edm.annotation.EdmDynamicAnnotationExpression;
+import org.apache.olingo.commons.api.edm.annotation.EdmPropertyValue;
+import org.apache.olingo.commons.core.edm.EdmAnnotationHelper;
+import org.apache.olingo.commons.core.edm.annotation.EdmAndImpl;
+import org.apache.olingo.commons.core.edm.annotation.EdmApplyImpl;
+import org.apache.olingo.commons.core.edm.annotation.EdmCollectionImpl;
+import org.apache.olingo.commons.core.edm.annotation.EdmEqImpl;
+import org.apache.olingo.commons.core.edm.annotation.EdmGeImpl;
+import org.apache.olingo.commons.core.edm.annotation.EdmGtImpl;
+import org.apache.olingo.commons.core.edm.annotation.EdmIfImpl;
+import org.apache.olingo.commons.core.edm.annotation.EdmLabeledElementImpl;
+import org.apache.olingo.commons.core.edm.annotation.EdmLabeledElementReferenceImpl;
+import org.apache.olingo.commons.core.edm.annotation.EdmLeImpl;
+import org.apache.olingo.commons.core.edm.annotation.EdmLtImpl;
+import org.apache.olingo.commons.core.edm.annotation.EdmNavigationPropertyPathImpl;
+import org.apache.olingo.commons.core.edm.annotation.EdmNeImpl;
+import org.apache.olingo.commons.core.edm.annotation.EdmNotImpl;
+import org.apache.olingo.commons.core.edm.annotation.EdmNullImpl;
+import org.apache.olingo.commons.core.edm.annotation.EdmOrImpl;
+import org.apache.olingo.commons.core.edm.annotation.EdmPathImpl;
+import org.apache.olingo.commons.core.edm.annotation.EdmPropertyPathImpl;
+import org.apache.olingo.commons.core.edm.annotation.EdmPropertyValueImpl;
+import org.apache.olingo.commons.core.edm.annotation.EdmUrlRefImpl;
+
+public class EdmAnnotationImpl implements EdmAnnotation {
+
+  private final Edm edm;
+
+  private final Annotation annotation;
+
+  private final EdmAnnotationHelper helper;
+
+  private EdmTerm term;
+
+  private EdmAnnotationExpression expression;
+
+  public EdmAnnotationImpl(final Edm edm, final Annotation annotation) {
+    this.edm = edm;
+    this.annotation = annotation;
+    this.helper = new EdmAnnotationHelperImpl(edm, annotation);
+  }
+
+  @Override
+  public EdmTerm getTerm() {
+    if (term == null) {
+      term = edm.getTerm(new FullQualifiedName(annotation.getTerm()));
+    }
+    return term;
+  }
+
+  @Override
+  public String getQualifier() {
+    return annotation.getQualifier();
+  }
+
+  private EdmAnnotationExpression getExpression(final AnnotationExpression exp) {
+    EdmAnnotationExpression _expression = null;
+
+    if (exp.isConstant()) {
+      _expression = new EdmConstantAnnotationExpressionImpl(edm, exp.asConstant());
+    } else if (annotation.getExpression().isDynamic()) {
+      _expression = getDynamicExpression(exp.asDynamic());
+    }
+
+    return _expression;
+  }
+
+  private EdmDynamicAnnotationExpression getDynamicExpression(final DynamicAnnotationExpression exp) {
+    EdmDynamicAnnotationExpression _expression = null;
+
+    if (exp.isNot()) {
+      _expression = new EdmNotImpl(getDynamicExpression(exp.asNot().getExpression()));
+    } else if (exp.isTwoParamsOp()) {
+      switch (exp.asTwoParamsOp().getType()) {
+        case And:
+          _expression = new EdmAndImpl(
+                  getDynamicExpression(exp.asTwoParamsOp().getLeftExpression()),
+                  getDynamicExpression(exp.asTwoParamsOp().getRightExpression()));
+          break;
+
+        case Or:
+          _expression = new EdmOrImpl(
+                  getDynamicExpression(exp.asTwoParamsOp().getLeftExpression()),
+                  getDynamicExpression(exp.asTwoParamsOp().getRightExpression()));
+          break;
+
+        case Eq:
+          _expression = new EdmEqImpl(
+                  getDynamicExpression(exp.asTwoParamsOp().getLeftExpression()),
+                  getDynamicExpression(exp.asTwoParamsOp().getRightExpression()));
+          break;
+
+        case Ne:
+          _expression = new EdmNeImpl(
+                  getDynamicExpression(exp.asTwoParamsOp().getLeftExpression()),
+                  getDynamicExpression(exp.asTwoParamsOp().getRightExpression()));
+          break;
+
+        case Ge:
+          _expression = new EdmGeImpl(
+                  getDynamicExpression(exp.asTwoParamsOp().getLeftExpression()),
+                  getDynamicExpression(exp.asTwoParamsOp().getRightExpression()));
+          break;
+
+        case Gt:
+          _expression = new EdmGtImpl(
+                  getDynamicExpression(exp.asTwoParamsOp().getLeftExpression()),
+                  getDynamicExpression(exp.asTwoParamsOp().getRightExpression()));
+          break;
+
+        case Le:
+          _expression = new EdmLeImpl(
+                  getDynamicExpression(exp.asTwoParamsOp().getLeftExpression()),
+                  getDynamicExpression(exp.asTwoParamsOp().getRightExpression()));
+          break;
+
+        case Lt:
+          _expression = new EdmLtImpl(
+                  getDynamicExpression(exp.asTwoParamsOp().getLeftExpression()),
+                  getDynamicExpression(exp.asTwoParamsOp().getRightExpression()));
+          break;
+
+        default:
+      }
+    } else if (exp.isAnnotationPath()) {
+      _expression = new EdmAnnotationPathImpl(exp.asAnnotationPath().getValue());
+    } else if (exp.isApply()) {
+      final List<EdmAnnotationExpression> parameters =
+              new ArrayList<EdmAnnotationExpression>(exp.asApply().getParameters().size());
+      for (AnnotationExpression param : exp.asApply().getParameters()) {
+        parameters.add(getExpression(param));
+      }
+      _expression = new EdmApplyImpl(exp.asApply().getFunction(), parameters);
+    } else if (exp.isCast()) {
+      _expression = new EdmCastImpl(edm, exp.asCast(), getDynamicExpression(exp.asCast().getValue()));
+    } else if (exp.isCollection()) {
+      final List<EdmAnnotationExpression> items =
+              new ArrayList<EdmAnnotationExpression>(exp.asCollection().getItems().size());
+      for (AnnotationExpression param : exp.asCollection().getItems()) {
+        items.add(getExpression(param));
+      }
+      _expression = new EdmCollectionImpl(items);
+    } else if (exp.isIf()) {
+      _expression = new EdmIfImpl(
+              getExpression(exp.asIf().getGuard()),
+              getExpression(exp.asIf().getThen()),
+              getExpression(exp.asIf().getElse()));
+    } else if (exp.isIsOf()) {
+      _expression = new EdmIsOfImpl(edm, exp.asIsOf(), getDynamicExpression(exp.asIsOf().getValue()));
+    } else if (exp.isLabeledElement()) {
+      _expression = new EdmLabeledElementImpl(
+              exp.asLabeledElement().getName(), getDynamicExpression(exp.asLabeledElement().getValue()));
+    } else if (exp.isLabeledElementReference()) {
+      _expression = new EdmLabeledElementReferenceImpl(exp.asLabeledElementReference().getValue());
+    } else if (exp.isNull()) {
+      _expression = new EdmNullImpl();
+    } else if (exp.isNavigationPropertyPath()) {
+      _expression = new EdmNavigationPropertyPathImpl(exp.asNavigationPropertyPath().getValue());
+    } else if (exp.isPath()) {
+      _expression = new EdmPathImpl(exp.asPath().getValue());
+    } else if (exp.isPropertyPath()) {
+      _expression = new EdmPropertyPathImpl(exp.asPropertyPath().getValue());
+    } else if (exp.isPropertyValue()) {
+      _expression = new EdmPropertyValueImpl(
+              exp.asPropertyValue().getProperty(), getExpression(exp.asPropertyValue().getValue()));
+    } else if (exp.isRecord()) {
+      final List<EdmPropertyValue> propertyValues =
+              new ArrayList<EdmPropertyValue>(exp.asRecord().getPropertyValues().size());
+      for (PropertyValue propertyValue : exp.asRecord().getPropertyValues()) {
+        propertyValues.add(new EdmPropertyValueImpl(
+                propertyValue.getProperty(), getExpression(propertyValue.getValue())));
+      }
+      _expression = new EdmRecordImpl(edm, exp.asRecord().getType(), propertyValues);
+    } else if (exp.isUrlRef()) {
+      _expression = new EdmUrlRefImpl(getExpression(exp.asUrlRef().getValue()));
+    }
+
+    if (_expression instanceof EdmAnnotatable && exp instanceof Annotatable) {
+      for (Annotation _annotation : ((Annotatable) exp).getAnnotations()) {
+        ((EdmAnnotatable) _expression).getAnnotations().add(new EdmAnnotationImpl(edm, _annotation));
+      }
+    }
+
+    return _expression;
+  }
+
+  @Override
+  public EdmAnnotationExpression getExpression() {
+    if (expression == null) {
+      expression = getExpression(annotation.getExpression());
+    }
+    return expression;
+  }
+
+  @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/EdmAnnotationsImpl.java
----------------------------------------------------------------------
diff --git a/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/EdmAnnotationsImpl.java b/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/EdmAnnotationsImpl.java
new file mode 100644
index 0000000..b4888b6
--- /dev/null
+++ b/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/EdmAnnotationsImpl.java
@@ -0,0 +1,146 @@
+/*
+ * 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.StringUtils;
+import org.apache.olingo.client.api.edm.xml.v4.Annotation;
+import org.apache.olingo.client.api.edm.xml.v4.Annotations;
+import org.apache.olingo.commons.api.edm.Edm;
+import org.apache.olingo.commons.api.edm.EdmAnnotation;
+import org.apache.olingo.commons.api.edm.EdmAnnotations;
+import org.apache.olingo.commons.api.edm.EdmAnnotationsTarget;
+import org.apache.olingo.commons.api.edm.EdmEntityContainer;
+import org.apache.olingo.commons.api.edm.EdmEnumType;
+import org.apache.olingo.commons.api.edm.EdmSchema;
+import org.apache.olingo.commons.api.edm.EdmStructuredType;
+import org.apache.olingo.commons.api.edm.EdmTerm;
+import org.apache.olingo.commons.api.edm.FullQualifiedName;
+
+public class EdmAnnotationsImpl implements EdmAnnotations {
+
+  private final Edm edm;
+
+  private final EdmSchema schema;
+
+  private final Annotations annotationGroup;
+
+  private EdmAnnotationsTarget target;
+
+  private List<EdmAnnotation> annotations;
+
+  public EdmAnnotationsImpl(final Edm edm, final EdmSchema schema, final Annotations annotationGroup) {
+    this.edm = edm;
+    this.schema = schema;
+    this.annotationGroup = annotationGroup;
+  }
+
+  private EdmAnnotationsTarget getTarget(final EdmStructuredType structured, final String path) {
+    EdmAnnotationsTarget _target = null;
+    if (structured != null) {
+      _target = path == null
+              ? structured
+              : structured.getStructuralProperty(path);
+      if (_target == null) {
+        _target = structured.getNavigationProperty(path);
+      }
+    }
+    return _target;
+  }
+
+  private EdmAnnotationsTarget getTarget(final EdmEnumType enumType, final String path) {
+    EdmAnnotationsTarget _target = null;
+    if (enumType != null) {
+      _target = path == null
+              ? enumType
+              : enumType.getMember(path);
+    }
+    return _target;
+  }
+
+  @Override
+  public EdmAnnotationsTarget getTarget() {
+    if (target == null) {
+      final String[] splitted = StringUtils.split(annotationGroup.getTarget(), '/');
+      final FullQualifiedName base = new FullQualifiedName(splitted[0]);
+      final String path = splitted.length > 1 ? splitted[1] : null;
+
+      final EdmEntityContainer baseEntityContainer = schema.getEntityContainer(base);
+      
+      target = baseEntityContainer == null? null: baseEntityContainer.getActionImport(path);
+      if (target == null) {
+        target = getTarget(edm.getComplexType(base), path);
+        if (target == null) {
+          target = baseEntityContainer;
+          if (target == null) {
+            target = baseEntityContainer == null? null: baseEntityContainer.getEntitySet(path);
+            if (target == null) {
+              target = getTarget(edm.getEntityType(base), path);
+              if (target == null) {
+                target = getTarget(edm.getEnumType(base), path);
+                if (target == null) {
+                  target = baseEntityContainer == null? null: baseEntityContainer.getFunctionImport(path);
+                  if (target == null) {
+                    target = baseEntityContainer == null? null: baseEntityContainer.getSingleton(path);
+                    if (target == null) {
+                      target = edm.getTerm(base);
+                      if (target == null) {
+                        target = edm.getTypeDefinition(base);
+                      }
+                    }
+                  }
+                }
+              }
+            }
+          }
+        }
+      }
+    }
+    return target;
+  }
+
+  @Override
+  public String getQualifier() {
+    return annotationGroup.getQualifier();
+  }
+
+  @Override
+  public EdmAnnotation getAnnotation(final EdmTerm term) {
+    EdmAnnotation result = null;
+    for (EdmAnnotation annotation : getAnnotations()) {
+      if (term.getFullQualifiedName().equals(annotation.getTerm().getFullQualifiedName())) {
+        result = annotation;
+      }
+    }
+    return result;
+  }
+
+  @Override
+  public List<EdmAnnotation> getAnnotations() {
+    if (annotations == null) {
+      annotations = new ArrayList<EdmAnnotation>();
+      for (Annotation annotation : annotationGroup.getAnnotations()) {
+        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/EdmBindingTargetImpl.java
----------------------------------------------------------------------
diff --git a/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/EdmBindingTargetImpl.java b/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/EdmBindingTargetImpl.java
index 452c880..9aa3485 100644
--- a/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/EdmBindingTargetImpl.java
+++ b/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/EdmBindingTargetImpl.java
@@ -25,6 +25,7 @@ import java.util.List;
 import org.apache.olingo.client.api.edm.xml.v4.BindingTarget;
 import org.apache.olingo.client.api.edm.xml.v4.NavigationPropertyBinding;
 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.EdmException;
@@ -32,18 +33,23 @@ import org.apache.olingo.commons.api.edm.EdmNavigationPropertyBinding;
 import org.apache.olingo.commons.api.edm.FullQualifiedName;
 import org.apache.olingo.commons.api.edm.Target;
 import org.apache.olingo.commons.core.edm.AbstractEdmBindingTarget;
+import org.apache.olingo.commons.core.edm.EdmAnnotationHelper;
 import org.apache.olingo.commons.core.edm.EdmNavigationPropertyBindingImpl;
 
 public abstract class EdmBindingTargetImpl extends AbstractEdmBindingTarget {
 
   private final BindingTarget target;
+
+  private final EdmAnnotationHelper helper;
+
   private List<EdmNavigationPropertyBinding> navigationPropertyBindings;
 
   public EdmBindingTargetImpl(final Edm edm, final EdmEntityContainer container,
-      final String name, final FullQualifiedName type, final BindingTarget target) {
+          final String name, final FullQualifiedName type, final BindingTarget target) {
 
     super(edm, container, name, type);
     this.target = target;
+    this.helper = new EdmAnnotationHelperImpl(edm, target);
   }
 
   @Override
@@ -53,8 +59,8 @@ public abstract class EdmBindingTargetImpl extends AbstractEdmBindingTarget {
     final List<? extends NavigationPropertyBinding> navigationPropertyBindings = target.getNavigationPropertyBindings();
     boolean found = false;
     for (final Iterator<? extends NavigationPropertyBinding> itor = navigationPropertyBindings.iterator(); itor
-        .hasNext()
-        && !found;) {
+            .hasNext()
+            && !found;) {
 
       final NavigationPropertyBinding binding = itor.next();
       if (binding.getPath().equals(path)) {
@@ -95,4 +101,9 @@ public abstract class EdmBindingTargetImpl extends AbstractEdmBindingTarget {
     return navigationPropertyBindings;
   }
 
+  @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/EdmClientImpl.java
----------------------------------------------------------------------
diff --git a/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/EdmClientImpl.java b/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/EdmClientImpl.java
index ae6c377..0b40f67 100644
--- a/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/EdmClientImpl.java
+++ b/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/EdmClientImpl.java
@@ -18,21 +18,19 @@
  */
 package org.apache.olingo.client.core.edm;
 
-import org.apache.olingo.commons.core.edm.EdmTypeInfo;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.Iterator;
+import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
-
 import org.apache.commons.lang3.StringUtils;
 import org.apache.commons.lang3.builder.EqualsBuilder;
 import org.apache.commons.lang3.builder.HashCodeBuilder;
 import org.apache.commons.lang3.builder.ReflectionToStringBuilder;
 import org.apache.commons.lang3.builder.ToStringStyle;
-import org.apache.olingo.client.api.v3.UnsupportedInV3Exception;
 import org.apache.olingo.client.api.edm.xml.CommonParameter;
 import org.apache.olingo.client.api.edm.xml.ComplexType;
 import org.apache.olingo.client.api.edm.xml.EntityContainer;
@@ -41,12 +39,18 @@ 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.Annotatable;
+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.EdmActionProxy;
 import org.apache.olingo.client.core.edm.v3.EdmFunctionProxy;
 import org.apache.olingo.client.core.edm.v3.FunctionImportUtils;
 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;
@@ -54,10 +58,12 @@ import org.apache.olingo.commons.api.edm.EdmEnumType;
 import org.apache.olingo.commons.api.edm.EdmFunction;
 import org.apache.olingo.commons.api.edm.EdmSchema;
 import org.apache.olingo.commons.api.edm.EdmServiceMetadata;
+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;
 import org.apache.olingo.commons.core.edm.AbstractEdm;
+import org.apache.olingo.commons.core.edm.EdmTypeInfo;
 
 public class EdmClientImpl extends AbstractEdm {
 
@@ -102,6 +108,15 @@ public class EdmClientImpl extends AbstractEdm {
   }
 
   @Override
+  protected Map<String, EdmSchema> createSchemas() {
+    final Map<String, EdmSchema> _schemas = new LinkedHashMap<String, EdmSchema>(xmlSchemas.size());
+    for (Schema schema : xmlSchemas) {
+      _schemas.put(schema.getNamespace(), new EdmSchemaImpl(version, this, xmlSchemas, schema));
+    }
+    return _schemas;
+  }
+
+  @Override
   protected EdmEntityContainer createEntityContainer(final FullQualifiedName containerName) {
     EdmEntityContainer result = null;
 
@@ -142,8 +157,6 @@ public class EdmClientImpl extends AbstractEdm {
       if (xmlTypeDefinition != null) {
         result = new EdmTypeDefinitionImpl(version, this, typeDefinitionName, xmlTypeDefinition);
       }
-    } else {
-      throw new UnsupportedInV3Exception();
     }
 
     return result;
@@ -408,6 +421,57 @@ public class EdmClientImpl extends AbstractEdm {
   }
 
   @Override
+  protected EdmTerm createTerm(final FullQualifiedName termName) {
+    EdmTerm result = null;
+
+    final Schema schema = xmlSchemaByNamespace.get(termName.getNamespace());
+    if (schema instanceof org.apache.olingo.client.api.edm.xml.v4.Schema) {
+      final Term term = ((org.apache.olingo.client.api.edm.xml.v4.Schema) schema).getTerm(termName.getName());
+      if (term != null) {
+        result = new EdmTermImpl(this, term);
+      }
+    }
+
+    return result;
+  }
+
+  @Override
+  protected EdmAnnotations createAnnotationGroup(final FullQualifiedName targetName) {
+    EdmAnnotationsImpl result = null;
+
+    final Schema schema = xmlSchemaByNamespace.get(targetName.getNamespace());
+    if (schema instanceof org.apache.olingo.client.api.edm.xml.v4.Schema) {
+      final Annotations annotationGroup =
+              ((org.apache.olingo.client.api.edm.xml.v4.Schema) schema).getAnnotationGroup(targetName.getName());
+      if (annotationGroup != null) {
+        result = new EdmAnnotationsImpl(this, schemas.get(schema.getNamespace()), annotationGroup);
+      }
+    }
+
+    return result;
+  }
+
+  @Override
+  protected List<EdmAnnotation> createAnnotations(final FullQualifiedName annotatedName) {
+    List<EdmAnnotation> result = null;
+
+    final Schema schema = xmlSchemaByNamespace.get(annotatedName.getNamespace());
+    if (schema instanceof org.apache.olingo.client.api.edm.xml.v4.Schema) {
+      final Annotatable annotatable =
+              ((org.apache.olingo.client.api.edm.xml.v4.Schema) schema).getAnnotatables().get(annotatedName.getName());
+      if (annotatable != null && annotatable.getAnnotations() != null) {
+        result = new ArrayList<EdmAnnotation>();
+        for (Annotation annotation : annotatable.getAnnotations()) {
+          final EdmTerm term = getTerm(new FullQualifiedName(annotation.getTerm()));
+          result.add(new EdmAnnotationImpl(this, annotation));
+        }
+      }
+    }
+
+    return result;
+  }
+
+  @Override
   public boolean equals(final Object obj) {
     return EqualsBuilder.reflectionEquals(this, obj);
   }
@@ -421,13 +485,4 @@ public class EdmClientImpl extends AbstractEdm {
   public String toString() {
     return ReflectionToStringBuilder.toString(this, ToStringStyle.MULTI_LINE_STYLE);
   }
-
-  @Override
-  protected List<EdmSchema> createSchemas() {
-    final List<EdmSchema> schemas = new ArrayList<EdmSchema>();
-    for (Schema schema : xmlSchemas) {
-      schemas.add(new EdmSchemaImpl(version, this, xmlSchemas, schema));
-    }
-    return schemas;
-  }
 }

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/726fbe52/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/EdmComplexTypeImpl.java
----------------------------------------------------------------------
diff --git a/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/EdmComplexTypeImpl.java b/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/EdmComplexTypeImpl.java
index 1ccc8d5..f770e56 100644
--- a/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/EdmComplexTypeImpl.java
+++ b/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/EdmComplexTypeImpl.java
@@ -24,15 +24,19 @@ import java.util.Map;
 import org.apache.olingo.client.api.edm.xml.ComplexType;
 import org.apache.olingo.client.api.edm.xml.Schema;
 import org.apache.olingo.commons.api.edm.Edm;
+import org.apache.olingo.commons.api.edm.EdmAnnotation;
 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.AbstractEdmComplexType;
+import org.apache.olingo.commons.core.edm.EdmAnnotationHelper;
 import org.apache.olingo.commons.core.edm.EdmStructuredTypeHelper;
 
 public class EdmComplexTypeImpl extends AbstractEdmComplexType {
 
-  private final EdmStructuredTypeHelper helper;
+  private final EdmStructuredTypeHelper typeHelper;
+
+  private EdmAnnotationHelper annotationHelper;
 
   public static EdmComplexTypeImpl getInstance(final Edm edm, final FullQualifiedName fqn,
           final List<? extends Schema> xmlSchemas, final ComplexType complexType) {
@@ -53,26 +57,36 @@ public class EdmComplexTypeImpl extends AbstractEdmComplexType {
           final List<? extends Schema> xmlSchemas, final ComplexType complexType) {
 
     super(edm, fqn, baseTypeName);
-    this.helper = new EdmStructuredTypeHelperImpl(edm, xmlSchemas, complexType);
+    this.typeHelper = new EdmStructuredTypeHelperImpl(edm, getFullQualifiedName(), xmlSchemas, complexType);
+    if (complexType instanceof org.apache.olingo.client.api.edm.xml.v4.ComplexType) {
+      this.annotationHelper = new EdmAnnotationHelperImpl(edm,
+              (org.apache.olingo.client.api.edm.xml.v4.ComplexType) complexType);
+    }
   }
 
   @Override
   protected Map<String, EdmProperty> getProperties() {
-    return helper.getProperties();
+    return typeHelper.getProperties();
   }
 
   @Override
   protected Map<String, EdmNavigationProperty> getNavigationProperties() {
-    return helper.getNavigationProperties();
+    return typeHelper.getNavigationProperties();
   }
 
   @Override
   public boolean isOpenType() {
-    return helper.isOpenType();
+    return typeHelper.isOpenType();
   }
 
   @Override
   public boolean isAbstract() {
-    return helper.isAbstract();
+    return typeHelper.isAbstract();
   }
+
+  @Override
+  public List<EdmAnnotation> getAnnotations() {
+    return annotationHelper == null ? null : annotationHelper.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/EdmEntityContainerImpl.java
----------------------------------------------------------------------
diff --git a/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/EdmEntityContainerImpl.java b/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/EdmEntityContainerImpl.java
index cf846f7..ff0938b 100644
--- a/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/EdmEntityContainerImpl.java
+++ b/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/EdmEntityContainerImpl.java
@@ -18,6 +18,7 @@
  */
 package org.apache.olingo.client.core.edm;
 
+import java.util.Collections;
 import org.apache.olingo.commons.core.edm.EdmTypeInfo;
 import java.util.List;
 
@@ -34,12 +35,13 @@ import org.apache.olingo.client.core.edm.v3.EdmEntitySetProxy;
 import org.apache.olingo.client.core.edm.v3.EdmFunctionImportProxy;
 import org.apache.olingo.commons.api.edm.Edm;
 import org.apache.olingo.commons.api.edm.EdmActionImport;
+import org.apache.olingo.commons.api.edm.EdmAnnotation;
 import org.apache.olingo.commons.api.edm.EdmEntitySet;
-import org.apache.olingo.commons.api.edm.EdmException;
 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.core.edm.AbstractEdmEntityContainer;
+import org.apache.olingo.commons.core.edm.EdmAnnotationHelper;
 
 public class EdmEntityContainerImpl extends AbstractEdmEntityContainer {
 
@@ -47,6 +49,8 @@ public class EdmEntityContainerImpl extends AbstractEdmEntityContainer {
 
   private final List<? extends Schema> xmlSchemas;
 
+  private EdmAnnotationHelper helper;
+
   public EdmEntityContainerImpl(final Edm edm, final FullQualifiedName entityContainerName,
           final EntityContainer xmlEntityContainer, final List<? extends Schema> xmlSchemas) {
 
@@ -55,6 +59,10 @@ public class EdmEntityContainerImpl extends AbstractEdmEntityContainer {
 
     this.xmlEntityContainer = xmlEntityContainer;
     this.xmlSchemas = xmlSchemas;
+    if (xmlEntityContainer instanceof org.apache.olingo.client.api.edm.xml.v4.EntityContainer) {
+      this.helper = new EdmAnnotationHelperImpl(edm,
+              (org.apache.olingo.client.api.edm.xml.v4.EntityContainer) xmlEntityContainer);
+    }
   }
 
   @Override
@@ -72,63 +80,69 @@ public class EdmEntityContainerImpl extends AbstractEdmEntityContainer {
 
     final Singleton singleton = ((org.apache.olingo.client.api.edm.xml.v4.EntityContainer) xmlEntityContainer).
             getSingleton(singletonName);
-    if (singleton == null) {
-      throw new EdmException("Singleton named '" + singletonName + "' not found in " + entityContainerName);
-    }
-    return new EdmSingletonImpl(edm, this, singletonName, new EdmTypeInfo.Builder().
-            setTypeExpression(singleton.getEntityType()).setDefaultNamespace(entityContainerName.getNamespace()).
-            build().getFullQualifiedName(), singleton);
+    return singleton == null
+            ? null
+            : new EdmSingletonImpl(edm, this, singletonName, new EdmTypeInfo.Builder().
+                    setTypeExpression(singleton.getEntityType()).
+                    setDefaultNamespace(entityContainerName.getNamespace()).
+                    build().getFullQualifiedName(), singleton);
   }
 
   @Override
   protected EdmEntitySet createEntitySet(final String entitySetName) {
+    EdmEntitySet result = null;
+
     final EntitySet entitySet = xmlEntityContainer.getEntitySet(entitySetName);
-    if (entitySet == null) {
-      throw new EdmException("EntitySet named '" + entitySetName + "' not found in " + entityContainerName);
+    if (entitySet != null) {
+      final FullQualifiedName entityType = new EdmTypeInfo.Builder().setTypeExpression(entitySet.getEntityType()).
+              setDefaultNamespace(entityContainerName.getNamespace()).build().getFullQualifiedName();
+      if (entitySet instanceof org.apache.olingo.client.api.edm.xml.v4.EntitySet) {
+        result = new EdmEntitySetImpl(edm, this, entitySetName, entityType,
+                (org.apache.olingo.client.api.edm.xml.v4.EntitySet) entitySet);
+      } else {
+        result = new EdmEntitySetProxy(edm, this, entitySetName, entityType, xmlSchemas);
+      }
     }
 
-    final FullQualifiedName entityType = new EdmTypeInfo.Builder().setTypeExpression(entitySet.getEntityType()).
-            setDefaultNamespace(entityContainerName.getNamespace()).build().getFullQualifiedName();
-    if (entitySet instanceof org.apache.olingo.client.api.edm.xml.v4.EntitySet) {
-      return new EdmEntitySetImpl(edm, this, entitySetName, entityType,
-              (org.apache.olingo.client.api.edm.xml.v4.EntitySet) entitySet);
-    } else {
-      return new EdmEntitySetProxy(edm, this, entitySetName, entityType, xmlSchemas);
-    }
+    return result;
   }
 
   @Override
   protected EdmActionImport createActionImport(final String actionImportName) {
+    EdmActionImport result = null;
+
     if (xmlEntityContainer instanceof org.apache.olingo.client.api.edm.xml.v4.EntityContainer) {
       final ActionImport actionImport = ((org.apache.olingo.client.api.edm.xml.v4.EntityContainer) xmlEntityContainer).
               getActionImport(actionImportName);
-      if (actionImport == null) {
-        throw new EdmException("ActionImport named '" + actionImportName + "' not found in " + entityContainerName);
+      if (actionImport != null) {
+        result = new EdmActionImportImpl(edm, this, actionImportName, actionImport);
       }
-      return new EdmActionImportImpl(edm, this, actionImportName, actionImport);
     } else {
       final FunctionImport functionImport = (FunctionImport) xmlEntityContainer.getFunctionImport(actionImportName);
-      if (functionImport == null) {
-        throw new EdmException("FunctionImport named '" + actionImportName + "' not found in " + entityContainerName);
+      if (functionImport != null) {
+        result = new EdmActionImportProxy(edm, this, actionImportName, functionImport);
       }
-      return new EdmActionImportProxy(edm, this, actionImportName, functionImport);
     }
+
+    return result;
   }
 
   @Override
   protected EdmFunctionImport createFunctionImport(final String functionImportName) {
+    EdmFunctionImport result = null;
+
     final CommonFunctionImport functionImport = xmlEntityContainer.getFunctionImport(functionImportName);
-    if (functionImport == null) {
-      throw new EdmException("FunctionImport named '" + functionImportName + "' not found in " + entityContainerName);
+    if (functionImport != null) {
+      if (functionImport instanceof org.apache.olingo.client.api.edm.xml.v4.FunctionImport) {
+        result = new EdmFunctionImportImpl(edm, this, functionImportName,
+                (org.apache.olingo.client.api.edm.xml.v4.FunctionImport) functionImport);
+      } else {
+        result = new EdmFunctionImportProxy(edm, this, functionImportName,
+                (org.apache.olingo.client.api.edm.xml.v3.FunctionImport) functionImport);
+      }
     }
 
-    if (functionImport instanceof org.apache.olingo.client.api.edm.xml.v4.FunctionImport) {
-      return new EdmFunctionImportImpl(edm, this, functionImportName,
-              (org.apache.olingo.client.api.edm.xml.v4.FunctionImport) functionImport);
-    } else {
-      return new EdmFunctionImportProxy(edm, this, functionImportName,
-              (org.apache.olingo.client.api.edm.xml.v3.FunctionImport) functionImport);
-    }
+    return result;
   }
 
   @Override
@@ -209,4 +223,15 @@ public class EdmEntityContainerImpl extends AbstractEdmEntityContainer {
       }
     }
   }
+
+  @Override
+  public TargetType getAnnotationsTargetType() {
+    return TargetType.EntityContainer;
+  }
+
+  @Override
+  public List<EdmAnnotation> getAnnotations() {
+    return helper == null ? Collections.<EdmAnnotation>emptyList() : 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/EdmEntitySetImpl.java
----------------------------------------------------------------------
diff --git a/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/EdmEntitySetImpl.java b/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/EdmEntitySetImpl.java
index ec9af77..2c80ad1 100644
--- a/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/EdmEntitySetImpl.java
+++ b/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/EdmEntitySetImpl.java
@@ -26,12 +26,13 @@ import org.apache.olingo.commons.api.edm.FullQualifiedName;
 
 public class EdmEntitySetImpl extends EdmBindingTargetImpl implements EdmEntitySet {
 
-  private EntitySet entitySet;
+  private final EntitySet entitySet;
 
   public EdmEntitySetImpl(final Edm edm, final EdmEntityContainer container, final String name,
           final FullQualifiedName type, final EntitySet entitySet) {
 
     super(edm, container, name, type, entitySet);
+
     this.entitySet = entitySet;
   }
 
@@ -39,4 +40,9 @@ public class EdmEntitySetImpl extends EdmBindingTargetImpl implements EdmEntityS
   public boolean isIncludeInServiceDocument() {
     return entitySet.isIncludeInServiceDocument();
   }
+
+  @Override
+  public TargetType getAnnotationsTargetType() {
+    return TargetType.EntitySet;
+  }
 }

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/726fbe52/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/EdmEntityTypeImpl.java
----------------------------------------------------------------------
diff --git a/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/EdmEntityTypeImpl.java b/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/EdmEntityTypeImpl.java
index c7dc7fd..3cd09cb 100644
--- a/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/EdmEntityTypeImpl.java
+++ b/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/EdmEntityTypeImpl.java
@@ -27,21 +27,25 @@ import org.apache.olingo.client.api.edm.xml.EntityType;
 import org.apache.olingo.client.api.edm.xml.PropertyRef;
 import org.apache.olingo.client.api.edm.xml.Schema;
 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.EdmKeyPropertyRef;
 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.AbstractEdmEntityType;
+import org.apache.olingo.commons.core.edm.EdmAnnotationHelper;
 import org.apache.olingo.commons.core.edm.EdmStructuredTypeHelper;
 
 public class EdmEntityTypeImpl extends AbstractEdmEntityType {
 
-  private final EdmStructuredTypeHelper helper;
+  private final EdmStructuredTypeHelper typeHelper;
 
-  public static EdmEntityTypeImpl getInstance(final Edm edm, final FullQualifiedName fqn, 
+  private EdmAnnotationHelper annotationHelper;
+
+  public static EdmEntityTypeImpl getInstance(final Edm edm, final FullQualifiedName fqn,
           final List<? extends Schema> xmlSchemas, final EntityType entityType) {
-    
+
     final FullQualifiedName baseTypeName = entityType.getBaseType() == null
             ? null
             : new EdmTypeInfo.Builder().setTypeExpression(entityType.getBaseType()).build().getFullQualifiedName();
@@ -68,26 +72,36 @@ public class EdmEntityTypeImpl extends AbstractEdmEntityType {
           final List<? extends Schema> xmlSchemas, final EntityType entityType) {
 
     super(edm, fqn, baseTypeName, entityType.isHasStream());
-    this.helper = new EdmStructuredTypeHelperImpl(edm, xmlSchemas, entityType);
+    this.typeHelper = new EdmStructuredTypeHelperImpl(edm, getFullQualifiedName(), xmlSchemas, entityType);
+    if (entityType instanceof org.apache.olingo.client.api.edm.xml.v4.EntityType) {
+      this.annotationHelper = new EdmAnnotationHelperImpl(edm,
+              (org.apache.olingo.client.api.edm.xml.v4.EntityType) entityType);
+    }
   }
 
   @Override
   protected Map<String, EdmProperty> getProperties() {
-    return helper.getProperties();
+    return typeHelper.getProperties();
   }
 
   @Override
   protected Map<String, EdmNavigationProperty> getNavigationProperties() {
-    return helper.getNavigationProperties();
+    return typeHelper.getNavigationProperties();
   }
 
   @Override
   public boolean isOpenType() {
-    return helper.isOpenType();
+    return typeHelper.isOpenType();
   }
 
   @Override
   public boolean isAbstract() {
-    return helper.isAbstract();
+    return typeHelper.isAbstract();
   }
+
+  @Override
+  public List<EdmAnnotation> getAnnotations() {
+    return annotationHelper.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/EdmEnumTypeImpl.java
----------------------------------------------------------------------
diff --git a/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/EdmEnumTypeImpl.java b/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/EdmEnumTypeImpl.java
index bba016b..4a76953 100644
--- a/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/EdmEnumTypeImpl.java
+++ b/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/EdmEnumTypeImpl.java
@@ -18,6 +18,12 @@
  */
 package org.apache.olingo.client.core.edm;
 
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
 import org.apache.olingo.client.api.edm.xml.EnumType;
 import org.apache.olingo.client.api.edm.xml.Member;
 import org.apache.olingo.commons.api.edm.Edm;
@@ -26,14 +32,6 @@ import org.apache.olingo.commons.api.edm.EdmMember;
 import org.apache.olingo.commons.api.edm.EdmPrimitiveType;
 import org.apache.olingo.commons.api.edm.FullQualifiedName;
 import org.apache.olingo.commons.core.edm.AbstractEdmEnumType;
-import org.apache.olingo.commons.core.edm.EdmMemberImpl;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.LinkedHashMap;
-import java.util.List;
-import java.util.Map;
 import org.apache.commons.lang3.ArrayUtils;
 import org.apache.olingo.commons.api.edm.EdmException;
 import org.apache.olingo.commons.api.edm.EdmPrimitiveTypeKind;
@@ -76,7 +74,7 @@ public class EdmEnumTypeImpl extends AbstractEdmEnumType implements EdmEnumType
     final Map<String, EdmMember> _members = new LinkedHashMap<String, EdmMember>(xmlMembers.size());
     for (Member xmlMember : xmlMembers) {
       _memberNames.add(xmlMember.getName());
-      _members.put(xmlMember.getName(), new EdmMemberImpl(edm, xmlMember.getName(), xmlMember.getValue()));
+      _members.put(xmlMember.getName(), new EdmMemberImpl(edm, fqn, xmlMember));
     }
     this.memberNames = Collections.unmodifiableList(_memberNames);
     this.members = Collections.unmodifiableMap(_members);

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/726fbe52/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/EdmFunctionImportImpl.java
----------------------------------------------------------------------
diff --git a/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/EdmFunctionImportImpl.java b/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/EdmFunctionImportImpl.java
index 5c2575e..4a68b9b 100644
--- a/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/EdmFunctionImportImpl.java
+++ b/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/EdmFunctionImportImpl.java
@@ -23,15 +23,19 @@ import java.util.List;
 
 import org.apache.olingo.client.api.edm.xml.v4.FunctionImport;
 import org.apache.olingo.commons.api.edm.Edm;
+import org.apache.olingo.commons.api.edm.EdmAnnotation;
 import org.apache.olingo.commons.api.edm.EdmEntityContainer;
 import org.apache.olingo.commons.api.edm.EdmFunction;
 import org.apache.olingo.commons.api.edm.EdmFunctionImport;
 import org.apache.olingo.commons.api.edm.FullQualifiedName;
+import org.apache.olingo.commons.core.edm.EdmAnnotationHelper;
 
 public class EdmFunctionImportImpl extends EdmOperationImportImpl implements EdmFunctionImport {
 
   private final FunctionImport functionImport;
 
+  private final EdmAnnotationHelper helper;
+
   private FullQualifiedName functionFQN;
 
   public EdmFunctionImportImpl(final Edm edm, final EdmEntityContainer container, final String name,
@@ -39,6 +43,12 @@ public class EdmFunctionImportImpl extends EdmOperationImportImpl implements Edm
 
     super(edm, container, name, functionImport.getEntitySet());
     this.functionImport = functionImport;
+    this.helper = new EdmAnnotationHelperImpl(edm, functionImport);
+  }
+
+  @Override
+  public TargetType getAnnotationsTargetType() {
+    return TargetType.FunctionImport;
   }
 
   @Override
@@ -65,4 +75,9 @@ public class EdmFunctionImportImpl extends EdmOperationImportImpl implements Edm
     return functionImport.isIncludeInServiceDocument();
   }
 
+  @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/EdmMemberImpl.java
----------------------------------------------------------------------
diff --git a/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/EdmMemberImpl.java b/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/EdmMemberImpl.java
new file mode 100644
index 0000000..39806a4
--- /dev/null
+++ b/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/EdmMemberImpl.java
@@ -0,0 +1,47 @@
+/*
+ * 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.Collections;
+import java.util.List;
+import org.apache.olingo.client.api.edm.xml.Member;
+import org.apache.olingo.client.core.edm.xml.v4.MemberImpl;
+import org.apache.olingo.commons.api.edm.Edm;
+import org.apache.olingo.commons.api.edm.EdmAnnotation;
+import org.apache.olingo.commons.api.edm.FullQualifiedName;
+import org.apache.olingo.commons.core.edm.AbstractEdmMember;
+import org.apache.olingo.commons.core.edm.EdmAnnotationHelper;
+
+public class EdmMemberImpl extends AbstractEdmMember {
+
+  private EdmAnnotationHelper helper;
+
+  public EdmMemberImpl(final Edm edm, final FullQualifiedName enumFQN, final Member member) {
+    super(edm, enumFQN, member.getName(), member.getValue());
+    this.helper = member instanceof MemberImpl
+            ? new EdmAnnotationHelperImpl(edm, (MemberImpl) member)
+            : null;
+  }
+
+  @Override
+  public List<EdmAnnotation> getAnnotations() {
+    return helper == null ? Collections.<EdmAnnotation>emptyList() : 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/EdmNavigationPropertyImpl.java
----------------------------------------------------------------------
diff --git a/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/EdmNavigationPropertyImpl.java b/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/EdmNavigationPropertyImpl.java
index 08abd9c..9939364 100644
--- a/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/EdmNavigationPropertyImpl.java
+++ b/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/EdmNavigationPropertyImpl.java
@@ -24,24 +24,34 @@ import java.util.List;
 import org.apache.olingo.client.api.edm.xml.v4.NavigationProperty;
 import org.apache.olingo.client.api.edm.xml.v4.ReferentialConstraint;
 import org.apache.olingo.commons.api.edm.Edm;
+import org.apache.olingo.commons.api.edm.EdmAnnotation;
 import org.apache.olingo.commons.api.edm.EdmReferentialConstraint;
 import org.apache.olingo.commons.api.edm.FullQualifiedName;
 import org.apache.olingo.commons.core.edm.AbstractEdmNavigationProperty;
-import org.apache.olingo.commons.core.edm.EdmReferentialConstraintImpl;
+import org.apache.olingo.commons.core.edm.EdmAnnotationHelper;
 import org.apache.olingo.commons.core.edm.EdmTypeInfo;
 
 public class EdmNavigationPropertyImpl extends AbstractEdmNavigationProperty {
 
+  private final FullQualifiedName structuredTypeName;
+
   private final NavigationProperty navigationProperty;
 
   private final EdmTypeInfo edmTypeInfo;
 
+  private final EdmAnnotationHelper helper;
+
   private List<EdmReferentialConstraint> referentialConstraints;
 
-  public EdmNavigationPropertyImpl(final Edm edm, final NavigationProperty navigationProperty) {
+  public EdmNavigationPropertyImpl(
+          final Edm edm, final FullQualifiedName structuredTypeName, final NavigationProperty navigationProperty) {
+
     super(edm, navigationProperty.getName());
+
+    this.structuredTypeName = structuredTypeName;
     this.navigationProperty = navigationProperty;
     this.edmTypeInfo = new EdmTypeInfo.Builder().setTypeExpression(navigationProperty.getType()).build();
+    this.helper = new EdmAnnotationHelperImpl(edm, navigationProperty);
   }
 
   @Override
@@ -71,11 +81,9 @@ public class EdmNavigationPropertyImpl extends AbstractEdmNavigationProperty {
 
   @Override
   public String getReferencingPropertyName(final String referencedPropertyName) {
-    final List<? extends ReferentialConstraint> _referentialConstraints =
-            navigationProperty.getReferentialConstraints();
-    for (ReferentialConstraint constraint : _referentialConstraints) {
-      if (constraint.getReferencedProperty().equals(referencedPropertyName)) {
-        return constraint.getProperty();
+    for (EdmReferentialConstraint constraint : getReferentialConstraints()) {
+      if (constraint.getReferencedPropertyName().equals(referencedPropertyName)) {
+        return constraint.getPropertyName();
       }
     }
 
@@ -89,12 +97,21 @@ public class EdmNavigationPropertyImpl extends AbstractEdmNavigationProperty {
       referentialConstraints = new ArrayList<EdmReferentialConstraint>();
       if (providerConstraints != null) {
         for (ReferentialConstraint constraint : providerConstraints) {
-          referentialConstraints.add(
-                  new EdmReferentialConstraintImpl(constraint.getProperty(), constraint.getReferencedProperty()));
+          referentialConstraints.add(new EdmReferentialConstraintImpl(edm, constraint));
         }
       }
     }
     return referentialConstraints;
   }
 
+  @Override
+  public FullQualifiedName getAnnotationsTargetFQN() {
+    return structuredTypeName;
+  }
+
+  @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/EdmOperationImpl.java
----------------------------------------------------------------------
diff --git a/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/EdmOperationImpl.java b/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/EdmOperationImpl.java
index da29a68..c0d3471 100644
--- a/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/EdmOperationImpl.java
+++ b/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/EdmOperationImpl.java
@@ -24,20 +24,24 @@ import java.util.List;
 import org.apache.olingo.client.api.edm.xml.CommonParameter;
 import org.apache.olingo.client.api.edm.xml.v4.Action;
 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;
 import org.apache.olingo.commons.core.edm.AbstractEdmOperation;
+import org.apache.olingo.commons.core.edm.EdmAnnotationHelper;
 
 public abstract class EdmOperationImpl extends AbstractEdmOperation {
 
   protected final Action operation;
 
+  protected final EdmAnnotationHelper helper;
+
   protected static <T extends EdmOperationImpl> T getInstance(final T instance) {
     final List<? extends CommonParameter> parameters = instance.operation.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);
 
@@ -57,6 +61,7 @@ public abstract class EdmOperationImpl extends AbstractEdmOperation {
 
     super(edm, name, kind);
     this.operation = operation;
+    this.helper = new EdmAnnotationHelperImpl(edm, operation);
   }
 
   private EdmParameter getBindingParameter() {
@@ -87,4 +92,10 @@ public abstract class EdmOperationImpl extends AbstractEdmOperation {
     }
     return result;
   }
+
+  @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/EdmOperationImportImpl.java
----------------------------------------------------------------------
diff --git a/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/EdmOperationImportImpl.java b/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/EdmOperationImportImpl.java
index 9f7aadf..f415246 100644
--- a/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/EdmOperationImportImpl.java
+++ b/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/EdmOperationImportImpl.java
@@ -18,7 +18,10 @@
  */
 package org.apache.olingo.client.core.edm;
 
+import java.util.Collections;
+import java.util.List;
 import org.apache.olingo.commons.api.edm.Edm;
+import org.apache.olingo.commons.api.edm.EdmAnnotation;
 import org.apache.olingo.commons.api.edm.EdmEntityContainer;
 import org.apache.olingo.commons.api.edm.Target;
 import org.apache.olingo.commons.core.edm.AbstractEdmOperationImport;
@@ -31,4 +34,8 @@ public abstract class EdmOperationImportImpl extends AbstractEdmOperationImport
     super(edm, container, name, entitySet == null ? null : new Target.Builder(entitySet, container).build());
   }
 
+  @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/EdmParameterImpl.java
----------------------------------------------------------------------
diff --git a/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/EdmParameterImpl.java b/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/EdmParameterImpl.java
index 6c71709..68388b3 100644
--- a/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/EdmParameterImpl.java
+++ b/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/EdmParameterImpl.java
@@ -18,32 +18,39 @@
  */
 package org.apache.olingo.client.core.edm;
 
-import org.apache.olingo.commons.core.edm.EdmTypeInfo;
+import java.util.Collections;
+import java.util.List;
 import org.apache.olingo.client.api.edm.xml.CommonParameter;
+import org.apache.olingo.client.api.edm.xml.v4.Parameter;
 import org.apache.olingo.commons.api.edm.Edm;
+import org.apache.olingo.commons.api.edm.EdmAnnotation;
 import org.apache.olingo.commons.api.edm.EdmMapping;
+import org.apache.olingo.commons.api.edm.FullQualifiedName;
+import org.apache.olingo.commons.api.edm.geo.SRID;
 import org.apache.olingo.commons.core.edm.AbstractEdmParameter;
+import org.apache.olingo.commons.core.edm.EdmAnnotationHelper;
+import org.apache.olingo.commons.core.edm.EdmTypeInfo;
 
 public class EdmParameterImpl extends AbstractEdmParameter {
 
   private final CommonParameter parameter;
 
-  private final EdmTypeInfo parameterInfo;
+  private final EdmTypeInfo typeInfo;
 
-  public static EdmParameterImpl getInstance(final Edm edm, final CommonParameter parameter) {
-    final EdmTypeInfo paramTypeInfo = new EdmTypeInfo.Builder().setTypeExpression(parameter.getType()).build();
-    return new EdmParameterImpl(edm, parameter, paramTypeInfo);
-  }
+  private EdmAnnotationHelper helper;
 
-  private EdmParameterImpl(final Edm edm, final CommonParameter parameter, final EdmTypeInfo parameterInfo) {
-    super(edm, parameter.getName(), parameterInfo.getFullQualifiedName());
+  public EdmParameterImpl(final Edm edm, final CommonParameter parameter) {
+    super(edm, parameter.getName(), new FullQualifiedName(parameter.getType()));
     this.parameter = parameter;
-    this.parameterInfo = parameterInfo;
+    this.typeInfo = new EdmTypeInfo.Builder().setEdm(edm).setTypeExpression(parameter.getType()).build();
+    if (parameter instanceof Parameter) {
+      this.helper = new EdmAnnotationHelperImpl(edm, (Parameter) parameter);
+    }
   }
 
   @Override
   public boolean isCollection() {
-    return parameterInfo.isCollection();
+    return typeInfo.isCollection();
   }
 
   @Override
@@ -71,4 +78,16 @@ public class EdmParameterImpl extends AbstractEdmParameter {
     return parameter.getScale();
   }
 
+  @Override
+  public SRID getSrid() {
+    return (parameter instanceof Parameter)
+            ? ((Parameter) parameter).getSrid()
+            : null;
+  }
+
+  @Override
+  public List<EdmAnnotation> getAnnotations() {
+    return helper == null ? Collections.<EdmAnnotation>emptyList() : 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/EdmPropertyImpl.java
----------------------------------------------------------------------
diff --git a/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/EdmPropertyImpl.java b/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/EdmPropertyImpl.java
index 9c9b4f6..3928c64 100644
--- a/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/EdmPropertyImpl.java
+++ b/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/EdmPropertyImpl.java
@@ -18,34 +18,44 @@
  */
 package org.apache.olingo.client.core.edm;
 
-import org.apache.olingo.commons.core.edm.EdmTypeInfo;
+import java.util.Collections;
+import java.util.List;
 import org.apache.olingo.client.api.edm.xml.CommonProperty;
+import org.apache.olingo.client.api.edm.xml.v4.Property;
 import org.apache.olingo.commons.api.edm.Edm;
+import org.apache.olingo.commons.api.edm.EdmAnnotation;
 import org.apache.olingo.commons.api.edm.EdmMapping;
 import org.apache.olingo.commons.api.edm.EdmProperty;
 import org.apache.olingo.commons.api.edm.FullQualifiedName;
+import org.apache.olingo.commons.api.edm.geo.SRID;
 import org.apache.olingo.commons.core.edm.AbstractEdmProperty;
+import org.apache.olingo.commons.core.edm.EdmAnnotationHelper;
+import org.apache.olingo.commons.core.edm.EdmTypeInfo;
 
 public class EdmPropertyImpl extends AbstractEdmProperty implements EdmProperty {
 
+  private final FullQualifiedName structuredTypeName;
+
   private final CommonProperty property;
 
-  private final EdmTypeInfo edmTypeInfo;
+  private final EdmTypeInfo typeInfo;
 
-  public EdmPropertyImpl(final Edm edm, final CommonProperty property) {
+  private EdmAnnotationHelper helper;
+
+  public EdmPropertyImpl(final Edm edm, final FullQualifiedName structuredTypeName, final CommonProperty property) {
     super(edm, property.getName());
-    this.property = property;
-    this.edmTypeInfo = new EdmTypeInfo.Builder().setTypeExpression(property.getType()).build();
-  }
 
-  @Override
-  protected FullQualifiedName getTypeFQN() {
-    return edmTypeInfo.getFullQualifiedName();
+    this.structuredTypeName = structuredTypeName;
+    this.property = property;
+    this.typeInfo = new EdmTypeInfo.Builder().setEdm(edm).setTypeExpression(property.getType()).build();
+    if (property instanceof Property) {
+      this.helper = new EdmAnnotationHelperImpl(edm, (Property) property);
+    }
   }
 
   @Override
-  public boolean isCollection() {
-    return edmTypeInfo.isCollection();
+  protected EdmTypeInfo getTypeInfo() {
+    return typeInfo;
   }
 
   @Override
@@ -88,4 +98,21 @@ public class EdmPropertyImpl extends AbstractEdmProperty implements EdmProperty
     return property.getDefaultValue();
   }
 
+  @Override
+  public SRID getSrid() {
+    return (property instanceof Property)
+            ? ((Property) property).getSrid()
+            : null;
+  }
+
+  @Override
+  public FullQualifiedName getAnnotationsTargetFQN() {
+    return structuredTypeName;
+  }
+
+  @Override
+  public List<EdmAnnotation> getAnnotations() {
+    return helper == null ? Collections.<EdmAnnotation>emptyList() : 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/EdmReferentialConstraintImpl.java
----------------------------------------------------------------------
diff --git a/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/EdmReferentialConstraintImpl.java b/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/EdmReferentialConstraintImpl.java
new file mode 100644
index 0000000..7237854
--- /dev/null
+++ b/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/EdmReferentialConstraintImpl.java
@@ -0,0 +1,42 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.olingo.client.core.edm;
+
+import java.util.List;
+import org.apache.olingo.client.api.edm.xml.v4.ReferentialConstraint;
+import org.apache.olingo.commons.api.edm.Edm;
+import org.apache.olingo.commons.api.edm.EdmAnnotation;
+import org.apache.olingo.commons.core.edm.AbstractEdmReferentialConstraint;
+import org.apache.olingo.commons.core.edm.EdmAnnotationHelper;
+
+public class EdmReferentialConstraintImpl extends AbstractEdmReferentialConstraint {
+
+  private final EdmAnnotationHelper helper;
+
+  public EdmReferentialConstraintImpl(final Edm edm, final ReferentialConstraint constraint) {
+    super(constraint.getProperty(), constraint.getReferencedProperty());
+    this.helper = new EdmAnnotationHelperImpl(edm, constraint);
+  }
+
+  @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/EdmReturnTypeImpl.java
----------------------------------------------------------------------
diff --git a/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/EdmReturnTypeImpl.java b/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/EdmReturnTypeImpl.java
index 71a1009..851b299 100644
--- a/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/EdmReturnTypeImpl.java
+++ b/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/EdmReturnTypeImpl.java
@@ -18,16 +18,17 @@
  */
 package org.apache.olingo.client.core.edm;
 
-import org.apache.olingo.commons.core.edm.EdmTypeInfo;
 import org.apache.olingo.client.api.edm.xml.v4.ReturnType;
 import org.apache.olingo.commons.api.edm.Edm;
+import org.apache.olingo.commons.api.edm.geo.SRID;
 import org.apache.olingo.commons.core.edm.AbstractEdmReturnType;
+import org.apache.olingo.commons.core.edm.EdmTypeInfo;
 
 public class EdmReturnTypeImpl extends AbstractEdmReturnType {
 
   private final ReturnType returnType;
 
-  private final EdmTypeInfo returnTypeInfo;
+  private final boolean isCollection;
 
   public static EdmReturnTypeImpl getInstance(final Edm edm, final ReturnType returnType) {
     final EdmTypeInfo returnTypeInfo = new EdmTypeInfo.Builder().setTypeExpression(returnType.getType()).build();
@@ -37,7 +38,12 @@ public class EdmReturnTypeImpl extends AbstractEdmReturnType {
   private EdmReturnTypeImpl(final Edm edm, final ReturnType returnType, final EdmTypeInfo returnTypeInfo) {
     super(edm, returnTypeInfo.getFullQualifiedName());
     this.returnType = returnType;
-    this.returnTypeInfo = returnTypeInfo;
+    this.isCollection = returnTypeInfo.isCollection();
+  }
+
+  @Override
+  public boolean isCollection() {
+    return isCollection;
   }
 
   @Override
@@ -61,8 +67,10 @@ public class EdmReturnTypeImpl extends AbstractEdmReturnType {
   }
 
   @Override
-  public boolean isCollection() {
-    return returnTypeInfo.isCollection();
+  public SRID getSrid() {
+    return (returnType instanceof ReturnType)
+            ? ((ReturnType) returnType).getSrid()
+            : null;
   }
 
 }