Repository: olingo-odata2 Updated Branches: refs/heads/master ee4b64337 -> 742560d27
[OLINGO-1088] Improve V2 serialization error messages Signed-off-by: Christian Amend <[email protected]> Project: http://git-wip-us.apache.org/repos/asf/olingo-odata2/repo Commit: http://git-wip-us.apache.org/repos/asf/olingo-odata2/commit/742560d2 Tree: http://git-wip-us.apache.org/repos/asf/olingo-odata2/tree/742560d2 Diff: http://git-wip-us.apache.org/repos/asf/olingo-odata2/diff/742560d2 Branch: refs/heads/master Commit: 742560d27b5498860a9fb4d63eb11f8cf1d294dd Parents: ee4b643 Author: i050510 <[email protected]> Authored: Wed Mar 1 14:35:27 2017 +0530 Committer: Christian Amend <[email protected]> Committed: Wed Mar 1 15:51:47 2017 +0100 ---------------------------------------------------------------------- .../odata2/api/edm/EdmSimpleTypeException.java | 13 ++ .../odata2/api/exception/MessageReference.java | 10 ++ .../odata2/core/ep/BasicEntityProvider.java | 9 +- .../ep/producer/AtomEntryEntityProducer.java | 37 ++++- .../ep/producer/JsonPropertyEntityProducer.java | 10 +- .../ep/producer/XmlPropertyEntityProducer.java | 15 +- .../src/main/resources/i18n.properties | 2 + .../core/ep/producer/AtomEntryProducerTest.java | 163 +++++++++++++++++++ .../producer/JsonEntryEntityProducerTest.java | 161 ++++++++++++++++++ .../olingo/odata2/testutil/mock/EdmMock.java | 28 +++- 10 files changed, 434 insertions(+), 14 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/742560d2/odata2-lib/odata-api/src/main/java/org/apache/olingo/odata2/api/edm/EdmSimpleTypeException.java ---------------------------------------------------------------------- diff --git a/odata2-lib/odata-api/src/main/java/org/apache/olingo/odata2/api/edm/EdmSimpleTypeException.java b/odata2-lib/odata-api/src/main/java/org/apache/olingo/odata2/api/edm/EdmSimpleTypeException.java index 771623c..a003808 100644 --- a/odata2-lib/odata-api/src/main/java/org/apache/olingo/odata2/api/edm/EdmSimpleTypeException.java +++ b/odata2-lib/odata-api/src/main/java/org/apache/olingo/odata2/api/edm/EdmSimpleTypeException.java @@ -53,6 +53,10 @@ public class EdmSimpleTypeException extends EdmException { "VALUE_ILLEGAL_CONTENT"); public static final MessageReference VALUE_FACETS_NOT_MATCHED = createMessageReference(EdmSimpleTypeException.class, "VALUE_FACETS_NOT_MATCHED"); + public static final MessageReference PROPERTY_VALUE_NULL_NOT_ALLOWED = createMessageReference( + EdmSimpleTypeException.class, "PROPERTY_VALUE_NULL_NOT_ALLOWED"); + public static final MessageReference PROPERTY_VALUE_FACETS_NOT_MATCHED = createMessageReference( + EdmSimpleTypeException.class,"PROPERTY_VALUE_FACETS_NOT_MATCHED"); public EdmSimpleTypeException(final MessageReference messageReference) { super(messageReference); @@ -70,4 +74,13 @@ public class EdmSimpleTypeException extends EdmException { final String errorCode) { super(messageReference, cause, errorCode); } + + public static MessageReference getMessageReference(final MessageReference messageReference) { + if (EdmSimpleTypeException.VALUE_NULL_NOT_ALLOWED.equals(messageReference)) { + return EdmSimpleTypeException.PROPERTY_VALUE_NULL_NOT_ALLOWED; + } else if (EdmSimpleTypeException.VALUE_FACETS_NOT_MATCHED.equals(messageReference)) { + return EdmSimpleTypeException.PROPERTY_VALUE_FACETS_NOT_MATCHED; + } + return messageReference; + } } http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/742560d2/odata2-lib/odata-api/src/main/java/org/apache/olingo/odata2/api/exception/MessageReference.java ---------------------------------------------------------------------- diff --git a/odata2-lib/odata-api/src/main/java/org/apache/olingo/odata2/api/exception/MessageReference.java b/odata2-lib/odata-api/src/main/java/org/apache/olingo/odata2/api/exception/MessageReference.java index 4f0f5be..fe22695 100644 --- a/odata2-lib/odata-api/src/main/java/org/apache/olingo/odata2/api/exception/MessageReference.java +++ b/odata2-lib/odata-api/src/main/java/org/apache/olingo/odata2/api/exception/MessageReference.java @@ -172,4 +172,14 @@ public abstract class MessageReference { } return true; } + + public MessageReference updateContent(List<?> oldContent, Object... newContent) { + + final List<Object> mergedContent = new ArrayList<Object>(); + if (oldContent != null && oldContent.size() > 0) { + mergedContent.addAll(oldContent); + } + mergedContent.addAll(Arrays.asList(newContent)); + return new SimpleMessageReference(key, mergedContent); + } } http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/742560d2/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/ep/BasicEntityProvider.java ---------------------------------------------------------------------- diff --git a/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/ep/BasicEntityProvider.java b/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/ep/BasicEntityProvider.java index 7766431..287f88c 100644 --- a/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/ep/BasicEntityProvider.java +++ b/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/ep/BasicEntityProvider.java @@ -42,6 +42,7 @@ import org.apache.olingo.odata2.api.edm.EdmException; import org.apache.olingo.odata2.api.edm.EdmLiteralKind; import org.apache.olingo.odata2.api.edm.EdmProperty; import org.apache.olingo.odata2.api.edm.EdmSimpleType; +import org.apache.olingo.odata2.api.edm.EdmSimpleTypeException; import org.apache.olingo.odata2.api.edm.EdmSimpleTypeKind; import org.apache.olingo.odata2.api.edm.provider.DataServices; import org.apache.olingo.odata2.api.edm.provider.EntityType; @@ -173,7 +174,13 @@ public class BasicEntityProvider { return writeBinary(contentType, (byte[]) binary); } else { - return writeText(type.valueToString(value, EdmLiteralKind.DEFAULT, edmProperty.getFacets())); + try { + return writeText(type.valueToString(value, EdmLiteralKind.DEFAULT, edmProperty.getFacets())); + } catch (EdmSimpleTypeException e) { + throw new EntityProviderProducerException(EdmSimpleTypeException.getMessageReference( + e.getMessageReference()).updateContent(e.getMessageReference().getContent(), + edmProperty.getName()), e); + } } } catch (EdmException e) { http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/742560d2/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/ep/producer/AtomEntryEntityProducer.java ---------------------------------------------------------------------- diff --git a/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/ep/producer/AtomEntryEntityProducer.java b/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/ep/producer/AtomEntryEntityProducer.java index 9c20bff..5622d39 100644 --- a/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/ep/producer/AtomEntryEntityProducer.java +++ b/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/ep/producer/AtomEntryEntityProducer.java @@ -181,11 +181,13 @@ public class AtomEntryEntityProducer { protected static String createETag(final EntityInfoAggregator eia, final Map<String, Object> data) throws EntityProviderException { + String propertyName = ""; try { String etag = null; Collection<EntityPropertyInfo> propertyInfos = eia.getETagPropertyInfos(); for (EntityPropertyInfo propertyInfo : propertyInfos) { + propertyName = propertyInfo.getName(); EdmType edmType = propertyInfo.getType(); if (edmType instanceof EdmSimpleType) { EdmSimpleType edmSimpleType = (EdmSimpleType) edmType; @@ -209,7 +211,8 @@ public class AtomEntryEntityProducer { return etag; } catch (EdmSimpleTypeException e) { - throw new EntityProviderProducerException(e.getMessageReference(), e); + throw new EntityProviderProducerException(EdmSimpleTypeException.getMessageReference( + e.getMessageReference()).updateContent(e.getMessageReference().getContent(), propertyName), e); } } @@ -439,7 +442,14 @@ public class AtomEntryEntityProducer { if (titleInfo != null) { EdmSimpleType st = (EdmSimpleType) titleInfo.getType(); Object object = data.get(titleInfo.getName()); - String title = st.valueToString(object, EdmLiteralKind.DEFAULT, titleInfo.getFacets()); + String title = null; + try { + title = st.valueToString(object, EdmLiteralKind.DEFAULT, titleInfo.getFacets()); + } catch (final EdmSimpleTypeException e) { + throw new EntityProviderProducerException( + EdmSimpleTypeException.getMessageReference(e.getMessageReference()). + updateContent(e.getMessageReference().getContent(), titleInfo.getName()), e); + } if (title != null) { writer.writeCharacters(title); } @@ -461,7 +471,7 @@ public class AtomEntryEntityProducer { } String getUpdatedString(final EntityInfoAggregator eia, final Map<String, Object> data) - throws EdmSimpleTypeException { + throws EdmSimpleTypeException, EntityProviderProducerException { Object updateDate = null; EdmFacets updateFacets = null; EntityPropertyInfo updatedInfo = eia.getTargetPathInfo(EdmTargetPath.SYNDICATION_UPDATED); @@ -474,21 +484,30 @@ public class AtomEntryEntityProducer { if (updateDate == null) { updateDate = new Date(); } - return EdmDateTimeOffset.getInstance().valueToString(updateDate, EdmLiteralKind.DEFAULT, updateFacets); + try { + return EdmDateTimeOffset.getInstance().valueToString(updateDate, EdmLiteralKind.DEFAULT, updateFacets); + } catch (final EdmSimpleTypeException e) { + throw new EntityProviderProducerException( + EdmSimpleTypeException.getMessageReference(e.getMessageReference()). + updateContent(e.getMessageReference().getContent(), updatedInfo.getName()), e); + } } private String getTargetPathValue(final EntityInfoAggregator eia, final String targetPath, final Map<String, Object> data) throws EntityProviderException { + EntityPropertyInfo info = null; try { - EntityPropertyInfo info = eia.getTargetPathInfo(targetPath); + info = eia.getTargetPathInfo(targetPath); if (info != null) { EdmSimpleType type = (EdmSimpleType) info.getType(); Object value = data.get(info.getName()); return type.valueToString(value, EdmLiteralKind.DEFAULT, info.getFacets()); } return null; - } catch (EdmSimpleTypeException e) { - throw new EntityProviderProducerException(e.getMessageReference(), e); + } catch (final EdmSimpleTypeException e) { + throw new EntityProviderProducerException( + EdmSimpleTypeException.getMessageReference(e.getMessageReference()). + updateContent(e.getMessageReference().getContent(), info.getName()), e); } } @@ -585,7 +604,9 @@ public class AtomEntryEntityProducer { keys.append(Encoder.encode(type.valueToString(data.get(name), EdmLiteralKind.URI, keyPropertyInfo.getFacets()))); } catch (final EdmSimpleTypeException e) { - throw new EntityProviderProducerException(e.getMessageReference(), e); + throw new EntityProviderProducerException( + EdmSimpleTypeException.getMessageReference(e.getMessageReference()). + updateContent(e.getMessageReference().getContent(), name), e); } } http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/742560d2/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/ep/producer/JsonPropertyEntityProducer.java ---------------------------------------------------------------------- diff --git a/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/ep/producer/JsonPropertyEntityProducer.java b/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/ep/producer/JsonPropertyEntityProducer.java index 9de1f9f..64fef53 100644 --- a/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/ep/producer/JsonPropertyEntityProducer.java +++ b/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/ep/producer/JsonPropertyEntityProducer.java @@ -27,6 +27,7 @@ import org.apache.olingo.odata2.api.edm.EdmException; import org.apache.olingo.odata2.api.edm.EdmFacets; import org.apache.olingo.odata2.api.edm.EdmLiteralKind; import org.apache.olingo.odata2.api.edm.EdmSimpleType; +import org.apache.olingo.odata2.api.edm.EdmSimpleTypeException; import org.apache.olingo.odata2.api.edm.EdmSimpleTypeKind; import org.apache.olingo.odata2.api.edm.EdmType; import org.apache.olingo.odata2.api.ep.EntityProviderException; @@ -99,7 +100,14 @@ public class JsonPropertyEntityProducer { final EdmSimpleType type = (EdmSimpleType) propertyInfo.getType(); final Object contentValue = value instanceof Map ? ((Map<?, ?>) value).get(propertyInfo.getName()) : value; final EdmFacets facets = validatingFacets ? propertyInfo.getFacets(): null; - final String valueAsString = type.valueToString(contentValue, EdmLiteralKind.JSON, facets); + String valueAsString = null; + try { + valueAsString = type.valueToString(contentValue, EdmLiteralKind.JSON, facets); + } catch (EdmSimpleTypeException e) { + throw new EntityProviderProducerException(EdmSimpleTypeException.getMessageReference( + e.getMessageReference()).updateContent(e.getMessageReference().getContent(), + propertyInfo.getName()), e); + } switch (EdmSimpleTypeKind.valueOf(type.getName())) { case String: jsonStreamWriter.stringValue(valueAsString); http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/742560d2/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/ep/producer/XmlPropertyEntityProducer.java ---------------------------------------------------------------------- diff --git a/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/ep/producer/XmlPropertyEntityProducer.java b/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/ep/producer/XmlPropertyEntityProducer.java index 293545d..646963a 100644 --- a/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/ep/producer/XmlPropertyEntityProducer.java +++ b/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/ep/producer/XmlPropertyEntityProducer.java @@ -30,6 +30,7 @@ import org.apache.olingo.odata2.api.edm.EdmException; import org.apache.olingo.odata2.api.edm.EdmFacets; import org.apache.olingo.odata2.api.edm.EdmLiteralKind; import org.apache.olingo.odata2.api.edm.EdmSimpleType; +import org.apache.olingo.odata2.api.edm.EdmSimpleTypeException; import org.apache.olingo.odata2.api.ep.EntityProviderException; import org.apache.olingo.odata2.api.ep.EntityProviderWriteProperties; import org.apache.olingo.odata2.core.ep.EntityProviderProducerException; @@ -139,7 +140,7 @@ public class XmlPropertyEntityProducer { * @param value * @throws XMLStreamException * @throws EdmException - * @throws EntityProviderException + * @throws EntityProviderException */ private void appendProperty(final XMLStreamWriter writer, final EntityComplexPropertyInfo propertyInfo, final Object value) throws XMLStreamException, EdmException, EntityProviderException { @@ -190,9 +191,10 @@ public class XmlPropertyEntityProducer { * @param value the value of the property * @throws XMLStreamException * @throws EdmException + * @throws EntityProviderProducerException */ private void appendProperty(final XMLStreamWriter writer, final EntityPropertyInfo prop, final Object value) - throws XMLStreamException, EdmException { + throws XMLStreamException, EdmException, EntityProviderProducerException { Object contentValue = value; String mimeType = null; if (prop.getMimeType() != null) { @@ -213,7 +215,14 @@ public class XmlPropertyEntityProducer { } final EdmFacets facets = validateFacets ? prop.getFacets() : null; - final String valueAsString = type.valueToString(contentValue, EdmLiteralKind.DEFAULT, facets); + String valueAsString = null; + try { + valueAsString = type.valueToString(contentValue, EdmLiteralKind.DEFAULT, facets); + } catch (EdmSimpleTypeException e) { + throw new EntityProviderProducerException(EdmSimpleTypeException.getMessageReference( + e.getMessageReference()).updateContent( + e.getMessageReference().getContent(), prop.getName()), e); + } if (valueAsString == null) { writer.writeAttribute(Edm.NAMESPACE_M_2007_08, FormatXml.ATOM_NULL, FormatXml.ATOM_VALUE_TRUE); } else { http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/742560d2/odata2-lib/odata-core/src/main/resources/i18n.properties ---------------------------------------------------------------------- diff --git a/odata2-lib/odata-core/src/main/resources/i18n.properties b/odata2-lib/odata-core/src/main/resources/i18n.properties index 2de9892..23a906b 100644 --- a/odata2-lib/odata-core/src/main/resources/i18n.properties +++ b/odata2-lib/odata-core/src/main/resources/i18n.properties @@ -82,8 +82,10 @@ org.apache.olingo.odata2.api.edm.EdmSimpleTypeException.LITERAL_FACETS_NOT_MATCH org.apache.olingo.odata2.api.edm.EdmSimpleTypeException.LITERAL_UNCONVERTIBLE_TO_VALUE_TYPE=The literal '%1$s' can not be converted into the type '%1$s'. org.apache.olingo.odata2.api.edm.EdmSimpleTypeException.VALUE_TYPE_NOT_SUPPORTED=The type '%1$s' of the value object is not supported. org.apache.olingo.odata2.api.edm.EdmSimpleTypeException.VALUE_NULL_NOT_ALLOWED=The metadata do not allow a null value. +org.apache.olingo.odata2.api.edm.EdmSimpleTypeException.PROPERTY_VALUE_NULL_NOT_ALLOWED=The metadata do not allow a null value for property '%1$s'. org.apache.olingo.odata2.api.edm.EdmSimpleTypeException.VALUE_ILLEGAL_CONTENT=The value object '%1$s' can not be formatted properly due to its content. org.apache.olingo.odata2.api.edm.EdmSimpleTypeException.VALUE_FACETS_NOT_MATCHED=The metadata constraints '%2$s' do not allow to format the value '%1$s'. +org.apache.olingo.odata2.api.edm.EdmSimpleTypeException.PROPERTY_VALUE_FACETS_NOT_MATCHED=The metadata constraints '%2$s' do not allow to format the value '%1$s' for property '%3$s'. ################################## # EPexceptions http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/742560d2/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ep/producer/AtomEntryProducerTest.java ---------------------------------------------------------------------- diff --git a/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ep/producer/AtomEntryProducerTest.java b/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ep/producer/AtomEntryProducerTest.java index 0a2cd48..f62d953 100644 --- a/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ep/producer/AtomEntryProducerTest.java +++ b/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ep/producer/AtomEntryProducerTest.java @@ -24,6 +24,7 @@ import static org.custommonkey.xmlunit.XMLAssert.assertXpathNotExists; 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 static org.junit.Assert.fail; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; @@ -1370,4 +1371,166 @@ public class AtomEntryProducerTest extends AbstractProviderTest { assertXpathExists("/a:entry/a:content/m:properties/d:Seats", xmlString); } + + @Test + public void contentOnlyWithoutKeyWithoutSelectedProperties() throws Exception { + HashMap<String, Object> employeeData = new HashMap<String, Object>(); + employeeData.put("ManagerId", "1"); + employeeData.put("Age", new Integer(52)); + employeeData.put("RoomId", "1"); + employeeData.put("TeamId", "42"); + + List<String> selectedProperties = new ArrayList<String>(); + selectedProperties.add("ManagerId"); + selectedProperties.add("Age"); + selectedProperties.add("RoomId"); + selectedProperties.add("TeamId"); + final EdmEntitySet entitySet = MockFacade.getMockEdm().getDefaultEntityContainer().getEntitySet("Employees"); + + EntityProviderWriteProperties properties = + EntityProviderWriteProperties.fromProperties(DEFAULT_PROPERTIES).contentOnly(true).build(); + AtomEntityProvider ser = createAtomEntityProvider(); + try { + ser.writeEntry(entitySet, employeeData, properties); + } catch (EntityProviderProducerException e) { + assertTrue(e.getMessage().contains("The metadata do not allow a null value for property 'EmployeeId'")); + } + } + + @Test + public void testWithoutKey() throws Exception { + EdmEntitySet entitySet = MockFacade.getMockEdm().getDefaultEntityContainer().getEntitySet("Employees"); + List<String> selectedPropertyNames = new ArrayList<String>(); + selectedPropertyNames.add("ManagerId"); + ExpandSelectTreeNode select = + ExpandSelectTreeNode.entitySet(entitySet).selectedProperties(selectedPropertyNames).build(); + + final EntityProviderWriteProperties properties = + EntityProviderWriteProperties.serviceRoot(BASE_URI).expandSelectTree(select).build(); + + Map<String, Object> localEmployeeData = new HashMap<String, Object>(); + localEmployeeData.put("ManagerId", "1"); + + AtomEntityProvider ser = createAtomEntityProvider(); + try { + ser.writeEntry(entitySet, localEmployeeData, properties); + } catch (EntityProviderProducerException e) { + assertTrue(e.getMessage().contains("The metadata do not allow a null value for property 'EmployeeId'")); + } + } + + @Test + public void testWithoutCompositeKey() throws Exception { + EdmEntitySet entitySet = MockFacade.getMockEdm().getEntityContainer("Container2").getEntitySet("Photos"); + + final EntityProviderWriteProperties properties = + EntityProviderWriteProperties.serviceRoot(BASE_URI).build(); + + Map<String, Object> photoData = new HashMap<String, Object>(); + photoData.put("Name", "Mona Lisa"); + + AtomEntityProvider ser = createAtomEntityProvider(); + try { + ser.writeEntry(entitySet, photoData, properties); + } catch (EntityProviderProducerException e) { + assertTrue(e.getMessage().contains("The metadata do not allow a null value for property 'Id'")); + } + } + + @Test + public void testWithoutCompositeKeyWithOneKeyNull() throws Exception { + Edm edm = MockFacade.getMockEdm(); + EdmEntitySet entitySet = edm.getEntityContainer("Container2").getEntitySet("Photos"); + + final EntityProviderWriteProperties properties = + EntityProviderWriteProperties.serviceRoot(BASE_URI).build(); + + Map<String, Object> photoData = new HashMap<String, Object>(); + photoData.put("Name", "Mona Lisa"); + photoData.put("Id", Integer.valueOf(1)); + + EdmTyped typeProperty = edm.getEntityContainer("Container2").getEntitySet("Photos"). + getEntityType().getProperty("Type"); + EdmFacets facets = mock(EdmFacets.class); + when(facets.getConcurrencyMode()).thenReturn(EdmConcurrencyMode.Fixed); + when(facets.getMaxLength()).thenReturn(3); + when(((EdmProperty) typeProperty).getFacets()).thenReturn(facets); + + AtomEntityProvider ser = createAtomEntityProvider(); + try { + ser.writeEntry(entitySet, photoData, properties); + } catch (EntityProviderProducerException e) { + assertTrue(e.getMessage().contains("The metadata do not allow a null value for property 'Type'")); + } + } + + + @Test + public void testExceptionWithNonNullablePropertyIsNull() throws Exception { + EdmEntitySet entitySet = MockFacade.getMockEdm().getDefaultEntityContainer().getEntitySet("Organizations"); + EdmProperty nameProperty = (EdmProperty) entitySet.getEntityType().getProperty("Name"); + EdmFacets facets = nameProperty.getFacets(); + when(facets.isNullable()).thenReturn(new Boolean(false)); + final EntityProviderWriteProperties properties = + EntityProviderWriteProperties.serviceRoot(BASE_URI).omitETag(true). + isDataBasedPropertySerialization(true).build(); + AtomEntityProvider ser = createAtomEntityProvider(); + + Map<String, Object> orgData = new HashMap<String, Object>(); + orgData.put("Id", "1"); + try { + ser.writeEntry(entitySet, orgData, properties); + } catch (EntityProviderProducerException e) { + assertTrue(e.getMessage().contains("The metadata do not allow a null value for property 'Name'")); + } + } + + @Test + public void testExceptionWithNonNullablePropertyIsNull1() throws Exception { + EdmEntitySet entitySet = MockFacade.getMockEdm().getDefaultEntityContainer().getEntitySet("Organizations"); + EdmProperty kindProperty = (EdmProperty) entitySet.getEntityType().getProperty("Kind"); + EdmFacets facets = kindProperty.getFacets(); + when(facets.isNullable()).thenReturn(new Boolean(false)); + + EdmProperty nameProperty = (EdmProperty) entitySet.getEntityType().getProperty("Name"); + when(nameProperty.getFacets()).thenReturn(null); + final EntityProviderWriteProperties properties = + EntityProviderWriteProperties.serviceRoot(BASE_URI).omitETag(true). + isDataBasedPropertySerialization(true).build(); + AtomEntityProvider ser = createAtomEntityProvider(); + + Map<String, Object> orgData = new HashMap<String, Object>(); + orgData.put("Id", "1"); + orgData.put("Name", "Org1"); + try { + ser.writeEntry(entitySet, orgData, properties); + } catch (EntityProviderProducerException e) { + assertTrue(e.getMessage().contains("The metadata do not allow a null value for property 'Kind'")); + } + } + + @Test + public void testExceptionWithNonNullablePropertyIsNull2() throws Exception { + EdmEntitySet entitySet = MockFacade.getMockEdm().getDefaultEntityContainer().getEntitySet("Organizations"); + EdmProperty kindProperty = (EdmProperty) entitySet.getEntityType().getProperty("Kind"); + EdmFacets facets = kindProperty.getFacets(); + when(facets.isNullable()).thenReturn(new Boolean(false)); + + EdmProperty nameProperty = (EdmProperty) entitySet.getEntityType().getProperty("Name"); + EdmFacets facets1 = nameProperty.getFacets(); + when(facets1.isNullable()).thenReturn(new Boolean(false)); + final EntityProviderWriteProperties properties = + EntityProviderWriteProperties.serviceRoot(BASE_URI).omitETag(true). + isDataBasedPropertySerialization(true).build(); + AtomEntityProvider ser = createAtomEntityProvider(); + + Map<String, Object> orgData = new HashMap<String, Object>(); + orgData.put("Id", "1"); + orgData.put("Name", "Org1"); + try { + ser.writeEntry(entitySet, orgData, properties); + } catch (EntityProviderProducerException e) { + assertTrue(e.getMessage().contains("do not allow to format the value 'Org1' for property 'Name'.")); + } + } } http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/742560d2/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ep/producer/JsonEntryEntityProducerTest.java ---------------------------------------------------------------------- diff --git a/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ep/producer/JsonEntryEntityProducerTest.java b/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ep/producer/JsonEntryEntityProducerTest.java index 2673758..899dd4f 100644 --- a/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ep/producer/JsonEntryEntityProducerTest.java +++ b/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ep/producer/JsonEntryEntityProducerTest.java @@ -41,6 +41,7 @@ import java.util.TimeZone; import org.apache.olingo.odata2.api.ODataCallback; import org.apache.olingo.odata2.api.edm.Edm; +import org.apache.olingo.odata2.api.edm.EdmConcurrencyMode; import org.apache.olingo.odata2.api.edm.EdmEntitySet; import org.apache.olingo.odata2.api.edm.EdmEntityType; import org.apache.olingo.odata2.api.edm.EdmFacets; @@ -59,6 +60,7 @@ import org.apache.olingo.odata2.api.ep.callback.WriteFeedCallbackResult; import org.apache.olingo.odata2.api.exception.ODataApplicationException; import org.apache.olingo.odata2.api.processor.ODataResponse; import org.apache.olingo.odata2.api.uri.ExpandSelectTreeNode; +import org.apache.olingo.odata2.core.ep.EntityProviderProducerException; import org.apache.olingo.odata2.core.ep.JsonEntityProvider; import org.apache.olingo.odata2.testutil.fit.BaseTest; import org.apache.olingo.odata2.testutil.helper.StringHelper; @@ -1503,4 +1505,163 @@ public class JsonEntryEntityProducerTest extends BaseTest { + "\"uri\":\"" + BASE_URI + "Buildings('1')\",\"type\":\"RefScenario.Building\"}," + "\"Id\":\"1\",\"Name\":\"Building1\"}}}", json); } + + @Test + public void contentOnlyWithoutKeyWithoutSelectedProperties() throws Exception { + HashMap<String, Object> employeeData = new HashMap<String, Object>(); + employeeData.put("ManagerId", "1"); + employeeData.put("Age", new Integer(52)); + employeeData.put("RoomId", "1"); + employeeData.put("TeamId", "42"); + + List<String> selectedProperties = new ArrayList<String>(); + selectedProperties.add("ManagerId"); + selectedProperties.add("Age"); + selectedProperties.add("RoomId"); + selectedProperties.add("TeamId"); + final EdmEntitySet entitySet = MockFacade.getMockEdm().getDefaultEntityContainer().getEntitySet("Employees"); + + EntityProviderWriteProperties properties = + EntityProviderWriteProperties.fromProperties(DEFAULT_PROPERTIES).omitJsonWrapper(true).contentOnly(true) + .build(); + try { + new JsonEntityProvider().writeEntry(entitySet, employeeData, properties); + } catch (EntityProviderProducerException e) { + assertTrue(e.getMessage().contains("The metadata do not allow a null value for property 'EmployeeId'")); + } + } + + @Test + public void testWithoutKey() throws Exception { + EdmEntitySet entitySet = MockFacade.getMockEdm().getDefaultEntityContainer().getEntitySet("Employees"); + List<String> selectedPropertyNames = new ArrayList<String>(); + selectedPropertyNames.add("ManagerId"); + ExpandSelectTreeNode select = + ExpandSelectTreeNode.entitySet(entitySet).selectedProperties(selectedPropertyNames).build(); + + final EntityProviderWriteProperties properties = + EntityProviderWriteProperties.serviceRoot(URI.create(BASE_URI)).expandSelectTree(select).build(); + + Map<String, Object> localEmployeeData = new HashMap<String, Object>(); + localEmployeeData.put("ManagerId", "1"); + + JsonEntityProvider ser = new JsonEntityProvider(); + try { + ser.writeEntry(entitySet, localEmployeeData, properties); + } catch (EntityProviderProducerException e) { + assertTrue(e.getMessage().contains("The metadata do not allow a null value for property 'EmployeeId'")); + } + } + + @Test + public void testWithoutCompositeKey() throws Exception { + EdmEntitySet entitySet = MockFacade.getMockEdm().getEntityContainer("Container2").getEntitySet("Photos"); + + final EntityProviderWriteProperties properties = + EntityProviderWriteProperties.serviceRoot(URI.create(BASE_URI)).build(); + + Map<String, Object> photoData = new HashMap<String, Object>(); + photoData.put("Name", "Mona Lisa"); + + JsonEntityProvider ser = new JsonEntityProvider(); + try { + ser.writeEntry(entitySet, photoData, properties); + } catch (EntityProviderProducerException e) { + assertTrue(e.getMessage().contains("The metadata do not allow a null value for property 'Id'")); + } + } + + @Test + public void testWithoutCompositeKeyWithOneKeyNull() throws Exception { + Edm edm = MockFacade.getMockEdm(); + EdmEntitySet entitySet = edm.getEntityContainer("Container2").getEntitySet("Photos"); + + final EntityProviderWriteProperties properties = + EntityProviderWriteProperties.serviceRoot(URI.create(BASE_URI)).build(); + + Map<String, Object> photoData = new HashMap<String, Object>(); + photoData.put("Name", "Mona Lisa"); + photoData.put("Id", Integer.valueOf(1)); + + EdmTyped typeProperty = edm.getEntityContainer("Container2").getEntitySet("Photos"). + getEntityType().getProperty("Type"); + EdmFacets facets = mock(EdmFacets.class); + when(facets.getConcurrencyMode()).thenReturn(EdmConcurrencyMode.Fixed); + when(facets.getMaxLength()).thenReturn(3); + when(((EdmProperty) typeProperty).getFacets()).thenReturn(facets); + + JsonEntityProvider ser = new JsonEntityProvider(); + try { + ser.writeEntry(entitySet, photoData, properties); + } catch (EntityProviderProducerException e) { + assertTrue(e.getMessage().contains("The metadata do not allow a null value for property 'Type'")); + } + } + + + @Test + public void testExceptionWithNonNullablePropertyIsNull() throws Exception { + EdmEntitySet entitySet = MockFacade.getMockEdm().getDefaultEntityContainer().getEntitySet("Organizations"); + EdmProperty nameProperty = (EdmProperty) entitySet.getEntityType().getProperty("Name"); + EdmFacets facets = nameProperty.getFacets(); + when(facets.isNullable()).thenReturn(new Boolean(false)); + final EntityProviderWriteProperties properties = + EntityProviderWriteProperties.serviceRoot(URI.create(BASE_URI)).omitETag(true). + isDataBasedPropertySerialization(true).build(); + + Map<String, Object> orgData = new HashMap<String, Object>(); + orgData.put("Id", "1"); + try { + new JsonEntityProvider().writeEntry(entitySet, orgData, properties); + } catch (EntityProviderProducerException e) { + assertTrue(e.getMessage().contains("The metadata do not allow a null value for property 'Name'")); + } + } + + @Test + public void testExceptionWithNonNullablePropertyIsNull1() throws Exception { + EdmEntitySet entitySet = MockFacade.getMockEdm().getDefaultEntityContainer().getEntitySet("Organizations"); + EdmProperty kindProperty = (EdmProperty) entitySet.getEntityType().getProperty("Kind"); + EdmFacets facets = kindProperty.getFacets(); + when(facets.isNullable()).thenReturn(new Boolean(false)); + + EdmProperty nameProperty = (EdmProperty) entitySet.getEntityType().getProperty("Name"); + when(nameProperty.getFacets()).thenReturn(null); + final EntityProviderWriteProperties properties = + EntityProviderWriteProperties.serviceRoot(URI.create(BASE_URI)).omitETag(true). + isDataBasedPropertySerialization(true).build(); + + Map<String, Object> orgData = new HashMap<String, Object>(); + orgData.put("Id", "1"); + orgData.put("Name", "Org1"); + try { + new JsonEntityProvider().writeEntry(entitySet, orgData, properties); + } catch (EntityProviderProducerException e) { + assertTrue(e.getMessage().contains("The metadata do not allow a null value for property 'Kind'")); + } + } + + @Test + public void testExceptionWithNonNullablePropertyIsNull2() throws Exception { + EdmEntitySet entitySet = MockFacade.getMockEdm().getDefaultEntityContainer().getEntitySet("Organizations"); + EdmProperty kindProperty = (EdmProperty) entitySet.getEntityType().getProperty("Kind"); + EdmFacets facets = kindProperty.getFacets(); + when(facets.isNullable()).thenReturn(new Boolean(false)); + + EdmProperty nameProperty = (EdmProperty) entitySet.getEntityType().getProperty("Name"); + EdmFacets facets1 = nameProperty.getFacets(); + when(facets1.isNullable()).thenReturn(new Boolean(false)); + final EntityProviderWriteProperties properties = + EntityProviderWriteProperties.serviceRoot(URI.create(BASE_URI)).omitETag(true). + isDataBasedPropertySerialization(true).build(); + + Map<String, Object> orgData = new HashMap<String, Object>(); + orgData.put("Id", "1"); + orgData.put("Name", "Org1"); + try { + new JsonEntityProvider().writeEntry(entitySet, orgData, properties); + } catch (EntityProviderProducerException e) { + assertTrue(e.getMessage().contains("do not allow to format the value 'Org1' for property 'Name'.")); + } + } } http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/742560d2/odata2-lib/odata-testutil/src/main/java/org/apache/olingo/odata2/testutil/mock/EdmMock.java ---------------------------------------------------------------------- diff --git a/odata2-lib/odata-testutil/src/main/java/org/apache/olingo/odata2/testutil/mock/EdmMock.java b/odata2-lib/odata-testutil/src/main/java/org/apache/olingo/odata2/testutil/mock/EdmMock.java index e291d22..b8cb129 100644 --- a/odata2-lib/odata-testutil/src/main/java/org/apache/olingo/odata2/testutil/mock/EdmMock.java +++ b/odata2-lib/odata-testutil/src/main/java/org/apache/olingo/odata2/testutil/mock/EdmMock.java @@ -70,6 +70,8 @@ class EdmMock { createEntitySetMock(defaultContainer, "Buildings", EdmSimpleTypeKind.String, "Id"); final EdmEntitySet companiesEntitySet = createEntitySetMock(defaultContainer, "Companys", EdmSimpleTypeKind.String, "Id"); + final EdmEntitySet organizationsEntitySet = + createEntitySetMock(defaultContainer, "Organizations", EdmSimpleTypeKind.String, "Id"); EdmEntityType employeeType = employeeEntitySet.getEntityType(); when(employeeType.hasStream()).thenReturn(true); @@ -176,6 +178,29 @@ class EdmMock { createProperty("Name", EdmSimpleTypeKind.String, companyType); createProperty("Kind", EdmSimpleTypeKind.String, companyType); createProperty("NGO", EdmSimpleTypeKind.Boolean, companyType); + + EdmEntityType organizationType = organizationsEntitySet.getEntityType(); + when(organizationType.getPropertyNames()).thenReturn(Arrays.asList("Id", "Name", "Kind", "Location", "NoOfTeam")); + when(organizationType.getProperty("Location")).thenReturn(locationComplexProperty); + EdmProperty orgName = createProperty("Name", EdmSimpleTypeKind.String, organizationType); + EdmProperty orgKind = createProperty("Kind", EdmSimpleTypeKind.String, organizationType); + createProperty("NoOfTeam", EdmSimpleTypeKind.Int16, organizationType); + + EdmFacets orgNameFacets = mock(EdmFacets.class); + when(orgNameFacets.isNullable()).thenReturn(null); + when(orgName.getFacets()).thenReturn(orgNameFacets); + EdmCustomizableFeedMappings orgTitleMappings = mock(EdmCustomizableFeedMappings.class); + when(orgTitleMappings.getFcTargetPath()).thenReturn(EdmTargetPath.SYNDICATION_TITLE); + when(orgTitleMappings.isFcKeepInContent()).thenReturn(false); + when(orgName.getCustomizableFeedMappings()).thenReturn(orgTitleMappings); + + EdmFacets orgKindFacets = mock(EdmFacets.class); + when(orgKindFacets.isNullable()).thenReturn(null); + when(orgKind.getFacets()).thenReturn(orgKindFacets); + EdmCustomizableFeedMappings orgKindMappings = mock(EdmCustomizableFeedMappings.class); + when(orgKindMappings.getFcTargetPath()).thenReturn(EdmTargetPath.SYNDICATION_SUMMARY); + when(orgKindMappings.isFcKeepInContent()).thenReturn(true); + when(orgKind.getCustomizableFeedMappings()).thenReturn(orgKindMappings); EdmFunctionImport employeeSearchFunctionImport = createFunctionImportMock(defaultContainer, "EmployeeSearch", employeeType, EdmMultiplicity.MANY); @@ -293,7 +318,8 @@ class EdmMock { when(edm.getComplexType("RefScenario", "c_Location")).thenReturn(locationComplexType); when(edm.getEntityType("RefScenario2", "Photo")).thenReturn(photoEntityType); when(edm.getEntityType("RefScenario", "Company")).thenReturn(companyType); - + when(edm.getEntityType("RefScenario", "Organization")).thenReturn(organizationType); + return edm; }
