[OLINGO-168] Tests for metadata serialization

This commit is contained in:
Christian Amend 2014-04-02 17:21:18 +02:00
parent 1e8eaecf06
commit 809519f9d8
11 changed files with 418 additions and 194 deletions

View File

@ -1,18 +1,18 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* 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
*
* 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
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
@ -27,29 +27,36 @@ import org.apache.olingo.commons.api.edm.constants.EdmTypeKind;
public abstract class AbstractEdmComplexType extends AbstractEdmStructuredType implements EdmComplexType {
public AbstractEdmComplexType(
final Edm edm,
final FullQualifiedName fqn,
final FullQualifiedName baseTypeName) {
super(edm, fqn, EdmTypeKind.COMPLEX, baseTypeName);
}
public AbstractEdmComplexType(
final Edm edm,
final FullQualifiedName typeName,
final FullQualifiedName baseTypeName) {
super(edm, typeName, EdmTypeKind.COMPLEX, baseTypeName);
}
@Override
protected EdmStructuredType buildBaseType(final FullQualifiedName baseTypeName) {
// TODO: check for comment
EdmComplexType baseType = null;
if (baseTypeName != null) {
baseType = edm.getComplexType(baseTypeName);
if (baseType == null) {
throw new EdmException("Can't find base type with name: " + baseTypeName + " for complex type: "
+ getName());
}
}
return baseType;
@Override
protected EdmStructuredType buildBaseType(final FullQualifiedName baseTypeName) {
EdmComplexType baseType = null;
if (baseTypeName != null) {
baseType = edm.getComplexType(baseTypeName);
if (baseType == null) {
throw new EdmException("Can't find base type with name: " + baseTypeName + " for complex type: "
+ getName());
}
}
return baseType;
}
@Override
public EdmComplexType getBaseType() {
return (EdmComplexType) baseType;
@Override
public EdmComplexType getBaseType() {
checkBaseType();
return (EdmComplexType) baseType;
}
@Override
protected void checkBaseType() {
if (baseTypeName != null && baseType == null) {
baseType = buildBaseType(baseTypeName);
}
}
}

View File

@ -34,19 +34,15 @@ import org.apache.olingo.commons.api.edm.constants.EdmTypeKind;
public abstract class AbstractEdmEntityType extends AbstractEdmStructuredType implements EdmEntityType {
private final boolean hasStream;
protected EdmEntityType entityBaseType;
private final List<String> keyPredicateNames = new ArrayList<String>();
private final Map<String, EdmKeyPropertyRef> keyPropertyRefs = new LinkedHashMap<String, EdmKeyPropertyRef>();
private List<EdmKeyPropertyRef> keyPropertyRefsList;
protected AbstractEdmEntityType(final Edm edm, final FullQualifiedName fqn, final FullQualifiedName baseTypeName,
protected AbstractEdmEntityType(final Edm edm, final FullQualifiedName typeName, final FullQualifiedName baseTypeName,
final boolean hashStream) {
super(edm, fqn, EdmTypeKind.ENTITY, baseTypeName);
super(edm, typeName, EdmTypeKind.ENTITY, baseTypeName);
this.hasStream = hashStream;
}
@ -76,11 +72,13 @@ public abstract class AbstractEdmEntityType extends AbstractEdmStructuredType im
@Override
public EdmEntityType getBaseType() {
checkBaseType();
return entityBaseType;
}
@Override
public List<String> getKeyPredicateNames() {
checkBaseType();
if (keyPredicateNames.isEmpty() && baseType != null) {
return entityBaseType.getKeyPredicateNames();
}
@ -89,6 +87,7 @@ public abstract class AbstractEdmEntityType extends AbstractEdmStructuredType im
@Override
public List<EdmKeyPropertyRef> getKeyPropertyRefs() {
checkBaseType();
if (keyPropertyRefsList == null) {
keyPropertyRefsList = new ArrayList<EdmKeyPropertyRef>(keyPropertyRefs.values());
}
@ -100,6 +99,7 @@ public abstract class AbstractEdmEntityType extends AbstractEdmStructuredType im
@Override
public EdmKeyPropertyRef getKeyPropertyRef(final String keyPredicateName) {
checkBaseType();
final EdmKeyPropertyRef edmKeyPropertyRef = keyPropertyRefs.get(keyPredicateName);
if (edmKeyPropertyRef == null && entityBaseType != null) {
return entityBaseType.getKeyPropertyRef(keyPredicateName);
@ -111,4 +111,8 @@ public abstract class AbstractEdmEntityType extends AbstractEdmStructuredType im
public boolean hasStream() {
return hasStream;
}
protected void checkBaseType() {
//Current Client implementation doesn`t need this so I implemented an empty body here.
}
}

View File

@ -1,18 +1,18 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* 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
*
* 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
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
@ -62,7 +62,8 @@ public abstract class AbstractEdmNavigationProperty extends EdmElementImpl imple
for (String element : split) {
property = type.getNavigationProperty(element);
if (property == null) {
throw new EdmException("Cannot find property with name: " + element + " at type " + type.getName());
throw new EdmException("Cannot find navigation property with name: " + element
+ " at type " + type.getName());
}
type = (EdmStructuredType) property.getType();
}

View File

@ -1,18 +1,18 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* 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
*
* 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
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
@ -34,99 +34,105 @@ import org.apache.olingo.commons.api.edm.constants.EdmTypeKind;
public abstract class AbstractEdmStructuredType extends EdmTypeImpl implements EdmStructuredType {
protected EdmStructuredType baseType;
protected EdmStructuredType baseType;
protected FullQualifiedName baseTypeName;
private List<String> propertyNames;
private List<String> navigationPropertyNames;
private List<String> propertyNames;
public AbstractEdmStructuredType(
final Edm edm,
final FullQualifiedName typeName,
final EdmTypeKind kind,
final FullQualifiedName baseTypeName) {
private List<String> navigationPropertyNames;
super(edm, typeName, kind);
this.baseTypeName = baseTypeName;
}
public AbstractEdmStructuredType(
final Edm edm,
final FullQualifiedName fqn,
final EdmTypeKind kind,
final FullQualifiedName baseTypeName) {
protected abstract EdmStructuredType buildBaseType(FullQualifiedName baseTypeName);
super(edm, fqn, kind);
protected abstract Map<String, EdmProperty> getProperties();
protected abstract Map<String, EdmNavigationProperty> getNavigationProperties();
protected abstract void checkBaseType();
@Override
public List<String> getPropertyNames() {
if (propertyNames == null) {
propertyNames = new ArrayList<String>();
checkBaseType();
if (baseType != null) {
propertyNames.addAll(baseType.getPropertyNames());
}
propertyNames.addAll(getProperties().keySet());
}
return propertyNames;
}
@Override
public List<String> getNavigationPropertyNames() {
if (navigationPropertyNames == null) {
navigationPropertyNames = new ArrayList<String>();
checkBaseType();
if (baseType != null) {
navigationPropertyNames.addAll(baseType.getNavigationPropertyNames());
}
navigationPropertyNames.addAll(getNavigationProperties().keySet());
}
return navigationPropertyNames;
}
@Override
public EdmElement getProperty(final String name) {
EdmElement property = getStructuralProperty(name);
if (property == null) {
property = getNavigationProperty(name);
}
return property;
}
@Override
public EdmProperty getStructuralProperty(final String name) {
EdmProperty property = null;
checkBaseType();
if (baseType != null) {
property = baseType.getStructuralProperty(name);
}
if (property == null) {
property = getProperties().get(name);
}
return property;
}
@Override
public EdmNavigationProperty getNavigationProperty(final String name) {
EdmNavigationProperty property = null;
checkBaseType();
if (baseType != null) {
property = baseType.getNavigationProperty(name);
}
if (property == null) {
property = getNavigationProperties().get(name);
}
return property;
}
@Override
public boolean compatibleTo(final EdmType targetType) {
EdmStructuredType sourceType = this;
if (targetType == null) {
throw new EdmException("Target type must not be null");
}
while (!sourceType.getName().equals(targetType.getName())
|| !sourceType.getNamespace().equals(targetType.getNamespace())) {
sourceType = sourceType.getBaseType();
if (sourceType == null) {
return false;
}
}
protected abstract EdmStructuredType buildBaseType(FullQualifiedName baseTypeName);
protected abstract Map<String, EdmProperty> getProperties();
protected abstract Map<String, EdmNavigationProperty> getNavigationProperties();
@Override
public List<String> getPropertyNames() {
if (propertyNames == null) {
propertyNames = new ArrayList<String>();
if (baseType != null) {
propertyNames.addAll(baseType.getPropertyNames());
}
propertyNames.addAll(getProperties().keySet());
}
return propertyNames;
}
@Override
public List<String> getNavigationPropertyNames() {
if (navigationPropertyNames == null) {
navigationPropertyNames = new ArrayList<String>();
if (baseType != null) {
navigationPropertyNames.addAll(baseType.getNavigationPropertyNames());
}
navigationPropertyNames.addAll(getNavigationProperties().keySet());
}
return navigationPropertyNames;
}
@Override
public EdmElement getProperty(final String name) {
EdmElement property = getStructuralProperty(name);
if (property == null) {
property = getNavigationProperty(name);
}
return property;
}
@Override
public EdmProperty getStructuralProperty(final String name) {
EdmProperty property = null;
if (baseType != null) {
property = baseType.getStructuralProperty(name);
}
if (property == null) {
property = getProperties().get(name);
}
return property;
}
@Override
public EdmNavigationProperty getNavigationProperty(final String name) {
EdmNavigationProperty property = null;
if (baseType != null) {
property = baseType.getNavigationProperty(name);
}
if (property == null) {
property = getNavigationProperties().get(name);
}
return property;
}
@Override
public boolean compatibleTo(final EdmType targetType) {
EdmStructuredType sourceType = this;
if (targetType == null) {
throw new EdmException("Target type must not be null");
}
while (!sourceType.getName().equals(targetType.getName())
|| !sourceType.getNamespace().equals(targetType.getNamespace())) {
sourceType = sourceType.getBaseType();
if (sourceType == null) {
return false;
}
}
return true;
}
return true;
}
}

View File

@ -1,18 +1,18 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* 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
*
* 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
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
@ -25,23 +25,22 @@ import org.apache.olingo.commons.api.edm.constants.EdmTypeKind;
public class EdmTypeImpl extends EdmNamedImpl implements EdmType {
protected final FullQualifiedName fqn;
protected final FullQualifiedName typeName;
protected final EdmTypeKind kind;
protected final EdmTypeKind kind;
public EdmTypeImpl(final Edm edm, final FullQualifiedName typeName, final EdmTypeKind kind) {
super(edm, typeName.getName());
this.typeName = typeName;
this.kind = kind;
}
public EdmTypeImpl(final Edm edm, final FullQualifiedName fqn, final EdmTypeKind kind) {
super(edm, fqn.getName());
this.fqn = fqn;
this.kind = kind;
}
@Override
public String getNamespace() {
return typeName.getNamespace();
}
@Override
public String getNamespace() {
return fqn.getNamespace();
}
@Override
public EdmTypeKind getKind() {
return kind;
}
@Override
public EdmTypeKind getKind() {
return kind;
}
}

View File

@ -36,8 +36,6 @@ public class EdmComplexTypeImpl extends AbstractEdmComplexType {
final Edm edm, final FullQualifiedName name, final ComplexType complexType) {
final EdmComplexTypeImpl instance = new EdmComplexTypeImpl(edm, name, complexType);
instance.baseType = instance.buildBaseType(complexType.getBaseType());
return instance;
}

View File

@ -36,34 +36,19 @@ import org.apache.olingo.server.api.edm.provider.PropertyRef;
public class EdmEntityTypeImpl extends AbstractEdmEntityType {
private final EdmStructuredTypeHelper helper;
private EntityType entityType;
private boolean baseTypeChecked = false;
public static EdmEntityTypeImpl getInstance(final Edm edm, final FullQualifiedName name,
final EntityType entityType) {
final EdmEntityTypeImpl instance = new EdmEntityTypeImpl(edm, name, entityType);
instance.baseType = instance.buildBaseType(entityType.getBaseType());
if (instance.baseType == null) {
instance.entityBaseType = null;
final List<PropertyRef> key = entityType.getKey();
if (key != null) {
final List<EdmKeyPropertyRef> edmKey = new ArrayList<EdmKeyPropertyRef>();
for (PropertyRef ref : key) {
edmKey.add(new EdmKeyPropertyRefImpl(instance, ref));
}
instance.setEdmKeyPropertyRef(edmKey);
}
} else {
instance.entityBaseType = (EdmEntityType) instance.baseType;
}
return instance;
}
private EdmEntityTypeImpl(final Edm edm, final FullQualifiedName name, final EntityType entityType) {
super(edm, name, entityType.getBaseType(), entityType.hasStream());
this.entityType = entityType;
helper = new EdmStructuredTypeHelperImpl(edm, entityType);
}
@ -77,4 +62,28 @@ public class EdmEntityTypeImpl extends AbstractEdmEntityType {
return helper.getNavigationProperties();
}
@Override
protected void checkBaseType() {
if (!baseTypeChecked) {
if (baseTypeName != null) {
baseType = buildBaseType(baseTypeName);
}
if (baseType == null) {
entityBaseType = null;
final List<PropertyRef> key = entityType.getKey();
if (key != null) {
final List<EdmKeyPropertyRef> edmKey = new ArrayList<EdmKeyPropertyRef>();
for (PropertyRef ref : key) {
edmKey.add(new EdmKeyPropertyRefImpl(this, ref));
}
setEdmKeyPropertyRef(edmKey);
}
} else {
entityBaseType = (EdmEntityType) baseType;
}
baseTypeChecked = true;
}
}
}

View File

@ -59,7 +59,7 @@ public class EdmComplexTypeImplTest {
List<NavigationProperty> baseNavigationProperties = new ArrayList<NavigationProperty>();
baseNavigationProperties.add(new NavigationProperty().setName("nav1"));
baseComplexType.setName("BaseTypeName").setAbstract(false).setOpenType(false).setProperties(baseProperties)
.setNavigationProperties(baseNavigationProperties);
.setNavigationProperties(baseNavigationProperties);
when(provider.getComplexType(baseName)).thenReturn(baseComplexType);
baseType = EdmComplexTypeImpl.getInstance(edm, baseName, baseComplexType);
@ -71,7 +71,7 @@ public class EdmComplexTypeImplTest {
List<NavigationProperty> navigationProperties = new ArrayList<NavigationProperty>();
navigationProperties.add(new NavigationProperty().setName("nav2"));
complexType.setName("BaseTypeName").setAbstract(false).setOpenType(false).setProperties(properties)
.setNavigationProperties(navigationProperties);
.setNavigationProperties(navigationProperties);
when(provider.getComplexType(name)).thenReturn(complexType);
type = EdmComplexTypeImpl.getInstance(edm, name, complexType);
@ -155,10 +155,12 @@ public class EdmComplexTypeImplTest {
EdmProvider provider = mock(EdmProvider.class);
EdmProviderImpl edm = new EdmProviderImpl(provider);
FullQualifiedName typeWithNonexistingBaseTypeName = new FullQualifiedName("namespace", "typeName");
ComplexType complexTypeForNonexistingBaseType
= new ComplexType().setBaseType(new FullQualifiedName("wrong", "wrong"));
ComplexType complexTypeForNonexistingBaseType =
new ComplexType().setBaseType(new FullQualifiedName("wrong", "wrong"));
complexTypeForNonexistingBaseType.setName("typeName");
when(provider.getComplexType(typeWithNonexistingBaseTypeName)).thenReturn(complexTypeForNonexistingBaseType);
EdmComplexTypeImpl.getInstance(edm, typeWithNonexistingBaseTypeName, complexTypeForNonexistingBaseType);
EdmComplexTypeImpl instance =
EdmComplexTypeImpl.getInstance(edm, typeWithNonexistingBaseTypeName, complexTypeForNonexistingBaseType);
instance.getBaseType();
}
}

View File

@ -96,21 +96,21 @@ public class EdmEntityTypeImplTest {
typeWithComplexKeyProvider.setName(typeWithComplexKeyName.getName());
List<Property> typeWithComplexKeyProperties = new ArrayList<Property>();
typeWithComplexKeyProperties.add(new Property().setName("Id").setType(
EdmPrimitiveTypeKind.String.getFullQualifiedName()));
EdmPrimitiveTypeKind.String.getFullQualifiedName()));
List<Property> complexTypeProperties = new ArrayList<Property>();
complexTypeProperties.add(new Property().setName("ComplexPropName").setType(
EdmPrimitiveTypeKind.String.getFullQualifiedName()));
EdmPrimitiveTypeKind.String.getFullQualifiedName()));
FullQualifiedName complexTypeName = new FullQualifiedName("namespace", "complexTypeName");
when(provider.getComplexType(complexTypeName)).thenReturn(
new ComplexType().setName("complexTypeName").setProperties(complexTypeProperties));
new ComplexType().setName("complexTypeName").setProperties(complexTypeProperties));
typeWithComplexKeyProperties.add(new Property().setName("Comp").setType(complexTypeName));
typeWithComplexKeyProvider.setProperties(typeWithComplexKeyProperties);
List<PropertyRef> keyForTypeWithComplexKey = new ArrayList<PropertyRef>();
keyForTypeWithComplexKey.add(new PropertyRef().setPropertyName("Id"));
keyForTypeWithComplexKey.add(new PropertyRef().setPropertyName("ComplexPropName").setAlias("alias").setPath(
"Comp/ComplexPropName"));
"Comp/ComplexPropName"));
typeWithComplexKeyProvider.setKey(keyForTypeWithComplexKey);
when(provider.getEntityType(typeWithComplexKeyName)).thenReturn(typeWithComplexKeyProvider);
@ -255,7 +255,8 @@ public class EdmEntityTypeImplTest {
public void invalidBaseType() {
EdmProviderImpl edm = mock(EdmProviderImpl.class);
EntityType entityType = new EntityType().setName("n").setBaseType(new FullQualifiedName("wrong", "wrong"));
EdmEntityTypeImpl.getInstance(edm, new FullQualifiedName("n", "n"), entityType);
EdmEntityTypeImpl instance = EdmEntityTypeImpl.getInstance(edm, new FullQualifiedName("n", "n"), entityType);
instance.getBaseType();
}
@Test

View File

@ -322,12 +322,14 @@ public class EdmSchemaImplTest {
List<EntityType> entityTypes = new ArrayList<EntityType>();
entityTypes.add(new EntityType().setName("entityType1"));
entityTypes.add(new EntityType().setName("entityType2"));
entityTypes.add(new EntityType().setName("entityType2")
.setBaseType(new FullQualifiedName("namespace", "entityType1")));
providerSchema.setEntityTypes(entityTypes);
List<ComplexType> complexTypes = new ArrayList<ComplexType>();
complexTypes.add(new ComplexType().setName("complexType1"));
complexTypes.add(new ComplexType().setName("complexType2"));
complexTypes.add(new ComplexType().setName("complexType2").setBaseType(
new FullQualifiedName("namespace", "complexType1")));
providerSchema.setComplexTypes(complexTypes);
List<Action> actions = new ArrayList<Action>();

View File

@ -18,13 +18,41 @@
*/
package org.apache.olingo.server.core.serializer.xml;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import static org.mockito.Mockito.mock;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import org.apache.olingo.commons.api.ODataException;
import org.apache.olingo.commons.api.ODataRuntimeException;
import org.apache.olingo.commons.api.edm.Edm;
import org.apache.olingo.commons.api.edm.EdmPrimitiveTypeKind;
import org.apache.olingo.commons.api.edm.FullQualifiedName;
import org.apache.olingo.commons.api.edm.Target;
import org.apache.olingo.server.api.ODataServer;
import org.apache.olingo.server.api.edm.provider.Action;
import org.apache.olingo.server.api.edm.provider.ActionImport;
import org.apache.olingo.server.api.edm.provider.ComplexType;
import org.apache.olingo.server.api.edm.provider.EdmProvider;
import org.apache.olingo.server.api.edm.provider.EntityContainer;
import org.apache.olingo.server.api.edm.provider.EntitySet;
import org.apache.olingo.server.api.edm.provider.EntityType;
import org.apache.olingo.server.api.edm.provider.EnumMember;
import org.apache.olingo.server.api.edm.provider.EnumType;
import org.apache.olingo.server.api.edm.provider.Function;
import org.apache.olingo.server.api.edm.provider.FunctionImport;
import org.apache.olingo.server.api.edm.provider.NavigationProperty;
import org.apache.olingo.server.api.edm.provider.NavigationPropertyBinding;
import org.apache.olingo.server.api.edm.provider.Parameter;
import org.apache.olingo.server.api.edm.provider.Property;
import org.apache.olingo.server.api.edm.provider.ReturnType;
import org.apache.olingo.server.api.edm.provider.Schema;
import org.apache.olingo.server.api.edm.provider.Singleton;
import org.apache.olingo.server.api.edm.provider.TypeDefinition;
import org.apache.olingo.server.api.serializer.ODataFormat;
import org.apache.olingo.server.api.serializer.ODataSerializer;
import org.apache.olingo.server.core.edm.provider.EdmProviderImpl;
@ -47,11 +75,178 @@ public class MetadataDocumentTest {
serializer.metadataDocument(edm);
}
@Test
public void writeMetadataWithLocalTestEdm() {
ODataSerializer serializer = ODataServer.newInstance().getSerializer(ODataFormat.XML);
Edm edm = new EdmProviderImpl(new TestMetadataProvider());
InputStream metadata = serializer.metadataDocument(edm);
assertNotNull(metadata);
String metadataString = StringUtils.inputStreamToString(metadata, false);
assertTrue(metadataString
.contains("<edmx:Edmx Version=\"4.0\" xmlns:edmx=\"http://docs.oasis-open.org/odata/ns/edmx\">"));
assertTrue(metadataString
.contains("<Schema xmlns=\"http://docs.oasis-open.org/odata/ns/edm\" " +
"Namespace=\"namespace\" Alias=\"alias\">"));
assertTrue(metadataString
.contains("<EntityType Name=\"ETBaseName\"><Property Name=\"P1\" Type=\"Edm.Int16\"/><NavigationProperty " +
"Name=\"N1\" Type=\"namespace.ETBaseName\" Nullable=\"true\" Partner=\"N1\"/></EntityType>"));
assertTrue(metadataString
.contains("<EntityType Name=\"ETDerivedName\" BaseType=\"namespace.ETBaseName\"><Property Name=\"P2\" " +
"Type=\"Edm.Int16\"/><NavigationProperty Name=\"N2\" Type=\"namespace.ETDerivedName\" Nullable=\"true\" " +
"Partner=\"N2\"/></EntityType>"));
assertTrue(metadataString
.contains("<ComplexType Name=\"CTBaseName\"><Property Name=\"P1\" Type=\"Edm.Int16\"/><NavigationProperty " +
"Name=\"N1\" Type=\"namespace.ETBaseName\" Nullable=\"true\" Partner=\"N1\"/></ComplexType>"));
assertTrue(metadataString
.contains("<ComplexType Name=\"CTDerivedName\" BaseType=\"namespace.CTBaseName\"><Property Name=\"P2\" " +
"Type=\"Edm.Int16\"/><NavigationProperty Name=\"N2\" Type=\"namespace.ETDerivedName\" Nullable=\"true\" " +
"Partner=\"N2\"/></ComplexType>"));
assertTrue(metadataString.contains("<TypeDefinition Name=\"typeDef\" Type=\"Edm.Int16\"/>"));
assertTrue(metadataString.contains("<Action Name=\"ActionWOParameter\" IsBound=\"false\"/>"));
assertTrue(metadataString
.contains("<Action Name=\"ActionName\" IsBound=\"true\"><Parameter Name=\"param\" Type=\"Edm.Int16\"/>" +
"<Parameter Name=\"param2\" Type=\"Collection(Edm.Int16)\"/><ReturnType Type=\"namespace.CTBaseName\"/>" +
"</Action>"));
assertTrue(metadataString
.contains("<Function Name=\"FunctionWOParameter\" IsBound=\"false\" IsComposable=\"false\"><ReturnType " +
"Type=\"namespace.CTBaseName\"/></Function>"));
assertTrue(metadataString
.contains("<Function Name=\"FunctionName\" IsBound=\"true\" IsComposable=\"false\"><Parameter Name=\"param\" " +
"Type=\"Edm.Int16\"/><Parameter Name=\"param2\" Type=\"Collection(Edm.Int16)\"/><ReturnType " +
"Type=\"namespace.CTBaseName\"/></Function>"));
assertTrue(metadataString.contains("<EntityContainer Name=\"container\">"));
assertTrue(metadataString
.contains("<EntitySet Name=\"EntitySetName\" EntityType=\"namespace.ETBaseName\"><NavigationPropertyBinding " +
"Path=\"N1\" Target=\"namespace.container/EntitySetName\"/></EntitySet>"));
assertTrue(metadataString
.contains("<Singleton Name=\"SingletonName\" EntityType=\"namespace.ETBaseName\"><NavigationPropertyBinding " +
"Path=\"N1\" Target=\"namespace.container/EntitySetName\"/></Singleton>"));
assertTrue(metadataString.contains("<ActionImport Name=\"actionImport\" Action=\"namespace.ActionWOParameter\"/>"));
assertTrue(metadataString
.contains("<FunctionImport Name=\"actionImport\" Function=\"namespace.FunctionName\" " +
"EntitySet=\"namespace.EntitySetName\" IncludeInServiceDocument=\"false\"/>"));
assertTrue(metadataString.contains("</EntityContainer></Schema></edmx:DataServices></edmx:Edmx>"));
}
@Test
public void writeMetadataWithTechnicalScenario() {
ODataSerializer serializer = ODataServer.newInstance().getSerializer(ODataFormat.XML);
EdmProviderImpl edm = new EdmProviderImpl(new EdmTechProvider());
InputStream metadata = serializer.metadataDocument(edm);
StringUtils.inputStreamToString(metadata, false);
assertNotNull(metadata);
// The technical scenario is too big to verify. We are content for now to make sure we can serialize it.
// System.out.println(StringUtils.inputStreamToString(metadata, false));
}
private class TestMetadataProvider extends EdmProvider {
@Override
public List<Schema> getSchemas() throws ODataException {
Property p1 = new Property().setName("P1").setType(EdmPrimitiveTypeKind.Int16.getFullQualifiedName());
String ns = "namespace";
NavigationProperty n1 = new NavigationProperty().setName("N1")
.setType(new FullQualifiedName(ns, "ETBaseName")).setNullable(true).setPartner("N1");
Property p2 = new Property().setName("P2").setType(EdmPrimitiveTypeKind.Int16.getFullQualifiedName());
NavigationProperty n2 = new NavigationProperty().setName("N2")
.setType(new FullQualifiedName(ns, "ETDerivedName")).setNullable(true).setPartner("N2");
Schema schema = new Schema().setNamespace(ns).setAlias("alias");
List<ComplexType> complexTypes = new ArrayList<ComplexType>();
schema.setComplexTypes(complexTypes);
ComplexType ctBase =
new ComplexType().setName("CTBaseName").setProperties(Arrays.asList(p1)).setNavigationProperties(
Arrays.asList(n1));
complexTypes.add(ctBase);
ComplexType ctDerived =
new ComplexType().setName("CTDerivedName").setBaseType(new FullQualifiedName(ns, "CTBaseName"))
.setProperties(Arrays.asList(p2)).setNavigationProperties(Arrays.asList(n2));
complexTypes.add(ctDerived);
List<EntityType> entityTypes = new ArrayList<EntityType>();
schema.setEntityTypes(entityTypes);
EntityType etBase =
new EntityType().setName("ETBaseName").setProperties(Arrays.asList(p1)).setNavigationProperties(
Arrays.asList(n1));
entityTypes.add(etBase);
EntityType etDerived =
new EntityType().setName("ETDerivedName").setBaseType(new FullQualifiedName(ns, "ETBaseName"))
.setProperties(Arrays.asList(p2)).setNavigationProperties(Arrays.asList(n2));
entityTypes.add(etDerived);
List<Action> actions = new ArrayList<Action>();
schema.setActions(actions);
// TODO:EntitySetPath
actions.add((new Action().setName("ActionWOParameter")));
List<Parameter> parameters = new ArrayList<Parameter>();
parameters.add(new Parameter().setName("param").setType(EdmPrimitiveTypeKind.Int16.getFullQualifiedName()));
parameters.add(new Parameter().setName("param2").setType(EdmPrimitiveTypeKind.Int16.getFullQualifiedName())
.setCollection(true));
actions.add(new Action().setName("ActionName").setBound(true).setParameters(parameters).setReturnType(
new ReturnType().setType(new FullQualifiedName(ns, "CTBaseName"))));
List<Function> functions = new ArrayList<Function>();
schema.setFunctions(functions);
functions.add((new Function().setName("FunctionWOParameter")
.setReturnType(new ReturnType().setType(new FullQualifiedName(ns, "CTBaseName")))));
functions.add(new Function().setName("FunctionName").setBound(true).setParameters(parameters).setReturnType(
new ReturnType().setType(new FullQualifiedName(ns, "CTBaseName"))));
List<EnumType> enumTypes = new ArrayList<EnumType>();
schema.setEnumTypes(enumTypes);
List<EnumMember> members = new ArrayList<EnumMember>();
members.add(new EnumMember().setName("member").setValue("1"));
enumTypes.add(new EnumType().setName("EnumName").setFlags(true).setMembers(members));
List<TypeDefinition> typeDefinitions = new ArrayList<TypeDefinition>();
schema.setTypeDefinitions(typeDefinitions);
typeDefinitions.add(new TypeDefinition().setName("typeDef")
.setUnderlyingType(EdmPrimitiveTypeKind.Int16.getFullQualifiedName()));
EntityContainer container = new EntityContainer().setName("container");
schema.setEntityContainer(container);
List<ActionImport> actionImports = new ArrayList<ActionImport>();
container.setActionImports(actionImports);
actionImports.add(new ActionImport().setName("actionImport").setAction(
new FullQualifiedName(ns, "ActionWOParameter")).setEntitySet(
new Target().setEntityContainer(new FullQualifiedName(ns, "container")).setTargetName("EntitySetName")));
List<FunctionImport> functionImports = new ArrayList<FunctionImport>();
container.setFunctionImports(functionImports);
functionImports.add(new FunctionImport().setName("actionImport").setFunction(
new FullQualifiedName(ns, "FunctionName")).setEntitySet(
new Target().setEntityContainer(new FullQualifiedName(ns, "container")).setTargetName("EntitySetName")));
List<EntitySet> entitySets = new ArrayList<EntitySet>();
container.setEntitySets(entitySets);
List<NavigationPropertyBinding> nPB = new ArrayList<NavigationPropertyBinding>();
nPB.add(new NavigationPropertyBinding().setPath("N1").setTarget(
new Target().setEntityContainer(new FullQualifiedName(ns, "container")).setTargetName("EntitySetName")));
entitySets.add(new EntitySet().setName("EntitySetName").setType(new FullQualifiedName(ns, "ETBaseName"))
.setNavigationPropertyBindings(nPB));
List<Singleton> singletons = new ArrayList<Singleton>();
container.setSingletons(singletons);
singletons.add(new Singleton().setName("SingletonName").setType(new FullQualifiedName(ns, "ETBaseName"))
.setNavigationPropertyBindings(nPB));
List<Schema> schemas = new ArrayList<Schema>();
schemas.add(schema);
return schemas;
}
}
}