blob: c900c232a17823e58a6aa6e456a2da9ebdb803d9 [file] [log] [blame]
/*******************************************************************************
* 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 testEntityContainer() 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());
assertEquals(NAMESPACE, container.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>"
+ "<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()) {
if (container.getName().equals("Container1")) {
assertEquals("Container1", container.getName());
for (EdmEntitySet entitySet : container.getEntitySets()) {
if (entitySet.getEntityType().getNamespace().equals(NAMESPACE2)) {
assertEquals(NAMESPACE2, entitySet.getEntityType().getNamespace());
assertEquals("Photo", entitySet.getEntityType().getName());
} else if (entitySet.getEntityType().getNamespace().equals(NAMESPACE3)) {
assertEquals(NAMESPACE3, entitySet.getEntityType().getNamespace());
assertEquals("Sign", entitySet.getEntityType().getName());
}
}
} else if (container.getName().equals("Container2")) {
assertEquals("Container2", container.getName());
for (EdmEntitySet entitySet : container.getEntitySets()) {
if (NAMESPACE2.equals(entitySet.getEntityType().getNamespace())) {
assertEquals(NAMESPACE2, entitySet.getEntityType().getNamespace());
if (entitySet.getEntityType().getName().equals("Name")) {
assertEquals("Name", entitySet.getEntityType().getName());
} else {
assertEquals("Photo", entitySet.getEntityType().getName());
}
} else {
assertEquals(NAMESPACE3, entitySet.getEntityType().getNamespace());
assertEquals("Sign", entitySet.getEntityType().getName());
}
}
}
}
}
}
@Test
public void testEntityType() 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>"
+ "<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());
assertEquals(NAMESPACE, result.getEdm().getSchemas().get(0).getNamespace());
assertEquals(NAMESPACE2, result.getEdm().getSchemas().get(1).getNamespace());
assertEquals(NAMESPACE3, result.getEdm().getSchemas().get(2).getNamespace());
assertEquals("Employee", result.getEdm().getSchemas().get(0).getEntityTypes().get(0).getName());
assertNotNull(result.getEdm().getSchemas().get(0).getEntityTypes().get(0).getProperty("EmployeeId"));
assertEquals("Photo", result.getEdm().getSchemas().get(1).getEntityTypes().get(0).getName());
assertNotNull(result.getEdm().getSchemas().get(1).getEntityTypes().get(0).getProperty("Id"));
assertEquals("Name", result.getEdm().getSchemas().get(1).getEntityTypes().get(1).getName());
assertEquals("NameId", result.getEdm().getSchemas().get(1).getEntityTypes()
.get(1).getKeyProperties().get(0).getName());
assertEquals("Sign", result.getEdm().getSchemas().get(2).getEntityTypes().get(0).getName());
assertNotNull(result.getEdm().getSchemas().get(2).getEntityTypes().get(0).getProperty("Id"));
}
@Test
public void testMetadataRelatedEntitySet() throws XMLStreamException,
EntityProviderException, EdmException, IOException {
XmlMetadataDeserializer parser = new XmlMetadataDeserializer();
String xml = readFile("metadataForRelatedEntity.xml");
InputStream reader = createStreamReader(xml);
EdmDataServices result = parser.readMetadata(reader, true);
assertEquals(1, result.getEdm().getSchemas().size());
ClientEdm edm = result.getEdm();
assertNotNull(edm);
for (EdmSchema schema : result.getEdm().getSchemas()) {
for (EdmEntityContainer container : schema.getEntityContainers()) {
if (container.getName().equals("CUAN_BUSINESS_DOCUMENT_IMP_SRV_Entities")) {
assertEquals("CUAN_BUSINESS_DOCUMENT_IMP_SRV_Entities", container.getName());
for (EdmEntitySet entitySet : container.getEntitySets()) {
for(EdmEntityType entityType:schema.getEntityTypes()){
List<String> navigationPropertyNames = entityType.getNavigationPropertyNames();
for (String navigationPropertyName : navigationPropertyNames) {
EdmNavigationProperty navigationProperty = (EdmNavigationProperty) entityType
.getProperty(navigationPropertyName);
if(((navigationProperty.getName().equals("BusinessDocuments") &&
("ImportHeaders").equals(entitySet.getName())) ||
(((navigationProperty.getName().equals("ProductItems") ||
navigationProperty.getName().equals("Offers") ||
navigationProperty.getName().equals("Company") ||
navigationProperty.getName().equals("AdditionalObjectReferences") ||
navigationProperty.getName().equals("Person")) &&
("BusinessDocuments").equals(entitySet.getName()))))
&& !navigationProperty.getName().equals(entitySet.getName()) ){
assertNotNull(entitySet.getRelatedEntitySet(navigationProperty));
}else{
assertNull(entitySet.getRelatedEntitySet(navigationProperty));
}
}
}
}
}
}
}
}
@Test
public void testMetadataWithNavigatons() throws XMLStreamException,
EntityProviderException, EdmException, IOException {
XmlMetadataDeserializer parser = new XmlMetadataDeserializer();
String xml = readFile("metadataWithNavigations.xml");
InputStream reader = createStreamReader(xml);
EdmDataServices result = parser.readMetadata(reader, true);
assertEquals(2, result.getEdm().getSchemas().size());
ClientEdm edm = result.getEdm();
assertNotNull(edm);
for (EdmSchema schema : result.getEdm().getSchemas()) {
for (EdmEntityContainer container : schema.getEntityContainers()) {
assertNotNull(container.getEntitySets());
int i=0;
for(EdmEntitySet entitySet:container.getEntitySets()){
assertEquals(edm.getSchemas().get(1).getEntityTypes().get(i).getName(),
entitySet.getEntityType().getName());
assertEquals(edm.getSchemas().get(1).getEntityTypes().get(i++).getKeyProperties().get(0),
entitySet.getEntityType().getKeyProperties().get(0));
}
}
}
}
protected String readFile(final String filename) throws IOException {
InputStream in = getFileAsStream(filename);
byte[] tmp = new byte[8192];
int count = in.read(tmp);
StringBuilder b = new StringBuilder();
while (count >= 0) {
b.append(new String(tmp, 0, count));
count = in.read(tmp);
}
return b.toString();
}
@Test
public void scenarioTest() throws XMLStreamException,
EntityProviderException, EdmException, UnsupportedEncodingException {
final String ASSOCIATION2 = "TeamEmployees";
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\"/>"
+ "<Property Name=\""
+ propertyNames[2]
+ "\" Type=\"RefScenario.c_Location\" Nullable=\"false\"/>"
+ "<NavigationProperty Name=\"ne_Manager\" Relationship=\"RefScenario.ManagerEmployees\" " +
"FromRole=\"r_Employees\" ToRole=\"r_Manager\" />"
+ "<NavigationProperty Name=\"ne_Team\" Relationship=\"RefScenario.TeamEmployees\" " +
"FromRole=\"r_Employees\" ToRole=\"r_Team\" />"
+ "</EntityType>"
+ "<EntityType Name=\"Manager\" BaseType=\"RefScenario.Employee\" m:HasStream=\"true\">"
+ "<NavigationProperty Name=\"nm_Employees\" Relationship=\"RefScenario.ManagerEmployees\" " +
"FromRole=\"r_Manager\" ToRole=\"r_Employees\" />"
+ "</EntityType>"
+ "<EntityType Name=\"Team\">"
+ "<Key>"
+ "<PropertyRef Name=\"Id\"/>"
+ "</Key>"
+ "<Property Name=\""
+ "Id"
+ "\" Type=\"Edm.String\" Nullable=\"false\"/>"
+ "<NavigationProperty Name=\"nt_Employees\" Relationship=\"RefScenario.TeamEmployees\"" +
" FromRole=\"r_Team\" ToRole=\"r_Employees\" />"
+ "</EntityType>" + "<ComplexType Name=\"c_Location\">"
+ "<Property Name=\"Country\" Type=\"Edm.String\"/>" + "</ComplexType>" + "<Association Name=\""
+ ASSOCIATION + "\">" + "<End Type=\"RS.Employee\" Multiplicity=\"*\" Role=\"r_Employees\">"
+ "<OnDelete Action=\"Cascade\"/>" + "</End>"
+ "<End Type=\"RefScenario.Manager\" Multiplicity=\"1\" Role=\"r_Manager\"/>" + "</Association>"
+ "<Association Name=\"" + ASSOCIATION2 + "\">"
+ "<End Type=\"RefScenario.Employee\" Multiplicity=\"*\" Role=\"r_Employees\"/>"
+ "<End Type=\"RefScenario.Team\" Multiplicity=\"1\" Role=\"r_Team\"/>" + "</Association>"
+ "<EntityContainer Name=\"Container1\" m:IsDefaultEntityContainer=\"true\">"
+ "<EntitySet Name=\"Employees\" EntityType=\"RS.Employee\"/>"
+ "<EntitySet Name=\"Managers\" EntityType=\"RefScenario.Manager\"/>"
+ "<EntitySet Name=\"Teams\" EntityType=\"RefScenario.Team\"/>" + "<AssociationSet Name=\"" + ASSOCIATION
+ "\" Association=\"RefScenario." + ASSOCIATION + "\">"
+ "<End EntitySet=\"Managers\" Role=\"r_Manager\"/>"
+ "<End EntitySet=\"Employees\" Role=\"r_Employees\"/>" + "</AssociationSet>" + "<AssociationSet Name=\""
+ ASSOCIATION2 + "\" Association=\"RefScenario." + ASSOCIATION2 + "\">"
+ "<End EntitySet=\"Teams\" Role=\"r_Team\"/>" + "<End EntitySet=\"Employees\" Role=\"r_Employees\"/>"
+ "</AssociationSet>" + "</EntityContainer>" + "</Schema>" + "<Schema Namespace=\"" + NAMESPACE2
+ "\" xmlns=\"" + Edm.NAMESPACE_EDM_2008_09 + "\">" + "<EntityType Name= \"Photo\">" + "<Key>"
+ "<PropertyRef Name=\"Id\"/>" + "<PropertyRef Name=\"Name\"/>" + "</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>"
+ "<EntityContainer Name=\"Container1\" m:IsDefaultEntityContainer=\"true\">"
+ "<EntitySet Name=\"Photos\" EntityType=\"RefScenario2.Photo\"/>" + "</EntityContainer>" + "</Schema>"
+ "</edmx:DataServices>" + "</edmx:Edmx>";
XmlMetadataDeserializer parser = new XmlMetadataDeserializer();
InputStream reader = createStreamReader(xml);
EdmDataServices result = parser.readMetadata(reader, true);
assertEquals(2, result.getEdm().getSchemas().size());
ClientEdm edm = result.getEdm();
assertEquals(4, edm.getEntitySets().size());
assertEquals(0, edm.getFunctionImports().size());
for (EdmSchema schema : result.getEdm().getSchemas()) {
if (NAMESPACE.equals(schema.getNamespace())) {
assertEquals(3, schema.getEntityTypes().size());
assertEquals(1, schema.getComplexTypes().size());
assertEquals(2, schema.getAssociations().size());
assertEquals(1, schema.getEntityContainers().size());
} else if (NAMESPACE2.equals(schema.getNamespace())) {
assertEquals(1, schema.getEntityTypes().size());
assertEquals(0, schema.getComplexTypes().size());
assertEquals(0, schema.getAssociations().size());
assertEquals(1, schema.getEntityContainers().size());
for (EdmEntityType entityType : schema.getEntityTypes()) {
assertEquals(2, entityType.getKeyProperties().size());
}
}
}
}
@Test
public void testRefScenario() throws Exception {
EdmProvider testProvider = new EdmTestProvider();
ODataResponse response = EntityProvider.writeMetadata(testProvider.getSchemas(), null);
String stream = StringHelper.inputStreamToString((InputStream) response.getEntity());
XmlMetadataDeserializer parser = new XmlMetadataDeserializer();
EdmDataServices result = parser.readMetadata(createStreamReader(stream), true);
assertNotNull(result);
}
@Test
public void testAnnotations() throws XMLStreamException,
EntityProviderException, EdmException, UnsupportedEncodingException {
final String xmlWithAnnotations =
"<edmx:Edmx Version=\"1.0\" xmlns:edmx=\""
+ Edm.NAMESPACE_EDMX_2007_06
+ "\" xmlns:annoPrefix=\"http://annoNamespace\">"
+ "<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\" prefix1:href=\"http://foo\" xmlns:prefix1=\"namespaceForAnno\">"
+ "<Key><PropertyRef Name=\"EmployeeId\"/></Key>"
+ "<Property Name=\"EmployeeId\" Type=\"Edm.String\" Nullable=\"false\"/>"
+ "<Property Name=\"EmployeeName\" Type=\"Edm.String\" m:FC_TargetPath=\"SyndicationTitle\" " +
"annoPrefix:annoName=\"annoText\">"
+ "<annoPrefix:propertyAnnoElement>text</annoPrefix:propertyAnnoElement>"
+ "<annoPrefix:propertyAnnoElement2 />"
+ "</Property>"
+ "</EntityType>"
+ "<annoPrefix:schemaElementTest1>"
+ "<prefix:schemaElementTest2 xmlns:prefix=\"namespace\">text3"
+ "</prefix:schemaElementTest2>"
+ "<annoPrefix:schemaElementTest3 rel=\"self\" pre:href=\"http://foo\" " +
"xmlns:pre=\"namespaceForAnno\">text4</annoPrefix:schemaElementTest3>"
+ " </annoPrefix:schemaElementTest1>" + "</Schema>"
+ "</edmx:DataServices>" + "</edmx:Edmx>";
XmlMetadataDeserializer parser = new XmlMetadataDeserializer();
InputStream reader = createStreamReader(xmlWithAnnotations);
EdmDataServices result = parser.readMetadata(reader, false);
for (EdmSchema schema : result.getEdm().getSchemas()) {
assertEquals(1, schema.getAnnotationElements().size());
for (EdmAnnotationElement annoElement : schema.getAnnotationElements()) {
for (EdmAnnotationElement childAnnoElement : annoElement.getChildElements()) {
if ("schemaElementTest2".equals(childAnnoElement.getName())) {
assertEquals("prefix", childAnnoElement.getPrefix());
assertEquals("namespace", childAnnoElement.getNamespace());
assertEquals("text3", childAnnoElement.getText());
} else if ("schemaElementTest3".equals(childAnnoElement.getName())) {
assertEquals("text4", childAnnoElement.getText());
assertEquals("rel", childAnnoElement.getAttributes().get(0).getName());
assertEquals("self", childAnnoElement.getAttributes().get(0).getText());
assertEquals("", childAnnoElement.getAttributes().get(0).getPrefix());
assertNull(childAnnoElement.getAttributes().get(0).getNamespace());
assertEquals("href", childAnnoElement.getAttributes().get(1).getName());
assertEquals("pre", childAnnoElement.getAttributes().get(1).getPrefix());
assertEquals("namespaceForAnno", childAnnoElement.getAttributes().get(1).getNamespace());
assertEquals("http://foo", childAnnoElement.getAttributes().get(1).getText());
} else {
throw new EntityProviderException(null, "xmlWithAnnotations");
}
}
}
for (EdmEntityType entityType : schema.getEntityTypes()) {
assertEquals(1, entityType.getAnnotations().getAnnotationAttributes().size());
EdmAnnotationAttribute attr = entityType.getAnnotations().getAnnotationAttributes().get(0);
assertEquals("href", attr.getName());
assertEquals("prefix1", attr.getPrefix());
assertEquals("namespaceForAnno", attr.getNamespace());
assertEquals("http://foo", attr.getText());
for (String name : entityType.getPropertyNames()) {
if ("EmployeeName".equals(name)) {
EdmProperty property = (EdmProperty) entityType.getProperty(name);
assertEquals(2, property.getAnnotations().getAnnotationElements().size());
for (EdmAnnotationElement anElement : property.getAnnotations().getAnnotationElements()) {
if ("propertyAnnoElement".equals(anElement.getName())) {
assertEquals("text", anElement.getText());
}
}
for (EdmAnnotationAttribute anAttribute : property.getAnnotations().getAnnotationAttributes()) {
assertEquals("annoName", anAttribute.getName());
assertEquals("annoPrefix", anAttribute.getPrefix());
assertEquals("annoText", anAttribute.getText());
assertEquals("http://annoNamespace", anAttribute.getNamespace());
}
}
}
}
}
}
private InputStream createStreamReader(final String xml) throws
XMLStreamException, UnsupportedEncodingException {
return new ByteArrayInputStream(xml.getBytes("UTF-8"));
}
}