You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@olingo.apache.org by ch...@apache.org on 2017/03/01 14:52:26 UTC

olingo-odata2 git commit: [OLINGO-1088] Improve V2 serialization error messages

Repository: olingo-odata2
Updated Branches:
  refs/heads/master ee4b64337 -> 742560d27


[OLINGO-1088] Improve V2 serialization error messages

Signed-off-by: Christian Amend <ch...@sap.com>


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 <ra...@sap.com>
Authored: Wed Mar 1 14:35:27 2017 +0530
Committer: Christian Amend <ch...@sap.com>
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;
   }