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
