| /******************************************************************************* |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| ******************************************************************************/ |
| package org.apache.olingo.odata2.core.ep.producer; |
| |
| import static org.custommonkey.xmlunit.XMLAssert.assertXpathExists; |
| |
| import java.io.OutputStreamWriter; |
| import java.util.ArrayList; |
| import java.util.HashMap; |
| import java.util.List; |
| import java.util.Map; |
| |
| import javax.xml.stream.XMLOutputFactory; |
| import javax.xml.stream.XMLStreamWriter; |
| |
| import org.apache.olingo.odata2.api.ODataServiceVersion; |
| import org.apache.olingo.odata2.api.edm.EdmSimpleTypeKind; |
| 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.Documentation; |
| import org.apache.olingo.odata2.api.edm.provider.EntityType; |
| import org.apache.olingo.odata2.api.edm.provider.Key; |
| import org.apache.olingo.odata2.api.edm.provider.Property; |
| import org.apache.olingo.odata2.api.edm.provider.PropertyRef; |
| import org.apache.olingo.odata2.api.edm.provider.Schema; |
| import org.apache.olingo.odata2.api.edm.provider.SimpleProperty; |
| import org.apache.olingo.odata2.core.commons.XmlHelper; |
| import org.apache.olingo.odata2.core.ep.AbstractXmlProducerTestHelper; |
| import org.apache.olingo.odata2.core.ep.util.CircleStreamBuffer; |
| import org.apache.olingo.odata2.testutil.helper.StringHelper; |
| import org.custommonkey.xmlunit.NamespaceContext; |
| import org.custommonkey.xmlunit.SimpleNamespaceContext; |
| import org.custommonkey.xmlunit.XMLUnit; |
| import org.junit.Before; |
| import org.junit.Test; |
| |
| public class XmlMetadataProducerTest extends AbstractXmlProducerTestHelper { |
| |
| private XMLOutputFactory xmlStreamWriterFactory; |
| |
| public XmlMetadataProducerTest(final StreamWriterImplType type) { |
| super(type); |
| } |
| |
| @Before |
| public void before() { |
| xmlStreamWriterFactory = XmlHelper.getXMLOutputFactory(); |
| } |
| |
| @Test |
| public void writeValidMetadata() throws Exception { |
| List<Schema> schemas = new ArrayList<Schema>(); |
| |
| List<AnnotationElement> annotationElements = new ArrayList<AnnotationElement>(); |
| annotationElements.add(new AnnotationElement().setName("test").setText("hallo")); |
| Schema schema = new Schema().setAnnotationElements(annotationElements); |
| schema.setNamespace("http://namespace.com"); |
| schemas.add(schema); |
| |
| DataServices data = new DataServices().setSchemas(schemas).setDataServiceVersion(ODataServiceVersion.V20); |
| OutputStreamWriter writer = null; |
| CircleStreamBuffer csb = new CircleStreamBuffer(); |
| writer = new OutputStreamWriter(csb.getOutputStream(), "UTF-8"); |
| XMLStreamWriter xmlStreamWriter = xmlStreamWriterFactory.createXMLStreamWriter(writer); |
| XmlMetadataProducer.writeMetadata(data, xmlStreamWriter, null); |
| |
| Map<String, String> prefixMap = new HashMap<String, String>(); |
| prefixMap.put("edmx", "http://schemas.microsoft.com/ado/2007/06/edmx"); |
| prefixMap.put("a", "http://schemas.microsoft.com/ado/2008/09/edm"); |
| |
| NamespaceContext ctx = new SimpleNamespaceContext(prefixMap); |
| XMLUnit.setXpathNamespaceContext(ctx); |
| |
| String metadata = StringHelper.inputStreamToString(csb.getInputStream()); |
| assertXpathExists("/edmx:Edmx/edmx:DataServices/a:Schema/a:test", metadata); |
| } |
| |
| @Test |
| public void writeValidMetadata2() throws Exception { |
| List<Schema> schemas = new ArrayList<Schema>(); |
| |
| List<AnnotationElement> childElements = new ArrayList<AnnotationElement>(); |
| childElements |
| .add(new AnnotationElement().setName("schemaElementTest2").setText("text2").setNamespace("namespace1")); |
| |
| List<AnnotationAttribute> elementAttributes = new ArrayList<AnnotationAttribute>(); |
| elementAttributes.add(new AnnotationAttribute().setName("rel").setText("self")); |
| elementAttributes.add(new AnnotationAttribute().setName("href").setText("http://google.com").setPrefix("pre") |
| .setNamespace("namespaceForAnno")); |
| |
| List<AnnotationElement> element3List = new ArrayList<AnnotationElement>(); |
| element3List.add(new AnnotationElement().setName("schemaElementTest4").setText("text4").setAttributes( |
| elementAttributes)); |
| childElements.add(new AnnotationElement().setName("schemaElementTest3").setText("text3").setPrefix("prefix") |
| .setNamespace("namespace2").setChildElements(element3List)); |
| |
| List<AnnotationElement> schemaElements = new ArrayList<AnnotationElement>(); |
| schemaElements.add(new AnnotationElement().setName("schemaElementTest1").setText("text1").setChildElements( |
| childElements)); |
| |
| schemaElements.add(new AnnotationElement().setName("test")); |
| Schema schema = new Schema().setAnnotationElements(schemaElements); |
| schema.setNamespace("http://namespace.com"); |
| schemas.add(schema); |
| |
| DataServices data = new DataServices().setSchemas(schemas).setDataServiceVersion(ODataServiceVersion.V20); |
| OutputStreamWriter writer = null; |
| CircleStreamBuffer csb = new CircleStreamBuffer(); |
| writer = new OutputStreamWriter(csb.getOutputStream(), "UTF-8"); |
| XMLStreamWriter xmlStreamWriter = xmlStreamWriterFactory.createXMLStreamWriter(writer); |
| XmlMetadataProducer.writeMetadata(data, xmlStreamWriter, null); |
| |
| Map<String, String> prefixMap = new HashMap<String, String>(); |
| prefixMap.put("edmx", "http://schemas.microsoft.com/ado/2007/06/edmx"); |
| prefixMap.put("a", "http://schemas.microsoft.com/ado/2008/09/edm"); |
| prefixMap.put("b", "namespace1"); |
| prefixMap.put("prefix", "namespace2"); |
| prefixMap.put("pre", "namespaceForAnno"); |
| |
| NamespaceContext ctx = new SimpleNamespaceContext(prefixMap); |
| XMLUnit.setXpathNamespaceContext(ctx); |
| |
| String metadata = StringHelper.inputStreamToString(csb.getInputStream()); |
| assertXpathExists("/edmx:Edmx/edmx:DataServices/a:Schema/a:test", metadata); |
| assertXpathExists("/edmx:Edmx/edmx:DataServices/a:Schema/a:schemaElementTest1", metadata); |
| assertXpathExists("/edmx:Edmx/edmx:DataServices/a:Schema/a:schemaElementTest1/b:schemaElementTest2", metadata); |
| assertXpathExists("/edmx:Edmx/edmx:DataServices/a:Schema/a:schemaElementTest1/prefix:schemaElementTest3", metadata); |
| assertXpathExists( |
| "/edmx:Edmx/edmx:DataServices/a:Schema/a:schemaElementTest1/prefix:schemaElementTest3/" + |
| "a:schemaElementTest4[@rel=\"self\" and @pre:href=\"http://google.com\"]", |
| metadata); |
| |
| } |
| |
| @Test |
| public void writeValidMetadata3() throws Exception { |
| List<Schema> schemas = new ArrayList<Schema>(); |
| |
| List<AnnotationElement> annotationElements = new ArrayList<AnnotationElement>(); |
| annotationElements.add(new AnnotationElement().setName("test").setText("hallo)")); |
| Schema schema = new Schema().setAnnotationElements(annotationElements); |
| schema.setNamespace("http://namespace.com"); |
| schemas.add(schema); |
| |
| List<PropertyRef> keys = new ArrayList<PropertyRef>(); |
| keys.add(new PropertyRef().setName("Id")); |
| Key key = new Key().setKeys(keys); |
| List<Property> properties = new ArrayList<Property>(); |
| properties.add(new SimpleProperty().setName("Id").setType(EdmSimpleTypeKind.String)); |
| EntityType entityType = new EntityType().setName("testType").setKey(key).setProperties(properties); |
| entityType.setDocumentation(new Documentation()); |
| |
| List<PropertyRef> keys2 = new ArrayList<PropertyRef>(); |
| keys2.add(new PropertyRef().setName("SecondId")); |
| Key key2 = new Key().setKeys(keys2); |
| List<Property> properties2 = new ArrayList<Property>(); |
| properties2.add(new SimpleProperty().setName("SecondId").setType(EdmSimpleTypeKind.String)); |
| EntityType entityType2 = new EntityType().setName("SecondTestType").setKey(key2).setProperties(properties2); |
| entityType2.setDocumentation(new Documentation().setSummary("Doc_TlDr").setLongDescription("Some long desc.")); |
| List<EntityType> entityTypes = new ArrayList<EntityType>(); |
| entityTypes.add(entityType); |
| entityTypes.add(entityType2); |
| schema.setEntityTypes(entityTypes); |
| |
| DataServices data = new DataServices().setSchemas(schemas).setDataServiceVersion(ODataServiceVersion.V20); |
| CircleStreamBuffer csb = new CircleStreamBuffer(); |
| OutputStreamWriter writer = new OutputStreamWriter(csb.getOutputStream(), "UTF-8"); |
| XMLStreamWriter xmlStreamWriter = xmlStreamWriterFactory.createXMLStreamWriter(writer); |
| XmlMetadataProducer.writeMetadata(data, xmlStreamWriter, null); |
| |
| Map<String, String> prefixMap = new HashMap<String, String>(); |
| prefixMap.put("edmx", "http://schemas.microsoft.com/ado/2007/06/edmx"); |
| prefixMap.put("a", "http://schemas.microsoft.com/ado/2008/09/edm"); |
| |
| NamespaceContext ctx = new SimpleNamespaceContext(prefixMap); |
| XMLUnit.setXpathNamespaceContext(ctx); |
| |
| String metadata = StringHelper.inputStreamToString(csb.getInputStream()); |
| assertXpathExists("/edmx:Edmx/edmx:DataServices/a:Schema/a:test", metadata); |
| |
| assertXpathExists("/edmx:Edmx/edmx:DataServices/a:Schema/a:EntityType[@Name=\"testType\"]", metadata); |
| assertXpathExists("/edmx:Edmx/edmx:DataServices/a:Schema/" + |
| "a:EntityType[@Name=\"SecondTestType\"]/a:Documentation/a:Summary", metadata); |
| } |
| |
| // Elements with namespace and attributes without namespace |
| @Test |
| public void writeValidMetadata4() throws Exception { |
| |
| List<Schema> schemas = new ArrayList<Schema>(); |
| |
| List<AnnotationAttribute> attributesElement1 = new ArrayList<AnnotationAttribute>(); |
| attributesElement1.add(new AnnotationAttribute().setName("rel").setText("self")); |
| attributesElement1.add(new AnnotationAttribute().setName("href").setText("link")); |
| |
| List<AnnotationElement> schemaElements = new ArrayList<AnnotationElement>(); |
| schemaElements.add(new AnnotationElement().setName("schemaElementTest1").setPrefix("atom").setNamespace( |
| "http://www.w3.org/2005/Atom").setAttributes(attributesElement1)); |
| schemaElements.add(new AnnotationElement().setName("schemaElementTest2").setPrefix("atom").setNamespace( |
| "http://www.w3.org/2005/Atom").setAttributes(attributesElement1)); |
| |
| Schema schema = new Schema().setAnnotationElements(schemaElements); |
| schema.setNamespace("http://namespace.com"); |
| schemas.add(schema); |
| |
| DataServices data = new DataServices().setSchemas(schemas).setDataServiceVersion(ODataServiceVersion.V20); |
| OutputStreamWriter writer = null; |
| CircleStreamBuffer csb = new CircleStreamBuffer(); |
| writer = new OutputStreamWriter(csb.getOutputStream(), "UTF-8"); |
| XMLStreamWriter xmlStreamWriter = xmlStreamWriterFactory.createXMLStreamWriter(writer); |
| XmlMetadataProducer.writeMetadata(data, xmlStreamWriter, null); |
| String metadata = StringHelper.inputStreamToString(csb.getInputStream()); |
| |
| Map<String, String> prefixMap = new HashMap<String, String>(); |
| prefixMap.put("edmx", "http://schemas.microsoft.com/ado/2007/06/edmx"); |
| prefixMap.put("a", "http://schemas.microsoft.com/ado/2008/09/edm"); |
| prefixMap.put("atom", "http://www.w3.org/2005/Atom"); |
| |
| NamespaceContext ctx = new SimpleNamespaceContext(prefixMap); |
| XMLUnit.setXpathNamespaceContext(ctx); |
| |
| assertXpathExists("/edmx:Edmx/edmx:DataServices/a:Schema/atom:schemaElementTest1", metadata); |
| assertXpathExists("/edmx:Edmx/edmx:DataServices/a:Schema/atom:schemaElementTest2", metadata); |
| } |
| |
| // Element with namespace and attributes with same namespace |
| @Test |
| public void writeValidMetadata5() throws Exception { |
| |
| List<Schema> schemas = new ArrayList<Schema>(); |
| |
| List<AnnotationAttribute> attributesElement1 = new ArrayList<AnnotationAttribute>(); |
| attributesElement1.add(new AnnotationAttribute().setName("rel").setText("self").setPrefix("atom").setNamespace( |
| "http://www.w3.org/2005/Atom")); |
| attributesElement1.add(new AnnotationAttribute().setName("href").setText("link").setPrefix("atom").setNamespace( |
| "http://www.w3.org/2005/Atom")); |
| |
| List<AnnotationElement> schemaElements = new ArrayList<AnnotationElement>(); |
| schemaElements.add(new AnnotationElement().setName("schemaElementTest1").setPrefix("atom").setNamespace( |
| "http://www.w3.org/2005/Atom").setAttributes(attributesElement1)); |
| schemaElements.add(new AnnotationElement().setName("schemaElementTest2").setPrefix("atom").setNamespace( |
| "http://www.w3.org/2005/Atom").setAttributes(attributesElement1)); |
| |
| Schema schema = new Schema().setAnnotationElements(schemaElements); |
| schema.setNamespace("http://namespace.com"); |
| schemas.add(schema); |
| |
| DataServices data = new DataServices().setSchemas(schemas).setDataServiceVersion(ODataServiceVersion.V20); |
| OutputStreamWriter writer = null; |
| CircleStreamBuffer csb = new CircleStreamBuffer(); |
| writer = new OutputStreamWriter(csb.getOutputStream(), "UTF-8"); |
| XMLStreamWriter xmlStreamWriter = xmlStreamWriterFactory.createXMLStreamWriter(writer); |
| XmlMetadataProducer.writeMetadata(data, xmlStreamWriter, null); |
| String metadata = StringHelper.inputStreamToString(csb.getInputStream()); |
| |
| Map<String, String> prefixMap = new HashMap<String, String>(); |
| prefixMap.put("edmx", "http://schemas.microsoft.com/ado/2007/06/edmx"); |
| prefixMap.put("a", "http://schemas.microsoft.com/ado/2008/09/edm"); |
| prefixMap.put("atom", "http://www.w3.org/2005/Atom"); |
| |
| NamespaceContext ctx = new SimpleNamespaceContext(prefixMap); |
| XMLUnit.setXpathNamespaceContext(ctx); |
| |
| assertXpathExists("/edmx:Edmx/edmx:DataServices/a:Schema/atom:schemaElementTest1", metadata); |
| assertXpathExists("/edmx:Edmx/edmx:DataServices/a:Schema/atom:schemaElementTest2", metadata); |
| } |
| |
| // Element with namespace childelements with same namespace |
| @Test |
| public void writeValidMetadata6() throws Exception { |
| |
| List<Schema> schemas = new ArrayList<Schema>(); |
| |
| List<AnnotationAttribute> attributesElement1 = new ArrayList<AnnotationAttribute>(); |
| attributesElement1.add(new AnnotationAttribute().setName("rel").setText("self").setPrefix("atom").setNamespace( |
| "http://www.w3.org/2005/Atom")); |
| attributesElement1.add(new AnnotationAttribute().setName("href").setText("link").setPrefix("atom").setNamespace( |
| "http://www.w3.org/2005/Atom")); |
| |
| List<AnnotationElement> elementElements = new ArrayList<AnnotationElement>(); |
| elementElements.add(new AnnotationElement().setName("schemaElementTest2").setPrefix("atom").setNamespace( |
| "http://www.w3.org/2005/Atom").setAttributes(attributesElement1)); |
| elementElements.add(new AnnotationElement().setName("schemaElementTest3").setPrefix("atom").setNamespace( |
| "http://www.w3.org/2005/Atom").setAttributes(attributesElement1)); |
| |
| List<AnnotationElement> schemaElements = new ArrayList<AnnotationElement>(); |
| schemaElements.add(new AnnotationElement().setName("schemaElementTest1").setPrefix("atom").setNamespace( |
| "http://www.w3.org/2005/Atom").setAttributes(attributesElement1).setChildElements(elementElements)); |
| |
| Schema schema = new Schema().setAnnotationElements(schemaElements); |
| schema.setNamespace("http://namespace.com"); |
| schemas.add(schema); |
| |
| DataServices data = new DataServices().setSchemas(schemas).setDataServiceVersion(ODataServiceVersion.V20); |
| OutputStreamWriter writer = null; |
| CircleStreamBuffer csb = new CircleStreamBuffer(); |
| writer = new OutputStreamWriter(csb.getOutputStream(), "UTF-8"); |
| XMLStreamWriter xmlStreamWriter = xmlStreamWriterFactory.createXMLStreamWriter(writer); |
| XmlMetadataProducer.writeMetadata(data, xmlStreamWriter, null); |
| String metadata = StringHelper.inputStreamToString(csb.getInputStream()); |
| |
| Map<String, String> prefixMap = new HashMap<String, String>(); |
| prefixMap.put("edmx", "http://schemas.microsoft.com/ado/2007/06/edmx"); |
| prefixMap.put("a", "http://schemas.microsoft.com/ado/2008/09/edm"); |
| prefixMap.put("atom", "http://www.w3.org/2005/Atom"); |
| |
| NamespaceContext ctx = new SimpleNamespaceContext(prefixMap); |
| XMLUnit.setXpathNamespaceContext(ctx); |
| |
| assertXpathExists("/edmx:Edmx/edmx:DataServices/a:Schema/atom:schemaElementTest1", metadata); |
| assertXpathExists("/edmx:Edmx/edmx:DataServices/a:Schema/atom:schemaElementTest1/atom:schemaElementTest2", |
| metadata); |
| assertXpathExists("/edmx:Edmx/edmx:DataServices/a:Schema/atom:schemaElementTest1/atom:schemaElementTest3", |
| metadata); |
| } |
| |
| // If no name for an AnnotationAttribute is set this has to result in an Exception |
| @Test(expected = Exception.class) |
| public void writeInvalidMetadata() throws Exception { |
| disableLogging(this.getClass()); |
| List<Schema> schemas = new ArrayList<Schema>(); |
| |
| List<AnnotationElement> annotationElements = new ArrayList<AnnotationElement>(); |
| annotationElements.add(new AnnotationElement().setText("hallo")); |
| Schema schema = new Schema().setAnnotationElements(annotationElements); |
| schema.setNamespace("http://namespace.com"); |
| schemas.add(schema); |
| |
| DataServices data = new DataServices().setSchemas(schemas).setDataServiceVersion(ODataServiceVersion.V20); |
| OutputStreamWriter writer = null; |
| CircleStreamBuffer csb = new CircleStreamBuffer(); |
| writer = new OutputStreamWriter(csb.getOutputStream(), "UTF-8"); |
| XMLStreamWriter xmlStreamWriter = xmlStreamWriterFactory.createXMLStreamWriter(writer); |
| XmlMetadataProducer.writeMetadata(data, xmlStreamWriter, null); |
| } |
| |
| // Element with predefined namespace |
| @Test |
| public void writeWithPredefinedNamespaces() throws Exception { |
| // prepare |
| List<Schema> schemas = new ArrayList<Schema>(); |
| |
| List<AnnotationAttribute> attributesElement1 = new ArrayList<AnnotationAttribute>(); |
| attributesElement1.add(new AnnotationAttribute().setName("rel").setText("self").setPrefix("foo").setNamespace( |
| "http://www.foo.bar/Protocols/Data")); |
| attributesElement1.add(new AnnotationAttribute().setName("href").setText("link").setPrefix("foo").setNamespace( |
| "http://www.foo.bar/Protocols/Data")); |
| |
| List<AnnotationElement> elementElements = new ArrayList<AnnotationElement>(); |
| elementElements.add(new AnnotationElement().setName("schemaElementTest2").setPrefix("foo").setNamespace( |
| "http://www.foo.bar/Protocols/Data").setAttributes(attributesElement1)); |
| elementElements.add(new AnnotationElement().setName("schemaElementTest3").setPrefix("foo").setNamespace( |
| "http://www.foo.bar/Protocols/Data").setAttributes(attributesElement1)); |
| |
| List<AnnotationElement> schemaElements = new ArrayList<AnnotationElement>(); |
| schemaElements.add(new AnnotationElement().setName("schemaElementTest1").setPrefix("foo").setNamespace( |
| "http://www.foo.bar/Protocols/Data").setAttributes(attributesElement1).setChildElements(elementElements)); |
| |
| Schema schema = new Schema().setAnnotationElements(schemaElements); |
| schema.setNamespace("http://namespace.com"); |
| schemas.add(schema); |
| |
| // Execute |
| Map<String, String> predefinedNamespaces = new HashMap<String, String>(); |
| predefinedNamespaces.put("foo", "http://www.foo.bar/Protocols/Data"); |
| DataServices data = new DataServices().setSchemas(schemas).setDataServiceVersion(ODataServiceVersion.V20); |
| OutputStreamWriter writer = null; |
| CircleStreamBuffer csb = new CircleStreamBuffer(); |
| writer = new OutputStreamWriter(csb.getOutputStream(), "UTF-8"); |
| XMLStreamWriter xmlStreamWriter = xmlStreamWriterFactory.createXMLStreamWriter(writer); |
| XmlMetadataProducer.writeMetadata(data, xmlStreamWriter, predefinedNamespaces); |
| String metadata = StringHelper.inputStreamToString(csb.getInputStream()); |
| |
| // Verify |
| Map<String, String> prefixMap = new HashMap<String, String>(); |
| prefixMap.put("edmx", "http://schemas.microsoft.com/ado/2007/06/edmx"); |
| prefixMap.put("a", "http://schemas.microsoft.com/ado/2008/09/edm"); |
| prefixMap.put("foo", "http://www.foo.bar/Protocols/Data"); |
| |
| NamespaceContext ctx = new SimpleNamespaceContext(prefixMap); |
| XMLUnit.setXpathNamespaceContext(ctx); |
| |
| assertXpathExists("/edmx:Edmx/edmx:DataServices/a:Schema/foo:schemaElementTest1", metadata); |
| assertXpathExists("/edmx:Edmx/edmx:DataServices/a:Schema/foo:schemaElementTest1/foo:schemaElementTest2", metadata); |
| assertXpathExists("/edmx:Edmx/edmx:DataServices/a:Schema/foo:schemaElementTest1/foo:schemaElementTest3", metadata); |
| } |
| } |