Repository: olingo-odata2
Updated Branches:
  refs/heads/master eee416532 -> 8d90a1606


[OLINGO-1005] Support edmx references in metadata


Project: http://git-wip-us.apache.org/repos/asf/olingo-odata2/repo
Commit: http://git-wip-us.apache.org/repos/asf/olingo-odata2/commit/546466ce
Tree: http://git-wip-us.apache.org/repos/asf/olingo-odata2/tree/546466ce
Diff: http://git-wip-us.apache.org/repos/asf/olingo-odata2/diff/546466ce

Branch: refs/heads/master
Commit: 546466ceb9db7956c7eb344aa78a1afde3041744
Parents: eee4165
Author: Christian Amend <[email protected]>
Authored: Tue Jun 14 17:30:41 2016 +0200
Committer: Christian Amend <[email protected]>
Committed: Wed Aug 17 14:31:39 2016 +0200

----------------------------------------------------------------------
 .../odata2/api/edm/provider/DataServices.java   | 36 ++++++++++
 .../olingo/odata2/api/ep/EntityProvider.java    | 32 +++++++++
 .../odata2/core/ep/BasicEntityProvider.java     | 23 +++++-
 .../odata2/core/ep/ProviderFacadeImpl.java      |  7 ++
 .../core/ep/producer/XmlMetadataProducer.java   | 50 ++++++++++----
 .../odata2/core/ep/BasicProviderTest.java       | 73 +++++++++++++++++++-
 .../ep/consumer/XmlMetadataConsumerTest.java    | 70 ++++++++++++++-----
 .../apache/olingo/odata2/fit/ref/BatchTest.java | 27 ++++----
 8 files changed, 270 insertions(+), 48 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/546466ce/odata2-lib/odata-api/src/main/java/org/apache/olingo/odata2/api/edm/provider/DataServices.java
----------------------------------------------------------------------
diff --git 
a/odata2-lib/odata-api/src/main/java/org/apache/olingo/odata2/api/edm/provider/DataServices.java
 
b/odata2-lib/odata-api/src/main/java/org/apache/olingo/odata2/api/edm/provider/DataServices.java
index 552eb01..535a4e8 100644
--- 
a/odata2-lib/odata-api/src/main/java/org/apache/olingo/odata2/api/edm/provider/DataServices.java
+++ 
b/odata2-lib/odata-api/src/main/java/org/apache/olingo/odata2/api/edm/provider/DataServices.java
@@ -29,6 +29,8 @@ public class DataServices {
 
   private List<Schema> schemas;
   private String dataServiceVersion;
+  private String customEdmxVersion;
+  private List<AnnotationElement> annotationElements;
 
   /**
    * Sets the schemas for this {@link DataServices}
@@ -51,6 +53,33 @@ public class DataServices {
   }
 
   /**
+   * Sets the collection of {@link AnnotationElement} for this {@link 
DataServices}
+   * @param annotationElements
+   * @return {@link ComplexType} for method chaining
+   */
+  public DataServices setAnnotationElements(final List<AnnotationElement> 
annotationElements) {
+    this.annotationElements = annotationElements;
+    return this;
+  }
+
+  /**
+   * Sets a custom edmx version which is used in the metadata document
+   * @param customEdmxVersion
+   * @return {@link ComplexType} for method chaining
+   */
+  public DataServices setCustomEdmxVersion(String customEdmxVersion) {
+    this.customEdmxVersion = customEdmxVersion;
+    return this;
+  }
+
+  /**
+   * @return collection of {@link AnnotationElement} annotation elements
+   */
+  public List<AnnotationElement> getAnnotationElements() {
+    return annotationElements;
+  }
+
+  /**
    * @return List<{@link Schema}>
    */
   public List<Schema> getSchemas() {
@@ -63,4 +92,11 @@ public class DataServices {
   public String getDataServiceVersion() {
     return dataServiceVersion;
   }
+
+  /**
+   * @return <b>String</b> custom edmx version
+   */
+  public String getCustomEdmxVersion() {
+    return customEdmxVersion;
+  }
 }

http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/546466ce/odata2-lib/odata-api/src/main/java/org/apache/olingo/odata2/api/ep/EntityProvider.java
----------------------------------------------------------------------
diff --git 
a/odata2-lib/odata-api/src/main/java/org/apache/olingo/odata2/api/ep/EntityProvider.java
 
b/odata2-lib/odata-api/src/main/java/org/apache/olingo/odata2/api/ep/EntityProvider.java
index 361a94e..438dd0b 100644
--- 
a/odata2-lib/odata-api/src/main/java/org/apache/olingo/odata2/api/ep/EntityProvider.java
+++ 
b/odata2-lib/odata-api/src/main/java/org/apache/olingo/odata2/api/ep/EntityProvider.java
@@ -31,6 +31,7 @@ import org.apache.olingo.odata2.api.edm.Edm;
 import org.apache.olingo.odata2.api.edm.EdmEntitySet;
 import org.apache.olingo.odata2.api.edm.EdmFunctionImport;
 import org.apache.olingo.odata2.api.edm.EdmProperty;
+import org.apache.olingo.odata2.api.edm.provider.DataServices;
 import org.apache.olingo.odata2.api.edm.provider.Schema;
 import org.apache.olingo.odata2.api.ep.entry.ODataEntry;
 import org.apache.olingo.odata2.api.ep.feed.ODataDeltaFeed;
@@ -78,6 +79,22 @@ public final class EntityProvider {
         throws EntityProviderException;
 
     /**
+     * Write metadata document in XML format for the given schemas and the 
provided predefined
+     * namespaces at the EDMX element. PredefinedNamespaces is of type
+     * Map{@literal <}prefix,namespace{@literal >} and may be null or an empty 
Map.
+     * <b>Important<b>
+     * This method takes edmx references into account
+     * This method will not calculate the DataServiceVersion but will instead 
take the version provided via the
+     * signature if no version is set the default version 2.0 is used.
+     * @param serviceMetadata
+     * @param predefinedNamespaces type of Map{@literal 
<}prefix,namespace{@literal >} and may be null or an empty Map
+     * @return resulting {@link ODataResponse} with written metadata content.
+     * @throws EntityProviderException if writing of data (serialization) fails
+     */
+    ODataResponse writeMetadata(final DataServices serviceMetadata,
+        final Map<String, String> predefinedNamespaces) throws 
EntityProviderException;
+
+    /**
      * Write service document based on given {@link Edm} and <code>service 
root</code> as
      * given content type.
      * 
@@ -484,6 +501,21 @@ public final class EntityProvider {
   }
 
   /**
+   * Write metadata document in XML format for the given schemas and the 
provided predefined
+   * namespaces at the EDMX element. PredefinedNamespaces is of type
+   * Map{@literal <}prefix,namespace{@literal >} and may be null or an empty 
Map.
+   * 
+   * @param serviceMetadata
+   * @param predefinedNamespaces type of Map{@literal 
<}prefix,namespace{@literal >} and may be null or an empty Map
+   * @return resulting {@link ODataResponse} with written metadata content.
+   * @throws EntityProviderException if writing of data (serialization) fails
+   */
+  public static ODataResponse writeMetadata(final DataServices serviceMetadata,
+      final Map<String, String> predefinedNamespaces) throws 
EntityProviderException {
+    return createEntityProvider().writeMetadata(serviceMetadata, 
predefinedNamespaces);
+  }
+
+  /**
    * Write service document based on given {@link Edm} and <code>service 
root</code> as
    * given content type.
    * 

http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/546466ce/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/ep/BasicEntityProvider.java
----------------------------------------------------------------------
diff --git 
a/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/ep/BasicEntityProvider.java
 
b/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/ep/BasicEntityProvider.java
index 56d34fc..7766431 100644
--- 
a/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/ep/BasicEntityProvider.java
+++ 
b/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/ep/BasicEntityProvider.java
@@ -232,12 +232,18 @@ public class BasicEntityProvider {
    */
   public ODataResponse writeMetadata(final List<Schema> schemas, final 
Map<String, String> predefinedNamespaces)
       throws EntityProviderException {
-    ODataResponseBuilder builder = ODataResponse.newBuilder();
     String dataServiceVersion = ODataServiceVersion.V10;
     if (schemas != null) {
       dataServiceVersion = calculateDataServiceVersion(schemas);
     }
     DataServices metadata = new 
DataServices().setSchemas(schemas).setDataServiceVersion(dataServiceVersion);
+    return writeMetadataInternal(predefinedNamespaces, dataServiceVersion, 
metadata);
+  }
+
+  private ODataResponse writeMetadataInternal(final Map<String, String> 
predefinedNamespaces, String dataServiceVersion,
+      DataServices metadata) throws EntityProviderException,
+      EntityProviderProducerException {
+    ODataResponseBuilder builder = ODataResponse.newBuilder();
     OutputStreamWriter writer = null;
     CircleStreamBuffer csb = new CircleStreamBuffer();
     try {
@@ -260,6 +266,21 @@ public class BasicEntityProvider {
   }
 
   /**
+   * Writes the metadata in XML format. Predefined namespaces is of type 
Map{@literal <}prefix,namespace{@literal >} and
+   * may be null or an empty Map.
+   * @param serviceMetadata
+   * @param predefinedNamespaces
+   * @return resulting {@link ODataResponse} with written metadata content
+   * @throws EntityProviderException
+   */
+  public ODataResponse writeMetadata(final DataServices serviceMetadata,
+      final Map<String, String> predefinedNamespaces) throws 
EntityProviderException {
+    String dataServiceVersion = serviceMetadata.getDataServiceVersion() == 
null ? ODataServiceVersion.V20
+        : serviceMetadata.getDataServiceVersion();
+    return writeMetadataInternal(predefinedNamespaces, dataServiceVersion, 
serviceMetadata);
+  }
+
+  /**
    * Calculates the necessary data service version for the metadata 
serialization
    * @param schemas
    * @return DataServiceversion as String

http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/546466ce/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/ep/ProviderFacadeImpl.java
----------------------------------------------------------------------
diff --git 
a/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/ep/ProviderFacadeImpl.java
 
b/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/ep/ProviderFacadeImpl.java
index 4937e30..739513c 100644
--- 
a/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/ep/ProviderFacadeImpl.java
+++ 
b/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/ep/ProviderFacadeImpl.java
@@ -31,6 +31,7 @@ import org.apache.olingo.odata2.api.edm.Edm;
 import org.apache.olingo.odata2.api.edm.EdmEntitySet;
 import org.apache.olingo.odata2.api.edm.EdmFunctionImport;
 import org.apache.olingo.odata2.api.edm.EdmProperty;
+import org.apache.olingo.odata2.api.edm.provider.DataServices;
 import org.apache.olingo.odata2.api.edm.provider.EdmProvider;
 import org.apache.olingo.odata2.api.edm.provider.Schema;
 import org.apache.olingo.odata2.api.ep.EntityProvider.EntityProviderInterface;
@@ -220,6 +221,12 @@ public class ProviderFacadeImpl implements 
EntityProviderInterface {
   }
 
   @Override
+  public ODataResponse writeMetadata(final DataServices seriviceMetadata,
+      final Map<String, String> predefinedNamespaces) throws 
EntityProviderException {
+    return create().writeMetadata(seriviceMetadata, predefinedNamespaces);
+  }
+
+  @Override
   public Edm readMetadata(final InputStream inputStream, final boolean 
validate) throws EntityProviderException {
     EdmProvider provider = new EdmxProvider().parse(inputStream, validate);
     return new EdmImplProv(provider);

http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/546466ce/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/ep/producer/XmlMetadataProducer.java
----------------------------------------------------------------------
diff --git 
a/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/ep/producer/XmlMetadataProducer.java
 
b/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/ep/producer/XmlMetadataProducer.java
index f301482..6bba219 100644
--- 
a/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/ep/producer/XmlMetadataProducer.java
+++ 
b/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/ep/producer/XmlMetadataProducer.java
@@ -67,28 +67,48 @@ public class XmlMetadataProducer {
       Map<String, String> predefinedNamespaces) throws EntityProviderException 
{
 
     try {
+      String edmxNamespace = Edm.NAMESPACE_EDMX_2007_06;
+      String defaultNamespace = Edm.NAMESPACE_EDM_2008_09;
+
+      if (predefinedNamespaces == null) {
+        predefinedNamespaces = new HashMap<String, String>();
+      } else {
+        String predefinedEdmxNamespace = 
predefinedNamespaces.get(Edm.PREFIX_EDMX);
+        if (predefinedEdmxNamespace != null) {
+          edmxNamespace = predefinedEdmxNamespace;
+          predefinedNamespaces.remove(Edm.PREFIX_EDMX);
+        }
+        String predefinedDefaultNamespace = predefinedNamespaces.get(null);
+        if (predefinedDefaultNamespace != null) {
+          defaultNamespace = predefinedDefaultNamespace;
+          predefinedNamespaces.remove(null);
+        }
+      }
+
       xmlStreamWriter.writeStartDocument();
-      xmlStreamWriter.setPrefix(Edm.PREFIX_EDMX, Edm.NAMESPACE_EDMX_2007_06);
+      xmlStreamWriter.setPrefix(Edm.PREFIX_EDMX, edmxNamespace);
       xmlStreamWriter.setPrefix(Edm.PREFIX_M, Edm.NAMESPACE_M_2007_08);
-      xmlStreamWriter.setDefaultNamespace(Edm.NAMESPACE_EDM_2008_09);
 
-      xmlStreamWriter.writeStartElement(Edm.NAMESPACE_EDMX_2007_06, "Edmx");
-      xmlStreamWriter.writeAttribute("Version", "1.0");
-      xmlStreamWriter.writeNamespace(Edm.PREFIX_EDMX, 
Edm.NAMESPACE_EDMX_2007_06);
+      xmlStreamWriter.writeStartElement(edmxNamespace, "Edmx");
+      xmlStreamWriter.writeNamespace(Edm.PREFIX_EDMX, edmxNamespace);
+      if(metadata.getCustomEdmxVersion() == null){
+        xmlStreamWriter.writeAttribute("Version", "1.0");
+      }else {
+        xmlStreamWriter.writeAttribute("Version", 
metadata.getCustomEdmxVersion());
+      }
+
+      for (Map.Entry<String, String> entry : predefinedNamespaces.entrySet()) {
+        xmlStreamWriter.writeNamespace(entry.getKey(), entry.getValue());
+      }
+
+      writeAnnotationElements(metadata.getAnnotationElements(), 
predefinedNamespaces, xmlStreamWriter);
 
-      xmlStreamWriter.writeStartElement(Edm.NAMESPACE_EDMX_2007_06, 
XmlMetadataConstants.EDM_DATA_SERVICES);
+      xmlStreamWriter.writeStartElement(edmxNamespace, 
XmlMetadataConstants.EDM_DATA_SERVICES);
+      xmlStreamWriter.setDefaultNamespace(defaultNamespace);
       xmlStreamWriter.writeAttribute(Edm.PREFIX_M, Edm.NAMESPACE_M_2007_08,
           XmlMetadataConstants.EDM_DATA_SERVICE_VERSION, 
metadata.getDataServiceVersion());
       xmlStreamWriter.writeNamespace(Edm.PREFIX_M, Edm.NAMESPACE_M_2007_08);
 
-      if (predefinedNamespaces != null) {
-        for (Map.Entry<String, String> entry : 
predefinedNamespaces.entrySet()) {
-          xmlStreamWriter.writeNamespace(entry.getKey(), entry.getValue());
-        }
-      } else {
-        predefinedNamespaces = new HashMap<String, String>();
-      }
-
       Collection<Schema> schemas = metadata.getSchemas();
       if (schemas != null) {
         for (Schema schema : schemas) {
@@ -97,7 +117,7 @@ public class XmlMetadataProducer {
             
xmlStreamWriter.writeAttribute(XmlMetadataConstants.EDM_SCHEMA_ALIAS, 
schema.getAlias());
           }
           
xmlStreamWriter.writeAttribute(XmlMetadataConstants.EDM_SCHEMA_NAMESPACE, 
schema.getNamespace());
-          xmlStreamWriter.writeDefaultNamespace(Edm.NAMESPACE_EDM_2008_09);
+          xmlStreamWriter.writeDefaultNamespace(defaultNamespace);
 
           writeAnnotationAttributes(schema.getAnnotationAttributes(), 
predefinedNamespaces, null, xmlStreamWriter);
 

http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/546466ce/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ep/BasicProviderTest.java
----------------------------------------------------------------------
diff --git 
a/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ep/BasicProviderTest.java
 
b/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ep/BasicProviderTest.java
index ecefecd..031f692 100644
--- 
a/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ep/BasicProviderTest.java
+++ 
b/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ep/BasicProviderTest.java
@@ -26,14 +26,21 @@ import static org.junit.Assert.assertTrue;
 
 import java.io.ByteArrayInputStream;
 import java.io.InputStream;
+import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
 
+import org.apache.olingo.odata2.api.ODataServiceVersion;
 import org.apache.olingo.odata2.api.edm.Edm;
 import org.apache.olingo.odata2.api.edm.EdmProperty;
 import org.apache.olingo.odata2.api.edm.EdmTyped;
+import org.apache.olingo.odata2.api.edm.provider.AnnotationAttribute;
+import org.apache.olingo.odata2.api.edm.provider.AnnotationElement;
+import org.apache.olingo.odata2.api.edm.provider.DataServices;
 import org.apache.olingo.odata2.api.edm.provider.EdmProvider;
+import org.apache.olingo.odata2.api.edm.provider.Schema;
 import org.apache.olingo.odata2.api.ep.EntityProviderException;
 import org.apache.olingo.odata2.api.processor.ODataResponse;
 import org.apache.olingo.odata2.core.commons.ContentType;
@@ -63,7 +70,8 @@ public class BasicProviderTest extends AbstractProviderTest {
     predefinedNamespaces.put("annoPrefix2", "http://annoNamespace";);
     predefinedNamespaces.put("annoPrefix", "http://annoNamespace";);
 
-    ODataResponse response = provider.writeMetadata(null, 
predefinedNamespaces);
+    List<Schema> schemas = null;
+    ODataResponse response = provider.writeMetadata(schemas, 
predefinedNamespaces);
     assertNotNull(response);
     assertNotNull(response.getEntity());
     assertNull("BasicProvider should not set content header", 
response.getContentHeader());
@@ -131,6 +139,69 @@ public class BasicProviderTest extends 
AbstractProviderTest {
   }
 
   @Test
+  public void metadataWithReferences() throws Exception {
+    DataServices serviceMetadata = new DataServices();
+    List<AnnotationElement> annoElements = new ArrayList<AnnotationElement>();
+    annoElements.add(createElementWithoutInclude());
+    annoElements.add(createElementWithInclude());
+    serviceMetadata.setAnnotationElements(annoElements);
+    serviceMetadata.setDataServiceVersion(ODataServiceVersion.V20);
+    ODataResponse response = provider.writeMetadata(serviceMetadata, null);
+    assertNotNull(response);
+    assertNotNull(response.getEntity());
+    assertNull("BasicProvider should not set content header", 
response.getContentHeader());
+    String metadata = StringHelper.inputStreamToString((InputStream) 
response.getEntity());
+    assertTrue(metadata.contains(
+        "edmx:Reference 
xmlns:edmx=\"http://docs.oasis-open.org/odata/ns/edmx\"; 
Uri=\"http://someurl.com\"";));
+    assertTrue(metadata.contains("edmx:Include 
xmlns:edmx=\"http://docs.oasis-open.org/odata/ns/edmx\"";));
+  }
+  
+  @Test
+  public void metadataWithReferencesAndPredefinedNamespaces() throws Exception 
{
+    DataServices serviceMetadata = new DataServices();
+    serviceMetadata.setCustomEdmxVersion("4.0");
+    List<AnnotationElement> annoElements = new ArrayList<AnnotationElement>();
+    annoElements.add(createElementWithoutInclude());
+    annoElements.add(createElementWithInclude());
+    serviceMetadata.setAnnotationElements(annoElements);
+    serviceMetadata.setDataServiceVersion("4.0");
+    
+    Map<String, String> predefinedNamespaces = new HashMap<String, String>();
+    predefinedNamespaces.put("edmx", 
"http://docs.oasis-open.org/odata/ns/edmx";);
+    predefinedNamespaces.put(null, "http://docs.oasis-open.org/odata/ns/edmx";);
+    
+    ODataResponse response = provider.writeMetadata(serviceMetadata, 
predefinedNamespaces);
+    assertNotNull(response);
+    assertNotNull(response.getEntity());
+    assertNull("BasicProvider should not set content header", 
response.getContentHeader());
+    String metadata = StringHelper.inputStreamToString((InputStream) 
response.getEntity());
+    assertTrue(metadata.contains(
+        "edmx:Reference 
xmlns:edmx=\"http://docs.oasis-open.org/odata/ns/edmx\"; 
Uri=\"http://someurl.com\"";));
+    assertTrue(metadata.contains("edmx:Include 
xmlns:edmx=\"http://docs.oasis-open.org/odata/ns/edmx\"";));
+    assertTrue(metadata.contains("edmx:Edmx 
xmlns:edmx=\"http://docs.oasis-open.org/odata/ns/edmx\"; Version=\"4.0\""));
+  }
+
+  private AnnotationElement createElementWithInclude() {
+    List<AnnotationAttribute> childAttributes = new 
ArrayList<AnnotationAttribute>();
+    childAttributes.add(new 
AnnotationAttribute().setName("Namespace").setText("Org.OData.Core.V1"));
+    childAttributes.add(new 
AnnotationAttribute().setName("Alias").setText("UI"));
+    List<AnnotationElement> childElements = new ArrayList<AnnotationElement>();
+    childElements.add(new AnnotationElement().setName("Include").setNamespace(
+        
"http://docs.oasis-open.org/odata/ns/edmx";).setPrefix("edmx").setAttributes(childAttributes));
+    List<AnnotationAttribute> referenceAttributes = new 
ArrayList<AnnotationAttribute>();
+    referenceAttributes.add(new 
AnnotationAttribute().setName("Uri").setText("http://someurl2.com";));
+    return new 
AnnotationElement().setName("Reference").setPrefix("edmx").setNamespace(
+        
"http://docs.oasis-open.org/odata/ns/edmx";).setAttributes(referenceAttributes).setChildElements(childElements);
+  }
+
+  private AnnotationElement createElementWithoutInclude() {
+    List<AnnotationAttribute> referenceAttributes = new 
ArrayList<AnnotationAttribute>();
+    referenceAttributes.add(new 
AnnotationAttribute().setName("Uri").setText("http://someurl.com";));
+    return new 
AnnotationElement().setName("Reference").setPrefix("edmx").setNamespace(
+        
"http://docs.oasis-open.org/odata/ns/edmx";).setAttributes(referenceAttributes);
+  }
+
+  @Test
   public void writeMetadata3() throws Exception {
     EdmProvider testProvider = new EdmTestProvider();
 

http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/546466ce/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ep/consumer/XmlMetadataConsumerTest.java
----------------------------------------------------------------------
diff --git 
a/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ep/consumer/XmlMetadataConsumerTest.java
 
b/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ep/consumer/XmlMetadataConsumerTest.java
index 83d234f..ec8e96c 100644
--- 
a/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ep/consumer/XmlMetadataConsumerTest.java
+++ 
b/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ep/consumer/XmlMetadataConsumerTest.java
@@ -26,12 +26,14 @@ import static org.junit.Assert.fail;
 
 import java.io.InputStream;
 import java.io.StringReader;
+import java.util.ArrayList;
 import java.util.List;
 
 import javax.xml.stream.XMLInputFactory;
 import javax.xml.stream.XMLStreamException;
 import javax.xml.stream.XMLStreamReader;
 
+import org.apache.olingo.odata2.api.ODataServiceVersion;
 import org.apache.olingo.odata2.api.edm.Edm;
 import org.apache.olingo.odata2.api.edm.EdmAction;
 import org.apache.olingo.odata2.api.edm.EdmConcurrencyMode;
@@ -177,7 +179,7 @@ public class XmlMetadataConsumerTest extends 
AbstractXmlConsumerTest {
       + "<EntityType Name= \"Photo\"><Key><PropertyRef 
Name=\"Id\"/></Key><Property Name=\"Id\" Type=\"Edm.Int32\" " +
       "Nullable=\"false\" MaxLength=\"Max\"/><Property Name=\"Name\" 
Type=\"Edm.Int32\" MaxLength=\"max\"/>"
       + "</EntityType></Schema></edmx:DataServices></edmx:Edmx>";
-  
+
   @Test
   public void testMetadataDokumentWithWhitepaces() throws Exception {
     final String metadata = ""
@@ -197,11 +199,11 @@ public class XmlMetadataConsumerTest extends 
AbstractXmlConsumerTest {
         + "       </Schema>"
         + "  </edmx:DataServices>"
         + "</edmx:Edmx>";
-    
+
     XmlMetadataConsumer parser = new XmlMetadataConsumer();
     XMLStreamReader reader = createStreamReader(metadata);
     DataServices result = parser.readMetadata(reader, true);
-    
+
     assertEquals(1, result.getSchemas().size());
     List<EntityType> entityTypes = result.getSchemas().get(0).getEntityTypes();
     assertEquals(1, entityTypes.size());
@@ -211,11 +213,11 @@ public class XmlMetadataConsumerTest extends 
AbstractXmlConsumerTest {
     AnnotationElement annotationElement = annotationElements.get(0);
     List<AnnotationElement> childElements = 
annotationElement.getChildElements();
     assertEquals(2, childElements.size());
-    
+
     assertEquals(" value1", childElements.get(0).getText());
     assertEquals("value2", childElements.get(1).getText());
   }
-  
+
   @Test
   public void testMetadataDokumentWithWhitepacesMultiline() throws Exception {
     final String metadata = ""
@@ -236,11 +238,11 @@ public class XmlMetadataConsumerTest extends 
AbstractXmlConsumerTest {
         + "       </Schema>"
         + "  </edmx:DataServices>"
         + "</edmx:Edmx>";
-    
+
     XmlMetadataConsumer parser = new XmlMetadataConsumer();
     XMLStreamReader reader = createStreamReader(metadata);
     DataServices result = parser.readMetadata(reader, true);
-    
+
     assertEquals(1, result.getSchemas().size());
     List<EntityType> entityTypes = result.getSchemas().get(0).getEntityTypes();
     assertEquals(1, entityTypes.size());
@@ -250,12 +252,12 @@ public class XmlMetadataConsumerTest extends 
AbstractXmlConsumerTest {
     AnnotationElement annotationElement = annotationElements.get(0);
     List<AnnotationElement> childElements = 
annotationElement.getChildElements();
     assertEquals(2, childElements.size());
-    
-    assertEquals(" value1\n" + 
+
+    assertEquals(" value1\n" +
         "                 long long long multiline attribute", 
childElements.get(0).getText());
     assertEquals("value2", childElements.get(1).getText());
   }
-  
+
   @Test
   public void testMetadataDokumentWithWhitepaces2() throws Exception {
     final String metadata = ""
@@ -274,11 +276,11 @@ public class XmlMetadataConsumerTest extends 
AbstractXmlConsumerTest {
         + "       </Schema>"
         + "  </edmx:DataServices>"
         + "</edmx:Edmx>";
-    
+
     XmlMetadataConsumer parser = new XmlMetadataConsumer();
     XMLStreamReader reader = createStreamReader(metadata);
     DataServices result = parser.readMetadata(reader, true);
-    
+
     assertEquals(1, result.getSchemas().size());
     List<EntityType> entityTypes = result.getSchemas().get(0).getEntityTypes();
     assertEquals(1, entityTypes.size());
@@ -288,10 +290,10 @@ public class XmlMetadataConsumerTest extends 
AbstractXmlConsumerTest {
     AnnotationElement annotationElement = annotationElements.get(0);
     List<AnnotationElement> childElements = 
annotationElement.getChildElements();
     assertEquals(1, childElements.size());
-    
+
     assertEquals(" value1", childElements.get(0).getText());
   }
-  
+
   @Test
   public void stringValueForMaxLegthFacet() throws Exception {
     XmlMetadataConsumer parser = new XmlMetadataConsumer();
@@ -736,7 +738,6 @@ public class XmlMetadataConsumerTest extends 
AbstractXmlConsumerTest {
         assertEquals(EdmSimpleTypeKind.Int32, 
functionImport1.getParameters().get(1).getType());
         assertEquals(Boolean.FALSE, 
functionImport1.getParameters().get(1).getFacets().isNullable());
 
-
         FunctionImport functionImport2 = container.getFunctionImports().get(1);
         assertEquals("RoomSearch", functionImport2.getName());
         assertEquals("Rooms", functionImport2.getEntitySet());
@@ -745,12 +746,12 @@ public class XmlMetadataConsumerTest extends 
AbstractXmlConsumerTest {
         assertEquals(EdmMultiplicity.MANY, 
functionImport2.getReturnType().getMultiplicity());
         assertEquals("GET", functionImport2.getHttpMethod());
         assertEquals(2, functionImport2.getParameters().size());
-        assertEquals(new FullQualifiedName("RefScenario","Room"),
+        assertEquals(new FullQualifiedName("RefScenario", "Room"),
             functionImport2.getReturnType().getTypeName());
         assertEquals(EdmMultiplicity.MANY, 
functionImport2.getReturnType().getMultiplicity());
 
         FunctionImportParameter functionImportParameter = 
functionImport2.getParameters().get(0);
-               assertEquals("q1", functionImportParameter.getName());
+        assertEquals("q1", functionImportParameter.getName());
         assertEquals(EdmSimpleTypeKind.String, 
functionImport2.getParameters().get(0).getType());
         assertEquals(Boolean.TRUE, 
functionImport2.getParameters().get(0).getFacets().isNullable());
         assertEquals("In", functionImportParameter.getMode());
@@ -758,7 +759,7 @@ public class XmlMetadataConsumerTest extends 
AbstractXmlConsumerTest {
         assertEquals("q2", functionImport2.getParameters().get(1).getName());
         assertEquals(EdmSimpleTypeKind.Int32, 
functionImport2.getParameters().get(1).getType());
         assertEquals(Boolean.FALSE, 
functionImport2.getParameters().get(1).getFacets().isNullable());
-        assertEquals(null, functionImport2.getParameters().get(1).getMode()); 
+        assertEquals(null, functionImport2.getParameters().get(1).getMode());
 
         FunctionImport functionImport3 = container.getFunctionImports().get(2);
         assertEquals("NoParamters", functionImport3.getName());
@@ -1464,6 +1465,39 @@ public class XmlMetadataConsumerTest extends 
AbstractXmlConsumerTest {
     }
   }
 
+  @Test
+  public void edmxReferences() throws Exception {
+    DataServices serviceMetadata = new DataServices();
+    List<AnnotationElement> annoElements = new ArrayList<AnnotationElement>();
+    annoElements.add(createElementWithoutInclude());
+    annoElements.add(createElementWithInclude());
+    serviceMetadata.setAnnotationElements(annoElements);
+    serviceMetadata.setDataServiceVersion(ODataServiceVersion.V20);
+    ODataResponse response = EntityProvider.writeMetadata(serviceMetadata, 
null);
+
+    EntityProvider.readMetadata(response.getEntityAsStream(), false);
+  }
+
+  private AnnotationElement createElementWithInclude() {
+    List<AnnotationAttribute> childAttributes = new 
ArrayList<AnnotationAttribute>();
+    childAttributes.add(new 
AnnotationAttribute().setName("Namespace").setText("Org.OData.Core.V1"));
+    childAttributes.add(new 
AnnotationAttribute().setName("Alias").setText("UI"));
+    List<AnnotationElement> childElements = new ArrayList<AnnotationElement>();
+    childElements.add(new AnnotationElement().setName("Include").setNamespace(
+        
"http://docs.oasis-open.org/odata/ns/edmx";).setPrefix("edmx").setAttributes(childAttributes));
+    List<AnnotationAttribute> referenceAttributes = new 
ArrayList<AnnotationAttribute>();
+    referenceAttributes.add(new 
AnnotationAttribute().setName("Uri").setText("http://someurl2.com";));
+    return new 
AnnotationElement().setName("Reference").setPrefix("edmx").setNamespace(
+        
"http://docs.oasis-open.org/odata/ns/edmx";).setAttributes(referenceAttributes).setChildElements(childElements);
+  }
+
+  private AnnotationElement createElementWithoutInclude() {
+    List<AnnotationAttribute> referenceAttributes = new 
ArrayList<AnnotationAttribute>();
+    referenceAttributes.add(new 
AnnotationAttribute().setName("Uri").setText("http://someurl.com";));
+    return new 
AnnotationElement().setName("Reference").setPrefix("edmx").setNamespace(
+        
"http://docs.oasis-open.org/odata/ns/edmx";).setAttributes(referenceAttributes);
+  }
+
   private XMLStreamReader createStreamReader(final String xml) throws 
XMLStreamException {
     XMLInputFactory factory = XMLInputFactory.newInstance();
     factory.setProperty(XMLInputFactory.IS_VALIDATING, false);

http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/546466ce/odata2-lib/odata-fit/src/test/java/org/apache/olingo/odata2/fit/ref/BatchTest.java
----------------------------------------------------------------------
diff --git 
a/odata2-lib/odata-fit/src/test/java/org/apache/olingo/odata2/fit/ref/BatchTest.java
 
b/odata2-lib/odata-fit/src/test/java/org/apache/olingo/odata2/fit/ref/BatchTest.java
index dec3ff8..80a2be6 100644
--- 
a/odata2-lib/odata-fit/src/test/java/org/apache/olingo/odata2/fit/ref/BatchTest.java
+++ 
b/odata2-lib/odata-fit/src/test/java/org/apache/olingo/odata2/fit/ref/BatchTest.java
@@ -53,25 +53,26 @@ public class BatchTest extends AbstractRefTest {
     String responseBody = execute("/simple.batch");
     assertFalse(responseBody
         .contains("<error 
xmlns=\"http://schemas.microsoft.com/ado/2007/08/dataservices/metadata\";>"));
-    assertTrue(responseBody.contains("<edmx:Edmx Version=\"1.0\""));
+    assertTrue(responseBody.contains(
+        "<edmx:Edmx 
xmlns:edmx=\"http://schemas.microsoft.com/ado/2007/06/edmx\"; Version=\"1.0\""));
   }
-  
+
   @Test
   public void functionImportBatch() throws Exception {
-           String responseBody = execute("/functionImport.batch");
-           assertFalse(responseBody
-               .contains("<error 
xmlns=\"http://schemas.microsoft.com/ado/2007/08/dataservices/metadata\";>"));
-           assertTrue(responseBody.contains("HTTP/1.1 200 OK"));
-           assertTrue(responseBody.contains("<?xml version='1.0' 
encoding='utf-8'?><ManagerPhoto xmlns="));
+    String responseBody = execute("/functionImport.batch");
+    assertFalse(responseBody
+        .contains("<error 
xmlns=\"http://schemas.microsoft.com/ado/2007/08/dataservices/metadata\";>"));
+    assertTrue(responseBody.contains("HTTP/1.1 200 OK"));
+    assertTrue(responseBody.contains("<?xml version='1.0' 
encoding='utf-8'?><ManagerPhoto xmlns="));
   }
-  
+
   @Test
   public void employeesWithFilterBatch() throws Exception {
-           String responseBody = execute("/employeesWithFilter.batch");
-           assertFalse(responseBody
-               .contains("<error 
xmlns=\"http://schemas.microsoft.com/ado/2007/08/dataservices/metadata\";>"));
-           assertTrue(responseBody.contains("HTTP/1.1 200 OK"));
-           assertTrue(responseBody.contains("<d:EmployeeName>Walter 
Winter</d:EmployeeName>"));
+    String responseBody = execute("/employeesWithFilter.batch");
+    assertFalse(responseBody
+        .contains("<error 
xmlns=\"http://schemas.microsoft.com/ado/2007/08/dataservices/metadata\";>"));
+    assertTrue(responseBody.contains("HTTP/1.1 200 OK"));
+    assertTrue(responseBody.contains("<d:EmployeeName>Walter 
Winter</d:EmployeeName>"));
   }
 
   @Test

Reply via email to