You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@olingo.apache.org by mi...@apache.org on 2014/10/14 08:38:38 UTC

[4/6] git commit: [OLINGO-423] Added implementation

[OLINGO-423] Added implementation


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

Branch: refs/heads/master
Commit: e3121831b426e192890855a2db8671a525a76571
Parents: 87f0f06
Author: Michael Bolz <mi...@sap.com>
Authored: Mon Oct 13 14:59:00 2014 +0200
Committer: Michael Bolz <mi...@sap.com>
Committed: Mon Oct 13 14:59:00 2014 +0200

----------------------------------------------------------------------
 .../xml/MetadataDocumentXmlSerializer.java      |  47 ++++++--
 .../serializer/xml/MetadataDocumentTest.java    | 111 ++++++++++++++++++-
 2 files changed, 144 insertions(+), 14 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/e3121831/lib/server-core/src/main/java/org/apache/olingo/server/core/serializer/xml/MetadataDocumentXmlSerializer.java
----------------------------------------------------------------------
diff --git a/lib/server-core/src/main/java/org/apache/olingo/server/core/serializer/xml/MetadataDocumentXmlSerializer.java b/lib/server-core/src/main/java/org/apache/olingo/server/core/serializer/xml/MetadataDocumentXmlSerializer.java
index ec3dd5f..a9cf2f8 100644
--- a/lib/server-core/src/main/java/org/apache/olingo/server/core/serializer/xml/MetadataDocumentXmlSerializer.java
+++ b/lib/server-core/src/main/java/org/apache/olingo/server/core/serializer/xml/MetadataDocumentXmlSerializer.java
@@ -21,6 +21,8 @@ package org.apache.olingo.server.core.serializer.xml;
 import org.apache.olingo.commons.api.edm.*;
 import org.apache.olingo.server.api.edmx.EdmxReference;
 import org.apache.olingo.server.api.ServiceMetadata;
+import org.apache.olingo.server.api.edmx.EdmxReferenceInclude;
+import org.apache.olingo.server.api.edmx.EdmxReferenceIncludeAnnotation;
 import org.apache.olingo.server.api.serializer.ODataSerializer;
 
 import javax.xml.stream.XMLStreamException;
@@ -70,6 +72,13 @@ public class MetadataDocumentXmlSerializer {
   private static final String XML_ALIAS = "Alias";
   private static final String XML_NAMESPACE = "Namespace";
   private static final String XML_TYPE_DEFINITION = "TypeDefinition";
+  private static final String REFERENCE = "Reference";
+  private static final String INCLUDE = "Include";
+  private static final String INCLUDE_ANNOTATIONS = "IncludeAnnotations";
+  private static final String XML_TERM_NAMESPACE = "TermNamespace";
+  private static final String XML_TARGET_NAMESPACE = "TargetNamespace";
+  private static final String XML_QUALIFIER = "Qualifier";
+  private static final String URI = "Uri";
 
   private final ServiceMetadata serviceMetadata;
 
@@ -463,7 +472,7 @@ public class MetadataDocumentXmlSerializer {
       writer.writeStartElement(XML_KEY);
       for (EdmKeyPropertyRef keyRef : keyPropertyRefs) {
         writer.writeEmptyElement(XML_PROPERTY_REF);
-        String keyName = null;
+        final String keyName;
         if (keyRef.getPath() != null) {
           keyName = keyRef.getPath() + "/" + keyRef.getKeyPropertyName();
         } else {
@@ -511,15 +520,33 @@ public class MetadataDocumentXmlSerializer {
   private void appendReference(final XMLStreamWriter writer) throws XMLStreamException {
     List<EdmxReference> references = serviceMetadata.getReferences();
     for (EdmxReference reference: references) {
-      writer.writeStartElement(NS_EDMX, "Reference");
-      // TODO: Which value can we use here?
-      // <http://docs.oasis-open.org/odata/odata/v4.0/cs02/vocabularies/Org.OData.Core.V1.xml>
-      // is an external site we don't want to query each time an EDM-enabled client is used.
-      writer.writeAttribute("Uri", reference.getUri().toASCIIString());
-  //    writer.writeEmptyElement(NS_EDMX, "Include");
-  //    writer.writeAttribute(XML_NAMESPACE, reference.getIncludeNamespace());
-  //    writer.writeAttribute(XML_ALIAS, reference.getIncludeAlias());
-  //    writer.writeEndElement();
+      writer.writeStartElement(PREFIX_EDMX, REFERENCE, NS_EDMX);
+      writer.writeAttribute(URI, reference.getUri().toASCIIString());
+
+      List<EdmxReferenceInclude> includes = reference.getIncludes();
+      for (EdmxReferenceInclude include : includes) {
+        writer.writeStartElement(PREFIX_EDMX, INCLUDE, NS_EDMX);
+        writer.writeAttribute(XML_NAMESPACE, include.getNamespace());
+        if(include.getAlias() != null) {
+          writer.writeAttribute(XML_ALIAS, include.getAlias());
+        }
+        writer.writeEndElement();
+      }
+
+      List<EdmxReferenceIncludeAnnotation> includeAnnotations = reference.getIncludeAnnotations();
+      for (EdmxReferenceIncludeAnnotation includeAnnotation : includeAnnotations) {
+        writer.writeStartElement(PREFIX_EDMX, INCLUDE_ANNOTATIONS, NS_EDMX);
+        writer.writeAttribute(XML_TERM_NAMESPACE, includeAnnotation.getTermNamespace());
+        if(includeAnnotation.getQualifier() != null) {
+          writer.writeAttribute(XML_QUALIFIER, includeAnnotation.getQualifier());
+        }
+        if(includeAnnotation.getTargetNamespace() != null) {
+          writer.writeAttribute(XML_TARGET_NAMESPACE, includeAnnotation.getTargetNamespace());
+        }
+        writer.writeEndElement();
+      }
+
+      writer.writeEndElement();
     }
   }
 }

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/e3121831/lib/server-test/src/test/java/org/apache/olingo/server/core/serializer/xml/MetadataDocumentTest.java
----------------------------------------------------------------------
diff --git a/lib/server-test/src/test/java/org/apache/olingo/server/core/serializer/xml/MetadataDocumentTest.java b/lib/server-test/src/test/java/org/apache/olingo/server/core/serializer/xml/MetadataDocumentTest.java
index 8fbbf15..85ac1e8 100644
--- a/lib/server-test/src/test/java/org/apache/olingo/server/core/serializer/xml/MetadataDocumentTest.java
+++ b/lib/server-test/src/test/java/org/apache/olingo/server/core/serializer/xml/MetadataDocumentTest.java
@@ -24,6 +24,7 @@ import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
 
 import java.io.InputStream;
+import java.net.URI;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collections;
@@ -59,11 +60,12 @@ import org.apache.olingo.server.api.edm.provider.Schema;
 import org.apache.olingo.server.api.edm.provider.Singleton;
 import org.apache.olingo.server.api.edm.provider.TypeDefinition;
 import org.apache.olingo.server.api.edmx.EdmxReference;
+import org.apache.olingo.server.api.edmx.EdmxReferenceInclude;
 import org.apache.olingo.server.api.serializer.ODataSerializer;
-import org.apache.olingo.server.api.serializer.SerializerException;
 import org.apache.olingo.server.core.ServiceMetadataImpl;
-import org.apache.olingo.server.core.edm.provider.EdmProviderImpl;
-import org.apache.olingo.server.tecsvc.provider.EdmTechProvider;
+import org.apache.olingo.server.core.edmx.EdmxReferenceImpl;
+import org.apache.olingo.server.core.edmx.EdmxReferenceIncludeAnnotationImpl;
+import org.apache.olingo.server.core.edmx.EdmxReferenceIncludeImpl;
 import org.junit.Test;
 
 public class MetadataDocumentTest {
@@ -78,14 +80,96 @@ public class MetadataDocumentTest {
   }
 
   @Test
+  public void writeEdmxWithLocalTestEdm() throws Exception {
+    ODataSerializer serializer = OData.newInstance().createSerializer(ODataFormat.XML);
+
+    List<EdmxReference> edmxReferences = new ArrayList<EdmxReference>();
+    EdmxReferenceImpl reference = new EdmxReferenceImpl(URI.create("http://example.com"));
+    edmxReferences.add(reference);
+
+    EdmxReferenceImpl referenceWithInclude = new EdmxReferenceImpl(
+            URI.create("http://localhost/odata/odata/v4.0/referenceWithInclude"));
+    EdmxReferenceInclude include = new EdmxReferenceIncludeImpl("Org.OData.Core.V1", "Core");
+    referenceWithInclude.addInclude(include);
+    edmxReferences.add(referenceWithInclude);
+
+    EdmxReferenceImpl referenceWithTwoIncludes = new EdmxReferenceImpl(
+            URI.create("http://localhost/odata/odata/v4.0/referenceWithTwoIncludes"));
+    referenceWithTwoIncludes.addInclude(new EdmxReferenceIncludeImpl("Org.OData.Core.2", "Core2"));
+    referenceWithTwoIncludes.addInclude(new EdmxReferenceIncludeImpl("Org.OData.Core.3", "Core3"));
+    edmxReferences.add(referenceWithTwoIncludes);
+
+    EdmxReferenceImpl referenceWithIncludeAnnos = new EdmxReferenceImpl(
+            URI.create("http://localhost/odata/odata/v4.0/referenceWithIncludeAnnos"));
+    referenceWithIncludeAnnos.addIncludeAnnotation(
+            new EdmxReferenceIncludeAnnotationImpl("TermNs.2", "Q.2", "TargetNS.2"));
+    referenceWithIncludeAnnos.addIncludeAnnotation(
+            new EdmxReferenceIncludeAnnotationImpl("TermNs.3", "Q.3","TargetNS.3"));
+    edmxReferences.add(referenceWithIncludeAnnos);
+
+    EdmxReferenceImpl referenceWithAll = new EdmxReferenceImpl(
+            URI.create("http://localhost/odata/odata/v4.0/referenceWithAll"));
+    referenceWithAll.addInclude(new EdmxReferenceIncludeImpl("ReferenceWithAll.1", "Core1"));
+    referenceWithAll.addInclude(new EdmxReferenceIncludeImpl("ReferenceWithAll.2", "Core2"));
+    referenceWithAll.addIncludeAnnotation(
+            new EdmxReferenceIncludeAnnotationImpl("ReferenceWithAllTermNs.4", "Q.4", "TargetNS.4"));
+    referenceWithAll.addIncludeAnnotation(
+            new EdmxReferenceIncludeAnnotationImpl("ReferenceWithAllTermNs.5", "Q.5", "TargetNS.5"));
+    edmxReferences.add(referenceWithAll);
+
+    ServiceMetadata serviceMetadata = new ServiceMetadataImpl(ODataServiceVersion.V40,
+            new TestMetadataProvider(), edmxReferences);
+    InputStream metadata = serializer.metadataDocument(serviceMetadata);
+    assertNotNull(metadata);
+
+    String metadataString = IOUtils.toString(metadata);
+    // edmx reference
+    assertTrue(metadataString.contains(
+            "<edmx:Reference Uri=\"http://example.com\"/>"));
+    assertTrue(metadataString.contains(
+            "<edmx:Reference " +
+                    "Uri=\"http://localhost/odata/odata/v4.0/referenceWithInclude\">" +
+            "<edmx:Include Namespace=\"Org.OData.Core.V1\" Alias=\"Core\"/>" +
+            "</edmx:Reference>"));
+    assertTrue(metadataString.contains(
+            "<edmx:Reference " +
+                    "Uri=\"http://localhost/odata/odata/v4.0/referenceWithTwoIncludes\">" +
+            "<edmx:Include Namespace=\"Org.OData.Core.2\" Alias=\"Core2\"/>" +
+            "<edmx:Include Namespace=\"Org.OData.Core.3\" Alias=\"Core3\"/>" +
+            "</edmx:Reference>"));
+    assertTrue(metadataString.contains(
+            "<edmx:Reference Uri=\"http://localhost/odata/odata/v4.0/referenceWithIncludeAnnos\">" +
+            "<edmx:IncludeAnnotations TermNamespace=\"TermNs.2\" Qualifier=\"Q.2\" TargetNamespace=\"TargetNS.2\"/>" +
+            "<edmx:IncludeAnnotations TermNamespace=\"TermNs.3\" Qualifier=\"Q.3\" TargetNamespace=\"TargetNS.3\"/>" +
+            "</edmx:Reference>"));
+    assertTrue(metadataString.contains(
+            "<edmx:Reference Uri=\"http://localhost/odata/odata/v4.0/referenceWithAll\">" +
+            "<edmx:Include Namespace=\"ReferenceWithAll.1\" Alias=\"Core1\"/>" +
+            "<edmx:Include Namespace=\"ReferenceWithAll.2\" Alias=\"Core2\"/>" +
+            "<edmx:IncludeAnnotations TermNamespace=\"ReferenceWithAllTermNs.4\" " +
+                    "Qualifier=\"Q.4\" TargetNamespace=\"TargetNS.4\"/>" +
+            "<edmx:IncludeAnnotations TermNamespace=\"ReferenceWithAllTermNs.5\" " +
+                    "Qualifier=\"Q.5\" TargetNamespace=\"TargetNS.5\"/>" +
+            "</edmx:Reference>"));
+  }
+
+  @Test
   public void writeMetadataWithLocalTestEdm() throws Exception {
     ODataSerializer serializer = OData.newInstance().createSerializer(ODataFormat.XML);
+    List<EdmxReference> edmxReferences = getEdmxReferences();
     ServiceMetadata serviceMetadata = new ServiceMetadataImpl(ODataServiceVersion.V40,
-            new TestMetadataProvider(), Collections.<EdmxReference>emptyList());
+            new TestMetadataProvider(), edmxReferences);
     InputStream metadata = serializer.metadataDocument(serviceMetadata);
     assertNotNull(metadata);
 
     String metadataString = IOUtils.toString(metadata);
+    // edmx reference
+    assertTrue(metadataString
+            .contains("<edmx:Reference " +
+                    "Uri=\"http://docs.oasis-open.org/odata/odata/v4.0/cs02/vocabularies/Org.OData.Core.V1.xml\">" +
+                    "<edmx:Include Namespace=\"Org.OData.Core.V1\" Alias=\"Core\"/>" +
+                    "</edmx:Reference>"));
+
     assertTrue(metadataString
         .contains("<edmx:Edmx Version=\"4.0\" xmlns:edmx=\"http://docs.oasis-open.org/odata/ns/edmx\">"));
 
@@ -147,6 +231,25 @@ public class MetadataDocumentTest {
     assertTrue(metadataString.contains("</EntityContainer></Schema></edmx:DataServices></edmx:Edmx>"));
   }
 
+  /**
+   * <code>
+   *  <edmx:Reference Uri="http://docs.oasis-open.org/odata/odata/v4.0/cs02/vocabularies/Org.OData.Core.V1.xml">
+   *    <edmx:Include Namespace="Org.OData.Core.V1" Alias="Core"/>
+   *  </edmx:Reference>
+   * </code>
+   *
+   * @return default emdx reference
+   */
+  private List<EdmxReference> getEdmxReferences() {
+    List<EdmxReference> edmxReferences = new ArrayList<EdmxReference>();
+    EdmxReferenceImpl reference = new EdmxReferenceImpl(
+            URI.create("http://docs.oasis-open.org/odata/odata/v4.0/cs02/vocabularies/Org.OData.Core.V1.xml"));
+    EdmxReferenceInclude include = new EdmxReferenceIncludeImpl("Org.OData.Core.V1", "Core");
+    reference.addInclude(include);
+    edmxReferences.add(reference);
+    return edmxReferences;
+  }
+
   @Test
   public void writeMetadataWithTechnicalScenario() throws Exception {
     ODataSerializer serializer = OData.newInstance().createSerializer(ODataFormat.XML);