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 2015/11/06 16:58:43 UTC

[5/5] olingo-odata4 git commit: [OLINGO-821] Verify Enum and TypeDef support

[OLINGO-821] Verify Enum and TypeDef support

Included full integration tests for all components


Project: http://git-wip-us.apache.org/repos/asf/olingo-odata4/repo
Commit: http://git-wip-us.apache.org/repos/asf/olingo-odata4/commit/639362ca
Tree: http://git-wip-us.apache.org/repos/asf/olingo-odata4/tree/639362ca
Diff: http://git-wip-us.apache.org/repos/asf/olingo-odata4/diff/639362ca

Branch: refs/heads/master
Commit: 639362caa32daa89f24622194b78f6a3020982d2
Parents: ac828a3
Author: Christian Amend <ch...@sap.com>
Authored: Fri Nov 6 16:29:55 2015 +0100
Committer: Christian Amend <ch...@sap.com>
Committed: Fri Nov 6 16:29:55 2015 +0100

----------------------------------------------------------------------
 .../olingo/fit/tecsvc/client/BasicITCase.java   |    8 +-
 .../tecsvc/client/FilterSystemQueryITCase.java  |    2 +-
 .../deserializer/xml/ODataXmlDeserializer.java  |  188 +-
 .../serializer/json/ODataJsonSerializer.java    |    7 +-
 .../olingo/server/tecsvc/data/DataCreator.java  | 1052 +--
 .../olingo/server/tecsvc/data/DataProvider.java |   51 +-
 .../tecsvc/provider/ComplexTypeProvider.java    |    2 +-
 .../tecsvc/provider/EntityTypeProvider.java     |    8 +-
 .../tecsvc/provider/PropertyProvider.java       |    9 +-
 .../json/ODataJsonDeserializerEntityTest.java   |   25 +
 .../xml/ODataXmlDeserializerTest.java           |    4 +-
 .../json/ODataJsonSerializerTest.java           |   60 +-
 .../serializer/xml/ODataXmlSerializerTest.java  |    2 -
 .../core/uri/antlr/TestFullResourcePath.java    | 6114 +++++++++---------
 ...tityETMixEnumDefCollCompWithEnumStrings.json |   24 +
 15 files changed, 3859 insertions(+), 3697 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/639362ca/fit/src/test/java/org/apache/olingo/fit/tecsvc/client/BasicITCase.java
----------------------------------------------------------------------
diff --git a/fit/src/test/java/org/apache/olingo/fit/tecsvc/client/BasicITCase.java b/fit/src/test/java/org/apache/olingo/fit/tecsvc/client/BasicITCase.java
index de0a0ac..a09cafa 100644
--- a/fit/src/test/java/org/apache/olingo/fit/tecsvc/client/BasicITCase.java
+++ b/fit/src/test/java/org/apache/olingo/fit/tecsvc/client/BasicITCase.java
@@ -468,10 +468,6 @@ public class BasicITCase extends AbstractParamTecSvcITCase {
   @Test
   public void createEntityWithEnumAndTypeDefinition() throws Exception {
     ClientEntity newEntity = getFactory().newEntity(new FullQualifiedName(SERVICE_NAMESPACE, "ETMixEnumDefCollComp"));
-    newEntity.getProperties().add(getFactory().newEnumProperty("PropertyEnumString",
-        getFactory().newEnumValue(null, "String2")));
-    newEntity.getProperties().add(getFactory().newPrimitiveProperty("PropertyDefString",
-        getFactory().newPrimitiveValueBuilder().buildString("Test String")));
     final ODataEntityCreateRequest<ClientEntity> request = getClient().getCUDRequestFactory().getEntityCreateRequest(
         getClient().newURIBuilder(SERVICE_URI).appendEntitySetSegment("ESMixEnumDefCollComp").build(),
         newEntity);
@@ -481,11 +477,11 @@ public class BasicITCase extends AbstractParamTecSvcITCase {
     ClientProperty property = createdEntity.getProperty("PropertyEnumString");
     assertNotNull(property);
     // TODO: Improve client value types.
-    assertEquals("String2", isJson() ? property.getPrimitiveValue().toValue() : property.getEnumValue().getValue());
+    assertEquals("String1", isJson() ? property.getPrimitiveValue().toValue() : property.getEnumValue().getValue());
     property = createdEntity.getProperty("PropertyDefString");
     assertNotNull(property);
     // TODO: Improve client value types.
-    assertEquals("Test String", isJson() ?
+    assertEquals("1", isJson() ?
         property.getPrimitiveValue().toValue() :
         property.getEnumValue().getValue());
   }

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/639362ca/fit/src/test/java/org/apache/olingo/fit/tecsvc/client/FilterSystemQueryITCase.java
----------------------------------------------------------------------
diff --git a/fit/src/test/java/org/apache/olingo/fit/tecsvc/client/FilterSystemQueryITCase.java b/fit/src/test/java/org/apache/olingo/fit/tecsvc/client/FilterSystemQueryITCase.java
index 6fe2e5b..4ecca7c 100644
--- a/fit/src/test/java/org/apache/olingo/fit/tecsvc/client/FilterSystemQueryITCase.java
+++ b/fit/src/test/java/org/apache/olingo/fit/tecsvc/client/FilterSystemQueryITCase.java
@@ -187,7 +187,7 @@ public class FilterSystemQueryITCase extends AbstractParamTecSvcITCase {
     assertShortOrInt(1, clientEntity.getProperty("PropertyInt16").getPrimitiveValue().toValue());
     assertEquals("2", clientEntity.getProperty("PropertyString").getPrimitiveValue().toValue());
 
-    result = sendRequest(ES_MIX_ENUM_DEF_COLL_COMP, "PropertyEnumString has Namespace1_Alias.ENString'String1'");
+    result = sendRequest(ES_MIX_ENUM_DEF_COLL_COMP, "PropertyEnumString eq Namespace1_Alias.ENString'String2'");
     assertTrue(result.getBody().getEntities().isEmpty());
   }
 

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/639362ca/lib/server-core/src/main/java/org/apache/olingo/server/core/deserializer/xml/ODataXmlDeserializer.java
----------------------------------------------------------------------
diff --git a/lib/server-core/src/main/java/org/apache/olingo/server/core/deserializer/xml/ODataXmlDeserializer.java b/lib/server-core/src/main/java/org/apache/olingo/server/core/deserializer/xml/ODataXmlDeserializer.java
index 8ddd72d..eb1f5de 100644
--- a/lib/server-core/src/main/java/org/apache/olingo/server/core/deserializer/xml/ODataXmlDeserializer.java
+++ b/lib/server-core/src/main/java/org/apache/olingo/server/core/deserializer/xml/ODataXmlDeserializer.java
@@ -6,9 +6,9 @@
  * to you under the Apache License, Version 2.0 (the
  * "License"); you may not use this file except in compliance
  * with the License. You may obtain a copy of the License at
- *
+ * 
  * http://www.apache.org/licenses/LICENSE-2.0
- *
+ * 
  * Unless required by applicable law or agreed to in writing,
  * software distributed under the License is distributed on an
  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
@@ -82,8 +82,8 @@ public class ODataXmlDeserializer implements ODataDeserializer {
   }
 
   private Object primitive(final XMLEventReader reader, final StartElement start,
-      final EdmType type, final boolean isNullable, final Integer maxLength, final Integer precision, 
-      final Integer scale, final boolean isUnicode) throws XMLStreamException, EdmPrimitiveTypeException, 
+      final EdmType type, final boolean isNullable, final Integer maxLength, final Integer precision,
+      final Integer scale, final boolean isUnicode) throws XMLStreamException, EdmPrimitiveTypeException,
       DeserializerException {
 
     Object value = null;
@@ -99,12 +99,12 @@ public class ODataXmlDeserializer implements ODataDeserializer {
         }
         final EdmPrimitiveType primitiveType = (EdmPrimitiveType) type;
         final String stringValue = event.asCharacters().getData();
-        value = primitiveType.valueOfString(stringValue, 
-            isNullable, 
-            maxLength, 
-            precision, 
-            scale, 
-            isUnicode, 
+        value = primitiveType.valueOfString(stringValue,
+            isNullable,
+            maxLength,
+            precision,
+            scale,
+            isUnicode,
             primitiveType.getDefaultType());
       }
 
@@ -123,8 +123,8 @@ public class ODataXmlDeserializer implements ODataDeserializer {
       final XMLEvent event = reader.nextEvent();
       if (event.isStartElement()) {
         StartElement se = event.asStartElement();
-        EdmProperty p = (EdmProperty)edmComplex.getProperty(se.getName().getLocalPart());
-        value.getValue().add(property(reader, se, p.getType(), p.isNullable(), p.getMaxLength(), 
+        EdmProperty p = (EdmProperty) edmComplex.getProperty(se.getName().getLocalPart());
+        value.getValue().add(property(reader, se, p.getType(), p.isNullable(), p.getMaxLength(),
             p.getPrecision(), p.getScale(), p.isUnicode(), p.isCollection()));
       }
       if (event.isEndElement() && start.getName().equals(event.asEndElement().getName())) {
@@ -145,12 +145,12 @@ public class ODataXmlDeserializer implements ODataDeserializer {
     while (reader.hasNext() && !foundEndProperty) {
       final XMLEvent event = reader.nextEvent();
 
-      if (event.isStartElement()) {        
+      if (event.isStartElement()) {
         if (edmType instanceof EdmPrimitiveType) {
           values.add(primitive(reader, event.asStartElement(), edmType, isNullable,
-              maxLength, precision, scale, isUnicode));          
+              maxLength, precision, scale, isUnicode));
         } else if (edmType instanceof EdmComplexType) {
-          values.add(complex(reader, event.asStartElement(), (EdmComplexType) edmType));                    
+          values.add(complex(reader, event.asStartElement(), (EdmComplexType) edmType));
         }
         // do not add null or empty values
       }
@@ -203,7 +203,7 @@ public class ODataXmlDeserializer implements ODataDeserializer {
 
     final Attribute nullAttr = start.getAttributeByName(nullQName);
     if (nullAttr != null) {
-      //found null
+      // found null
       boolean foundEndProperty = false;
       while (reader.hasNext() && !foundEndProperty) {
         final XMLEvent event = reader.nextEvent();
@@ -211,7 +211,7 @@ public class ODataXmlDeserializer implements ODataDeserializer {
           foundEndProperty = true;
         }
       }
-      valuable.setValue(getValueType(edmType, false), null);  
+      valuable.setValue(getValueType(edmType, false), null);
       return;
     }
 
@@ -221,23 +221,23 @@ public class ODataXmlDeserializer implements ODataDeserializer {
       collection(valuable, reader, start, edmType, isNullable, maxLength, precision, scale, isUnicode);
     } else if (edmType instanceof EdmPrimitiveType) {
       valuable.setValue(getValueType(edmType, false),
-          primitive(reader, start, edmType, isNullable, maxLength, precision, scale, isUnicode));          
+          primitive(reader, start, edmType, isNullable, maxLength, precision, scale, isUnicode));
     } else if (edmType instanceof EdmComplexType) {
       valuable.setValue(ValueType.COMPLEX, complex(reader, start, (EdmComplexType) edmType));
     } else if (edmType instanceof EdmEntityType) {
       valuable.setValue(ValueType.ENTITY, entity(reader, start, (EdmEntityType) edmType));
     }
-    // do not add null or empty values    
+    // do not add null or empty values
   }
 
   @Override
-  public DeserializerResult property(InputStream input, EdmProperty edmProperty) 
+  public DeserializerResult property(InputStream input, EdmProperty edmProperty)
       throws DeserializerException {
     try {
       final XMLEventReader reader = getReader(input);
       final StartElement start = skipBeforeFirstStartElement(reader);
-      Property property = property(reader, start, 
-          edmProperty.getType(), 
+      Property property = property(reader, start,
+          edmProperty.getType(),
           edmProperty.isNullable(),
           edmProperty.getMaxLength(),
           edmProperty.getPrecision(),
@@ -249,8 +249,8 @@ public class ODataXmlDeserializer implements ODataDeserializer {
     } catch (XMLStreamException e) {
       throw new DeserializerException(e.getMessage(), e, DeserializerException.MessageKeys.IO_EXCEPTION);
     } catch (final EdmPrimitiveTypeException e) {
-      throw new DeserializerException(e.getMessage(), e, 
-          DeserializerException.MessageKeys.INVALID_VALUE_FOR_PROPERTY);    
+      throw new DeserializerException(e.getMessage(), e,
+          DeserializerException.MessageKeys.INVALID_VALUE_FOR_PROPERTY);
     }
   }
 
@@ -286,8 +286,8 @@ public class ODataXmlDeserializer implements ODataDeserializer {
     }
   }
 
-  private void inline(final XMLEventReader reader, final StartElement start, final Link link, 
-      final EdmEntityType edmEntityType) throws XMLStreamException, EdmPrimitiveTypeException, 
+  private void inline(final XMLEventReader reader, final StartElement start, final Link link,
+      final EdmEntityType edmEntityType) throws XMLStreamException, EdmPrimitiveTypeException,
       DeserializerException {
 
     boolean foundEndElement = false;
@@ -301,35 +301,35 @@ public class ODataXmlDeserializer implements ODataDeserializer {
           if (inline != null) {
             if (Constants.QNAME_ATOM_ELEM_ENTRY.equals(inline.getName())) {
               if (navigationProperty.isCollection()) {
-                throw new DeserializerException( "Navigation Property "+ link.getTitle() + 
+                throw new DeserializerException("Navigation Property " + link.getTitle() +
                     " must be collection entities",
-                    DeserializerException.MessageKeys.INVALID_ANNOTATION_TYPE, link.getTitle());            
+                    DeserializerException.MessageKeys.INVALID_ANNOTATION_TYPE, link.getTitle());
               }
-              
+
               link.setInlineEntity(entity(reader, inline, navigationProperty.getType()));
             }
             if (Constants.QNAME_ATOM_ELEM_FEED.equals(inline.getName())) {
               if (!navigationProperty.isCollection()) {
-                throw new DeserializerException("Navigation Property " + link.getTitle() + 
+                throw new DeserializerException("Navigation Property " + link.getTitle() +
                     " must be single entity",
-                    DeserializerException.MessageKeys.INVALID_ANNOTATION_TYPE, link.getTitle());            
-              }                                          
+                    DeserializerException.MessageKeys.INVALID_ANNOTATION_TYPE, link.getTitle());
+              }
               link.setInlineEntitySet(entitySet(reader, inline, navigationProperty.getType()));
             }
           }
         } else if (entryRefQName.equals(event.asStartElement().getName())) {
           if (navigationProperty.isCollection()) {
-            throw new DeserializerException("Binding annotation: " + link.getTitle() + 
+            throw new DeserializerException("Binding annotation: " + link.getTitle() +
                 " must be collection of entity references",
-                DeserializerException.MessageKeys.INVALID_ANNOTATION_TYPE, link.getTitle());            
-          }          
+                DeserializerException.MessageKeys.INVALID_ANNOTATION_TYPE, link.getTitle());
+          }
           link.setBindingLink(entityRef(reader, event.asStartElement()));
           link.setType(Constants.ENTITY_BINDING_LINK_TYPE);
         } else if (Constants.QNAME_ATOM_ELEM_FEED.equals(event.asStartElement().getName())) {
           if (navigationProperty.isCollection()) {
-            throw new DeserializerException("Binding annotation: " + link.getTitle() + 
+            throw new DeserializerException("Binding annotation: " + link.getTitle() +
                 " must be single entity references",
-                DeserializerException.MessageKeys.INVALID_ANNOTATION_TYPE, link.getTitle());            
+                DeserializerException.MessageKeys.INVALID_ANNOTATION_TYPE, link.getTitle());
           }
           link.setBindingLinks(entityRefCollection(reader, event.asStartElement()));
           link.setType(Constants.ENTITY_COLLECTION_BINDING_LINK_TYPE);
@@ -342,17 +342,17 @@ public class ODataXmlDeserializer implements ODataDeserializer {
     }
   }
 
-  private List<String> entityRefCollection(XMLEventReader reader, StartElement start) 
+  private List<String> entityRefCollection(XMLEventReader reader, StartElement start)
       throws XMLStreamException {
     boolean foundEndElement = false;
     ArrayList<String> references = new ArrayList<String>();
     while (reader.hasNext() && !foundEndElement) {
       final XMLEvent event = reader.nextEvent();
-      
+
       if (event.isStartElement() && entryRefQName.equals(event.asStartElement().getName())) {
-          references.add(entityRef(reader, event.asStartElement()));
+        references.add(entityRef(reader, event.asStartElement()));
       }
-      
+
       if (event.isEndElement() && start.getName().equals(event.asEndElement().getName())) {
         foundEndElement = true;
       }
@@ -386,7 +386,7 @@ public class ODataXmlDeserializer implements ODataDeserializer {
     return null;
   }
 
-  private void properties(final XMLEventReader reader, final StartElement start, final Entity entity, 
+  private void properties(final XMLEventReader reader, final StartElement start, final Entity entity,
       final EdmEntityType edmEntityType)
       throws XMLStreamException, EdmPrimitiveTypeException, DeserializerException {
 
@@ -395,10 +395,14 @@ public class ODataXmlDeserializer implements ODataDeserializer {
       final XMLEvent event = reader.nextEvent();
 
       if (event.isStartElement()) {
-        EdmProperty edmProperty = (EdmProperty)edmEntityType
-            .getProperty(event.asStartElement().getName().getLocalPart());
-        entity.getProperties().add(property(reader, event.asStartElement(), 
-            edmProperty.getType(), 
+        String propertyName = event.asStartElement().getName().getLocalPart();
+        EdmProperty edmProperty = (EdmProperty) edmEntityType.getProperty(propertyName);
+        if (edmProperty == null) {
+          throw new DeserializerException("Invalid Property in payload with name: " + propertyName,
+              DeserializerException.MessageKeys.UNKNOWN_CONTENT, propertyName);
+        }
+        entity.getProperties().add(property(reader, event.asStartElement(),
+            edmProperty.getType(),
             edmProperty.isNullable(),
             edmProperty.getMaxLength(),
             edmProperty.getPrecision(),
@@ -480,7 +484,7 @@ public class ODataXmlDeserializer implements ODataDeserializer {
               if (mediaETag != null) {
                 entity.setMediaETag(mediaETag.getValue());
               }
-            } else if (link.getRel().startsWith(Constants.NS_NAVIGATION_LINK_REL)) {              
+            } else if (link.getRel().startsWith(Constants.NS_NAVIGATION_LINK_REL)) {
               inline(reader, event.asStartElement(), link, edmEntityType);
               if (link.getInlineEntity() == null && link.getInlineEntitySet() == null) {
                 entity.getNavigationBindings().add(link);
@@ -488,8 +492,8 @@ public class ODataXmlDeserializer implements ODataDeserializer {
                 if (link.getInlineEntitySet() != null) {
                   List<String> bindings = new ArrayList<String>();
                   List<Entity> entities = link.getInlineEntitySet().getEntities();
-                  
-                  for (Entity inlineEntity:entities) {
+
+                  for (Entity inlineEntity : entities) {
                     // check if this is reference
                     if (inlineEntity.getId() != null && inlineEntity.getProperties().isEmpty()) {
                       bindings.add(inlineEntity.getId().toASCIIString());
@@ -501,11 +505,11 @@ public class ODataXmlDeserializer implements ODataDeserializer {
                     entity.getNavigationBindings().add(link);
                   } else {
                     entity.getNavigationLinks().add(link);
-                  }                  
+                  }
                 } else {
                   // add link
-                  entity.getNavigationLinks().add(link);                  
-                }                
+                  entity.getNavigationLinks().add(link);
+                }
               }
             } else if (link.getRel().startsWith(Constants.NS_ASSOCIATION_LINK_REL)) {
               entity.getAssociationLinks().add(link);
@@ -543,7 +547,7 @@ public class ODataXmlDeserializer implements ODataDeserializer {
   }
 
   @Override
-  public DeserializerResult entity(InputStream input, EdmEntityType edmEntityType) 
+  public DeserializerResult entity(InputStream input, EdmEntityType edmEntityType)
       throws DeserializerException {
     try {
       final XMLEventReader reader = getReader(input);
@@ -551,14 +555,14 @@ public class ODataXmlDeserializer implements ODataDeserializer {
       final Entity entity = entity(reader, start, edmEntityType);
       if (entity == null) {
         throw new DeserializerException("No entity found!", DeserializerException.MessageKeys.INVALID_ENTITY);
-      } 
+      }
       return DeserializerResultImpl.with().entity(entity)
-          .build();      
+          .build();
     } catch (XMLStreamException e) {
-      throw new DeserializerException(e.getMessage(), e, 
+      throw new DeserializerException(e.getMessage(), e,
           DeserializerException.MessageKeys.IO_EXCEPTION);
     } catch (final EdmPrimitiveTypeException e) {
-      throw new DeserializerException(e.getMessage(), e, 
+      throw new DeserializerException(e.getMessage(), e,
           DeserializerException.MessageKeys.INVALID_ENTITY);
     }
   }
@@ -579,7 +583,7 @@ public class ODataXmlDeserializer implements ODataDeserializer {
   }
 
   private EntityCollection entitySet(final XMLEventReader reader, final StartElement start,
-      final EdmEntityType edmEntityType) throws XMLStreamException, EdmPrimitiveTypeException, 
+      final EdmEntityType edmEntityType) throws XMLStreamException, EdmPrimitiveTypeException,
       DeserializerException {
     if (!Constants.QNAME_ATOM_ELEM_FEED.equals(start.getName())) {
       return null;
@@ -635,8 +639,8 @@ public class ODataXmlDeserializer implements ODataDeserializer {
       final XMLEventReader reader = getReader(input);
       final StartElement start = skipBeforeFirstStartElement(reader);
       EntityCollection entityCollection = entitySet(reader, start, edmEntityType);
-      if(entityCollection != null) {
-        for (Entity entity: entityCollection.getEntities()) {
+      if (entityCollection != null) {
+        for (Entity entity : entityCollection.getEntities()) {
           entity.setType(edmEntityType.getFullQualifiedName().getFullQualifiedNameAsString());
         }
       }
@@ -644,11 +648,11 @@ public class ODataXmlDeserializer implements ODataDeserializer {
     } catch (final XMLStreamException e) {
       throw new DeserializerException(e.getMessage(), e, DeserializerException.MessageKeys.IO_EXCEPTION);
     } catch (final EdmPrimitiveTypeException e) {
-      throw new DeserializerException(e.getMessage(), e, 
+      throw new DeserializerException(e.getMessage(), e,
           DeserializerException.MessageKeys.INVALID_VALUE_FOR_PROPERTY);
     }
   }
-  
+
   @Override
   public DeserializerResult entityReferences(InputStream stream) throws DeserializerException {
     try {
@@ -673,7 +677,7 @@ public class ODataXmlDeserializer implements ODataDeserializer {
   }
 
   @Override
-  public DeserializerResult actionParameters(InputStream stream, EdmAction edmAction) 
+  public DeserializerResult actionParameters(InputStream stream, EdmAction edmAction)
       throws DeserializerException {
     Map<String, Parameter> parameters = new LinkedHashMap<String, Parameter>();
     if (edmAction.getParameterNames() == null || edmAction.getParameterNames().isEmpty()
@@ -682,13 +686,13 @@ public class ODataXmlDeserializer implements ODataDeserializer {
           .build();
     }
 
-    try {             
+    try {
       final XMLEventReader reader = getReader(stream);
       while (reader.hasNext()) {
         final XMLEvent event = reader.nextEvent();
         if (event.isStartElement() && parametersQName.equals(event.asStartElement().getName())) {
           consumeParameters(edmAction, reader, event.asStartElement(), parameters);
-        }        
+        }
       }
       // EDM checks.
       for (final String param : edmAction.getParameterNames()) {
@@ -715,53 +719,53 @@ public class ODataXmlDeserializer implements ODataDeserializer {
     } catch (XMLStreamException e) {
       throw new DeserializerException(e.getMessage(), e, DeserializerException.MessageKeys.IO_EXCEPTION);
     } catch (final EdmPrimitiveTypeException e) {
-      throw new DeserializerException(e.getMessage(), e, 
-          DeserializerException.MessageKeys.INVALID_VALUE_FOR_PROPERTY);    
+      throw new DeserializerException(e.getMessage(), e,
+          DeserializerException.MessageKeys.INVALID_VALUE_FOR_PROPERTY);
     }
   }
 
-  private void consumeParameters(EdmAction edmAction, XMLEventReader reader, 
-      StartElement start, Map<String, Parameter> parameters) throws DeserializerException, 
+  private void consumeParameters(EdmAction edmAction, XMLEventReader reader,
+      StartElement start, Map<String, Parameter> parameters) throws DeserializerException,
       EdmPrimitiveTypeException, XMLStreamException {
-    
+
     List<String> parameterNames = edmAction.getParameterNames();
     if (edmAction.isBound()) {
       // The binding parameter must not occur in the payload.
       parameterNames = parameterNames.subList(1, parameterNames.size());
     }
-    
-    boolean foundEndElement = false;    
+
+    boolean foundEndElement = false;
     while (reader.hasNext() && !foundEndElement) {
       final XMLEvent event = reader.nextEvent();
       if (event.isStartElement()) {
         boolean found = false;
-        for(String paramName:parameterNames) {
-          if(paramName.equals(event.asStartElement().getName().getLocalPart())) {
+        for (String paramName : parameterNames) {
+          if (paramName.equals(event.asStartElement().getName().getLocalPart())) {
             found = true;
-            Parameter parameter = createParameter(reader, event.asStartElement(), paramName, 
+            Parameter parameter = createParameter(reader, event.asStartElement(), paramName,
                 edmAction.getParameter(paramName));
             Parameter previous = parameters.put(paramName, parameter);
             if (previous != null) {
-              throw new DeserializerException("Duplicate property detected", 
-                  DeserializerException.MessageKeys.DUPLICATE_PROPERTY);              
+              throw new DeserializerException("Duplicate property detected",
+                  DeserializerException.MessageKeys.DUPLICATE_PROPERTY);
             }
-            break; //for
+            break; // for
           }
         }
         if (!found) {
           throw new DeserializerException("failed to read " + event.asStartElement().getName().getLocalPart(),
-              DeserializerException.MessageKeys.UNKNOWN_CONTENT);          
+              DeserializerException.MessageKeys.UNKNOWN_CONTENT);
         }
-      }      
+      }
       if (event.isEndElement() && start.getName().equals(event.asEndElement().getName())) {
         foundEndElement = true;
-      }      
-    }    
+      }
+    }
   }
 
-  private Parameter createParameter(XMLEventReader reader, StartElement start, String paramName, 
+  private Parameter createParameter(XMLEventReader reader, StartElement start, String paramName,
       EdmParameter edmParameter) throws DeserializerException, EdmPrimitiveTypeException, XMLStreamException {
-    
+
     Parameter parameter = new Parameter();
     parameter.setName(paramName);
     switch (edmParameter.getType().getKind()) {
@@ -769,14 +773,14 @@ public class ODataXmlDeserializer implements ODataDeserializer {
     case ENUM:
     case DEFINITION:
     case COMPLEX:
-      Property property = property(reader, start, 
-        edmParameter.getType(),
-        edmParameter.isNullable(), 
-        edmParameter.getMaxLength(), 
-        edmParameter.getPrecision(), 
-        edmParameter.getScale(), 
-        true,
-        edmParameter.isCollection());
+      Property property = property(reader, start,
+          edmParameter.getType(),
+          edmParameter.isNullable(),
+          edmParameter.getMaxLength(),
+          edmParameter.getPrecision(),
+          edmParameter.getScale(),
+          true,
+          edmParameter.isCollection());
       parameter.setValue(property.getValueType(), property.getValue());
       break;
     case ENTITY:

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/639362ca/lib/server-core/src/main/java/org/apache/olingo/server/core/serializer/json/ODataJsonSerializer.java
----------------------------------------------------------------------
diff --git a/lib/server-core/src/main/java/org/apache/olingo/server/core/serializer/json/ODataJsonSerializer.java b/lib/server-core/src/main/java/org/apache/olingo/server/core/serializer/json/ODataJsonSerializer.java
index 1ddc979..b5a2c6a 100644
--- a/lib/server-core/src/main/java/org/apache/olingo/server/core/serializer/json/ODataJsonSerializer.java
+++ b/lib/server-core/src/main/java/org/apache/olingo/server/core/serializer/json/ODataJsonSerializer.java
@@ -391,7 +391,12 @@ public class ODataJsonSerializer extends AbstractODataSerializer {
         throw new SerializerException("Non-nullable property not present!",
             SerializerException.MessageKeys.MISSING_PROPERTY, edmProperty.getName());
       } else {
-        json.writeNull();
+        if(edmProperty.isCollection()){
+          json.writeStartArray();
+          json.writeEndArray();
+        }else {
+          json.writeNull();
+        }
       }
     } else {
       writePropertyValue(edmProperty, property, selectedPaths, json);