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

[14/15] git commit: [OLINGO-263] Some refinements + client support form edmx:IncludeAnnotations

[OLINGO-263] Some refinements + client support form edmx:IncludeAnnotations


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

Branch: refs/heads/master
Commit: 6e9cb60e49664884d8c1e944222d25bb04c8fab7
Parents: 585ddae
Author: Francesco Chicchiriccò <il...@apache.org>
Authored: Mon May 5 15:17:15 2014 +0200
Committer: Francesco Chicchiriccò <il...@apache.org>
Committed: Mon May 5 15:17:15 2014 +0200

----------------------------------------------------------------------
 .../request/retrieve/XMLMetadataRequest.java    |  4 +-
 .../olingo/client/api/edm/xml/XMLMetadata.java  |  2 +
 .../client/api/edm/xml/v4/Annotations.java      |  6 +-
 .../olingo/client/api/op/CommonODataReader.java |  4 +-
 .../retrieve/EdmMetadataRequestImpl.java        |  4 +-
 .../retrieve/v3/XMLMetadataRequestImpl.java     | 25 +++--
 .../retrieve/v4/XMLMetadataRequestImpl.java     | 96 +++++++++++++++-----
 .../edm/AbstractEdmServiceMetadataImpl.java     |  3 +-
 .../olingo/client/core/edm/EdmClientImpl.java   | 19 ++--
 .../core/edm/v4/EdmServiceMetadataImpl.java     |  4 +-
 .../core/edm/xml/AbstractXMLMetadata.java       |  4 +
 .../client/core/edm/xml/v4/AnnotationsImpl.java | 12 +--
 .../client/core/edm/xml/v4/SchemaImpl.java      | 26 +++++-
 .../client/core/op/AbstractODataReader.java     | 10 +-
 14 files changed, 147 insertions(+), 72 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/6e9cb60e/lib/client-api/src/main/java/org/apache/olingo/client/api/communication/request/retrieve/XMLMetadataRequest.java
----------------------------------------------------------------------
diff --git a/lib/client-api/src/main/java/org/apache/olingo/client/api/communication/request/retrieve/XMLMetadataRequest.java b/lib/client-api/src/main/java/org/apache/olingo/client/api/communication/request/retrieve/XMLMetadataRequest.java
index fbeff8f..619aa04 100644
--- a/lib/client-api/src/main/java/org/apache/olingo/client/api/communication/request/retrieve/XMLMetadataRequest.java
+++ b/lib/client-api/src/main/java/org/apache/olingo/client/api/communication/request/retrieve/XMLMetadataRequest.java
@@ -18,12 +18,12 @@
  */
 package org.apache.olingo.client.api.communication.request.retrieve;
 
-import java.util.List;
+import java.util.Map;
 import org.apache.olingo.client.api.edm.xml.Schema;
 import org.apache.olingo.commons.api.format.ODataFormat;
 
 /**
  * This class implements an XML metadata request.
  */
-public interface XMLMetadataRequest extends ODataRetrieveRequest<List<? extends Schema>, ODataFormat> {
+public interface XMLMetadataRequest extends ODataRetrieveRequest<Map<String, Schema>, ODataFormat> {
 }

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/6e9cb60e/lib/client-api/src/main/java/org/apache/olingo/client/api/edm/xml/XMLMetadata.java
----------------------------------------------------------------------
diff --git a/lib/client-api/src/main/java/org/apache/olingo/client/api/edm/xml/XMLMetadata.java b/lib/client-api/src/main/java/org/apache/olingo/client/api/edm/xml/XMLMetadata.java
index bcb5973..bf618f9 100644
--- a/lib/client-api/src/main/java/org/apache/olingo/client/api/edm/xml/XMLMetadata.java
+++ b/lib/client-api/src/main/java/org/apache/olingo/client/api/edm/xml/XMLMetadata.java
@@ -19,6 +19,7 @@
 package org.apache.olingo.client.api.edm.xml;
 
 import java.util.List;
+import java.util.Map;
 
 /**
  * Entry point for access information about EDM metadata.
@@ -56,4 +57,5 @@ public interface XMLMetadata {
    */
   List<? extends Schema> getSchemas();
 
+  Map<String, Schema> getSchemaByNsOrAlias();
 }

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/6e9cb60e/lib/client-api/src/main/java/org/apache/olingo/client/api/edm/xml/v4/Annotations.java
----------------------------------------------------------------------
diff --git a/lib/client-api/src/main/java/org/apache/olingo/client/api/edm/xml/v4/Annotations.java b/lib/client-api/src/main/java/org/apache/olingo/client/api/edm/xml/v4/Annotations.java
index fc481a2..f23bed3 100644
--- a/lib/client-api/src/main/java/org/apache/olingo/client/api/edm/xml/v4/Annotations.java
+++ b/lib/client-api/src/main/java/org/apache/olingo/client/api/edm/xml/v4/Annotations.java
@@ -18,13 +18,9 @@
  */
 package org.apache.olingo.client.api.edm.xml.v4;
 
-import java.util.List;
-
 import org.apache.olingo.client.api.edm.xml.CommonAnnotations;
 
-public interface Annotations extends CommonAnnotations {
-
-  List<? extends Annotation> getAnnotations();
+public interface Annotations extends CommonAnnotations, Annotatable {
 
   Annotation getAnnotation(String term);
 }

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/6e9cb60e/lib/client-api/src/main/java/org/apache/olingo/client/api/op/CommonODataReader.java
----------------------------------------------------------------------
diff --git a/lib/client-api/src/main/java/org/apache/olingo/client/api/op/CommonODataReader.java b/lib/client-api/src/main/java/org/apache/olingo/client/api/op/CommonODataReader.java
index eea1567..897f8f9 100644
--- a/lib/client-api/src/main/java/org/apache/olingo/client/api/op/CommonODataReader.java
+++ b/lib/client-api/src/main/java/org/apache/olingo/client/api/op/CommonODataReader.java
@@ -20,7 +20,7 @@ package org.apache.olingo.client.api.op;
 
 import java.io.InputStream;
 import java.io.Serializable;
-import java.util.List;
+import java.util.Map;
 import org.apache.olingo.client.api.edm.xml.Schema;
 import org.apache.olingo.commons.api.data.ResWrap;
 import org.apache.olingo.commons.api.domain.ODataError;
@@ -56,7 +56,7 @@ public interface CommonODataReader extends Serializable {
    * <tt>&lt;edmx:Reference/&gt;</tt>) metadata document
    * @return metadata representation.
    */
-  Edm readMetadata(List<? extends Schema> xmlSchemas);
+  Edm readMetadata(Map<String, Schema> xmlSchemas);
 
   /**
    * Parses an OData service document.

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/6e9cb60e/lib/client-core/src/main/java/org/apache/olingo/client/core/communication/request/retrieve/EdmMetadataRequestImpl.java
----------------------------------------------------------------------
diff --git a/lib/client-core/src/main/java/org/apache/olingo/client/core/communication/request/retrieve/EdmMetadataRequestImpl.java b/lib/client-core/src/main/java/org/apache/olingo/client/core/communication/request/retrieve/EdmMetadataRequestImpl.java
index 37a4220..5a02a19 100644
--- a/lib/client-core/src/main/java/org/apache/olingo/client/core/communication/request/retrieve/EdmMetadataRequestImpl.java
+++ b/lib/client-core/src/main/java/org/apache/olingo/client/core/communication/request/retrieve/EdmMetadataRequestImpl.java
@@ -19,7 +19,7 @@
 package org.apache.olingo.client.core.communication.request.retrieve;
 
 import java.net.URI;
-import java.util.List;
+import java.util.Map;
 import org.apache.olingo.client.api.CommonODataClient;
 import org.apache.olingo.client.api.communication.request.retrieve.EdmMetadataRequest;
 import org.apache.olingo.client.api.communication.response.ODataRetrieveResponse;
@@ -46,7 +46,7 @@ class EdmMetadataRequestImpl extends AbstractMetadataRequestImpl<Edm> implements
 
   @Override
   public ODataRetrieveResponse<Edm> execute() {
-    final ODataRetrieveResponse<List<? extends Schema>> xmlMetadataResponse =
+    final ODataRetrieveResponse<Map<String, Schema>> xmlMetadataResponse =
             odataClient.getRetrieveRequestFactory().getXMLMetadataRequest(serviceRoot).execute();
 
     return new AbstractODataRetrieveResponse() {

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/6e9cb60e/lib/client-core/src/main/java/org/apache/olingo/client/core/communication/request/retrieve/v3/XMLMetadataRequestImpl.java
----------------------------------------------------------------------
diff --git a/lib/client-core/src/main/java/org/apache/olingo/client/core/communication/request/retrieve/v3/XMLMetadataRequestImpl.java b/lib/client-core/src/main/java/org/apache/olingo/client/core/communication/request/retrieve/v3/XMLMetadataRequestImpl.java
index a7ce9e0..8a480ee 100644
--- a/lib/client-core/src/main/java/org/apache/olingo/client/core/communication/request/retrieve/v3/XMLMetadataRequestImpl.java
+++ b/lib/client-core/src/main/java/org/apache/olingo/client/core/communication/request/retrieve/v3/XMLMetadataRequestImpl.java
@@ -19,7 +19,9 @@
 package org.apache.olingo.client.core.communication.request.retrieve.v3;
 
 import java.net.URI;
-import java.util.List;
+import java.util.HashMap;
+import java.util.Map;
+import org.apache.commons.lang3.StringUtils;
 import org.apache.http.HttpResponse;
 import org.apache.http.client.HttpClient;
 import org.apache.olingo.client.api.communication.request.retrieve.XMLMetadataRequest;
@@ -29,7 +31,7 @@ import org.apache.olingo.client.api.edm.xml.XMLMetadata;
 import org.apache.olingo.client.api.v3.ODataClient;
 import org.apache.olingo.client.core.communication.request.retrieve.AbstractMetadataRequestImpl;
 
-public class XMLMetadataRequestImpl extends AbstractMetadataRequestImpl<List<? extends Schema>>
+public class XMLMetadataRequestImpl extends AbstractMetadataRequestImpl<Map<String, Schema>>
         implements XMLMetadataRequest {
 
   XMLMetadataRequestImpl(final ODataClient odataClient, final URI query) {
@@ -37,13 +39,13 @@ public class XMLMetadataRequestImpl extends AbstractMetadataRequestImpl<List<? e
   }
 
   @Override
-  public ODataRetrieveResponse<List<? extends Schema>> execute() {
+  public ODataRetrieveResponse<Map<String, Schema>> execute() {
     return new XMLMetadataResponseImpl(httpClient, doExecute());
   }
 
   public class XMLMetadataResponseImpl extends AbstractODataRetrieveResponse {
 
-    private XMLMetadata metadata = null;
+    private Map<String, Schema> schemas;
 
     /**
      * Constructor.
@@ -65,15 +67,22 @@ public class XMLMetadataRequestImpl extends AbstractMetadataRequestImpl<List<? e
     }
 
     @Override
-    public List<? extends Schema> getBody() {
-      if (metadata == null) {
+    public Map<String, Schema> getBody() {
+      if (schemas == null) {
+        schemas = new HashMap<String, Schema>();
         try {
-          metadata = odataClient.getDeserializer().toMetadata(getRawResponse());
+          final XMLMetadata metadata = odataClient.getDeserializer().toMetadata(getRawResponse());
+          for (Schema schema : metadata.getSchemas()) {
+            schemas.put(schema.getNamespace(), schema);
+            if (StringUtils.isNotBlank(schema.getAlias())) {
+              schemas.put(schema.getAlias(), schema);
+            }
+          }
         } finally {
           this.close();
         }
       }
-      return metadata.getSchemas();
+      return schemas;
     }
   }
 }

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/6e9cb60e/lib/client-core/src/main/java/org/apache/olingo/client/core/communication/request/retrieve/v4/XMLMetadataRequestImpl.java
----------------------------------------------------------------------
diff --git a/lib/client-core/src/main/java/org/apache/olingo/client/core/communication/request/retrieve/v4/XMLMetadataRequestImpl.java b/lib/client-core/src/main/java/org/apache/olingo/client/core/communication/request/retrieve/v4/XMLMetadataRequestImpl.java
index 91b1516..0a1d48e 100644
--- a/lib/client-core/src/main/java/org/apache/olingo/client/core/communication/request/retrieve/v4/XMLMetadataRequestImpl.java
+++ b/lib/client-core/src/main/java/org/apache/olingo/client/core/communication/request/retrieve/v4/XMLMetadataRequestImpl.java
@@ -19,19 +19,24 @@
 package org.apache.olingo.client.core.communication.request.retrieve.v4;
 
 import java.net.URI;
-import java.util.ArrayList;
-import java.util.List;
+import java.util.HashMap;
+import java.util.Map;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.olingo.client.api.communication.request.retrieve.XMLMetadataRequest;
 import org.apache.olingo.client.api.communication.response.ODataRetrieveResponse;
 import org.apache.olingo.client.api.edm.xml.Schema;
+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.Include;
+import org.apache.olingo.client.api.edm.xml.v4.IncludeAnnotations;
 import org.apache.olingo.client.api.edm.xml.v4.Reference;
 import org.apache.olingo.client.api.edm.xml.v4.XMLMetadata;
 import org.apache.olingo.client.api.v4.ODataClient;
 import org.apache.olingo.client.core.communication.request.retrieve.AbstractMetadataRequestImpl;
+import org.apache.olingo.client.core.edm.xml.v4.AnnotationsImpl;
+import org.apache.olingo.client.core.edm.xml.v4.SchemaImpl;
 
-public class XMLMetadataRequestImpl extends AbstractMetadataRequestImpl<List<? extends Schema>>
+public class XMLMetadataRequestImpl extends AbstractMetadataRequestImpl<Map<String, Schema>>
         implements XMLMetadataRequest {
 
   XMLMetadataRequestImpl(final ODataClient odataClient, final URI uri) {
@@ -39,28 +44,73 @@ public class XMLMetadataRequestImpl extends AbstractMetadataRequestImpl<List<? e
   }
 
   @Override
-  public ODataRetrieveResponse<List<? extends Schema>> execute() {
+  public ODataRetrieveResponse<Map<String, Schema>> execute() {
     final SingleXMLMetadatRequestImpl rootReq = new SingleXMLMetadatRequestImpl((ODataClient) odataClient, uri);
     final ODataRetrieveResponse<XMLMetadata> rootRes = rootReq.execute();
 
     final XMLMetadataResponseImpl response = new XMLMetadataResponseImpl();
 
     final XMLMetadata rootMetadata = rootRes.getBody();
-    response.getSchemas().addAll(rootMetadata.getSchemas());
-
-    if (!rootMetadata.getReferences().isEmpty()) {
-      for (Reference reference : rootMetadata.getReferences()) {
-        final SingleXMLMetadatRequestImpl includeReq = new SingleXMLMetadatRequestImpl((ODataClient) odataClient,
-                odataClient.getURIBuilder(reference.getUri().toASCIIString()).build());
-        final XMLMetadata includeMetadata = includeReq.execute().getBody();
-        
-        for (Include include : reference.getIncludes()) {
-          Schema includedSchema = includeMetadata.getSchema(include.getNamespace());
-          if (includedSchema == null && StringUtils.isNotBlank(include.getAlias())) {
-            includedSchema = includeMetadata.getSchema(include.getAlias());
+    for (Schema schema : rootMetadata.getSchemas()) {
+      response.getBody().put(schema.getNamespace(), schema);
+      if (StringUtils.isNotBlank(schema.getAlias())) {
+        response.getBody().put(schema.getAlias(), schema);
+      }
+    }
+
+    // process external references
+    for (Reference reference : rootMetadata.getReferences()) {
+      final SingleXMLMetadatRequestImpl includeReq = new SingleXMLMetadatRequestImpl(
+              (ODataClient) odataClient, odataClient.getURIBuilder(reference.getUri().toASCIIString()).build());
+      final XMLMetadata includeMetadata = includeReq.execute().getBody();
+
+      // edmx:Include
+      for (Include include : reference.getIncludes()) {
+        final Schema includedSchema = includeMetadata.getSchema(include.getNamespace());
+        if (includedSchema != null) {
+          response.getBody().put(include.getNamespace(), includedSchema);
+          if (StringUtils.isNotBlank(include.getAlias())) {
+            response.getBody().put(include.getAlias(), includedSchema);
+          }
+        }
+      }
+
+      // edmx:IncludeAnnotations
+      for (IncludeAnnotations include : reference.getIncludeAnnotations()) {
+        for (Schema schema : includeMetadata.getSchemas()) {
+          // create empty schema that will be fed with edm:Annotations that match the criteria in IncludeAnnotations
+          final SchemaImpl forInclusion = new SchemaImpl();
+          forInclusion.setNamespace(schema.getNamespace());
+          forInclusion.setAlias(schema.getAlias());
+
+          // process all edm:Annotations in each schema of the included document
+          for (Annotations annotationGroup : ((SchemaImpl) schema).getAnnotationGroups()) {
+              // take into account only when (TargetNamespace was either not provided or matches) and
+            // (Qualifier was either not provided or matches)
+            if ((StringUtils.isBlank(include.getTargetNamespace())
+                    || include.getTargetNamespace().equals(
+                            StringUtils.substringBeforeLast(annotationGroup.getTarget(), ".")))
+                    && (StringUtils.isBlank(include.getQualifier())
+                    || include.getQualifier().equals(annotationGroup.getQualifier()))) {
+
+              final AnnotationsImpl toBeIncluded = new AnnotationsImpl();
+              toBeIncluded.setTarget(annotationGroup.getTarget());
+              toBeIncluded.setQualifier(annotationGroup.getQualifier());
+              // only import annotations with terms matching the given TermNamespace
+              for (Annotation annotation : annotationGroup.getAnnotations()) {
+                if (include.getTermNamespace().equals(StringUtils.substringBeforeLast(annotation.getTerm(), "."))) {
+                  toBeIncluded.getAnnotations().add(annotation);
+                }
+              }
+              forInclusion.getAnnotationGroups().add(toBeIncluded);
+            }
           }
-          if (includedSchema != null) {
-            response.getSchemas().add(includedSchema);
+
+          if (!forInclusion.getAnnotationGroups().isEmpty()) {
+            response.getBody().put(forInclusion.getNamespace(), forInclusion);
+            if (StringUtils.isNotBlank(forInclusion.getAlias())) {
+              response.getBody().put(forInclusion.getAlias(), forInclusion);
+            }
           }
         }
       }
@@ -93,7 +143,7 @@ public class XMLMetadataRequestImpl extends AbstractMetadataRequestImpl<List<? e
 
   public class XMLMetadataResponseImpl extends AbstractODataRetrieveResponse {
 
-    private final List<Schema> schemas = new ArrayList<Schema>();
+    private final Map<String, Schema> schemas = new HashMap<String, Schema>();
 
     /**
      * Constructor.
@@ -109,13 +159,9 @@ public class XMLMetadataRequestImpl extends AbstractMetadataRequestImpl<List<? e
       // just do nothing, this is a placeholder response
     }
 
-    public List<Schema> getSchemas() {
-      return schemas;
-    }
-
     @Override
-    public List<? extends Schema> getBody() {
-      return getSchemas();
+    public Map<String, Schema> getBody() {
+      return schemas;
     }
   }
 

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/6e9cb60e/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/AbstractEdmServiceMetadataImpl.java
----------------------------------------------------------------------
diff --git a/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/AbstractEdmServiceMetadataImpl.java b/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/AbstractEdmServiceMetadataImpl.java
index 020a09a..d598d78 100644
--- a/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/AbstractEdmServiceMetadataImpl.java
+++ b/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/AbstractEdmServiceMetadataImpl.java
@@ -46,8 +46,7 @@ public abstract class AbstractEdmServiceMetadataImpl implements EdmServiceMetada
 
   protected List<EdmActionImportInfo> actionImportInfos;
 
-  public static EdmServiceMetadata getInstance(final ODataServiceVersion version,
-          final List<? extends Schema> xmlSchemas) {
+  public static EdmServiceMetadata getInstance(final ODataServiceVersion version, final List<Schema> xmlSchemas) {
 
     return version.compareTo(ODataServiceVersion.V40) < 0
             ? new org.apache.olingo.client.core.edm.v3.EdmServiceMetadataImpl(xmlSchemas)

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/6e9cb60e/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 3c377a0..e7bdfd0 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
@@ -69,23 +69,25 @@ public class EdmClientImpl extends AbstractEdm {
 
   private final ODataServiceVersion version;
 
-  private final List<? extends Schema> xmlSchemas;
+  private final List<Schema> xmlSchemas;
 
   private final Map<String, Schema> xmlSchemaByNamespace;
 
   private final EdmServiceMetadata serviceMetadata;
 
-  public EdmClientImpl(final ODataServiceVersion version, final List<? extends Schema> xmlSchemas) {
+  public EdmClientImpl(final ODataServiceVersion version, final Map<String, Schema> xmlSchemas) {
     this.version = version;
 
-    this.xmlSchemas = xmlSchemas;
+    this.xmlSchemaByNamespace = xmlSchemas;
 
-    this.xmlSchemaByNamespace = new HashMap<String, Schema>();
-    for (Schema schema : xmlSchemas) {
-      xmlSchemaByNamespace.put(schema.getNamespace(), schema);
+    this.xmlSchemas = new ArrayList<Schema>();
+    for (Schema schema : xmlSchemaByNamespace.values()) {
+      if (!this.xmlSchemas.contains(schema)) {
+        this.xmlSchemas.add(schema);
+      }
     }
 
-    this.serviceMetadata = AbstractEdmServiceMetadataImpl.getInstance(version, xmlSchemas);
+    this.serviceMetadata = AbstractEdmServiceMetadataImpl.getInstance(version, this.xmlSchemas);
   }
 
   @Override
@@ -455,11 +457,8 @@ public class EdmClientImpl extends AbstractEdm {
   protected List<EdmAnnotation> createAnnotations(final FullQualifiedName annotatedName) {
     List<EdmAnnotation> result = null;
 
-    System.out.println("SSSSSSSSS1 " + annotatedName);
-    
     final Schema schema = xmlSchemaByNamespace.get(annotatedName.getNamespace());
     if (schema instanceof org.apache.olingo.client.api.edm.xml.v4.Schema) {
-    System.out.println("SSSSSSSSS2 " + ((org.apache.olingo.client.api.edm.xml.v4.Schema) schema).getAnnotatables());
       final Annotatable annotatable =
               ((org.apache.olingo.client.api.edm.xml.v4.Schema) schema).getAnnotatables().get(annotatedName.getName());
       if (annotatable != null && annotatable.getAnnotations() != null) {

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/6e9cb60e/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 d01b991..798716c 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
@@ -41,9 +41,7 @@ public class EdmServiceMetadataImpl extends AbstractEdmServiceMetadataImpl {
 
   private List<EdmSingletonInfo> singletonInfos;
 
-  private List<EdmActionImportInfo> actionImportInfos;
-
-  public EdmServiceMetadataImpl(final List<? extends Schema> xmlSchemas) {
+  public EdmServiceMetadataImpl(final List<Schema> xmlSchemas) {
     super(xmlSchemas);
   }
 

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/6e9cb60e/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/xml/AbstractXMLMetadata.java
----------------------------------------------------------------------
diff --git a/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/xml/AbstractXMLMetadata.java b/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/xml/AbstractXMLMetadata.java
index e04d5da..729a38d 100644
--- a/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/xml/AbstractXMLMetadata.java
+++ b/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/xml/AbstractXMLMetadata.java
@@ -93,4 +93,8 @@ public abstract class AbstractXMLMetadata extends AbstractEdmItem implements XML
     return this.edmx.getDataServices().getSchemas();
   }
 
+  public Map<String, Schema> getSchemaByNsOrAlias() {
+    return schemaByNsOrAlias;
+  }
+
 }

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/6e9cb60e/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/xml/v4/AnnotationsImpl.java
----------------------------------------------------------------------
diff --git a/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/xml/v4/AnnotationsImpl.java b/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/xml/v4/AnnotationsImpl.java
index a579624..110b21f 100644
--- a/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/xml/v4/AnnotationsImpl.java
+++ b/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/xml/v4/AnnotationsImpl.java
@@ -22,7 +22,7 @@ import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
 
 import java.util.ArrayList;
 import java.util.List;
-
+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.core.edm.xml.AbstractAnnotations;
 
@@ -31,17 +31,17 @@ public class AnnotationsImpl extends AbstractAnnotations implements Annotations
 
   private static final long serialVersionUID = 3877353656301805410L;
 
-  private final List<AnnotationImpl> annotations = new ArrayList<AnnotationImpl>();
+  private final List<Annotation> annotations = new ArrayList<Annotation>();
 
   @Override
-  public List<AnnotationImpl> getAnnotations() {
+  public List<Annotation> getAnnotations() {
     return annotations;
   }
 
   @Override
-  public AnnotationImpl getAnnotation(final String term) {
-    AnnotationImpl result = null;
-    for (AnnotationImpl annotation : getAnnotations()) {
+  public Annotation getAnnotation(final String term) {
+    Annotation result = null;
+    for (Annotation annotation : getAnnotations()) {
       if (term.equals(annotation.getTerm())) {
         result = annotation;
       }

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/6e9cb60e/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/xml/v4/SchemaImpl.java
----------------------------------------------------------------------
diff --git a/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/xml/v4/SchemaImpl.java b/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/xml/v4/SchemaImpl.java
index 064e679..0c6c5a8 100644
--- a/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/xml/v4/SchemaImpl.java
+++ b/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/xml/v4/SchemaImpl.java
@@ -26,14 +26,18 @@ import java.util.Map;
 
 import org.apache.olingo.client.api.edm.xml.EnumType;
 import org.apache.olingo.client.api.edm.xml.v4.Action;
+import org.apache.olingo.client.api.edm.xml.v4.ActionImport;
 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.ComplexType;
 import org.apache.olingo.client.api.edm.xml.v4.EntityContainer;
+import org.apache.olingo.client.api.edm.xml.v4.EntitySet;
 import org.apache.olingo.client.api.edm.xml.v4.EntityType;
 import org.apache.olingo.client.api.edm.xml.v4.Function;
+import org.apache.olingo.client.api.edm.xml.v4.FunctionImport;
 import org.apache.olingo.client.api.edm.xml.v4.Schema;
+import org.apache.olingo.client.api.edm.xml.v4.Singleton;
 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.xml.AbstractSchema;
@@ -193,12 +197,15 @@ public class SchemaImpl extends AbstractSchema implements Schema {
   public Map<String, Annotatable> getAnnotatables() {
     if (annotatables == null) {
       annotatables = new HashMap<String, Annotatable>();
-      for (Action action : getActions()) {
-        annotatables.put(action.getName(), action);
+      for (Annotations annotationGroup : getAnnotationGroups()) {
+        annotatables.put(null, annotationGroup);
       }
       for (Annotation annotation : getAnnotations()) {
         annotatables.put(annotation.getTerm(), annotation);
       }
+      for (Action action : getActions()) {
+        annotatables.put(action.getName(), action);
+      }
       for (ComplexType complexType : getComplexTypes()) {
         annotatables.put(complexType.getName(), complexType);
       }
@@ -219,6 +226,21 @@ public class SchemaImpl extends AbstractSchema implements Schema {
       }
       if (entityContainer != null) {
         annotatables.put(entityContainer.getName(), entityContainer);
+        for (Annotation annotation : entityContainer.getAnnotations()) {
+          annotatables.put(annotation.getTerm(), annotation);
+        }
+        for (ActionImport actionImport : entityContainer.getActionImports()) {
+          annotatables.put(actionImport.getName(), actionImport);
+        }
+        for (FunctionImport functionImport : entityContainer.getFunctionImports()) {
+          annotatables.put(functionImport.getName(), functionImport);
+        }
+        for (EntitySet entitySet : entityContainer.getEntitySets()) {
+          annotatables.put(entitySet.getName(), entitySet);
+        }
+        for (Singleton singleton : entityContainer.getSingletons()) {
+          annotatables.put(singleton.getName(), singleton);
+        }
       }
     }
     return annotatables;

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/6e9cb60e/lib/client-core/src/main/java/org/apache/olingo/client/core/op/AbstractODataReader.java
----------------------------------------------------------------------
diff --git a/lib/client-core/src/main/java/org/apache/olingo/client/core/op/AbstractODataReader.java b/lib/client-core/src/main/java/org/apache/olingo/client/core/op/AbstractODataReader.java
index 9cc9548..18aa0cf 100644
--- a/lib/client-core/src/main/java/org/apache/olingo/client/core/op/AbstractODataReader.java
+++ b/lib/client-core/src/main/java/org/apache/olingo/client/core/op/AbstractODataReader.java
@@ -20,7 +20,7 @@ package org.apache.olingo.client.core.op;
 
 import java.io.InputStream;
 import java.net.URI;
-import java.util.List;
+import java.util.Map;
 import org.apache.commons.io.IOUtils;
 import org.apache.olingo.client.api.CommonODataClient;
 import org.apache.olingo.client.api.data.ServiceDocument;
@@ -56,19 +56,19 @@ public abstract class AbstractODataReader implements CommonODataReader {
    */
   protected static final Logger LOG = LoggerFactory.getLogger(AbstractODataReader.class);
 
-  protected final CommonODataClient client;
+  protected final CommonODataClient<?> client;
 
-  protected AbstractODataReader(final CommonODataClient client) {
+  protected AbstractODataReader(final CommonODataClient<?> client) {
     this.client = client;
   }
 
   @Override
   public Edm readMetadata(final InputStream input) {
-    return readMetadata(client.getDeserializer().toMetadata(input).getSchemas());
+    return readMetadata(client.getDeserializer().toMetadata(input).getSchemaByNsOrAlias());
   }
 
   @Override
-  public Edm readMetadata(final List<? extends Schema> xmlSchemas) {
+  public Edm readMetadata(final Map<String, Schema> xmlSchemas) {
     return new EdmClientImpl(client.getServiceVersion(), xmlSchemas);
   }