diff --git a/lib/server-api/src/main/java/org/apache/olingo/server/api/deserializer/DeserializerException.java b/lib/server-api/src/main/java/org/apache/olingo/server/api/deserializer/DeserializerException.java index 2469d764d..0278a8271 100644 --- a/lib/server-api/src/main/java/org/apache/olingo/server/api/deserializer/DeserializerException.java +++ b/lib/server-api/src/main/java/org/apache/olingo/server/api/deserializer/DeserializerException.java @@ -35,7 +35,7 @@ public class DeserializerException extends ODataTranslatedException { /** parameter: propertyName */ INVALID_NULL_PROPERTY, /** parameter: keyName */ UNKOWN_CONTENT, /** parameter: propertyName */ INVALID_VALUE_FOR_PROPERTY, - /** parameter: propertyName */ INVALID_TYPE_FOR_PROPERTY, + /** parameter: propertyName */ INVALID_JSON_TYPE_FOR_PROPERTY, VALUE_ARRAY_NOT_PRESENT, VALUE_TAG_MUST_BE_AN_ARRAY, INVALID_ENTITY, diff --git a/lib/server-core/src/main/java/org/apache/olingo/server/core/deserializer/json/ODataJsonDeserializer.java b/lib/server-core/src/main/java/org/apache/olingo/server/core/deserializer/json/ODataJsonDeserializer.java index be6d54226..fa52b8bcc 100644 --- a/lib/server-core/src/main/java/org/apache/olingo/server/core/deserializer/json/ODataJsonDeserializer.java +++ b/lib/server-core/src/main/java/org/apache/olingo/server/core/deserializer/json/ODataJsonDeserializer.java @@ -306,7 +306,7 @@ public class ODataJsonDeserializer implements ODataDeserializer { if (edmProperty.isCollection()) { if (!jsonNode.isArray()) { throw new DeserializerException("Value for property: " + edmProperty.getName() - + " must be an arrat but is not.", DeserializerException.MessageKeys.INVALID_VALUE_FOR_PROPERTY, + + " must be an arrat but is not.", DeserializerException.MessageKeys.INVALID_JSON_TYPE_FOR_PROPERTY, edmProperty.getName()); } List valueArray = new ArrayList(); @@ -370,7 +370,7 @@ public class ODataJsonDeserializer implements ODataDeserializer { break; default: throw new DeserializerException("Invalid Type Kind for a property found: " + edmProperty.getType().getKind(), - DeserializerException.MessageKeys.INVALID_TYPE_FOR_PROPERTY, edmProperty.getName()); + DeserializerException.MessageKeys.INVALID_JSON_TYPE_FOR_PROPERTY, edmProperty.getName()); } } else { @@ -416,7 +416,7 @@ public class ODataJsonDeserializer implements ODataDeserializer { break; default: throw new DeserializerException("Invalid Type Kind for a property found: " + edmProperty.getType().getKind(), - DeserializerException.MessageKeys.INVALID_TYPE_FOR_PROPERTY, edmProperty.getName()); + DeserializerException.MessageKeys.INVALID_JSON_TYPE_FOR_PROPERTY, edmProperty.getName()); } } return property; @@ -426,7 +426,7 @@ public class ODataJsonDeserializer implements ODataDeserializer { if (jsonNode.isArray() || !jsonNode.isContainerNode()) { throw new DeserializerException( "Inavlid value for property: " + edmComplexProperty.getName() + " must not be an array or primitive value.", - DeserializerException.MessageKeys.INVALID_VALUE_FOR_PROPERTY, edmComplexProperty.getName()); + DeserializerException.MessageKeys.INVALID_JSON_TYPE_FOR_PROPERTY, edmComplexProperty.getName()); } // Even if there are no properties defined we have to give back an empty list List propertyList = new ArrayList(); @@ -476,7 +476,7 @@ public class ODataJsonDeserializer implements ODataDeserializer { if (!jsonNode.isValueNode()) { throw new DeserializerException( "Inavlid value for property: " + edmProperty.getName() + " must not be an object or array.", - DeserializerException.MessageKeys.INVALID_VALUE_FOR_PROPERTY, edmProperty.getName()); + DeserializerException.MessageKeys.INVALID_JSON_TYPE_FOR_PROPERTY, edmProperty.getName()); } try { EdmEnumType edmEnumType = (EdmEnumType) edmProperty.getType(); @@ -497,7 +497,7 @@ public class ODataJsonDeserializer implements ODataDeserializer { if (!jsonNode.isValueNode()) { throw new DeserializerException( "Inavlid value for property: " + edmProperty.getName() + " must not be an object or array.", - DeserializerException.MessageKeys.INVALID_TYPE_FOR_PROPERTY, edmProperty.getName()); + DeserializerException.MessageKeys.INVALID_JSON_TYPE_FOR_PROPERTY, edmProperty.getName()); } try { EdmPrimitiveType edmPrimitiveType = (EdmPrimitiveType) edmProperty.getType(); diff --git a/lib/server-core/src/main/java/org/apache/olingo/server/core/serializer/xml/MetadataDocumentXmlSerializer.java b/lib/server-core/src/main/java/org/apache/olingo/server/core/serializer/xml/MetadataDocumentXmlSerializer.java index d962d8266..25610fbad 100644 --- a/lib/server-core/src/main/java/org/apache/olingo/server/core/serializer/xml/MetadataDocumentXmlSerializer.java +++ b/lib/server-core/src/main/java/org/apache/olingo/server/core/serializer/xml/MetadataDocumentXmlSerializer.java @@ -185,7 +185,7 @@ public class MetadataDocumentXmlSerializer { for (EdmTypeDefinition definition : typeDefinitions) { writer.writeEmptyElement(XML_TYPE_DEFINITION); writer.writeAttribute(XML_NAME, definition.getName()); - writer.writeAttribute(XML_TYPE, getFullQualifiedName(definition.getUnderlyingType(), false)); + writer.writeAttribute(XML_UNDERLYING_TYPE, getFullQualifiedName(definition.getUnderlyingType(), false)); // Facets if (definition.getMaxLength() != null) { diff --git a/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/provider/ComplexTypeProvider.java b/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/provider/ComplexTypeProvider.java index 31e270d76..6c0274390 100644 --- a/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/provider/ComplexTypeProvider.java +++ b/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/provider/ComplexTypeProvider.java @@ -45,11 +45,12 @@ public class ComplexTypeProvider { "CTNavFiveProp"); public static final FullQualifiedName nameCTPrim = new FullQualifiedName(SchemaProvider.NAMESPACE, "CTPrim"); public static final FullQualifiedName nameCTPrimComp = new FullQualifiedName(SchemaProvider.NAMESPACE, "CTPrimComp"); - public static final FullQualifiedName nameCTPrimEnum = new FullQualifiedName(SchemaProvider.NAMESPACE, "CTPrimEnum"); public static final FullQualifiedName nameCTTwoBase = new FullQualifiedName(SchemaProvider.NAMESPACE, "CTTwoBase"); public static final FullQualifiedName nameCTTwoBasePrimCompNav = new FullQualifiedName(SchemaProvider.NAMESPACE, "CTTwoBasePrimCompNav"); public static final FullQualifiedName nameCTTwoPrim = new FullQualifiedName(SchemaProvider.NAMESPACE, "CTTwoPrim"); + public static final FullQualifiedName nameCTMixEnumTypeDefColl = new FullQualifiedName(SchemaProvider.NAMESPACE, + "CTMixEnumTypeDefColl"); public ComplexType getComplexType(final FullQualifiedName complexTypeName) throws ODataException { @@ -157,19 +158,21 @@ public class ComplexTypeProvider { PropertyProvider.navPropertyETKeyNavOne_ETKeyNav, PropertyProvider.collectionNavPropertyETKeyNavMany_ETKeyNav)); - } else if (complexTypeName.equals(nameCTPrimEnum)) { - return new ComplexType() - .setName("CTPrimEnum") - .setProperties(Arrays.asList(PropertyProvider.propertyInt16, PropertyProvider.propertyEnumString_ENString)); - } else if (complexTypeName.equals(nameCTTwoBasePrimCompNav)) { return new ComplexType() .setName("CTTwoBasePrimCompNav") .setBaseType(nameCTBasePrimCompNav); + } else if (complexTypeName.equals(nameCTMixEnumTypeDefColl)) { + return new ComplexType() + .setName(nameCTMixEnumTypeDefColl.getName()) + .setProperties(Arrays.asList( + PropertyProvider.propertyEnumString_ENString, + PropertyProvider.collPropertyEnumString_ENString, + PropertyProvider.propertyTypeDefinition_TDString, + PropertyProvider.collPropertyTypeDefinition_TDString)); } return null; } - } diff --git a/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/provider/ContainerProvider.java b/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/provider/ContainerProvider.java index 84ec4c4e8..2a5ef8f97 100644 --- a/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/provider/ContainerProvider.java +++ b/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/provider/ContainerProvider.java @@ -95,6 +95,7 @@ public class ContainerProvider { entitySets.add(prov.getEntitySet(ContainerProvider.nameContainer, "ESBaseTwoKeyNav")); entitySets.add(prov.getEntitySet(ContainerProvider.nameContainer, "ESCompMixPrimCollComp")); entitySets.add(prov.getEntitySet(ContainerProvider.nameContainer, "ESFourKeyAlias")); + entitySets.add(prov.getEntitySet(ContainerProvider.nameContainer, "ESMixEnumTypeDefCollComp")); // Singletons List singletons = new ArrayList(); @@ -262,6 +263,9 @@ public class ContainerProvider { return new EntitySet() .setName("ESFourKeyAlias") .setType(EntityTypeProvider.nameETFourKeyAlias); + } else if (name.equals("ESMixEnumTypeDefCollComp")) { + return new EntitySet().setName("ESMixEnumTypeDefCollComp").setType( + EntityTypeProvider.nameETMixEnumTypeDefCollComp); } } @@ -269,12 +273,12 @@ public class ContainerProvider { } public ActionImport getActionImport(final FullQualifiedName entityContainer, final String name) - throws ODataException { + throws ODataException { if (entityContainer.equals(nameContainer)) { if (name.equals(AIRT_STRING)) { return new ActionImport() - .setName(AIRT_STRING) - .setAction(ActionProvider.nameUARTString); + .setName(AIRT_STRING) + .setAction(ActionProvider.nameUARTString); } else if (name.equals(AIRT_COLL_STRING_TWO_PARAM)) { return new ActionImport() diff --git a/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/provider/EntityTypeProvider.java b/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/provider/EntityTypeProvider.java index 4a4668cdd..e78c5d439 100644 --- a/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/provider/EntityTypeProvider.java +++ b/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/provider/EntityTypeProvider.java @@ -76,6 +76,9 @@ public class EntityTypeProvider { public static final FullQualifiedName nameETAbstractBase = new FullQualifiedName(SchemaProvider.NAMESPACE, "ETAbstractBase"); + public static final FullQualifiedName nameETMixEnumTypeDefCollComp = new FullQualifiedName(SchemaProvider.NAMESPACE, + "ETMixEnumTypeDefCollComp"); + public EntityType getEntityType(final FullQualifiedName entityTypeName) throws ODataException { if (entityTypeName.equals(nameETAllPrim)) { return new EntityType() @@ -336,12 +339,10 @@ public class EntityTypeProvider { PropertyProvider.propertyComp_CTPrimComp_NotNullable, new Property().setName("PropertyCompNav").setType(ComplexTypeProvider.nameCTBasePrimCompNav) .setNullable(false), - PropertyProvider.propertyCompEnum_CTPrimEnum_NotNullable, PropertyProvider.collPropertyComp_CTPrimComp, new Property().setName("CollPropertyCompNav").setType(ComplexTypeProvider.nameCTNavFiveProp) .setCollection(true), - PropertyProvider.collPropertyString, PropertyProvider.propertyCompTwoPrim_CTTwoPrim, - PropertyProvider.propertyEnumString_ENString + PropertyProvider.collPropertyString, PropertyProvider.propertyCompTwoPrim_CTTwoPrim )) .setNavigationProperties(Arrays.asList( new NavigationProperty() @@ -417,6 +418,18 @@ public class EntityTypeProvider { .setKey(Arrays.asList(new PropertyRef().setPropertyName("PropertyInt16"))) .setProperties(Arrays.asList( PropertyProvider.propertyInt16_NotNullable)); + } else if (entityTypeName.equals(nameETMixEnumTypeDefCollComp)) { + return new EntityType() + .setName(nameETMixEnumTypeDefCollComp.getName()) + .setKey(Arrays.asList(new PropertyRef().setPropertyName("PropertyInt16"))) + .setProperties(Arrays.asList( + PropertyProvider.propertyInt16_NotNullable, + PropertyProvider.propertyEnumString_ENString, + PropertyProvider.collPropertyEnumString_ENString, + PropertyProvider.propertyTypeDefinition_TDString, + PropertyProvider.collPropertyTypeDefinition_TDString, + PropertyProvider.propertyComp_CTMixEnumTypeDefColl, + PropertyProvider.propertyCompColl_CTMixEnumTypeDefColl)); } return null; diff --git a/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/provider/PropertyProvider.java b/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/provider/PropertyProvider.java index 765a534c3..156df86f9 100644 --- a/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/provider/PropertyProvider.java +++ b/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/provider/PropertyProvider.java @@ -508,11 +508,6 @@ public class PropertyProvider { .setName("PropertyCompComp") .setType(ComplexTypeProvider.nameCTCompComp); - public static final Property propertyCompEnum_CTPrimEnum_NotNullable = new Property() - .setName("PropertyCompEnum") - .setType(ComplexTypeProvider.nameCTPrimEnum) - .setNullable(false); - public static final Property propertyCompTwoPrim_CTTwoPrim = new Property() .setName("PropertyCompTwoPrim") .setType(ComplexTypeProvider.nameCTTwoPrim); @@ -521,6 +516,15 @@ public class PropertyProvider { .setName("PropertyMixedPrimCollComp") .setType(ComplexTypeProvider.nameCTMixPrimCollComp); + public static final Property propertyComp_CTMixEnumTypeDefColl = new Property() + .setName("PropertyCTMixEnumTypeDefColl") + .setType(ComplexTypeProvider.nameCTMixEnumTypeDefColl); + + public static final Property propertyCompColl_CTMixEnumTypeDefColl = new Property() + .setName("PropertyCTMixEnumTypeDefColl") + .setType(ComplexTypeProvider.nameCTMixEnumTypeDefColl) + .setCollection(true); + // Navigation Properties ------------------------------------------------------------------------------------------- public static final NavigationProperty collectionNavPropertyETKeyNavMany_ETKeyNav = new NavigationProperty() .setName("NavPropertyETKeyNavMany") @@ -588,6 +592,18 @@ public class PropertyProvider { .setName("PropertyEnumString") .setType(EnumTypeProvider.nameENString); - // TypeDefinition Properties --------------------------------------------------------------------------------------- + public static final Property collPropertyEnumString_ENString = new Property() + .setName("PropertyEnumString") + .setType(EnumTypeProvider.nameENString) + .setCollection(true); + // TypeDefinition Properties --------------------------------------------------------------------------------------- + public static final Property propertyTypeDefinition_TDString = new Property() + .setName("PropertyTypeDefinitionString") + .setType(TypeDefinitionProvider.nameTDString); + + public static final Property collPropertyTypeDefinition_TDString = new Property() + .setName("CollPropertyTypeDefinitionString") + .setType(TypeDefinitionProvider.nameTDString) + .setCollection(true); } diff --git a/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/provider/SchemaProvider.java b/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/provider/SchemaProvider.java index d2c19551b..1b628f41e 100644 --- a/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/provider/SchemaProvider.java +++ b/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/provider/SchemaProvider.java @@ -25,6 +25,7 @@ import org.apache.olingo.server.api.edm.provider.EntityType; 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.Schema; +import org.apache.olingo.server.api.edm.provider.TypeDefinition; import java.util.ArrayList; import java.util.List; @@ -77,6 +78,7 @@ public class SchemaProvider { entityTypes.add(prov.getEntityType(EntityTypeProvider.nameETKeyPrimNav)); entityTypes.add(prov.getEntityType(EntityTypeProvider.nameETAbstract)); entityTypes.add(prov.getEntityType(EntityTypeProvider.nameETAbstractBase)); + entityTypes.add(prov.getEntityType(EntityTypeProvider.nameETMixEnumTypeDefCollComp)); // ComplexTypes List complexType = new ArrayList(); @@ -92,13 +94,16 @@ public class SchemaProvider { complexType.add(prov.getComplexType(ComplexTypeProvider.nameCTCompCollComp)); complexType.add(prov.getComplexType(ComplexTypeProvider.nameCTPrimComp)); complexType.add(prov.getComplexType(ComplexTypeProvider.nameCTNavFiveProp)); - complexType.add(prov.getComplexType(ComplexTypeProvider.nameCTPrimEnum)); complexType.add(prov.getComplexType(ComplexTypeProvider.nameCTBasePrimCompNav)); complexType.add(prov.getComplexType(ComplexTypeProvider.nameCTTwoBasePrimCompNav)); complexType.add(prov.getComplexType(ComplexTypeProvider.nameCTCompNav)); + complexType.add(prov.getComplexType(ComplexTypeProvider.nameCTMixEnumTypeDefColl)); // TypeDefinitions - + List typeDefinitions = new ArrayList(); + schema.setTypeDefinitions(typeDefinitions); + typeDefinitions.add(prov.getTypeDefinition(TypeDefinitionProvider.nameTDString)); + // Actions List actions = new ArrayList(); schema.setActions(actions); diff --git a/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/provider/TypeDefinitionProvider.java b/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/provider/TypeDefinitionProvider.java index 268858680..242c44fdf 100644 --- a/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/provider/TypeDefinitionProvider.java +++ b/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/provider/TypeDefinitionProvider.java @@ -18,12 +18,19 @@ */ package org.apache.olingo.server.tecsvc.provider; +import org.apache.olingo.commons.api.edm.EdmPrimitiveTypeKind; import org.apache.olingo.commons.api.edm.FullQualifiedName; import org.apache.olingo.server.api.edm.provider.TypeDefinition; public class TypeDefinitionProvider { + public static final FullQualifiedName nameTDString = new FullQualifiedName(SchemaProvider.NAMESPACE, "TDString"); + public TypeDefinition getTypeDefinition(final FullQualifiedName typeDefinitionName) { + if (nameTDString.equals(typeDefinitionName)) { + return new TypeDefinition().setName(nameTDString.getName()).setUnderlyingType( + EdmPrimitiveTypeKind.String.getFullQualifiedName()); + } return null; } diff --git a/lib/server-test/src/test/java/org/apache/olingo/server/core/deserializer/json/ODataJsonDeserializerEntityTest.java b/lib/server-test/src/test/java/org/apache/olingo/server/core/deserializer/json/ODataJsonDeserializerEntityTest.java index ba19036a3..707112f44 100644 --- a/lib/server-test/src/test/java/org/apache/olingo/server/core/deserializer/json/ODataJsonDeserializerEntityTest.java +++ b/lib/server-test/src/test/java/org/apache/olingo/server/core/deserializer/json/ODataJsonDeserializerEntityTest.java @@ -39,6 +39,7 @@ import org.apache.olingo.commons.api.format.ODataFormat; import org.apache.olingo.server.api.OData; import org.apache.olingo.server.api.deserializer.DeserializerException; import org.apache.olingo.server.api.deserializer.ODataDeserializer; +import org.junit.Ignore; import org.junit.Test; public class ODataJsonDeserializerEntityTest extends AbstractODataDeserializerTest { @@ -240,6 +241,44 @@ public class ODataJsonDeserializerEntityTest extends AbstractODataDeserializerTe } } + @SuppressWarnings("unchecked") + @Test + public void eTMixPrimCollCompMIssingPropertyInComplexType() throws Exception { + final String entityString = "{" + + "\"PropertyComp\":{\"PropertyInt16\":111}," + + "\"CollPropertyComp\":[" + + "{\"PropertyInt16\":123}," + + "{\"PropertyInt16\":456}," + + "{\"PropertyInt16\":789}]}"; + + InputStream stream = new ByteArrayInputStream(entityString.getBytes()); + ODataDeserializer deserializer = OData.newInstance().createDeserializer(ODataFormat.JSON); + Entity entity = + deserializer.entity(stream, edm.getEntityType(new FullQualifiedName("Namespace1_Alias", "ETMixPrimCollComp"))); + assertNotNull(entity); + List properties = entity.getProperties(); + assertNotNull(properties); + assertEquals(2, properties.size()); + + Property complexProperty = entity.getProperty("PropertyComp"); + assertEquals(ValueType.COMPLEX, complexProperty.getValueType()); + List complexPropertyValues = (List) complexProperty.getValue(); + assertEquals(1, complexPropertyValues.size()); + + Property property = entity.getProperty("CollPropertyComp"); + assertEquals(ValueType.COLLECTION_COMPLEX, property.getValueType()); + + assertTrue(property.getValue() instanceof List); + List asCollection = property.asCollection(); + assertEquals(3, asCollection.size()); + + for (Object arrayElement : asCollection) { + assertTrue(arrayElement instanceof List); + List castedArrayElement = (List) arrayElement; + assertEquals(1, castedArrayElement.size()); + } + } + @Test public void simpleEntityWithContextURL() throws Exception { String entityString = @@ -377,6 +416,30 @@ public class ODataJsonDeserializerEntityTest extends AbstractODataDeserializerTe assertTrue(bindingToMany.getBindingLinks().isEmpty()); } + @Ignore + @SuppressWarnings("unchecked") + @Test + public void eTTwoKeyNavEnumTest() throws Exception { + String entityString = "{" + + "\"PropertyEnumString\" : 2," + + "\"PropertyCompEnum\" : {" + + "\"PropertyEnumString\" : 2" + + "}}"; + + InputStream stream = new ByteArrayInputStream(entityString.getBytes()); + ODataDeserializer deserializer = OData.newInstance().createDeserializer(ODataFormat.JSON); + Entity entity = + deserializer.entity(stream, edm.getEntityType(new FullQualifiedName("Namespace1_Alias", "ETTwoKeyNav"))); + + Property enumProperty = entity.getProperty("PropertyEnumString"); + assertNotNull(enumProperty); + assertEquals((short) 2, enumProperty.getValue()); + + Property complexProperty = entity.getProperty("PropertyCompEnum"); + List value = (List) complexProperty.getValue(); + assertEquals((short) 2, value.get(0).getValue()); + } + // ---------------------------------- Negative Tests ----------------------------------------------------------- @Test(expected = DeserializerException.class) @@ -894,7 +957,6 @@ public class ODataJsonDeserializerEntityTest extends AbstractODataDeserializerTe throw e; } } - @Test(expected = DeserializerException.class) public void invalidJsonValueForPrimTypeArray() throws Exception { @@ -905,11 +967,11 @@ public class ODataJsonDeserializerEntityTest extends AbstractODataDeserializerTe try { deserializer.entity(stream, edm.getEntityType(new FullQualifiedName("Namespace1_Alias", "ETAllPrim"))); } catch (DeserializerException e) { - assertEquals(DeserializerException.MessageKeys.INVALID_TYPE_FOR_PROPERTY, e.getMessageKey()); + assertEquals(DeserializerException.MessageKeys.INVALID_JSON_TYPE_FOR_PROPERTY, e.getMessageKey()); throw e; } } - + @Test(expected = DeserializerException.class) public void invalidJsonValueForPrimTypeObject() throws Exception { String entityString = @@ -919,11 +981,237 @@ public class ODataJsonDeserializerEntityTest extends AbstractODataDeserializerTe try { deserializer.entity(stream, edm.getEntityType(new FullQualifiedName("Namespace1_Alias", "ETAllPrim"))); } catch (DeserializerException e) { - assertEquals(DeserializerException.MessageKeys.INVALID_TYPE_FOR_PROPERTY, e.getMessageKey()); + assertEquals(DeserializerException.MessageKeys.INVALID_JSON_TYPE_FOR_PROPERTY, e.getMessageKey()); throw e; } } + @Test(expected = DeserializerException.class) + public void invalidJsonValueForPrimCollectionTypeObject() throws Exception { + final String entityString = "{" + + "\"CollPropertyString\":" + + "{\"Employee1@company.example\":1234}" + + "}"; + InputStream stream = new ByteArrayInputStream(entityString.getBytes()); + ODataDeserializer deserializer = OData.newInstance().createDeserializer(ODataFormat.JSON); + try { + deserializer.entity(stream, edm.getEntityType(new FullQualifiedName("Namespace1_Alias", "ETMixPrimCollComp"))); + } catch (DeserializerException e) { + assertEquals(DeserializerException.MessageKeys.INVALID_JSON_TYPE_FOR_PROPERTY, e.getMessageKey()); + throw e; + } + } + + @Test(expected = DeserializerException.class) + public void invalidJsonValueForComplexTypeTypeString() throws Exception { + final String entityString = "{" + + "\"PropertyComp\":\"InvalidString\"" + + "}"; + InputStream stream = new ByteArrayInputStream(entityString.getBytes()); + ODataDeserializer deserializer = OData.newInstance().createDeserializer(ODataFormat.JSON); + try { + deserializer.entity(stream, edm.getEntityType(new FullQualifiedName("Namespace1_Alias", "ETMixPrimCollComp"))); + } catch (DeserializerException e) { + assertEquals(DeserializerException.MessageKeys.INVALID_JSON_TYPE_FOR_PROPERTY, e.getMessageKey()); + throw e; + } + } + + @Test(expected = DeserializerException.class) + public void invalidJsonValueForComplexTypeNull() throws Exception { + final String entityString = "{" + + "\"PropertyComp\":null" + + "}"; + InputStream stream = new ByteArrayInputStream(entityString.getBytes()); + ODataDeserializer deserializer = OData.newInstance().createDeserializer(ODataFormat.JSON); + try { + deserializer.entity(stream, edm.getEntityType(new FullQualifiedName("Namespace1_Alias", "ETMixPrimCollComp"))); + } catch (DeserializerException e) { + assertEquals(DeserializerException.MessageKeys.INVALID_NULL_PROPERTY, e.getMessageKey()); + throw e; + } + } + + @Test(expected = DeserializerException.class) + public void invalidJsonValueForComplexCollectionNullValue() throws Exception { + final String entityString = "{" + + "\"CollPropertyComp\":[" + + "null," + + "{\"PropertyInt16\":789,\"PropertyString\":\"TEST 3\"}]}"; + InputStream stream = new ByteArrayInputStream(entityString.getBytes()); + ODataDeserializer deserializer = OData.newInstance().createDeserializer(ODataFormat.JSON); + try { + deserializer.entity(stream, edm.getEntityType(new FullQualifiedName("Namespace1_Alias", "ETMixPrimCollComp"))); + } catch (DeserializerException e) { + assertEquals(DeserializerException.MessageKeys.INVALID_JSON_TYPE_FOR_PROPERTY, e.getMessageKey()); + throw e; + } + } + + @Test(expected = DeserializerException.class) + public void invalidJsonValueForPrimPropertyInComplexTypeNull() throws Exception { + final String entityString = "{" + + "\"PropertyComp\":{\"PropertyInt16\":null,\"PropertyString\":\"TEST A\"}" + + "}"; + InputStream stream = new ByteArrayInputStream(entityString.getBytes()); + ODataDeserializer deserializer = OData.newInstance().createDeserializer(ODataFormat.JSON); + try { + deserializer.entity(stream, edm.getEntityType(new FullQualifiedName("Namespace1_Alias", "ETMixPrimCollComp"))); + } catch (DeserializerException e) { + assertEquals(DeserializerException.MessageKeys.INVALID_NULL_PROPERTY, e.getMessageKey()); + throw e; + } + } + + @Test(expected = DeserializerException.class) + public void provokedPrimitiveTypeException() throws Exception { + final String entityString = "{" + + "\"PropertyInt16\":32767000000000000000000000000000000000000" + + "}"; + InputStream stream = new ByteArrayInputStream(entityString.getBytes()); + ODataDeserializer deserializer = OData.newInstance().createDeserializer(ODataFormat.JSON); + try { + deserializer.entity(stream, edm.getEntityType(new FullQualifiedName("Namespace1_Alias", "ETMixPrimCollComp"))); + } catch (DeserializerException e) { + assertEquals(DeserializerException.MessageKeys.INVALID_VALUE_FOR_PROPERTY, e.getMessageKey()); + throw e; + } + } + + @Ignore + @Test(expected = DeserializerException.class) + public void eTTwoKeyNavInvalidEnumValueNull() throws Exception { + String entityString = "{" + + "\"PropertyEnumString\" : null," + + "\"PropertyCompEnum\" : {" + + "\"PropertyEnumString\" : 2" + + "}}"; + + InputStream stream = new ByteArrayInputStream(entityString.getBytes()); + ODataDeserializer deserializer = OData.newInstance().createDeserializer(ODataFormat.JSON); + try { + deserializer.entity(stream, edm.getEntityType(new FullQualifiedName("Namespace1_Alias", "ETTwoKeyNav"))); + } catch (DeserializerException e) { + assertEquals(DeserializerException.MessageKeys.INVALID_NULL_PROPERTY, e.getMessageKey()); + throw e; + } + } + + @Ignore + @Test(expected = DeserializerException.class) + public void eTTwoKeyNavInvalidComplexEnumValueNull() throws Exception { + String entityString = "{" + + "\"PropertyEnumString\" : 2," + + "\"PropertyCompEnum\" : {" + + "\"PropertyEnumString\" : null" + + "}}"; + + InputStream stream = new ByteArrayInputStream(entityString.getBytes()); + ODataDeserializer deserializer = OData.newInstance().createDeserializer(ODataFormat.JSON); + try { + deserializer.entity(stream, edm.getEntityType(new FullQualifiedName("Namespace1_Alias", "ETTwoKeyNav"))); + } catch (DeserializerException e) { + assertEquals(DeserializerException.MessageKeys.INVALID_NULL_PROPERTY, e.getMessageKey()); + throw e; + } + } + + @Ignore + @Test(expected = DeserializerException.class) + public void eTTwoKeyNavInvalidEnumValueArray() throws Exception { + String entityString = "{" + + "\"PropertyEnumString\" : []," + + "\"PropertyCompEnum\" : {" + + "\"PropertyEnumString\" : 2" + + "}}"; + + InputStream stream = new ByteArrayInputStream(entityString.getBytes()); + ODataDeserializer deserializer = OData.newInstance().createDeserializer(ODataFormat.JSON); + try { + deserializer.entity(stream, edm.getEntityType(new FullQualifiedName("Namespace1_Alias", "ETTwoKeyNav"))); + } catch (DeserializerException e) { + assertEquals(DeserializerException.MessageKeys.INVALID_JSON_TYPE_FOR_PROPERTY, e.getMessageKey()); + throw e; + } + } + + @Ignore + @Test(expected = DeserializerException.class) + public void eTTwoKeyNavInvalidEnumValueObject() throws Exception { + String entityString = "{" + + "\"PropertyEnumString\" : {}," + + "\"PropertyCompEnum\" : {" + + "\"PropertyEnumString\" : 2" + + "}}"; + + InputStream stream = new ByteArrayInputStream(entityString.getBytes()); + ODataDeserializer deserializer = OData.newInstance().createDeserializer(ODataFormat.JSON); + try { + deserializer.entity(stream, edm.getEntityType(new FullQualifiedName("Namespace1_Alias", "ETTwoKeyNav"))); + } catch (DeserializerException e) { + assertEquals(DeserializerException.MessageKeys.INVALID_JSON_TYPE_FOR_PROPERTY, e.getMessageKey()); + throw e; + } + } + + @Ignore + @Test(expected = DeserializerException.class) + public void eTTwoKeyNavInvalidEnumValue() throws Exception { + String entityString = "{" + + "\"PropertyEnumString\" : \"invalid\"," + + "\"PropertyCompEnum\" : {" + + "\"PropertyEnumString\" : 2" + + "}}"; + + InputStream stream = new ByteArrayInputStream(entityString.getBytes()); + ODataDeserializer deserializer = OData.newInstance().createDeserializer(ODataFormat.JSON); + try { + deserializer.entity(stream, edm.getEntityType(new FullQualifiedName("Namespace1_Alias", "ETTwoKeyNav"))); + } catch (DeserializerException e) { + assertEquals(DeserializerException.MessageKeys.INVALID_VALUE_FOR_PROPERTY, e.getMessageKey()); + throw e; + } + } + + @Ignore + @Test(expected = DeserializerException.class) + public void eTTwoKeyNavInvalidEnumValueByPrimitiveTypeException() throws Exception { + String entityString = "{" + + "\"PropertyEnumString\" : 18," + + "\"PropertyCompEnum\" : {" + + "\"PropertyEnumString\" : 2" + + "}}"; + + InputStream stream = new ByteArrayInputStream(entityString.getBytes()); + ODataDeserializer deserializer = OData.newInstance().createDeserializer(ODataFormat.JSON); + try { + deserializer.entity(stream, edm.getEntityType(new FullQualifiedName("Namespace1_Alias", "ETTwoKeyNav"))); + } catch (DeserializerException e) { + assertEquals(DeserializerException.MessageKeys.INVALID_VALUE_FOR_PROPERTY, e.getMessageKey()); + throw e; + } + } + +// @Test(expected = DeserializerException.class) +// public void invalidJsonValueForPrimCollectionTypeObject() throws Exception { +// final String entityString = "{" +// + "\"PropertyInt16\":32767," +// + "\"CollPropertyString\":" +// + "[\"Employee1@company.example\",\"Employee2@company.example\",\"Employee3@company.example\"]," +// + "\"PropertyComp\":{\"PropertyInt16\":111,\"PropertyString\":\"TEST A\"}," +// + "\"CollPropertyComp\":[" +// + "{\"PropertyInt16\":123,\"PropertyString\":\"TEST 1\"}," +// + "{\"PropertyInt16\":456,\"PropertyString\":\"TEST 2\"}," +// + "{\"PropertyInt16\":789,\"PropertyString\":\"TEST 3\"}]}"; +// InputStream stream = new ByteArrayInputStream(entityString.getBytes()); +// ODataDeserializer deserializer = OData.newInstance().createDeserializer(ODataFormat.JSON); +// try { +// deserializer.entity(stream, edm.getEntityType(new FullQualifiedName("Namespace1_Alias", "ETMixPrimCollComp"))); +// } catch (DeserializerException e) { +// assertEquals(DeserializerException.MessageKeys.INVALID_JSON_TYPE_FOR_PROPERTY, e.getMessageKey()); +// throw e; +// } +// } private void checkPropertyJsonType(String entityString) throws DeserializerException { InputStream stream = new ByteArrayInputStream(entityString.getBytes()); diff --git a/lib/server-test/src/test/java/org/apache/olingo/server/core/uri/antlr/TestFullResourcePath.java b/lib/server-test/src/test/java/org/apache/olingo/server/core/uri/antlr/TestFullResourcePath.java index 333b9209d..911f24d29 100644 --- a/lib/server-test/src/test/java/org/apache/olingo/server/core/uri/antlr/TestFullResourcePath.java +++ b/lib/server-test/src/test/java/org/apache/olingo/server/core/uri/antlr/TestFullResourcePath.java @@ -1127,10 +1127,10 @@ public class TestFullResourcePath { @Test public void runEsNameKeyCast() throws Exception { // testUri.runEx("ESTwoPrim(1)/olingo.odata.test1.ETBase(1)") - // .isExSemantic(UriParserSemanticException.MessageKeys.xxx); + // .isExSemantic(UriParserSemanticException.MessageKeys.xxx); // testUri.runEx("ESTwoPrim/olingo.odata.test1.ETBase(1)/olingo.odata.test1.ETTwoBase(1)") - // .isExSemantic(UriParserSemanticException.MessageKeys.xxx); + // .isExSemantic(UriParserSemanticException.MessageKeys.xxx); testUri.runEx("ESBase/olingo.odata.test1.ETTwoPrim(1)") .isExSemantic(UriParserSemanticException.MessageKeys.INCOMPATIBLE_TYPE_FILTER); @@ -2393,7 +2393,7 @@ public class TestFullResourcePath { testUri.run("ESTwoKeyNav(PropertyInt16=1,PropertyString='2')", "$expand=olingo.odata.test1.ETBaseTwoKeyNav" - + "/NavPropertyETTwoKeyNavMany/olingo.odata.test1.ETTwoBaseTwoKeyNav") + + "/NavPropertyETTwoKeyNavMany/olingo.odata.test1.ETTwoBaseTwoKeyNav") .isKind(UriInfoKind.resource).goPath().first() .isKeyPredicate(0, "PropertyInt16", "1") .isKeyPredicate(1, "PropertyString", "'2'") @@ -4452,36 +4452,39 @@ public class TestFullResourcePath { @Test public void testHas() throws ExpressionVisitException, ODataApplicationException, UriParserException { - testFilter.runOnETTwoKeyNav("PropertyEnumString has olingo.odata.test1.ENString'String1'") + testFilter.runOnETMixEnumTypeDefCollComp("PropertyEnumString has olingo.odata.test1.ENString'String1'") .is("< has >>") .isBinary(BinaryOperatorKind.HAS) .root().left().goPath().isComplex("PropertyEnumString").isType(EnumTypeProvider.nameENString) .goUpFilterValidator() .root().right().isEnum(EnumTypeProvider.nameENString, Arrays.asList("String1")); - testFilter.runOnETTwoKeyNav("PropertyCompEnum/PropertyEnumString has olingo.odata.test1.ENString'String2'") - .is("< has >>") + testFilter.runOnETMixEnumTypeDefCollComp( + "PropertyCTMixEnumTypeDefColl/PropertyEnumString has olingo.odata.test1.ENString'String2'") + .is("< has >>") .isBinary(BinaryOperatorKind.HAS) .root().left().goPath() - .first().isComplex("PropertyCompEnum") + .first().isComplex("PropertyCTMixEnumTypeDefColl") .n().isComplex("PropertyEnumString").isType(EnumTypeProvider.nameENString) .isType(EnumTypeProvider.nameENString) .goUpFilterValidator() .root().right().isEnum(EnumTypeProvider.nameENString, Arrays.asList("String2")); - testFilter.runOnETTwoKeyNav( - "PropertyCompEnum/PropertyEnumString has olingo.odata.test1.ENString'String2' eq true") - .is("<< has >> eq >") + testFilter + .runOnETMixEnumTypeDefCollComp( + "PropertyCTMixEnumTypeDefColl/PropertyEnumString has olingo.odata.test1.ENString'String2' eq true") + .is("<< has " + + ">> eq >") .isBinary(BinaryOperatorKind.EQ) .root().left() .isBinary(BinaryOperatorKind.HAS) .root().left().left().goPath() - .first().isComplex("PropertyCompEnum") + .first().isComplex("PropertyCTMixEnumTypeDefColl") .n().isComplex("PropertyEnumString").isType(EnumTypeProvider.nameENString) .goUpFilterValidator() .root().left().right().isEnum(EnumTypeProvider.nameENString, Arrays.asList("String2")); - testFilter.runOnETTwoKeyNav("PropertyEnumString has olingo.odata.test1.ENString'String3'") + testFilter.runOnETMixEnumTypeDefCollComp("PropertyEnumString has olingo.odata.test1.ENString'String3'") .is("< has >>") .isBinary(BinaryOperatorKind.HAS) .root().left().goPath() @@ -4490,7 +4493,7 @@ public class TestFullResourcePath { .goUpFilterValidator() .root().right().isEnum(EnumTypeProvider.nameENString, Arrays.asList("String3")); - testFilter.runOnETTwoKeyNav("PropertyEnumString has olingo.odata.test1.ENString'String,String3'") + testFilter.runOnETMixEnumTypeDefCollComp("PropertyEnumString has olingo.odata.test1.ENString'String,String3'") .is("< has >>") .isBinary(BinaryOperatorKind.HAS) .root().left().goPath() @@ -4499,7 +4502,7 @@ public class TestFullResourcePath { .goUpFilterValidator() .root().right().isEnum(EnumTypeProvider.nameENString, Arrays.asList("String", "String3")); - testFilter.runOnETTwoKeyNav("PropertyEnumString has null") + testFilter.runOnETMixEnumTypeDefCollComp("PropertyEnumString has null") .is("< has >") .root() .isBinary(BinaryOperatorKind.HAS) @@ -4716,36 +4719,38 @@ public class TestFullResourcePath { .goUpFilterValidator() .root().right().isLiteral("12:34:55.12345678901"); - testFilter.runOnETTwoKeyNav("PropertyEnumString eq olingo.odata.test1.ENString'String1'") + testFilter.runOnETMixEnumTypeDefCollComp("PropertyEnumString eq olingo.odata.test1.ENString'String1'") .is("< eq >>") .isBinary(BinaryOperatorKind.EQ) .root().left().goPath().isComplex("PropertyEnumString").isType(EnumTypeProvider.nameENString) .goUpFilterValidator() .root().right().isEnum(EnumTypeProvider.nameENString, Arrays.asList("String1")); - testFilter.runOnETTwoKeyNav("PropertyEnumString eq olingo.odata.test1.ENString'String2'") + testFilter.runOnETMixEnumTypeDefCollComp("PropertyEnumString eq olingo.odata.test1.ENString'String2'") .is("< eq >>") .isBinary(BinaryOperatorKind.EQ) .root().left().goPath().isComplex("PropertyEnumString").isType(EnumTypeProvider.nameENString) .goUpFilterValidator() .root().right().isEnum(EnumTypeProvider.nameENString, Arrays.asList("String2")); - testFilter.runOnETTwoKeyNav("PropertyCompEnum/PropertyEnumString eq olingo.odata.test1.ENString'String3'") - .is("< eq >>") + testFilter.runOnETMixEnumTypeDefCollComp( + "PropertyCTMixEnumTypeDefColl/PropertyEnumString eq olingo.odata.test1.ENString'String3'") + .is("< eq >>") .isBinary(BinaryOperatorKind.EQ) .root().left().goPath() - .first().isComplex("PropertyCompEnum") + .first().isComplex("PropertyCTMixEnumTypeDefColl") .n().isComplex("PropertyEnumString").isType(EnumTypeProvider.nameENString).goUpFilterValidator() .root().right().isEnum(EnumTypeProvider.nameENString, Arrays.asList("String3")); - testFilter.runOnETTwoKeyNav("PropertyCompEnum/PropertyEnumString eq PropertyCompEnum/PropertyEnumString") - .is("< eq >") + testFilter.runOnETMixEnumTypeDefCollComp( + "PropertyCTMixEnumTypeDefColl/PropertyEnumString eq PropertyCTMixEnumTypeDefColl/PropertyEnumString") + .is("< eq >") .isBinary(BinaryOperatorKind.EQ) .root().left().goPath() - .first().isComplex("PropertyCompEnum") + .first().isComplex("PropertyCTMixEnumTypeDefColl") .n().isComplex("PropertyEnumString").isType(EnumTypeProvider.nameENString).goUpFilterValidator() .root().right().goPath() - .first().isComplex("PropertyCompEnum") + .first().isComplex("PropertyCTMixEnumTypeDefColl") .n().isComplex("PropertyEnumString").isType(EnumTypeProvider.nameENString).goUpFilterValidator(); } @@ -5065,12 +5070,12 @@ public class TestFullResourcePath { .goUpFilterValidator() .goOrder(0).right().isLiteral("12:34:55.123456789012"); - testFilter.runOrderByOnETTwoKeyNav("PropertyEnumString eq olingo.odata.test1.ENString'String1'") + testFilter.runOrderByOnETMixEnumTypeDefCollComp("PropertyEnumString eq olingo.odata.test1.ENString'String1'") .isSortOrder(0, false) .goOrder(0).left().goPath().isComplex("PropertyEnumString").goUpFilterValidator() .goOrder(0).right().isEnum(EnumTypeProvider.nameENString, Arrays.asList("String1")); - testFilter.runOrderByOnETTwoKeyNav("PropertyEnumString eq olingo.odata.test1.ENString'String1' desc") + testFilter.runOrderByOnETMixEnumTypeDefCollComp("PropertyEnumString eq olingo.odata.test1.ENString'String1' desc") .isSortOrder(0, true) .goOrder(0).left().goPath().isComplex("PropertyEnumString").goUpFilterValidator() .goOrder(0).right().isEnum(EnumTypeProvider.nameENString, Arrays.asList("String1")); diff --git a/lib/server-test/src/test/java/org/apache/olingo/server/core/uri/testutil/FilterValidator.java b/lib/server-test/src/test/java/org/apache/olingo/server/core/uri/testutil/FilterValidator.java index 21d8935d6..ff77f940b 100644 --- a/lib/server-test/src/test/java/org/apache/olingo/server/core/uri/testutil/FilterValidator.java +++ b/lib/server-test/src/test/java/org/apache/olingo/server/core/uri/testutil/FilterValidator.java @@ -112,6 +112,10 @@ public class FilterValidator implements TestValidator { public FilterValidator runOrderByOnETTwoKeyNav(final String orderBy) throws UriParserException { return runUriOrderBy("ESTwoKeyNav", "$orderby=" + orderBy.trim()); } + + public FilterValidator runOrderByOnETMixEnumTypeDefCollComp(final String orderBy) throws UriParserException { + return runUriOrderBy("ESMixEnumTypeDefCollComp", "$orderby=" + orderBy.trim()); + } public FilterValidator runOrderByOnETTwoKeyNavEx(final String orderBy) throws UriParserException { return runUriOrderByEx("ESTwoKeyNav", "$orderby=" + orderBy.trim()); @@ -120,6 +124,10 @@ public class FilterValidator implements TestValidator { public FilterValidator runOnETTwoKeyNav(final String filter) throws UriParserException { return runUri("ESTwoKeyNav", "$filter=" + filter.trim()); } + + public FilterValidator runOnETMixEnumTypeDefCollComp(final String filter) throws UriParserException { + return runUri("ESMixEnumTypeDefCollComp", "$filter=" + filter.trim()); + } public FilterValidator runOnETTwoKeyNavSingle(final String filter) throws UriParserException { return runUri("SINav", "$filter=" + filter.trim());