http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/9e949e40/odata2-lib/odata-client-core/src/test/java/org/apache/olingo/odata2/client/core/ep/deserializer/XmlMetadataDeserializerTest.java ---------------------------------------------------------------------- diff --git a/odata2-lib/odata-client-core/src/test/java/org/apache/olingo/odata2/client/core/ep/deserializer/XmlMetadataDeserializerTest.java b/odata2-lib/odata-client-core/src/test/java/org/apache/olingo/odata2/client/core/ep/deserializer/XmlMetadataDeserializerTest.java new file mode 100644 index 0000000..daf7a5c --- /dev/null +++ b/odata2-lib/odata-client-core/src/test/java/org/apache/olingo/odata2/client/core/ep/deserializer/XmlMetadataDeserializerTest.java @@ -0,0 +1,1904 @@ +/******************************************************************************* + * 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.client.core.ep.deserializer; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertTrue; + +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.UnsupportedEncodingException; +import java.util.List; + +import javax.xml.stream.XMLStreamException; + +import org.apache.olingo.odata2.api.edm.Edm; +import org.apache.olingo.odata2.api.edm.EdmAction; +import org.apache.olingo.odata2.api.edm.EdmAnnotationAttribute; +import org.apache.olingo.odata2.api.edm.EdmAnnotationElement; +import org.apache.olingo.odata2.api.edm.EdmAnnotations; +import org.apache.olingo.odata2.api.edm.EdmAssociation; +import org.apache.olingo.odata2.api.edm.EdmAssociationSet; +import org.apache.olingo.odata2.api.edm.EdmAssociationSetEnd; +import org.apache.olingo.odata2.api.edm.EdmComplexType; +import org.apache.olingo.odata2.api.edm.EdmConcurrencyMode; +import org.apache.olingo.odata2.api.edm.EdmContentKind; +import org.apache.olingo.odata2.api.edm.EdmEntityContainer; +import org.apache.olingo.odata2.api.edm.EdmEntitySet; +import org.apache.olingo.odata2.api.edm.EdmEntityType; +import org.apache.olingo.odata2.api.edm.EdmException; +import org.apache.olingo.odata2.api.edm.EdmFacets; +import org.apache.olingo.odata2.api.edm.EdmMultiplicity; +import org.apache.olingo.odata2.api.edm.EdmNavigationProperty; +import org.apache.olingo.odata2.api.edm.EdmProperty; +import org.apache.olingo.odata2.api.edm.EdmSimpleTypeKind; +import org.apache.olingo.odata2.api.edm.provider.EdmProvider; +import org.apache.olingo.odata2.api.ep.EntityProvider; +import org.apache.olingo.odata2.api.ep.EntityProviderException; +import org.apache.olingo.odata2.api.processor.ODataResponse; +import org.apache.olingo.odata2.client.api.ODataClient; +import org.apache.olingo.odata2.client.api.edm.ClientEdm; +import org.apache.olingo.odata2.client.api.edm.EdmDataServices; +import org.apache.olingo.odata2.client.api.edm.EdmSchema; +import org.apache.olingo.odata2.client.api.edm.EdmUsing; +import org.apache.olingo.odata2.client.core.edm.EdmMetadataAssociationEnd; +import org.apache.olingo.odata2.testutil.helper.StringHelper; +import org.apache.olingo.odata2.testutil.mock.EdmTestProvider; +import org.junit.Test; + +public class XmlMetadataDeserializerTest extends AbstractXmlDeserializerTest { + + public XmlMetadataDeserializerTest(final StreamWriterImplType type) { + super(type); + } + + private static final String DEFAULT_VALUE = "Photo"; + private static final String FC_TARGET_PATH = "СодеÑжание"; + private static final String FC_NS_URI = "http://localhost"; + private static final String FC_NS_PREFIX = "ÑÑ"; + private static final Boolean FC_KEEP_IN_CONTENT = Boolean.FALSE; + private static final String NAMESPACE = "RefScenario"; + private static final String NAMESPACE2 = "RefScenario2"; + private static final String NAMESPACE3 = "RefScenario3"; + private static final String MIME_TYPE = "image/jpeg"; + private static final String ASSOCIATION = "ManagerEmployees"; + private static final int MAX_LENGTH = 4; + + private final String[] propertyNames = { "EmployeeId", "EmployeeName", "Location" }; + + private final String xml = "<edmx:Edmx Version=\"1.0\" xmlns:edmx=\"" + Edm.NAMESPACE_EDMX_2007_06 + "\">" + + "<edmx:DataServices m:DataServiceVersion=\"2.0\" xmlns:m=\"" + Edm.NAMESPACE_M_2007_08 + "\">" + + "<Schema Namespace=\"" + NAMESPACE + "\" xmlns=\"" + Edm.NAMESPACE_EDM_2008_09 + "\">" + + "<EntityType Name= \"Employee\" m:HasStream=\"true\">" + "<Key><PropertyRef Name=\"EmployeeId\"/></Key>" + + "<Property Name=\"" + propertyNames[0] + "\" Type=\"Edm.String\" Nullable=\"false\"/>" + "<Property Name=\"" + + propertyNames[1] + "\" Type=\"Edm.String\" m:FC_TargetPath=\"SyndicationTitle\"/>" + "<Property Name=\"" + + propertyNames[2] + "\" Type=\"RefScenario.c_Location\" Nullable=\"false\"/>" + "</EntityType>" + + "<ComplexType Name=\"c_Location\">" + "<Property Name=\"Country\" Type=\"Edm.String\"/>" + "</ComplexType>" + + "</Schema>" + "</edmx:DataServices>" + "</edmx:Edmx>"; + + private final String customxml = "<edmx:Edmx Version=\"1.0\" xmlns:edmx=\"" + Edm.NAMESPACE_EDMX_2007_06 + "\">" + + "<edmx:DataServices m:DataServiceVersion=\"2.0\" xmlns:m=\"" + Edm.NAMESPACE_M_2007_08 + "\">" + + "<Schema Namespace=\"" + NAMESPACE + "\" xmlns=\"" + Edm.NAMESPACE_EDM_2008_09 + "\">" + + "<EntityType Name= \"Employee\" m:FC_TargetPath=\"SyndicationTitle\" m:HasStream=\"true\">" + + "<Key><PropertyRef Name=\"EmployeeId\"/></Key>" + + "<Property Name=\"" + propertyNames[0] + "\" Type=\"Edm.String\" Nullable=\"false\"/>" + "<Property Name=\"" + + propertyNames[1] + "\" Type=\"Edm.String\" m:FC_TargetPath=\"SyndicationTitle\"/>" + "<Property Name=\"" + + propertyNames[2] + "\" Type=\"RefScenario.c_Location\" Nullable=\"false\"/>" + "</EntityType>" + + "<ComplexType Name=\"c_Location\">" + "<Property Name=\"Country\" Type=\"Edm.String\"/>" + "</ComplexType>" + + "</Schema>" + "</edmx:DataServices>" + "</edmx:Edmx>"; + + private final String xml2 = "<edmx:Edmx Version=\"1.0\" xmlns:edmx=\"" + Edm.NAMESPACE_EDMX_2007_06 + + "\" xmlns:prefix=\"namespace\">" + "<edmx:DataServices m:DataServiceVersion=\"2.0\" xmlns:m=\"" + + Edm.NAMESPACE_M_2007_08 + "\">" + "<Schema Namespace=\"" + NAMESPACE + "\" xmlns=\"" + + Edm.NAMESPACE_EDM_2008_01 + "\">" + "<prefix:schemaElement>text3</prefix:schemaElement>" + + "<EntityType Name= \"Employee\" m:HasStream=\"true\">" + "<Key><PropertyRef Name=\"EmployeeId\"/></Key>" + + "<Property Name=\"" + propertyNames[0] + "\" Type=\"Edm.String\" Nullable=\"false\"/>" + "<Property Name=\"" + + propertyNames[1] + "\" Type=\"Edm.String\" m:FC_TargetPath=\"SyndicationTitle\"/>" + "<Property Name=\"" + + propertyNames[2] + "\" Type=\"RefScenario.c_Location\" Nullable=\"false\"/>" + "</EntityType>" + + "<ComplexType Name=\"c_Location\">" + "<Property Name=\"Country\" Type=\"Edm.String\"/>" + "</ComplexType>" + + "</Schema>" + "</edmx:DataServices>" + "</edmx:Edmx>"; + + private final String xmlWithBaseType = "<edmx:Edmx Version=\"1.0\" xmlns:edmx=\"" + Edm.NAMESPACE_EDMX_2007_06 + + "\">" + "<edmx:DataServices m:DataServiceVersion=\"2.0\" xmlns:m=\"" + Edm.NAMESPACE_M_2007_08 + "\">" + + "<Schema Namespace=\"" + NAMESPACE + "\" xmlns=\"" + Edm.NAMESPACE_EDM_2008_09 + "\">" + + "<EntityType Name= \"Employee\">" + "<Key><PropertyRef Name=\"EmployeeId\"/></Key>" + "<Property Name=\"" + + propertyNames[0] + "\" Type=\"Edm.String\" Nullable=\"false\"/>" + "<Property Name=\"" + propertyNames[1] + + "\" Type=\"Edm.String\" m:FC_TargetPath=\"SyndicationTitle\"/>" + "<Property Name=\"" + propertyNames[2] + + "\" Type=\"RefScenario.c_Location\" Nullable=\"false\"/>" + "</EntityType>" + + "<EntityType Name=\"Manager\" BaseType=\"RefScenario.Employee\" m:HasStream=\"true\">" + "</EntityType>" + + "<ComplexType Name=\"c_Location\">" + "<Property Name=\"Country\" Type=\"Edm.String\"/>" + "</ComplexType>" + + "</Schema>" + "</edmx:DataServices>" + "</edmx:Edmx>"; + + private final String xmlWithAssociation = + "<edmx:Edmx Version=\"1.0\" xmlns:edmx=\"" + + Edm.NAMESPACE_EDMX_2007_06 + + "\">" + + "<edmx:DataServices m:DataServiceVersion=\"2.0\" xmlns:m=\"" + + Edm.NAMESPACE_M_2007_08 + + "\">" + + "<Schema Namespace=\"" + + NAMESPACE + + "\" xmlns=\"" + + Edm.NAMESPACE_EDM_2008_09 + + "\">" + + "<EntityType Name= \"Employee\">" + + "<Key><PropertyRef Name=\"EmployeeId\"/></Key>" + + "<Property Name=\"" + + propertyNames[0] + + "\" Type=\"Edm.String\" Nullable=\"false\"/>" + + "<NavigationProperty Name=\"ne_Manager\" Relationship=\"RefScenario.ManagerEmployees\" " + + "FromRole=\"r_Employees\" ToRole=\"r_Manager\" />" + + "</EntityType>" + + "<EntityType Name=\"Manager\" BaseType=\"RefScenario.Employee\" m:HasStream=\"true\">" + + "<NavigationProperty Name=\"nm_Employees\" Relationship=\"RefScenario.ManagerEmployees\" " + + "FromRole=\"r_Manager\" ToRole=\"r_Employees\" />" + + "</EntityType>" + "<Association Name=\"" + ASSOCIATION + "\">" + + "<End Type=\"RefScenario.Employee\" Multiplicity=\"*\" Role=\"r_Employees\">" + + "<OnDelete Action=\"Cascade\"/>" + "</End>" + + "<End Type=\"RefScenario.Manager\" Multiplicity=\"1\" Role=\"r_Manager\"/>" + "</Association>" + + "</Schema>" + "<Schema Namespace=\"" + NAMESPACE2 + "\" xmlns=\"" + Edm.NAMESPACE_EDM_2008_09 + "\">" + + "<EntityContainer Name=\"Container1\" m:IsDefaultEntityContainer=\"true\">" + + "<EntitySet Name=\"Employees\" EntityType=\"RefScenario.Employee\"/>" + + "<EntitySet Name=\"Managers\" EntityType=\"RefScenario.Manager\"/>" + "<AssociationSet Name=\"" + + ASSOCIATION + "\" Association=\"RefScenario." + ASSOCIATION + "\">" + + "<End EntitySet=\"Managers\" Role=\"r_Manager\"/>" + "<End EntitySet=\"Employees\" Role=\"r_Employees\"/>" + + "</AssociationSet>" + "</EntityContainer>" + "</Schema>" + "</edmx:DataServices>" + "</edmx:Edmx>"; + + private final String xmlWithTwoSchemas = "<edmx:Edmx Version=\"1.0\" xmlns:edmx=\"" + Edm.NAMESPACE_EDMX_2007_06 + + "\">" + "<edmx:DataServices m:DataServiceVersion=\"2.0\" xmlns:m=\"" + Edm.NAMESPACE_M_2007_08 + "\">" + + "<Schema Namespace=\"" + NAMESPACE + "\" xmlns=\"" + Edm.NAMESPACE_EDM_2008_09 + "\">" + + "<EntityType Name= \"Employee\">" + "<Key><PropertyRef Name=\"EmployeeId\"/></Key>" + "<Property Name=\"" + + propertyNames[0] + "\" Type=\"Edm.String\" Nullable=\"false\"/>" + "<Property Name=\"" + propertyNames[1] + + "\" Type=\"Edm.String\"/>" + "</EntityType>" + "</Schema>" + "<Schema Namespace=\"" + NAMESPACE2 + + "\" xmlns=\"" + Edm.NAMESPACE_EDM_2008_09 + "\">" + "<EntityType Name= \"Photo\">" + + "<Key><PropertyRef Name=\"Id\"/></Key>" + + "<Property Name=\"Id\" Type=\"Edm.Int32\" Nullable=\"false\" ConcurrencyMode=\"Fixed\" MaxLength=\"" + + MAX_LENGTH + "\"/>" + "<Property Name=\"Name\" Type=\"Edm.String\" Unicode=\"true\" DefaultValue=\"" + + DEFAULT_VALUE + + "\" FixedLength=\"false\"/>" + "<Property Name=\"BinaryData\" Type=\"Edm.Binary\" m:MimeType=\"" + MIME_TYPE + + "\"/>" + "<Property Name=\"СодеÑжание\" Type=\"Edm.String\" m:FC_TargetPath=\"" + FC_TARGET_PATH + + "\" m:FC_NsUri=\"" + FC_NS_URI + "\"" + " m:FC_NsPrefix=\"" + FC_NS_PREFIX + "\" m:FC_KeepInContent=\"" + + FC_KEEP_IN_CONTENT + "\" m:FC_ContentKind=\"text\" >" + "</Property>" + "</EntityType>" + "</Schema>" + + "</edmx:DataServices>" + "</edmx:Edmx>"; + + private final String xmlWithStringValueForMaxLengthFacet = "<edmx:Edmx Version=\"1.0\" xmlns:edmx=\"" + + Edm.NAMESPACE_EDMX_2007_06 + + "\">" + "<edmx:DataServices m:DataServiceVersion=\"2.0\" xmlns:m=\"" + Edm.NAMESPACE_M_2007_08 + "\">" + + "<Schema Namespace=\"" + NAMESPACE2 + "\" xmlns=\"" + Edm.NAMESPACE_EDM_2008_09 + "\">" + + "<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>"; + private final String edmxRefFor1680364709 = + "<edmx:Edmx xmlns:edmx=\"http://schemas.microsoft.com/ado/2007/06/edmx\" " + + "xmlns:m=\"http://schemas.microsoft.com/ado/2007/08/dataservices/metadata\" xmlns:sap=\"" + + "http://www.sap.com/Protocols/SAPData\" Version=\"1.0\">" + + "<edmx:Reference xmlns:edmx=\"http://docs.oasis-open.org/odata/ns/edmx\" " + + "Uri=\"https://host:port/sap/opu/odata/IWFND/CATALOGSERVICE;v=2/Vocabularies"+ + "(TechnicalName='%2FIWBEP%2FVOC_COMMON'"+ + ",Version='0001',SAP__Origin='')/$value\">" + + "<edmx:Include Alias=\"Common\" Namespace=\"com.sap.vocabularies.Common.v1\"/>" + + "</edmx:Reference>" + + "</edmx:Edmx>"; + + @Test + public void twoEdmxWithValidation() throws Exception { + InputStream reader = createStreamReader(edmxRefFor1680364709); + EdmDataServices result = ODataClient.newInstance().readMetadata(reader, true); + assertNotNull(result); + + } + + @Test + public void twoEdmxWithoutValidation() throws Exception { + InputStream reader = createStreamReader(edmxRefFor1680364709); + EdmDataServices result = ODataClient.newInstance().readMetadata(reader, true); + assertNotNull(result); + + } + @Test + public void testMetadataDokumentWithWhitepaces() throws Exception { + final String metadata = "" + + "<edmx:Edmx Version=\"1.0\" xmlns:edmx=\"" + Edm.NAMESPACE_EDMX_2007_06 + "\">" + + " <edmx:DataServices m:DataServiceVersion=\"2.0\" xmlns:m=\"" + Edm.NAMESPACE_M_2007_08 + "\">" + + " <Schema Namespace=\"" + NAMESPACE2 + "\" xmlns=\"" + Edm.NAMESPACE_EDM_2008_09 + "\">" + + " <EntityType Name= \"Photo\">" + + " <Key> " + + " <PropertyRef Name=\"Id\" />" + + " </Key>" + + " <Property Name=\"Id\" Type=\"Edm.Int16\" Nullable=\"false\" />" + + " <MyAnnotation xmlns=\"http://company.com/odata\"> " + + " <child> value1</child>" + + " <child>value2</child>" + + " </MyAnnotation>" + + " </EntityType>" + + " </Schema>" + + " </edmx:DataServices>" + + "</edmx:Edmx>"; + + InputStream reader = createStreamReader(metadata); + EdmDataServices result = ODataClient.newInstance().readMetadata(reader, true); + assertEquals(1, result.getEdm().getSchemas().size()); + List<EdmEntityType> entityTypes = result.getEdm().getSchemas().get(0).getEntityTypes(); + assertEquals(1, entityTypes.size()); + EdmEntityType entityType = entityTypes.get(0); + EdmAnnotations annotation= entityType.getAnnotations(); + List<EdmAnnotationElement> annotationElements = annotation.getAnnotationElements(); + assertEquals(1, annotationElements.size()); + EdmAnnotationElement annotationElement = annotationElements.get(0); + List<EdmAnnotationElement> 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 = "" + + "<edmx:Edmx Version=\"1.0\" xmlns:edmx=\"" + Edm.NAMESPACE_EDMX_2007_06 + "\">" + + " <edmx:DataServices m:DataServiceVersion=\"2.0\" xmlns:m=\"" + Edm.NAMESPACE_M_2007_08 + "\">" + + " <Schema Namespace=\"" + NAMESPACE2 + "\" xmlns=\"" + Edm.NAMESPACE_EDM_2008_09 + "\">" + + " <EntityType Name= \"Photo\">" + + " <Key> " + + " <PropertyRef Name=\"Id\" />" + + " </Key>" + + " <Property Name=\"Id\" Type=\"Edm.Int16\" Nullable=\"false\" />" + + " <MyAnnotation xmlns=\"http://company.com/odata\"> " + + " <child> value1\n" + + " long long long multiline attribute</child>" + + " <child>value2</child>" + + " </MyAnnotation>" + + " </EntityType>" + + " </Schema>" + + " </edmx:DataServices>" + + "</edmx:Edmx>"; + + XmlMetadataDeserializer parser = new XmlMetadataDeserializer(); + InputStream reader = createStreamReader(metadata); + EdmDataServices result = parser.readMetadata(reader, true); + + assertEquals(1, result.getEdm().getSchemas().size()); + List<EdmEntityType> entityTypes = result.getEdm().getSchemas().get(0).getEntityTypes(); + assertEquals(1, entityTypes.size()); + EdmEntityType entityType = entityTypes.get(0); + EdmAnnotations annotations = entityType.getAnnotations(); + List<EdmAnnotationElement> annotationElements = annotations.getAnnotationElements(); + assertEquals(1, annotationElements.size()); + EdmAnnotationElement annotationElement = annotationElements.get(0); + List<EdmAnnotationElement> childElements = annotationElement.getChildElements(); + assertEquals(2, childElements.size()); + + 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 = "" + + "<edmx:Edmx Version=\"1.0\" xmlns:edmx=\"" + Edm.NAMESPACE_EDMX_2007_06 + "\">" + + " <edmx:DataServices m:DataServiceVersion=\"2.0\" xmlns:m=\"" + Edm.NAMESPACE_M_2007_08 + "\">" + + " <Schema Namespace=\"" + NAMESPACE2 + "\" xmlns=\"" + Edm.NAMESPACE_EDM_2008_09 + "\">" + + " <EntityType Name= \"Photo\">" + + " <Key> " + + " <PropertyRef Name=\"Id\" />" + + " </Key>" + + " <Property Name=\"Id\" Type=\"Edm.Int16\" Nullable=\"false\" />" + + " <MyAnnotation xmlns=\"http://company.com/odata\"> " + + " <child> value1" + + "</child></MyAnnotation>" + + " </EntityType>" + + " </Schema>" + + " </edmx:DataServices>" + + "</edmx:Edmx>"; + + XmlMetadataDeserializer parser = new XmlMetadataDeserializer(); + InputStream reader = createStreamReader(metadata); + EdmDataServices result = parser.readMetadata(reader, true); + + assertEquals(1, result.getEdm().getSchemas().size()); + List<EdmEntityType> entityTypes = result.getEdm().getSchemas().get(0).getEntityTypes(); + assertEquals(1, entityTypes.size()); + EdmEntityType entityType = entityTypes.get(0); + EdmAnnotations annotations = entityType.getAnnotations(); + List<EdmAnnotationElement> annotationElements = annotations.getAnnotationElements(); + assertEquals(1, annotationElements.size()); + EdmAnnotationElement annotationElement = annotationElements.get(0); + List<EdmAnnotationElement> childElements = annotationElement.getChildElements(); + assertEquals(1, childElements.size()); + + assertEquals(" value1", childElements.get(0).getText()); + } + + @Test + public void ODATAJAVA_77_testMetadataDokumentWithMultiLevelEntityType() throws Exception { + final String metadata = "" + + "<edmx:Edmx Version=\"1.0\" xmlns:edmx=\"" + Edm.NAMESPACE_EDMX_2007_06 + "\">" + + " <edmx:DataServices m:DataServiceVersion=\"2.0\" xmlns:m=\"" + Edm.NAMESPACE_M_2007_08 + "\">" + + " <Schema Namespace=\"" + NAMESPACE2 + "\" xmlns=\"" + Edm.NAMESPACE_EDM_2008_09 + "\">" + + " <EntityType Name= \"Parameter\">" + + " <Key> " + + " <PropertyRef Name=\"Id\" />" + + " </Key>" + + " <Property Name=\"Id\" Type=\"Edm.Int16\" Nullable=\"false\" />" + + " </EntityType>" + + " <EntityType Name= \"ConfigParameter\" BaseType= \"RefScenario2.Parameter\" />" + + " <EntityType Name= \"DataConfigParameter\" BaseType= \"RefScenario2.ConfigParameter\" />" + + " <EntityType Name= \"StringDataConfigParameter\" BaseType= \"RefScenario2.DataConfigParameter\" />" + + " </Schema>" + + " </edmx:DataServices>" + + "</edmx:Edmx>"; + + XmlMetadataDeserializer parser = new XmlMetadataDeserializer(); + InputStream reader = createStreamReader(metadata); + EdmDataServices result = parser.readMetadata(reader, true); + + assertEquals(1, result.getEdm().getSchemas().size()); + List<EdmEntityType> entityTypes = result.getEdm().getSchemas().get(0).getEntityTypes(); + assertEquals(4, entityTypes.size()); + + } + + @Test + public void testMultiplebaseType() throws Exception { + final String metadata = "" + + "<edmx:Edmx Version=\"1.0\" xmlns:edmx=\"" + Edm.NAMESPACE_EDMX_2007_06 + "\">" + + " <edmx:DataServices m:DataServiceVersion=\"2.0\" xmlns:m=\"" + Edm.NAMESPACE_M_2007_08 + "\">" + + " <Schema Namespace=\"" + NAMESPACE2 + "\" xmlns=\"" + Edm.NAMESPACE_EDM_2008_09 + "\">" + + " <Using Namespace=\"com.sap.banking.common.endpoint.v1_0.beans\" Alias=\"common\"/>" + + " <Using Namespace=\"com.sap.banking.messages.endpoint.v1_0.beans\" Alias=\"messages\"/>" + + " <EntityType Name= \"StringDataConfigParameter\" BaseType= \"RefScenario2.DataConfigParameter\" />" + + " <EntityType Name= \"DataConfigParameter\" BaseType= \"RefScenario2.ConfigParameter\" >" + + " <Key> " + + " <PropertyRef Name=\"Name\" />" + + " </Key>" + + " <Property Name=\"Name\" Type=\"Edm.String\" Nullable=\"false\" />" + + " </EntityType>" + + " <EntityType Name= \"ConfigParameter\" BaseType= \"RefScenario2.Parameter\" >" + + " <Property Name=\"ConfigName\" Type=\"Edm.String\" Nullable=\"false\" />" + + " </EntityType>" + + " <EntityType Name= \"Parameter\">" + + " <Key> " + + " <PropertyRef Name=\"Id\" />" + + " </Key>" + + " <Property Name=\"Id\" Type=\"Edm.Int16\" Nullable=\"false\" />" + + " </EntityType>" + + " </Schema>" + + " </edmx:DataServices>" + + "</edmx:Edmx>"; + + XmlMetadataDeserializer parser = new XmlMetadataDeserializer(); + InputStream reader = createStreamReader(metadata); + EdmDataServices result = parser.readMetadata(reader, true); + + assertEquals(1, result.getEdm().getSchemas().size()); + List<EdmEntityType> entityTypes = result.getEdm().getSchemas().get(0).getEntityTypes(); + assertEquals(4, entityTypes.size()); + for(EdmEntityType entityType:entityTypes){ + if(entityType.getName().equalsIgnoreCase("StringDataConfigParameter")){ + assertEquals(3, entityType.getPropertyNames().size()); + assertEquals("Name", entityType.getPropertyNames().get(0)); + assertEquals("ConfigName", entityType.getPropertyNames().get(1)); + assertEquals("Id", entityType.getPropertyNames().get(2)); + }else if(entityType.getName().equalsIgnoreCase("DataConfigParameter")){ + assertEquals(3, entityType.getPropertyNames().size()); + assertEquals("Name", entityType.getPropertyNames().get(0)); + assertEquals("ConfigName", entityType.getPropertyNames().get(1)); + assertEquals("Id", entityType.getPropertyNames().get(2)); + }else if(entityType.getName().equalsIgnoreCase("ConfigParameter")){ + assertEquals(2, entityType.getPropertyNames().size()); + assertEquals("ConfigName", entityType.getPropertyNames().get(0)); + assertEquals("Id", entityType.getPropertyNames().get(1)); + }else if(entityType.getName().equalsIgnoreCase("Parameter")){ + assertEquals(1, entityType.getPropertyNames().size()); + assertEquals("Id", entityType.getPropertyNames().get(0)); + } + + } + + } + + @Test + public void testUsing() throws Exception { + final String metadata = "" + + "<edmx:Edmx Version=\"1.0\" xmlns:edmx=\"" + Edm.NAMESPACE_EDMX_2007_06 + "\">" + + " <edmx:DataServices m:DataServiceVersion=\"2.0\" xmlns:m=\"" + Edm.NAMESPACE_M_2007_08 + "\">" + + " <Schema Namespace=\"" + NAMESPACE2 + "\" xmlns=\"" + Edm.NAMESPACE_EDM_2008_09 + "\">" + + " <Using Namespace=\"com.sap.banking.common.endpoint.v1_0.beans\" Alias=\"common\"/>" + + " <Using Namespace=\"com.sap.banking.messages.endpoint.v1_0.beans\" Alias=\"messages\"/>" + + " </Schema>" + + " </edmx:DataServices>" + + "</edmx:Edmx>"; + + XmlMetadataDeserializer parser = new XmlMetadataDeserializer(); + InputStream reader = createStreamReader(metadata); + EdmDataServices result = parser.readMetadata(reader, false); + + assertEquals(1, result.getEdm().getSchemas().size()); + List<EdmUsing> using = result.getEdm().getSchemas().get(0).getUsings(); + assertEquals(2, using.size()); + + + } + + @Test + public void testMultiplebaseTypeOrderChange() throws Exception { + final String metadata = "" + + "<edmx:Edmx Version=\"1.0\" xmlns:edmx=\"" + Edm.NAMESPACE_EDMX_2007_06 + "\">" + + " <edmx:DataServices m:DataServiceVersion=\"2.0\" xmlns:m=\"" + Edm.NAMESPACE_M_2007_08 + "\">" + + " <Schema Namespace=\"" + NAMESPACE2 + "\" xmlns=\"" + Edm.NAMESPACE_EDM_2008_09 + "\">" + + " <EntityType Name= \"ConfigParameter\" BaseType= \"RefScenario2.Parameter\" >" + + " <Property Name=\"ConfigName\" Type=\"Edm.String\" Nullable=\"false\" />" + + " </EntityType>" + + " <EntityType Name= \"DataConfigParameter\" BaseType= \"RefScenario2.ConfigParameter\" >" + + " <Key> " + + " <PropertyRef Name=\"Name\" />" + + " </Key>" + + " <Property Name=\"Name\" Type=\"Edm.String\" Nullable=\"false\" />" + + " </EntityType>" + + " <EntityType Name= \"Parameter\">" + + " <Key> " + + " <PropertyRef Name=\"Id\" />" + + " </Key>" + + " <Property Name=\"Id\" Type=\"Edm.Int16\" Nullable=\"false\" />" + + " </EntityType>" + + " <EntityType Name= \"StringDataConfigParameter\" BaseType= \"RefScenario2.DataConfigParameter\" />" + + " <EntityType Name= \"AnotherDataConfigParameter\" BaseType= \"RefScenario2.DataConfigParameter\" />" + + " </Schema>" + + " </edmx:DataServices>" + + "</edmx:Edmx>"; + + XmlMetadataDeserializer parser = new XmlMetadataDeserializer(); + InputStream reader = createStreamReader(metadata); + EdmDataServices result = parser.readMetadata(reader, true); + + assertEquals(1, result.getEdm().getSchemas().size()); + List<EdmEntityType> entityTypes = result.getEdm().getSchemas().get(0).getEntityTypes(); + assertEquals(5, entityTypes.size()); + for(EdmEntityType entityType:entityTypes){ + if(entityType.getName().equalsIgnoreCase("StringDataConfigParameter")){ + assertEquals(3, entityType.getPropertyNames().size()); + assertEquals("Name", entityType.getPropertyNames().get(0)); + assertEquals("ConfigName", entityType.getPropertyNames().get(1)); + assertEquals("Id", entityType.getPropertyNames().get(2)); + }else if(entityType.getName().equalsIgnoreCase("DataConfigParameter")){ + assertEquals(3, entityType.getPropertyNames().size()); + assertEquals("Name", entityType.getPropertyNames().get(0)); + assertEquals("ConfigName", entityType.getPropertyNames().get(1)); + assertEquals("Id", entityType.getPropertyNames().get(2)); + }else if(entityType.getName().equalsIgnoreCase("ConfigParameter")){ + assertEquals(2, entityType.getPropertyNames().size()); + assertEquals("ConfigName", entityType.getPropertyNames().get(0)); + assertEquals("Id", entityType.getPropertyNames().get(1)); + }else if(entityType.getName().equalsIgnoreCase("Parameter")){ + assertEquals(1, entityType.getPropertyNames().size()); + assertEquals("Id", entityType.getPropertyNames().get(0)); + }else if(entityType.getName().equalsIgnoreCase("AnotherDataConfigParameter")){ + assertEquals(3, entityType.getPropertyNames().size()); + assertEquals("Name", entityType.getPropertyNames().get(0)); + assertEquals("ConfigName", entityType.getPropertyNames().get(1)); + assertEquals("Id", entityType.getPropertyNames().get(2)); + } + + } + + } + + @Test + public void ODATAJAVA_77_testBaseTypeKey() throws Exception { + final String metadata = "" + + "<edmx:Edmx Version=\"1.0\" xmlns:edmx=\"" + Edm.NAMESPACE_EDMX_2007_06 + "\">" + + " <edmx:DataServices m:DataServiceVersion=\"2.0\" xmlns:m=\"" + Edm.NAMESPACE_M_2007_08 + "\">" + + " <Schema Namespace=\"" + NAMESPACE2 + "\" xmlns=\"" + Edm.NAMESPACE_EDM_2008_09 + "\">" + + " <EntityType Name= \"Parameter\">" + + " <Key> " + + " <PropertyRef Name=\"Id\" />" + + " </Key>" + + " <Property Name=\"Id\" Type=\"Edm.Int16\" Nullable=\"false\" />" + + " </EntityType>" + + " <EntityType Name= \"ConfigParameter\" BaseType= \"RefScenario2.Parameter\" />" + + " <EntityType Name= \"DataConfigParameter\" BaseType= \"RefScenario2.ConfigParameter\" >" + + " <Key> " + + " <PropertyRef Name=\"Name\" />" + + " </Key>" + + " <Property Name=\"Name\" Type=\"Edm.String\" Nullable=\"false\" />" + + " </EntityType>" + + " <EntityType Name= \"StringDataConfigParameter\" BaseType= \"RefScenario2.DataConfigParameter\" />" + + " </Schema>" + + " </edmx:DataServices>" + + "</edmx:Edmx>"; + + XmlMetadataDeserializer parser = new XmlMetadataDeserializer(); + InputStream reader = createStreamReader(metadata); + EdmDataServices result = parser.readMetadata(reader, true); + + assertEquals(1, result.getEdm().getSchemas().size()); + List<EdmEntityType> entityTypes = result.getEdm().getSchemas().get(0).getEntityTypes(); + assertEquals(4, entityTypes.size()); + + } + + @Test + public void ODATAJAVA_77_testEntityTypeKey() throws Exception { + final String metadata = "" + + "<edmx:Edmx Version=\"1.0\" xmlns:edmx=\"" + Edm.NAMESPACE_EDMX_2007_06 + "\">" + + " <edmx:DataServices m:DataServiceVersion=\"2.0\" xmlns:m=\"" + Edm.NAMESPACE_M_2007_08 + "\">" + + " <Schema Namespace=\"" + NAMESPACE2 + "\" xmlns=\"" + Edm.NAMESPACE_EDM_2008_09 + "\">" + + " <EntityType Name= \"Parameter\">" + + " <Key> " + + " <PropertyRef Name=\"Id\" />" + + " </Key>" + + " <Property Name=\"Id\" Type=\"Edm.Int16\" Nullable=\"false\" />" + + " </EntityType>" + + " <EntityType Name= \"ConfigParameter\" BaseType= \"RefScenario2.Parameter\" />" + + " <EntityType Name= \"DataConfigParameter\" BaseType= \"RefScenario2.ConfigParameter\" />" + + " <EntityType Name= \"StringDataConfigParameter\" BaseType= \"RefScenario2.DataConfigParameter\" >" + + " <Key> " + + " <PropertyRef Name=\"Name\" />" + + " </Key>" + + " <Property Name=\"Name\" Type=\"Edm.String\" Nullable=\"false\" />" + + " </EntityType>" + + " </Schema>" + + " </edmx:DataServices>" + + "</edmx:Edmx>"; + + XmlMetadataDeserializer parser = new XmlMetadataDeserializer(); + InputStream reader = createStreamReader(metadata); + EdmDataServices result = parser.readMetadata(reader, true); + + assertEquals(1, result.getEdm().getSchemas().size()); + List<EdmEntityType> entityTypes = result.getEdm().getSchemas().get(0).getEntityTypes(); + assertEquals(4, entityTypes.size()); + + } + + @Test(expected = EntityProviderException.class) + public void ODATAJAVA_77_ExceptionScenario() throws Exception { + final String metadata = "" + + "<edmx:Edmx Version=\"1.0\" xmlns:edmx=\"" + Edm.NAMESPACE_EDMX_2007_06 + "\">" + + " <edmx:DataServices m:DataServiceVersion=\"2.0\" xmlns:m=\"" + Edm.NAMESPACE_M_2007_08 + "\">" + + " <Schema Namespace=\"" + NAMESPACE2 + "\" xmlns=\"" + Edm.NAMESPACE_EDM_2008_09 + "\">" + + " <EntityType Name= \"ConfigParameter\" BaseType= \"RefScenario2.Parameter\" />" + + " <EntityType Name= \"DataConfigParameter\" BaseType= \"RefScenario2.ConfigParameter\" />" + + " <EntityType Name= \"StringDataConfigParameter\" BaseType= \"RefScenario2.DataConfigParameter\" />" + + " <EntityType Name= \"Parameter\">" + + " <Property Name=\"Id\" Type=\"Edm.Int16\" Nullable=\"false\" />" + + " </EntityType>" + + " </Schema>" + + " </edmx:DataServices>" + + "</edmx:Edmx>"; + + XmlMetadataDeserializer parser = new XmlMetadataDeserializer(); + InputStream reader = createStreamReader(metadata); + parser.readMetadata(reader, true); + } + + @Test + public void stringValueForMaxLegthFacet() throws Exception { + XmlMetadataDeserializer parser = new XmlMetadataDeserializer(); + InputStream reader = createStreamReader(xmlWithStringValueForMaxLengthFacet); + EdmDataServices result = parser.readMetadata(reader, true); + + List<String> properties = result.getEdm().getSchemas().get(0).getEntityTypes().get(0).getKeyPropertyNames(); + assertEquals(1, properties.size()); + + EdmProperty property = (EdmProperty) result.getEdm().getSchemas().get(0).getEntityTypes().get(0).getProperty("Id"); + EdmFacets facets = property.getFacets(); + assertEquals(new Integer(Integer.MAX_VALUE), facets.getMaxLength()); + + property = (EdmProperty) result.getEdm().getSchemas().get(0).getEntityTypes().get(0).getProperty("Name"); + facets = property.getFacets(); + assertEquals(new Integer(Integer.MAX_VALUE), facets.getMaxLength()); + } + + + @Test + public void test() throws XMLStreamException, + EntityProviderException, EdmException, UnsupportedEncodingException { + int i = 0; + XmlMetadataDeserializer parser = new XmlMetadataDeserializer(); + InputStream reader = createStreamReader(xml); + EdmDataServices result = parser.readMetadata(reader, true); + assertEquals("2.0", result.getDataServiceVersion()); + for (EdmSchema schema : result.getEdm().getSchemas()) { + assertEquals(NAMESPACE, schema.getNamespace()); + assertEquals(1, schema.getEntityTypes().size()); + assertEquals("Employee", schema.getEntityTypes().get(0).getName()); + assertEquals(Boolean.TRUE, schema.getEntityTypes().get(0).hasStream()); + for (EdmProperty propertyRef : schema.getEntityTypes().get(0).getKeyProperties()) { + assertEquals("EmployeeId", propertyRef.getName()); + } + for (String name : schema.getEntityTypes().get(0).getPropertyNames()) { + assertEquals(propertyNames[i], name); + EdmProperty property = (EdmProperty) schema.getEntityTypes().get(0).getProperty(name); + if ("Location".equals(property.getName())) { + EdmProperty cProperty = property; + assertEquals(NAMESPACE, cProperty.getType().getNamespace()); + assertEquals("c_Location", cProperty.getType().getName()); + } else if ("EmployeeName".equals(property.getName())) { + assertNotNull(property.getCustomizableFeedMappings()); + assertEquals("SyndicationTitle", property.getCustomizableFeedMappings().getFcTargetPath()); + assertNull(property.getCustomizableFeedMappings().getFcContentKind()); + } + i++; + } + assertEquals(1, schema.getComplexTypes().size()); + assertEquals("c_Location", schema.getComplexTypes().get(0).getName()); + } + } + + @Test + public void testCustom() throws XMLStreamException, + EntityProviderException, EdmException, UnsupportedEncodingException { + XmlMetadataDeserializer parser = new XmlMetadataDeserializer(); + InputStream reader = createStreamReader(customxml); + EdmDataServices result = parser.readMetadata(reader, true); + assertEquals("2.0", result.getDataServiceVersion()); + EdmSchema schema = result.getEdm().getSchemas().get(0); + assertNotNull(result.getEdm().getSchemas().get(0).getEntityTypes().get(0).getCustomizableFeedMappings()); + assertEquals("SyndicationTitle", schema.getEntityTypes().get(0).getCustomizableFeedMappings().getFcTargetPath()); + + } + @Test + public void testOtherEdmNamespace() throws XMLStreamException, + EntityProviderException, EdmException, UnsupportedEncodingException { + int i = 0; + XmlMetadataDeserializer parser = new XmlMetadataDeserializer(); + InputStream reader = createStreamReader(xml2); + EdmDataServices result = parser.readMetadata(reader, true); + assertEquals("2.0", result.getDataServiceVersion()); + for (EdmSchema schema : result.getEdm().getSchemas()) { + assertEquals(NAMESPACE, schema.getNamespace()); + assertEquals(1, schema.getEntityTypes().size()); + assertEquals("Employee", schema.getEntityTypes().get(0).getName()); + for (EdmProperty propertyRef : schema.getEntityTypes().get(0).getKeyProperties()) { + assertEquals("EmployeeId", propertyRef.getName()); + } + for (String name : schema.getEntityTypes().get(0).getPropertyNames()) { + EdmEntityType entity = schema.getEntityTypes().get(0); + assertEquals(propertyNames[i], name); + if ("Location".equals(name)) { + EdmProperty cProperty = (EdmProperty) entity.getProperty(name); + assertEquals("c_Location", cProperty.getType().getName()); + } else if ("EmployeeName".equals(name)) { + assertNotNull(((EdmProperty) entity.getProperty(name)).getCustomizableFeedMappings()); + } + i++; + } + for (EdmAnnotationElement annoElement : schema.getAnnotationElements()) { + assertEquals("prefix", annoElement.getPrefix()); + assertEquals("namespace", annoElement.getNamespace()); + assertEquals("schemaElement", annoElement.getName()); + assertEquals("text3", annoElement.getText()); + } + } + } + + @Test + public void testBaseType() throws XMLStreamException, + EntityProviderException, EdmException, UnsupportedEncodingException { + int i = 0; + XmlMetadataDeserializer parser = new XmlMetadataDeserializer(); + InputStream reader = createStreamReader(xmlWithBaseType); + EdmDataServices result = parser.readMetadata(reader, true); + assertEquals("2.0", result.getDataServiceVersion()); + for (EdmSchema schema : result.getEdm().getSchemas()) { + assertEquals(NAMESPACE, schema.getNamespace()); + assertEquals(2, schema.getEntityTypes().size()); + assertEquals("Employee", schema.getEntityTypes().get(0).getName()); + for (String propertyRef : schema.getEntityTypes().get(0).getKeyPropertyNames()) { + assertEquals("EmployeeId", propertyRef); + } + for (String property : schema.getEntityTypes().get(0).getPropertyNames()) { + assertEquals(propertyNames[i], property); + i++; + } + + } + } + + @Test + public void testComplexTypeWithBaseType() throws XMLStreamException, + EntityProviderException, EdmException, UnsupportedEncodingException { + final String xml = + "<edmx:Edmx Version=\"1.0\" xmlns:edmx=\"" + Edm.NAMESPACE_EDMX_2007_06 + "\">" + + "<edmx:DataServices m:DataServiceVersion=\"2.0\" xmlns:m=\"" + Edm.NAMESPACE_M_2007_08 + "\">" + + "<Schema Namespace=\"" + NAMESPACE + "\" Alias=\"RS\" xmlns=\"" + Edm.NAMESPACE_EDM_2008_09 + "\">" + + "<EntityType Name= \"Employee\" m:HasStream=\"true\">" + "<Key><PropertyRef Name=\"EmployeeId\"/></Key>" + + "<Property Name=\"" + propertyNames[0] + "\" Type=\"Edm.String\" Nullable=\"false\"/>" + + "<Property Name=\"" + propertyNames[2] + "\" Type=\"RefScenario.c_Location\" Nullable=\"false\"/>" + + "</EntityType>" + "<ComplexType Name=\"c_BaseType_for_Location\" Abstract=\"true\">" + + "<Property Name=\"Country\" Type=\"Edm.String\"/>" + "</ComplexType>" + + "<ComplexType Name=\"c_Location\" BaseType=\"RefScenario.c_BaseType_for_Location\">" + "</ComplexType>" + + "<ComplexType Name=\"c_Other_Location\" BaseType=\"RS.c_BaseType_for_Location\">" + "</ComplexType>" + + "</Schema>" + + "</edmx:DataServices>" + "</edmx:Edmx>"; + XmlMetadataDeserializer parser = new XmlMetadataDeserializer(); + InputStream reader = createStreamReader(xml); + EdmDataServices result = parser.readMetadata(reader, true); + assertEquals("2.0", result.getDataServiceVersion()); + for (EdmSchema schema : result.getEdm().getSchemas()) { + for (EdmComplexType complexType : schema.getComplexTypes()) { + if ("c_Location".equals(complexType.getName())) { + assertNotNull(complexType.getBaseType()); + assertEquals("c_BaseType_for_Location", complexType.getBaseType().getName()); + assertEquals("RefScenario", complexType.getBaseType().getNamespace()); + } else if ("c_Other_Location".equals(complexType.getName())) { + assertNotNull(complexType.getBaseType()); + assertEquals("c_BaseType_for_Location", complexType.getBaseType().getName()); + assertEquals("RefScenario", complexType.getBaseType().getNamespace()); + } else if ("c_BaseType_for_Location".equals(complexType.getName())) { + assertNotNull(complexType); + } else { + assertTrue(false); + } + } + + } + } + + @Test(expected = EntityProviderException.class) + public void testComplexTypeWithInvalidBaseType() throws XMLStreamException, + EntityProviderException, EdmException, UnsupportedEncodingException { + final String xml = + "<edmx:Edmx Version=\"1.0\" xmlns:edmx=\"" + Edm.NAMESPACE_EDMX_2007_06 + "\">" + + "<edmx:DataServices m:DataServiceVersion=\"2.0\" xmlns:m=\"" + Edm.NAMESPACE_M_2007_08 + "\">" + + "<Schema Namespace=\"" + NAMESPACE + "\" xmlns=\"" + Edm.NAMESPACE_EDM_2008_09 + "\">" + + "<EntityType Name= \"Employee\" m:HasStream=\"true\">" + "<Key><PropertyRef Name=\"EmployeeId\"/></Key>" + + "<Property Name=\"" + propertyNames[0] + "\" Type=\"Edm.String\" Nullable=\"false\"/>" + + "<Property Name=\"" + propertyNames[2] + "\" Type=\"RefScenario.c_Location\" Nullable=\"false\"/>" + + "</EntityType>" + "<ComplexType Name=\"c_BaseType_for_Location\" Abstract=\"true\">" + + "<Property Name=\"Country\" Type=\"Edm.String\"/>" + "</ComplexType>" + + "<ComplexType Name=\"c_Location\" BaseType=\"RefScenario.Employee\">" + "</ComplexType>" + "</Schema>" + + "</edmx:DataServices>" + "</edmx:Edmx>"; + XmlMetadataDeserializer parser = new XmlMetadataDeserializer(); + InputStream reader = createStreamReader(xml); + parser.readMetadata(reader, true); + } + + @Test(expected = EntityProviderException.class) + public void testComplexTypeWithInvalidBaseType2() throws XMLStreamException, + EntityProviderException, EdmException, UnsupportedEncodingException { + final String xml = + "<edmx:Edmx Version=\"1.0\" xmlns:edmx=\"" + Edm.NAMESPACE_EDMX_2007_06 + "\">" + + "<edmx:DataServices m:DataServiceVersion=\"2.0\" xmlns:m=\"" + Edm.NAMESPACE_M_2007_08 + "\">" + + "<Schema Namespace=\"" + NAMESPACE + "\" xmlns=\"" + Edm.NAMESPACE_EDM_2008_09 + "\">" + + "<EntityType Name= \"Employee\" m:HasStream=\"true\">" + "<Key><PropertyRef Name=\"EmployeeId\"/></Key>" + + "<Property Name=\"" + propertyNames[0] + "\" Type=\"Edm.String\" Nullable=\"false\"/>" + + "<Property Name=\"" + propertyNames[2] + "\" Type=\"RefScenario.c_Location\" Nullable=\"false\"/>" + + "</EntityType>" + "<ComplexType Name=\"c_BaseType_for_Location\" Abstract=\"true\">" + + "<Property Name=\"Country\" Type=\"Edm.String\"/>" + "</ComplexType>" + + "<ComplexType Name=\"c_Location\" BaseType=\"c_BaseType_for_Location\">" + "</ComplexType>" + "</Schema>" + + "</edmx:DataServices>" + "</edmx:Edmx>"; + XmlMetadataDeserializer parser = new XmlMetadataDeserializer(); + InputStream reader = createStreamReader(xml); + parser.readMetadata(reader, true); + } + + @Test(expected = EntityProviderException.class) + public void testMissingEdmxCloseTag() throws XMLStreamException, + EntityProviderException, EdmException, UnsupportedEncodingException { + final String xml = "<edmx:Edmx Version=\"1.0\" xmlns:edmx=\"" + Edm.NAMESPACE_EDMX_2007_06 + "\">" + + "<edmx:DataServices m:DataServiceVersion=\"2.0\" xmlns:m=\"" + Edm.NAMESPACE_M_2007_08 + "\">" + + "<Schema Namespace=\"" + NAMESPACE + "\" xmlns=\"" + Edm.NAMESPACE_EDM_2008_09 + "\">" + + "<EntityType Name= \"Employee\" m:HasStream=\"true\">" + "<Key><PropertyRef Name=\"EmployeeId\"/></Key>" + + "<Property Name=\"" + propertyNames[0] + "\" Type=\"Edm.String\" Nullable=\"false\"/>" + "<Property Name=\"" + + propertyNames[1] + "\" Type=\"Edm.String\" m:FC_TargetPath=\"SyndicationTitle\"/>" + "<Property Name=\"" + + propertyNames[2] + "\" Type=\"RefScenario.c_Location\" Nullable=\"false\"/>" + "</EntityType>" + + "<ComplexType Name=\"c_Location\">" + "<Property Name=\"Country\" Type=\"Edm.String\"/>" + "</ComplexType>" + + "</Schema>" + "</edmx:DataServices>"; + + XmlMetadataDeserializer parser = new XmlMetadataDeserializer(); + InputStream reader = createStreamReader(xml); + parser.readMetadata(reader, true); + } + + @Test + public void testAssociation() throws XMLStreamException, + EntityProviderException, EdmException, UnsupportedEncodingException { + XmlMetadataDeserializer parser = new XmlMetadataDeserializer(); + InputStream reader = createStreamReader(xmlWithAssociation); + EdmDataServices result = parser.readMetadata(reader, true); + assertEquals("2.0", result.getDataServiceVersion()); + assertEquals("EdmImpl", result.getEdm().toString()); + for (EdmSchema schema : result.getEdm().getSchemas()) { + assertEquals(schema.getNamespace()+"."+schema.getAlias(), schema.toString()); + for (EdmEntityType entityType : schema.getEntityTypes()) { + assertEquals("RefScenario."+entityType.getName(), entityType.toString()); + if ("Manager".equals(entityType.getName())) { + assertEquals("RefScenario", entityType.getBaseType().getNamespace()); + assertEquals("Employee", entityType.getBaseType().getName()); + for (String name : entityType.getNavigationPropertyNames()) { + EdmNavigationProperty navProperty = (EdmNavigationProperty) entityType.getProperty(name); + assertEquals(name, navProperty.toString()); + assertEquals("r_Manager", navProperty.getFromRole()); + assertEquals("r_Employees", navProperty.getToRole()); + assertEquals("RefScenario", navProperty.getRelationship().getNamespace()); + assertEquals(ASSOCIATION, navProperty.getRelationship().getName()); + } + } + if ("Employee".equals(entityType.getName())) { + for (String name : entityType.getNavigationPropertyNames()) { + EdmNavigationProperty navProperty = (EdmNavigationProperty) entityType.getProperty(name); + assertEquals(name, navProperty.toString()); + assertEquals("r_Employees", navProperty.getFromRole()); + assertEquals("RefScenario", navProperty.getRelationship().getNamespace()); + assertEquals(ASSOCIATION, navProperty.getRelationship().getName()); + } + } + } + for (EdmAssociation association : schema.getAssociations()) { + EdmMetadataAssociationEnd end; + assertEquals(ASSOCIATION, association.getName()); + assertEquals("RefScenario."+association.getName(), association.toString()); + if ("Employee".equals(association.getEnd1().getEntityType().getName())) { + end = (EdmMetadataAssociationEnd) association.getEnd1(); + } else { + end = (EdmMetadataAssociationEnd) association.getEnd2(); + } + assertEquals("null null", end.toString()); + assertEquals(EdmMultiplicity.MANY, end.getMultiplicity()); + assertEquals("r_Employees", end.getRole()); + assertEquals(EdmAction.Cascade, end.getOnDelete().getAction()); + } + } + } + + @Test + public void testTwoSchemas() throws XMLStreamException, EntityProviderException, + EdmException, UnsupportedEncodingException { + int i = 0; + String schemasNs[] = { NAMESPACE, NAMESPACE2 }; + XmlMetadataDeserializer parser = new XmlMetadataDeserializer(); + InputStream reader = createStreamReader(xmlWithTwoSchemas); + EdmDataServices result = parser.readMetadata(reader, true); + assertEquals("2.0", result.getDataServiceVersion()); + assertEquals(2, result.getEdm().getSchemas().size()); + for (EdmSchema schema : result.getEdm().getSchemas()) { + assertEquals(schemasNs[i], schema.getNamespace()); + assertEquals(1, schema.getEntityTypes().size()); + i++; + + } + } + + @Test + public void testProperties() throws EntityProviderException, + XMLStreamException, EdmException, UnsupportedEncodingException { + XmlMetadataDeserializer parser = new XmlMetadataDeserializer(); + InputStream reader = createStreamReader(xmlWithTwoSchemas); + EdmDataServices result = parser.readMetadata(reader, true); + for (EdmSchema schema : result.getEdm().getSchemas()) { + for (EdmEntityType entityType : schema.getEntityTypes()) { + if ("Employee".equals(entityType.getName())) { + for (String name : entityType.getPropertyNames()) { + EdmProperty property = (EdmProperty)(entityType.getProperty(name)); + if (propertyNames[0].equals(name)) { + assertNotNull(property.getFacets()); + assertEquals(Boolean.FALSE, property.getFacets().isNullable()); + } else if (propertyNames[1].equals(name)) { + assertNull(property.getFacets()); + } + } + } else if ("Photo".equals(entityType.getName())) { + for (String name : entityType.getPropertyNames()) { + EdmProperty sProperty = (EdmProperty) entityType.getProperty(name); + if ("Id".equals(sProperty.getName())) { + assertEquals(Boolean.FALSE, sProperty.getFacets().isNullable()); + assertEquals(EdmConcurrencyMode.Fixed, sProperty.getFacets().getConcurrencyMode()); + assertEquals(new Integer(MAX_LENGTH), sProperty.getFacets().getMaxLength()); + assertTrue(sProperty.isSimple()); + assertEquals(EdmSimpleTypeKind.Int32.toString(), sProperty.getType().getName()); + assertNull(sProperty.getCustomizableFeedMappings()); + } + if ("Name".equals(sProperty.getName())) { + assertEquals(Boolean.TRUE, sProperty.getFacets().isUnicode()); + assertEquals(DEFAULT_VALUE, sProperty.getFacets().getDefaultValue()); + assertEquals(Boolean.FALSE, sProperty.getFacets().isFixedLength()); + assertEquals(EdmSimpleTypeKind.String.name(), sProperty.getType().getName()); + //assertEquals(EdmSimpleTypeKind.String, sProperty.getType()); + assertNull(sProperty.getCustomizableFeedMappings()); + } + if ("СодеÑжание".equals(sProperty.getName())) { + assertEquals(FC_TARGET_PATH, sProperty.getCustomizableFeedMappings().getFcTargetPath()); + assertEquals(FC_NS_URI, sProperty.getCustomizableFeedMappings().getFcNsUri()); + assertEquals(FC_NS_PREFIX, sProperty.getCustomizableFeedMappings().getFcNsPrefix()); + assertEquals(FC_KEEP_IN_CONTENT, sProperty.getCustomizableFeedMappings().isFcKeepInContent()); + assertEquals(EdmContentKind.text, sProperty.getCustomizableFeedMappings().getFcContentKind()); + } + if ("BinaryData".equals(sProperty.getName())) { + assertEquals(MIME_TYPE, sProperty.getMimeType()); + } + } + } + } + } + } + + @Test + public void testEntitySet() throws XMLStreamException, + EntityProviderException, EdmException, UnsupportedEncodingException { + final String xmWithEntityContainer = + "<edmx:Edmx Version=\"1.0\" xmlns:edmx=\"" + Edm.NAMESPACE_EDMX_2007_06 + "\">" + + "<edmx:DataServices m:DataServiceVersion=\"2.0\" xmlns:m=\"" + Edm.NAMESPACE_M_2007_08 + "\">" + + "<Schema Namespace=\"" + NAMESPACE + "\" xmlns=\"" + Edm.NAMESPACE_EDM_2008_09 + "\">" + + "<EntityType Name= \"Employee\" m:HasStream=\"true\">" + "<Key><PropertyRef Name=\"EmployeeId\"/></Key>" + + "<Property Name=\"" + propertyNames[0] + "\" Type=\"Edm.String\" Nullable=\"false\"/>" + + "<Property Name=\"" + propertyNames[1] + "\" Type=\"Edm.String\" m:FC_TargetPath=\"SyndicationTitle\"/>" + + "</EntityType>" + "<EntityContainer Name=\"Container1\" m:IsDefaultEntityContainer=\"true\">" + + "<EntitySet Name=\"Employees\" EntityType=\"RefScenario.Employee\"/>" + "</EntityContainer>" + + "</Schema>" + "</edmx:DataServices>" + "</edmx:Edmx>"; + XmlMetadataDeserializer parser = new XmlMetadataDeserializer(); + InputStream reader = createStreamReader(xmWithEntityContainer); + EdmDataServices result = parser.readMetadata(reader, true); + assertEquals("Container1", result.getEdm().getEntityContainer("Container1").getName()); + for (EdmSchema schema : result.getEdm().getSchemas()) { + for (EdmEntityContainer container : schema.getEntityContainers()) { + assertEquals("Container1", container.getName()); + assertEquals(Boolean.TRUE, container.isDefaultEntityContainer()); + for (EdmEntitySet entitySet : container.getEntitySets()) { + assertEquals("Employees", entitySet.getName()); + assertEquals("Employee", entitySet.getEntityType().getName()); + assertEquals(NAMESPACE, entitySet.getEntityType().getNamespace()); + } + } + } + } + + @Test + public void testAssociationSet() throws XMLStreamException, + EntityProviderException, EdmException, UnsupportedEncodingException { + XmlMetadataDeserializer parser = new XmlMetadataDeserializer(); + InputStream reader = createStreamReader(xmlWithAssociation); + EdmDataServices result = parser.readMetadata(reader, true); + for (EdmSchema schema : result.getEdm().getSchemas()) { + for (EdmEntityContainer container : schema.getEntityContainers()) { + assertEquals(NAMESPACE2, schema.getNamespace()); + assertEquals("Container1", container.getName()); + assertEquals(Boolean.TRUE, container.isDefaultEntityContainer()); + assertNotNull(result.getEdm().getDefaultEntityContainer()); + assertEquals("Container1", result.getEdm().getDefaultEntityContainer().getName()); + for (EdmAssociationSet assocSet : container.getAssociationSets()) { + assertEquals(ASSOCIATION, assocSet.getName()); + assertEquals(ASSOCIATION, assocSet.getAssociation().getName()); + assertEquals(NAMESPACE, assocSet.getAssociation().getNamespace()); + EdmAssociationSetEnd end; + if ("Employees".equals(assocSet.getEnd("r_Employees").getEntitySet().getName())) { + end = assocSet.getEnd("r_Employees"); + } else { + end = assocSet.getEnd("r_Manager"); + } + assertEquals("r_Employees", end.getRole()); + } + } + } + } + + + + @Test() + public void testAlias() throws XMLStreamException, + EntityProviderException, EdmException, UnsupportedEncodingException { + final String xml = + "<edmx:Edmx Version=\"1.0\" xmlns:edmx=\"" + Edm.NAMESPACE_EDMX_2007_06 + "\">" + + "<edmx:DataServices m:DataServiceVersion=\"2.0\" xmlns:m=\"" + Edm.NAMESPACE_M_2007_08 + "\">" + + "<Schema Namespace=\"" + NAMESPACE + "\" Alias=\"RS\" xmlns=\"" + Edm.NAMESPACE_EDM_2008_09 + "\">" + + "<EntityType Name= \"Employee\">" + "<Key><PropertyRef Name=\"EmployeeId\"/></Key>" + "<Property Name=\"" + + propertyNames[0] + "\" Type=\"Edm.String\" Nullable=\"false\"/>" + "</EntityType>" + + "<EntityType Name=\"Manager\" BaseType=\"RS.Employee\" m:HasStream=\"true\">" + "</EntityType>" + + "</Schema>" + "</edmx:DataServices>" + "</edmx:Edmx>"; + XmlMetadataDeserializer parser = new XmlMetadataDeserializer(); + InputStream reader = createStreamReader(xml); + EdmDataServices result = parser.readMetadata(reader, true); + for (EdmSchema schema : result.getEdm().getSchemas()) { + assertEquals("RS", schema.getAlias()); + for (EdmEntityType entityType : schema.getEntityTypes()) { + if ("Manager".equals(entityType.getName())) { + assertEquals("Employee", entityType.getBaseType().getName()); + assertEquals("RefScenario", entityType.getBaseType() + .getNamespace()); + } + } + + } + } + + @Test(expected = EntityProviderException.class) + public void testEntityTypeWithoutKeys() throws XMLStreamException, + EntityProviderException, EdmException, UnsupportedEncodingException { + final String xmlWithoutKeys = + "<Schema Namespace=\"" + NAMESPACE + "\" xmlns=\"" + Edm.NAMESPACE_EDM_2008_09 + "\">" + + "<EntityType Name= \"Employee\">" + "<Property Name=\"" + propertyNames[0] + + "\" Type=\"Edm.String\" Nullable=\"false\"/>" + "</EntityType>" + "</Schema>"; + XmlMetadataDeserializer parser = new XmlMetadataDeserializer(); + InputStream reader = createStreamReader(xmlWithoutKeys); + parser.readMetadata(reader, true); + } + + @Test(expected = EntityProviderException.class) + public void testInvalidBaseType() throws XMLStreamException, + EntityProviderException, EdmException, UnsupportedEncodingException { + final String xmlWithInvalidBaseType = + "<Schema Namespace=\"" + NAMESPACE + "\" xmlns=\"" + Edm.NAMESPACE_EDM_2008_09 + "\">" + + "<EntityType Name= \"Manager\" BaseType=\"Employee\" m:HasStream=\"true\">" + "</EntityType>" + + "</Schema>"; + XmlMetadataDeserializer parser = new XmlMetadataDeserializer(); + InputStream reader = createStreamReader(xmlWithInvalidBaseType); + parser.readMetadata(reader, true); + } + + @Test(expected = EntityProviderException.class) + public void testInvalidRole() throws XMLStreamException, + EntityProviderException, EdmException, UnsupportedEncodingException { + final String xmlWithInvalidAssociation = + "<edmx:Edmx Version=\"1.0\" xmlns:edmx=\"" + + Edm.NAMESPACE_EDMX_2007_06 + + "\">" + + "<edmx:DataServices m:DataServiceVersion=\"2.0\" xmlns:m=\"" + + Edm.NAMESPACE_M_2007_08 + + "\">" + + "<Schema Namespace=\"" + + NAMESPACE + + "\" xmlns=\"" + + Edm.NAMESPACE_EDM_2008_09 + + "\">" + + "<EntityType Name= \"Employee\">" + + "<Key><PropertyRef Name=\"EmployeeId\"/></Key>" + + "<Property Name=\"" + + propertyNames[0] + + "\" Type=\"Edm.String\" Nullable=\"false\"/>" + + "</EntityType>" + + "<EntityType Name=\"Manager\" BaseType=\"RefScenario.Employee\" m:HasStream=\"true\">" + + "<NavigationProperty Name=\"nm_Employees\" Relationship=\"RefScenario.ManagerEmployees\" " + + "FromRole=\"Manager\" ToRole=\"Employees\" />" + + "</EntityType>" + "<Association Name=\"ManagerEmployees\">" + + "<End Type=\"RefScenario.Employee\" Multiplicity=\"*\" Role=\"r_Employees\"/>" + + "<End Type=\"RefScenario.Manager\" Multiplicity=\"1\" Role=\"r_Manager\"/>" + "</Association>" + + "</Schema>" + + "</edmx:DataServices>" + "</edmx:Edmx>"; + XmlMetadataDeserializer parser = new XmlMetadataDeserializer(); + InputStream reader = createStreamReader(xmlWithInvalidAssociation); + parser.readMetadata(reader, true); + } + + @Test(expected = EntityProviderException.class) + public void testInvalidRelationship() throws XMLStreamException, + EntityProviderException, EdmException, UnsupportedEncodingException { + final String xmlWithInvalidAssociation = + "<edmx:Edmx Version=\"1.0\" xmlns:edmx=\"" + + Edm.NAMESPACE_EDMX_2007_06 + + "\">" + + "<edmx:DataServices m:DataServiceVersion=\"2.0\" xmlns:m=\"" + + Edm.NAMESPACE_M_2007_08 + + "\">" + + "<Schema Namespace=\"" + + NAMESPACE + + "\" xmlns=\"" + + Edm.NAMESPACE_EDM_2008_09 + + "\">" + + "<EntityType Name= \"Employee\">" + + "<Key><PropertyRef Name=\"EmployeeId\"/></Key>" + + "<Property Name=\"" + + propertyNames[0] + + "\" Type=\"Edm.String\" Nullable=\"false\"/>" + + "<NavigationProperty Name=\"ne_Manager\" Relationship=\"RefScenario.ManagerEmployee\" " + + "FromRole=\"r_Employees\" ToRole=\"r_Manager\" />" + + "</EntityType>" + "<EntityType Name=\"Manager\" BaseType=\"RefScenario.Employee\" m:HasStream=\"true\">" + + "</EntityType>" + "<Association Name=\"ManagerEmployees\">" + + "<End Type=\"RefScenario.Employee\" Multiplicity=\"*\" Role=\"r_Employees\"/>" + + "<End Type=\"RefScenario.Manager\" Multiplicity=\"1\" Role=\"r_Manager\"/>" + "</Association>" + + "</Schema>" + + "</edmx:DataServices>" + "</edmx:Edmx>"; + XmlMetadataDeserializer parser = new XmlMetadataDeserializer(); + InputStream reader = createStreamReader(xmlWithInvalidAssociation); + parser.readMetadata(reader, true); + } + @Test(expected = EntityProviderException.class) + public void testMissingRelationship() throws Exception { + final String xmlWithInvalidAssociation = + "<edmx:Edmx Version=\"1.0\" xmlns:edmx=\"" + Edm.NAMESPACE_EDMX_2007_06 + "\">" + + "<edmx:DataServices m:DataServiceVersion=\"2.0\" xmlns:m=\"" + Edm.NAMESPACE_M_2007_08 + "\">" + + "<Schema Namespace=\"" + NAMESPACE + "\" xmlns=\"" + Edm.NAMESPACE_EDM_2008_09 + "\">" + + "<EntityType Name= \"Employee\">" + "<Key><PropertyRef Name=\"EmployeeId\"/></Key>" + "<Property Name=\"" + + propertyNames[0] + "\" Type=\"Edm.String\" Nullable=\"false\"/>" + + "<NavigationProperty Name=\"ne_Manager\" />" + "</EntityType>" + + "<EntityType Name=\"Manager\" BaseType=\"RefScenario.Employee\" m:HasStream=\"true\">" + "</EntityType>" + + "<Association Name=\"ManagerEmployees\">" + + "<End Type=\"RefScenario.Employee\" Multiplicity=\"*\" Role=\"r_Employees\"/>" + + "<End Type=\"RefScenario.Manager\" Multiplicity=\"1\" Role=\"r_Manager\"/>" + + "</Association></Schema></edmx:DataServices></edmx:Edmx>"; + XmlMetadataDeserializer parser = new XmlMetadataDeserializer(); + InputStream reader = createStreamReader(xmlWithInvalidAssociation); + try { + parser.readMetadata(reader, true); + } catch (EntityProviderException e) { + assertEquals(EntityProviderException.MISSING_ATTRIBUTE.getKey(), e.getMessageReference().getKey()); + assertEquals(2, e.getMessageReference().getContent().size()); + assertEquals("Relationship", e.getMessageReference().getContent().get(0)); + assertEquals("NavigationProperty", e.getMessageReference().getContent().get(1)); + throw e; + } + } + + + @Test(expected = EntityProviderException.class) + public void testMissingEntityType() throws Exception { + final String xmlWithInvalidAssociation = + "<edmx:Edmx Version=\"1.0\" xmlns:edmx=\"" + + Edm.NAMESPACE_EDMX_2007_06 + + "\">" + + "<edmx:DataServices m:DataServiceVersion=\"2.0\" xmlns:m=\"" + + Edm.NAMESPACE_M_2007_08 + + "\">" + + "<Schema Namespace=\"" + + NAMESPACE + + "\" xmlns=\"" + + Edm.NAMESPACE_EDM_2008_09 + + "\">" + + "<EntityType Name= \"Employee\">" + + "<Key><PropertyRef Name=\"EmployeeId\"/></Key>" + + "<Property Name=\"" + + propertyNames[0] + + "\" Type=\"Edm.String\" Nullable=\"false\"/>" + + "<NavigationProperty Name=\"ne_Manager\" Relationship=\"RefScenario.ManagerEmployees\" " + + "FromRole=\"r_Employees\" ToRole=\"r_Manager\" />" + + "</EntityType>" + "<EntityType Name=\"Manager\" BaseType=\"RefScenario.Employee\" m:HasStream=\"true\">" + + "</EntityType>" + "<EntityContainer Name=\"Container1\" m:IsDefaultEntityContainer=\"true\">" + + "<EntitySet Name=\"Employees\" />" + "</EntityContainer>" + "<Association Name=\"ManagerEmployees\">" + + "<End Type=\"RefScenario.Employee\" Multiplicity=\"*\" Role=\"r_Employees\"/>" + + "<End Type=\"RefScenario.Manager\" Multiplicity=\"1\" Role=\"r_Manager\"/>" + + "</Association></Schema></edmx:DataServices></edmx:Edmx>"; + XmlMetadataDeserializer parser = new XmlMetadataDeserializer(); + InputStream reader = createStreamReader(xmlWithInvalidAssociation); + try { + parser.readMetadata(reader, true); + } catch (EntityProviderException e) { + assertEquals(EntityProviderException.MISSING_ATTRIBUTE.getKey(), e.getMessageReference().getKey()); + assertEquals(2, e.getMessageReference().getContent().size()); + assertEquals("EntityType", e.getMessageReference().getContent().get(0)); + assertEquals("EntitySet", e.getMessageReference().getContent().get(1)); + throw e; + } + } + + @Test(expected = EntityProviderException.class) + public void testMissingType() throws Exception { + final String xmlWithInvalidAssociation = + "<edmx:Edmx Version=\"1.0\" xmlns:edmx=\"" + + Edm.NAMESPACE_EDMX_2007_06 + + "\">" + + "<edmx:DataServices m:DataServiceVersion=\"2.0\" xmlns:m=\"" + + Edm.NAMESPACE_M_2007_08 + + "\">" + + "<Schema Namespace=\"" + + NAMESPACE + + "\" xmlns=\"" + + Edm.NAMESPACE_EDM_2008_09 + + "\">" + + "<EntityType Name= \"Employee\">" + + "<Key><PropertyRef Name=\"EmployeeId\"/></Key>" + + "<Property Name=\"" + + propertyNames[0] + + "\" Nullable=\"false\"/>" + + "<NavigationProperty Name=\"ne_Manager\" Relationship=\"RefScenario.ManagerEmployees\" " + + "FromRole=\"r_Employees\" ToRole=\"r_Manager\" />" + + "</EntityType>" + "<EntityType Name=\"Manager\" BaseType=\"RefScenario.Employee\" m:HasStream=\"true\">" + + "</EntityType>" + "<Association Name=\"ManagerEmployees\">" + + "<End Type=\"RefScenario.Employee\" Multiplicity=\"*\" Role=\"r_Employees\"/>" + + "<End Type=\"RefScenario.Manager\" Multiplicity=\"1\" Role=\"r_Manager\"/>" + + "</Association></Schema></edmx:DataServices></edmx:Edmx>"; + XmlMetadataDeserializer parser = new XmlMetadataDeserializer(); + InputStream reader = createStreamReader(xmlWithInvalidAssociation); + try { + parser.readMetadata(reader, true); + } catch (EntityProviderException e) { + assertEquals(EntityProviderException.MISSING_ATTRIBUTE.getKey(), e.getMessageReference().getKey()); + assertEquals(2, e.getMessageReference().getContent().size()); + assertEquals("Type", e.getMessageReference().getContent().get(0)); + assertEquals("Property", e.getMessageReference().getContent().get(1)); + throw e; + } + } + @Test(expected = EntityProviderException.class) + public void testMissingTypeAtAssociation() throws Exception { + final String xmlWithInvalidAssociation = + "<edmx:Edmx Version=\"1.0\" xmlns:edmx=\"" + + Edm.NAMESPACE_EDMX_2007_06 + + "\">" + + "<edmx:DataServices m:DataServiceVersion=\"2.0\" xmlns:m=\"" + + Edm.NAMESPACE_M_2007_08 + + "\">" + + "<Schema Namespace=\"" + + NAMESPACE + + "\" xmlns=\"" + + Edm.NAMESPACE_EDM_2008_09 + + "\">" + + "<EntityType Name= \"Employee\">" + + "<Key><PropertyRef Name=\"EmployeeId\"/></Key>" + + "<Property Name=\"" + + propertyNames[0] + + "\" Type=\"Edm.String\" Nullable=\"false\"/>" + + "<NavigationProperty Name=\"ne_Manager\" Relationship=\"RefScenario.ManagerEmployees\" " + + "FromRole=\"r_Employees\" ToRole=\"r_Manager\" />" + + "</EntityType>" + "<EntityType Name=\"Manager\" BaseType=\"RefScenario.Employee\" m:HasStream=\"true\">" + + "</EntityType>" + "<Association Name=\"ManagerEmployees\">" + + "<End Multiplicity=\"*\" Role=\"r_Employees\"/>" + + "<End Type=\"RefScenario.Manager\" Multiplicity=\"1\" Role=\"r_Manager\"/>" + + "</Association></Schema></edmx:DataServices></edmx:Edmx>"; + XmlMetadataDeserializer parser = new XmlMetadataDeserializer(); + InputStream reader = createStreamReader(xmlWithInvalidAssociation); + try { + parser.readMetadata(reader, true); + } catch (EntityProviderException e) { + assertEquals(EntityProviderException.MISSING_ATTRIBUTE.getKey(), e.getMessageReference().getKey()); + assertEquals(2, e.getMessageReference().getContent().size()); + assertEquals("Type", e.getMessageReference().getContent().get(0)); + assertEquals("End", e.getMessageReference().getContent().get(1)); + throw e; + } + } + + @Test(expected = EntityProviderException.class) + public void testMissingTypeAtFunctionImport() throws Exception { + final String xml = + "<edmx:Edmx Version=\"1.0\" xmlns:edmx=\"" + + Edm.NAMESPACE_EDMX_2007_06 + + "\">" + + "<edmx:DataServices m:DataServiceVersion=\"2.0\" xmlns:m=\"" + + Edm.NAMESPACE_M_2007_08 + + "\">" + + "<Schema Namespace=\"" + + NAMESPACE + + "\" xmlns=\"" + + Edm.NAMESPACE_EDM_2008_09 + + "\">" + + "<EntityType Name= \"Employee\" m:HasStream=\"true\">" + + "<Key><PropertyRef Name=\"EmployeeId\"/></Key>" + + "<Property Name=\"" + + propertyNames[0] + + "\" Type=\"Edm.String\" Nullable=\"false\"/>" + + "<Property Name=\"" + + propertyNames[1] + + "\" Type=\"Edm.String\" m:FC_TargetPath=\"SyndicationTitle\"/>" + + "</EntityType>" + + "<EntityContainer Name=\"Container1\" m:IsDefaultEntityContainer=\"true\">" + + "<EntitySet Name=\"Employees\" EntityType=\"RefScenario.Employee\"/>" + + "<FunctionImport Name=\"EmployeeSearch\" ReturnType=\"Collection(RefScenario.Employee)\" " + + "EntitySet=\"Employees\" m:HttpMethod=\"GET\">" + + "<Parameter Name=\"q\" Nullable=\"true\" />" + "</FunctionImport>" + + "</EntityContainer></Schema></edmx:DataServices></edmx:Edmx>"; + XmlMetadataDeserializer parser = new XmlMetadataDeserializer(); + InputStream reader = createStreamReader(xml); + try { + parser.readMetadata(reader, true); + } catch (EntityProviderException e) { + assertEquals(EntityProviderException.MISSING_ATTRIBUTE.getKey(), e.getMessageReference().getKey()); + assertEquals(2, e.getMessageReference().getContent().size()); + assertEquals("Type", e.getMessageReference().getContent().get(0)); + assertEquals("Parameter", e.getMessageReference().getContent().get(1)); + throw e; + } + } + + @Test(expected = EntityProviderException.class) + public void testMissingAssociation() throws Exception { + final String xmlWithAssociation = + "<edmx:Edmx Version=\"1.0\" xmlns:edmx=\"" + + Edm.NAMESPACE_EDMX_2007_06 + + "\">" + + "<edmx:DataServices m:DataServiceVersion=\"2.0\" xmlns:m=\"" + + Edm.NAMESPACE_M_2007_08 + + "\">" + + "<Schema Namespace=\"" + + NAMESPACE + + "\" xmlns=\"" + + Edm.NAMESPACE_EDM_2008_09 + + "\">" + + "<EntityType Name= \"Employee\">" + + "<Key><PropertyRef Name=\"EmployeeId\"/></Key>" + + "<Property Name=\"" + + propertyNames[0] + + "\" Type=\"Edm.String\" Nullable=\"false\"/>" + + "<NavigationProperty Name=\"ne_Manager\" Relationship=\"RefScenario.ManagerEmployees\" " + + "FromRole=\"r_Employees\" ToRole=\"r_Manager\" />" + + "</EntityType>" + "<EntityContainer Name=\"Container1\" m:IsDefaultEntityContainer=\"true\">" + + "<EntitySet Name=\"Employees\" EntityType=\"RefScenario.Employee\"/>" + "<AssociationSet Name=\"" + + ASSOCIATION + // + "\" Association=\"RefScenario." + ASSOCIATION + + "\">" + "<End EntitySet=\"Employees\" Role=\"r_Employees\"/>" + "</AssociationSet>" + + "</EntityContainer>" + "</Schema>" + "</edmx:DataServices></edmx:Edmx>"; + XmlMetadataDeserializer parser = new XmlMetadataDeserializer(); + InputStream reader = createStreamReader(xmlWithAssociation); + try { + parser.readMetadata(reader, true); + } catch (EntityProviderException e) { + assertEquals(EntityProviderException.MISSING_ATTRIBUTE.getKey(), e.getMessageReference().getKey()); + assertEquals(2, e.getMessageReference().getContent().size()); + assertEquals("Association", e.getMessageReference().getContent().get(0)); + assertEquals("AssociationSet", e.getMessageReference().getContent().get(1)); + throw e; + } + } + + @Test(expected = EdmException.class) + public void testInvalidAssociation() throws XMLStreamException, + EntityProviderException, EdmException, UnsupportedEncodingException { + final String xmlWithInvalidAssociationSet = + "<edmx:Edmx Version=\"1.0\" xmlns:edmx=\"" + + Edm.NAMESPACE_EDMX_2007_06 + + "\">" + + "<edmx:DataServices m:DataServiceVersion=\"2.0\" xmlns:m=\"" + + Edm.NAMESPACE_M_2007_08 + + "\">" + + "<Schema Namespace=\"" + + NAMESPACE + + "\" xmlns=\"" + + Edm.NAMESPACE_EDM_2008_09 + + "\">" + + "<EntityType Name= \"Employee\">" + + "<Key><PropertyRef Name=\"EmployeeId\"/></Key>" + + "<Property Name=\"" + + propertyNames[0] + + "\" Type=\"Edm.String\" Nullable=\"false\"/>" + + "<NavigationProperty Name=\"ne_Manager\" Relationship=\"RefScenario.ManagerEmployees\" " + + "FromRole=\"r_Employees\" ToRole=\"r_Manager\" />" + + "</EntityType>" + + "<EntityType Name=\"Manager\" BaseType=\"RefScenario.Employee\" m:HasStream=\"true\">" + + "<NavigationProperty Name=\"nm_Employees\" Relationship=\"RefScenario.ManagerEmployees\" " + + "FromRole=\"r_Manager\" ToRole=\"r_Employees\" />" + + "</EntityType>" + "<Association Name=\"" + ASSOCIATION + "\">" + + "<End Type=\"RefScenario.Employee\" Multiplicity=\"*\" Role=\"r_Employees\">" + + "<OnDelete Action=\"Cascade\"/>" + "</End>" + + "<End Type=\"RefScenario.Manager\" Multiplicity=\"1\" Role=\"r_Manager\"/>" + "</Association>" + + "<EntityContainer Name=\"Container1\" m:IsDefaultEntityContainer=\"true\">" + + "<EntitySet Name=\"Employees\" EntityType=\"RefScenario.Employee\"/>" + + "<EntitySet Name=\"Managers\" EntityType=\"RefScenario.Manager\"/>" + "<AssociationSet Name=\"" + + ASSOCIATION + "\" Association=\"RefScenario2." + ASSOCIATION + "\">" + + "<End EntitySet=\"Managers\" Role=\"r_Manager\"/>" + + "<End EntitySet=\"Employees\" Role=\"r_Employees\"/>" + "</AssociationSet>" + "</EntityContainer>" + + "</Schema>" + "</edmx:DataServices>" + "</edmx:Edmx>"; + XmlMetadataDeserializer parser = new XmlMetadataDeserializer(); + InputStream reader = createStreamReader(xmlWithInvalidAssociationSet); + parser.readMetadata(reader, true); + + } + + @Test(expected = EdmException.class) + public void testInvalidAssociationEnd() throws XMLStreamException, + EntityProviderException, EdmException, UnsupportedEncodingException { + final String employees = "r_Employees"; + final String manager = "r_Manager"; + final String xmlWithInvalidAssociationSetEnd = + "<edmx:Edmx Version=\"1.0\" xmlns:edmx=\"" + Edm.NAMESPACE_EDMX_2007_06 + "\">" + + "<edmx:DataServices m:DataServiceVersion=\"2.0\" xmlns:m=\"" + Edm.NAMESPACE_M_2007_08 + "\">" + + "<Schema Namespace=\"" + NAMESPACE + "\" xmlns=\"" + Edm.NAMESPACE_EDM_2008_09 + "\">" + + "<EntityType Name= \"Employee\">" + "<Key><PropertyRef Name=\"EmployeeId\"/></Key>" + "<Property Name=\"" + + propertyNames[0] + "\" Type=\"Edm.String\" Nullable=\"false\"/>" + + "<NavigationProperty Name=\"ne_Manager\" Relationship=\"RefScenario.ManagerEmployees\" FromRole=\"" + + employees + "\" ToRole=\"" + manager + "\" />" + "</EntityType>" + + "<EntityType Name=\"Manager\" BaseType=\"RefScenario.Employee\" m:HasStream=\"true\">" + + "<NavigationProperty Name=\"nm_Employees\" Relationship=\"RefScenario.ManagerEmployees\" FromRole=\"" + + manager + "\" ToRole=\"" + employees + "\" />" + "</EntityType>" + "<Association Name=\"" + ASSOCIATION + + "\">" + + "<End Type=\"RefScenario.Employee\" Multiplicity=\"*\" Role=\"" + employees + "1" + "\"/>" + + "<End Type=\"RefScenario.Manager\" Multiplicity=\"1\" Role=\"" + manager + "\"/>" + "</Association>" + + "<EntityContainer Name=\"Container1\" m:IsDefaultEntityContainer=\"true\">" + + "<EntitySet Name=\"Employees\" EntityType=\"RefScenario.Employee\"/>" + + "<EntitySet Name=\"Managers\" EntityType=\"RefScenario.Manager\"/>" + "<AssociationSet Name=\"" + + ASSOCIATION + "\" Association=\"RefScenario2." + ASSOCIATION + "\">" + + "<End EntitySet=\"Managers\" Role=\"" + manager + "\"/>" + "<End EntitySet=\"Employees\" Role=\"" + + employees + "\"/>" + "</AssociationSet>" + "</EntityContainer>" + "</Schema>" + "</edmx:DataServices>" + + "</edmx:Edmx>"; + XmlMetadataDeserializer parser = new XmlMetadataDeserializer(); + InputStream reader = createStreamReader(xmlWithInvalidAssociationSetEnd); + parser.readMetadata(reader, true); + + } + + @Test(expected = EdmException.class) + public void testInvalidAssociationEnd2() throws XMLStreamException, + EntityProviderException, EdmException, UnsupportedEncodingException { + final String employees = "r_Employees"; + final String manager = "r_Manager"; + final String xmlWithInvalidAssociationSetEnd = + "<edmx:Edmx Version=\"1.0\" xmlns:edmx=\"" + Edm.NAMESPACE_EDMX_2007_06 + "\">" + + "<edmx:DataServices m:DataServiceVersion=\"2.0\" xmlns:m=\"" + Edm.NAMESPACE_M_2007_08 + "\">" + + "<Schema Namespace=\"" + NAMESPACE + "\" xmlns=\"" + Edm.NAMESPACE_EDM_2008_09 + "\">" + + "<EntityType Name= \"Employee\">" + "<Key><PropertyRef Name=\"EmployeeId\"/></Key>" + "<Property Name=\"" + + propertyNames[0] + "\" Type=\"Edm.String\" Nullable=\"false\"/>" + + "<NavigationProperty Name=\"ne_Manager\" Relationship=\"RefScenario.ManagerEmployees\" FromRole=\"" + + employees + "\" ToRole=\"" + manager + "\" />" + "</EntityType>" + + "<EntityType Name=\"Manager\" BaseType=\"RefScenario.Employee\" m:HasStream=\"true\">" + + "<NavigationProperty Name=\"nm_Employees\" Relationship=\"RefScenario.ManagerEmployees\" FromRole=\"" + + manager + "\" ToRole=\"" + employees + "\" />" + "</EntityType>" + "<Association Name=\"" + ASSOCIATION + + "\">" + + "<End Type=\"RefScenario.Employee\" Multiplicity=\"*\" Role=\"" + employees + "\"/>" + + "<End Type=\"RefScenario.Manager\" Multiplicity=\"1\" Role=\"" + manager + "\"/>" + "</Association>" + + "<EntityContainer Name=\"Container1\" m:IsDefaultEntityContainer=\"true\">" + + "<EntitySet Name=\"Employees\" EntityType=\"RefScenario.Employee\"/>" + + "<EntitySet Name=\"Managers\" EntityType=\"RefScenario.Manager\"/>" + "<AssociationSet Name=\"" + + ASSOCIATION + "\" Association=\"RefScenario2." + ASSOCIATION + "\">" + + "<End EntitySet=\"Managers\" Role=\"" + manager + "\"/>" + "<End EntitySet=\"Managers\" Role=\"" + + manager + "\"/>" + "</AssociationSet>" + "</EntityContainer>" + "</Schema>" + "</edmx:DataServices>" + + "</edmx:Edmx>"; + XmlMetadataDeserializer parser = new XmlMetadataDeserializer(); + InputStream reader = createStreamReader(xmlWithInvalidAssociationSetEnd); + parser.readMetadata(reader, true); + + } + + @Test(expected = EntityProviderException.class) + public void testInvalidEntitySet() throws XMLStreamException, + EntityProviderException, EdmException, UnsupportedEncodingException { + final String xmWithEntityContainer = + "<edmx:Edmx Version=\"1.0\" xmlns:edmx=\"" + Edm.NAMESPACE_EDMX_2007_06 + "\">" + + "<edmx:DataServices m:DataServiceVersion=\"2.0\" xmlns:m=\"" + Edm.NAMESPACE_M_2007_08 + "\">" + + "<Schema Namespace=\"" + NAMESPACE + "\" xmlns=\"" + Edm.NAMESPACE_EDM_2008_09 + "\">" + + "<EntityType Name= \"Employee\" m:HasStream=\"true\">" + "<Key><PropertyRef Name=\"EmployeeId\"/></Key>" + + "<Property Name=\"" + propertyNames[0] + "\" Type=\"Edm.String\" Nullable=\"false\"/>" + + "<Property Name=\"" + propertyNames[1] + "\" Type=\"Edm.String\" m:FC_TargetPath=\"SyndicationTitle\"/>" + + "</EntityType>" + "<EntityContainer Name=\"Container1\" m:IsDefaultEntityContainer=\"true\">" + + "<EntitySet Name=\"Employees\" EntityType=\"RefScenario.Mitarbeiter\"/>" + "</EntityContainer>" + + "</Schema>" + "</edmx:DataServices>" + "</edmx:Edmx>"; + XmlMetadataDeserializer parser = new XmlMetadataDeserializer(); + InputStream reader = createStreamReader(xmWithEntityContainer); + parser.readMetadata(reader, true); + + } + + @Test + public void testEntityTypeInOtherSchema() throws XMLStreamException, + EntityProviderException, EdmException, UnsupportedEncodingException { + final String xmWithEntityContainer = + "<edmx:Edmx Version=\"1.0\" xmlns:edmx=\"" + Edm.NAMESPACE_EDMX_2007_06 + "\">" + + "<edmx:DataServices m:DataServiceVersion=\"2.0\" xmlns:m=\"" + Edm.NAMESPACE_M_2007_08 + "\">" + + "<Schema Namespace=\"" + NAMESPACE + "\" xmlns=\"" + Edm.NAMESPACE_EDM_2008_09 + "\">" + + "<EntityType Name= \"Employee\" m:HasStream=\"true\">" + "<Key><PropertyRef Name=\"EmployeeId\"/></Key>" + + "<Property Name=\"" + propertyNames[0] + "\" Type=\"Edm.String\" Nullable=\"false\"/>" + "</EntityType>" + + "<EntityContainer Name=\"Container1\" m:IsDefaultEntityContainer=\"true\">" + + "<EntitySet Name=\"Photos\" EntityType=\"" + NAMESPACE2 + ".Photo\"/>" + "</EntityContainer>" + + "</Schema>" + "<Schema Namespace=\"" + NAMESPACE2 + "\" xmlns=\"" + Edm.NAMESPACE_EDM_2008_09 + "\">" + + "<EntityType Name= \"Photo\">" + "<Key><PropertyRef Name=\"Id\"/></Key>" + + "<Property Name=\"Id\" Type=\"Edm.Int32\" Nullable=\"false\"/>" + "</EntityType>" + "</Schema>" + + "</edmx:DataServices>" + + "</edmx:Edmx>"; + XmlMetadataDeserializer parser = new XmlMetadataDeserializer(); + InputStream reader = createStreamReader(xmWithEntityContainer); + EdmDataServices result = parser.readMetadata(reader, true); + assertEquals("2.0", result.getDataServiceVersion()); + for (EdmSchema schema : result.getEdm().getSchemas()) { + for (EdmEntityContainer container : schema.getEntityContainers()) { + assertEquals("Container1", container.getName()); + for (EdmEntitySet entitySet : container.getEntitySets()) { + assertEquals(NAMESPACE2, entitySet.getEntityType().getNamespace()); + assertEquals("Photo", entitySet.getEntityType().getName()); + } + } + } + } + + @Test + public void testMultipleSchemas() throws XMLStreamException, + EntityProviderException, EdmException, UnsupportedEncodingException { + final String xmWithEntityContainer = + "<edmx:Edmx Version=\"1.0\" xmlns:edmx=\"" + Edm.NAMESPACE_EDMX_2007_06 + "\">" + + "<edmx:DataServices m:DataServiceVersion=\"2.0\" xmlns:m=\"" + Edm.NAMESPACE_M_2007_08 + "\">" + + "<Schema Namespace=\"" + NAMESPACE + "\" xmlns=\"" + Edm.NAMESPACE_EDM_2008_09 + "\">" + + "<EntityType Name= \"Employee\" m:HasStream=\"true\">" + "<Key><PropertyRef Name=\"EmployeeId\"/></Key>" + + "<Property Name=\"" + propertyNames[0] + "\" Type=\"Edm.String\" Nullable=\"false\"/>" + "</EntityType>" + + "<EntityContainer Name=\"Container1\" m:IsDefaultEntityContainer=\"true\">" + + "<EntitySet Name=\"Photos\" EntityType=\"" + NAMESPACE2 + ".Photo\"/>" + "</EntityContainer>" + + "<EntityContainer Name=\"Container2\" m:IsDefaultEntityContainer=\"true\">" + + "<EntitySet Name=\"Sign\" EntityType=\"" + NAMESPACE3 + ".Sign\"/>" + "</EntityContainer>" + + "</Schema>" + + + "<Schema Namespace=\"" + NAMESPACE2 + "\" xmlns=\"" + Edm.NAMESPACE_EDM_2008_09 + "\">" + + "<EntityType Name= \"Photo\">" + "<Key><PropertyRef Name=\"Id\"/></Key>" + + "<Property Name=\"Id\" Type=\"Edm.Int32\" Nullable=\"false\"/>" + "</EntityType>" + + "<EntityType Name= \"Name\">" + "<Key><PropertyRef Name=\"NameId\"/></Key>" + + "<Property Name=\"NameId\" Type=\"Edm.Int32\" Nullable=\"false\"/>" + "</EntityType>" + + "<EntityContainer Name=\"Container2\" m:IsDefaultEntityContainer=\"true\">" + + "<EntitySet Name=\"Name\" EntityType=\"" + NAMESPACE2 + ".Name\"/>" + + "<EntitySet Name=\"Photo\" EntityType=\"" + NAMESPACE2 + ".Photo\"/>" + + "</EntityContainer>" + + "</Schema>" + + + "<Schema Namespace=\"" + NAMESPACE3 + "\" xmlns=\"" + Edm.NAMESPACE_EDM_2008_09 + "\">" + + "<EntityType Name= \"Sign\">" + "<Key><PropertyRef Name=\"Id\"/></Key>" +
<TRUNCATED>