You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@olingo.apache.org by mi...@apache.org on 2014/04/29 13:58:19 UTC

[01/13] git commit: [OLINGO-239] Changed folder path handling

Repository: olingo-odata2
Updated Branches:
  refs/heads/OLINGO-231_PocForAndroid 3f1de10c8 -> 28333efff


[OLINGO-239] Changed folder path handling


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

Branch: refs/heads/OLINGO-231_PocForAndroid
Commit: e1b6ead92c2bb71055e99cc9f762e4bccbd96974
Parents: df76930
Author: Michael Bolz <mi...@apache.org>
Authored: Fri Apr 11 06:00:04 2014 +0200
Committer: Michael Bolz <mi...@apache.org>
Committed: Fri Apr 11 08:27:13 2014 +0200

----------------------------------------------------------------------
 .../processor/core/util/ClassHelper.java        | 56 ++++++++++++--------
 .../processor/core/util/ClassHelperTest.java    | 20 +++++++
 2 files changed, 53 insertions(+), 23 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/e1b6ead9/odata2-annotation-processor/annotation-processor-core/src/main/java/org/apache/olingo/odata2/annotation/processor/core/util/ClassHelper.java
----------------------------------------------------------------------
diff --git a/odata2-annotation-processor/annotation-processor-core/src/main/java/org/apache/olingo/odata2/annotation/processor/core/util/ClassHelper.java b/odata2-annotation-processor/annotation-processor-core/src/main/java/org/apache/olingo/odata2/annotation/processor/core/util/ClassHelper.java
index 22ba73c..d81d9cf 100644
--- a/odata2-annotation-processor/annotation-processor-core/src/main/java/org/apache/olingo/odata2/annotation/processor/core/util/ClassHelper.java
+++ b/odata2-annotation-processor/annotation-processor-core/src/main/java/org/apache/olingo/odata2/annotation/processor/core/util/ClassHelper.java
@@ -23,6 +23,8 @@ import java.io.FileFilter;
 import java.io.FilenameFilter;
 import java.io.IOException;
 import java.lang.reflect.Field;
+import java.net.URI;
+import java.net.URISyntaxException;
 import java.net.URL;
 import java.util.ArrayList;
 import java.util.Collection;
@@ -58,25 +60,22 @@ public class ClassHelper {
     }
   };
 
-  public static final List<Class<?>> loadClasses(final String packageToScan, final ClassValidator cv) {
+  public static List<Class<?>> loadClasses(final String packageToScan, final ClassValidator cv) {
     return loadClasses(packageToScan, CLASSFILE_FILTER, cv);
   }
 
-  public static final List<Class<?>> loadClasses(final String packageToScan, final FilenameFilter ff,
+  public static List<Class<?>> loadClasses(final String packageToScan, final FilenameFilter ff,
       final ClassValidator cv) {
     final ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
-    String folderToScan = packageToScan.replace(PACKAGE_SEPARATOR, RESOURCE_SEPARATOR);
-    URL url = classLoader.getResource(folderToScan);
-    if (url == null) {
-      throw new IllegalArgumentException("No folder to scan found for package '" + packageToScan + "'.");
-    }
+
+    URI uri = getResourceUri(packageToScan, classLoader);
 
     final Collection<String> fqnForClasses;
-    File folder = new File(url.getFile());
+    File folder = new File(uri.getSchemeSpecificPart());
     if (folder.isDirectory()) {
       fqnForClasses = getClassFqnFromDir(ff, folder, packageToScan);
-    } else if (isJarFile(url)) {
-      fqnForClasses = getClassFqnFromJar(url.getFile().substring(5), packageToScan);
+    } else if (isJarFile(uri)) {
+      fqnForClasses = getClassFqnFromJar(uri, packageToScan);
     } else {
       fqnForClasses = null;
     }
@@ -94,7 +93,7 @@ public class ClassHelper {
         }
       } catch (ClassNotFoundException ex) {
         throw new IllegalArgumentException("Exception during class loading of class '" + fqn +
-            " from resource '" + url.getFile() + "'" +
+            " from resource '" + uri + "'" +
             "' with message '" + ex.getMessage() + "'.");
       }
     }
@@ -102,18 +101,29 @@ public class ClassHelper {
     return annotatedClasses;
   }
 
-  private static boolean isJarFile(final URL url) {
-    String filename = url.getFile();
-    int index = filename.indexOf(JAR_RESOURCE_SEPARATOR);
-    if (index > JAR_FILE_ENDING.length()) {
-      String fileEnding = filename.substring(index - JAR_FILE_ENDING.length(), index);
-      return JAR_FILE_ENDING.equalsIgnoreCase(fileEnding);
+  private static URI getResourceUri(String packageToScan, ClassLoader classLoader) {
+    String folderToScan = packageToScan.replace(PACKAGE_SEPARATOR, RESOURCE_SEPARATOR);
+    URL url = classLoader.getResource(folderToScan);
+    if (url == null) {
+      throw new IllegalArgumentException("No folder to scan found for package '" + packageToScan + "'.");
+    }
+    try {
+      URI uri = url.toURI();
+      if (uri == null) {
+        throw new IllegalArgumentException("No folder to scan found for package '" + packageToScan + "'.");
+      }
+      return uri;
+    } catch (URISyntaxException e) {
+      throw new IllegalArgumentException("Invalid folder path for path URL '" + url +
+              "' from thread context class loader.");
     }
-    return false;
   }
 
-  private static Collection<String> getClassFqnFromDir(final FilenameFilter ff, final File folder,
-      final String packageToScan) {
+  private static boolean isJarFile(URI uri) {
+    return JAR_FILE_ENDING.equals(uri.getScheme());
+  }
+
+  private static Collection<String> getClassFqnFromDir(final FilenameFilter ff, File folder, String packageToScan) {
     List<String> classFiles = new ArrayList<String>();
     String[] classFilesForFolder = folder.list(ff);
     for (String name : classFilesForFolder) {
@@ -129,10 +139,9 @@ public class ClassHelper {
     return classFiles;
   }
 
-  private static Collection<String> getClassFqnFromJar(final String filepath, final String packageToScan) {
-    JarFile jarFile = null;
-
+  private static Collection<String> getClassFqnFromJar(URI uri, String packageToScan) {
     final String jarFilePath;
+    String filepath = uri.getSchemeSpecificPart().substring(5);
     String[] split = filepath.split(JAR_RESOURCE_SEPARATOR);
     if (split.length == 2) {
       jarFilePath = split[0];
@@ -140,6 +149,7 @@ public class ClassHelper {
       throw new IllegalArgumentException("Illegal jar file path '" + filepath + "'.");
     }
 
+    JarFile jarFile = null;
     try {
       jarFile = new JarFile(jarFilePath);
       List<String> classFileNames = new ArrayList<String>();

http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/e1b6ead9/odata2-annotation-processor/annotation-processor-core/src/test/java/org/apache/olingo/odata2/annotation/processor/core/util/ClassHelperTest.java
----------------------------------------------------------------------
diff --git a/odata2-annotation-processor/annotation-processor-core/src/test/java/org/apache/olingo/odata2/annotation/processor/core/util/ClassHelperTest.java b/odata2-annotation-processor/annotation-processor-core/src/test/java/org/apache/olingo/odata2/annotation/processor/core/util/ClassHelperTest.java
index 393b651..42dd259 100644
--- a/odata2-annotation-processor/annotation-processor-core/src/test/java/org/apache/olingo/odata2/annotation/processor/core/util/ClassHelperTest.java
+++ b/odata2-annotation-processor/annotation-processor-core/src/test/java/org/apache/olingo/odata2/annotation/processor/core/util/ClassHelperTest.java
@@ -15,6 +15,8 @@
  */
 package org.apache.olingo.odata2.annotation.processor.core.util;
 
+import java.io.File;
+import java.net.URL;
 import java.util.List;
 
 import junit.framework.Assert;
@@ -59,6 +61,24 @@ public class ClassHelperTest {
     Assert.assertEquals(SimpleEntity.class.getName(), loadedClasses.get(0).getName());
   }
 
+  @Test(expected = ClassFormatError.class)
+  public void loadFromSpaceDir() throws Exception {
+    URL currentPath = Thread.currentThread().getContextClassLoader().getResource(".");
+    File folder = new File(currentPath.getFile(), "space space/package");
+    folder.mkdirs();
+    File classFile = new File(folder, "Invalid.class");
+    classFile.createNewFile();
+    String packageToScan = "space space.package";
+
+    //
+    List<Class<?>> loadedClasses = ClassHelper.loadClasses(packageToScan, annotatedTestEntityInnerClasses);
+
+    //
+    Assert.assertEquals(1, loadedClasses.size());
+    Assert.assertEquals(SimpleEntity.class.getName(), loadedClasses.get(0).getName());
+  }
+
+
   @Test
   public void loadSingleEntityFromJar() throws ODataException {
     String packageToScan = AnnotatedEntity.class.getPackage().getName();


[04/13] git commit: [OLINGO-245] Fix for names of foreign key names. Properties representing foreign key are prefixed with FK

Posted by mi...@apache.org.
[OLINGO-245] Fix for names of foreign key names. 
Properties representing foreign key are prefixed with FK


Signed-off-by: Chandan V A <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/2dd0181d
Tree: http://git-wip-us.apache.org/repos/asf/olingo-odata2/tree/2dd0181d
Diff: http://git-wip-us.apache.org/repos/asf/olingo-odata2/diff/2dd0181d

Branch: refs/heads/OLINGO-231_PocForAndroid
Commit: 2dd0181d4fce203d6cf4e67367b25ffe54540340
Parents: 74dff0f
Author: Chandan V A <ch...@sap.com>
Authored: Sat Apr 19 16:07:44 2014 +0530
Committer: Chandan V A <ch...@sap.com>
Committed: Sat Apr 19 16:07:44 2014 +0530

----------------------------------------------------------------------
 .../jpa/processor/core/access/model/JPAEdmNameBuilder.java  | 6 +++++-
 .../odata2/jpa/processor/core/model/JPAEdmProperty.java     | 9 +++++----
 .../processor/core/access/model/JPAEdmNameBuilderTest.java  | 4 ++--
 3 files changed, 12 insertions(+), 7 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/2dd0181d/odata2-jpa-processor/jpa-core/src/main/java/org/apache/olingo/odata2/jpa/processor/core/access/model/JPAEdmNameBuilder.java
----------------------------------------------------------------------
diff --git a/odata2-jpa-processor/jpa-core/src/main/java/org/apache/olingo/odata2/jpa/processor/core/access/model/JPAEdmNameBuilder.java b/odata2-jpa-processor/jpa-core/src/main/java/org/apache/olingo/odata2/jpa/processor/core/access/model/JPAEdmNameBuilder.java
index 9c22364..1f0e152 100644
--- a/odata2-jpa-processor/jpa-core/src/main/java/org/apache/olingo/odata2/jpa/processor/core/access/model/JPAEdmNameBuilder.java
+++ b/odata2-jpa-processor/jpa-core/src/main/java/org/apache/olingo/odata2/jpa/processor/core/access/model/JPAEdmNameBuilder.java
@@ -58,6 +58,7 @@ public class JPAEdmNameBuilder {
   private static final String ASSOCIATIONSET_SUFFIX = "Set";
   private static final String NAVIGATION_NAME = "Details";
   private static final String UNDERSCORE = "_";
+  private static final String FK_PREFIX = "FK";
 
   public static FullQualifiedName build(final JPAEdmBaseView view, final String name) {
     FullQualifiedName fqName = new FullQualifiedName(buildNamespace(view), name);
@@ -124,7 +125,7 @@ public class JPAEdmNameBuilder {
    * ************************************************************************
    */
   public static void build(final JPAEdmPropertyView view, final boolean isComplexMode,
-      final boolean skipDefaultNaming) {
+      final boolean skipDefaultNaming, final boolean isForeignKey) {
     Attribute<?, ?> jpaAttribute = view.getJPAAttribute();
     String jpaAttributeName = jpaAttribute.getName();
     String propertyName = null;
@@ -145,6 +146,9 @@ public class JPAEdmNameBuilder {
       propertyName = Character.toUpperCase(jpaAttributeName.charAt(0)) + jpaAttributeName.substring(1);
     } else if (propertyName == null) {
       propertyName = jpaAttributeName;
+      if (isForeignKey == true) {
+        propertyName = FK_PREFIX + UNDERSCORE + propertyName;
+      }
     }
 
     view.getEdmSimpleProperty().setName(propertyName);

http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/2dd0181d/odata2-jpa-processor/jpa-core/src/main/java/org/apache/olingo/odata2/jpa/processor/core/model/JPAEdmProperty.java
----------------------------------------------------------------------
diff --git a/odata2-jpa-processor/jpa-core/src/main/java/org/apache/olingo/odata2/jpa/processor/core/model/JPAEdmProperty.java b/odata2-jpa-processor/jpa-core/src/main/java/org/apache/olingo/odata2/jpa/processor/core/model/JPAEdmProperty.java
index e23f3b1..8ea02f7 100644
--- a/odata2-jpa-processor/jpa-core/src/main/java/org/apache/olingo/odata2/jpa/processor/core/model/JPAEdmProperty.java
+++ b/odata2-jpa-processor/jpa-core/src/main/java/org/apache/olingo/odata2/jpa/processor/core/model/JPAEdmProperty.java
@@ -210,7 +210,7 @@ public class JPAEdmProperty extends JPAEdmBaseViewImpl implements
         switch (attributeType) {
         case BASIC:
           currentSimpleProperty = new SimpleProperty();
-          properties.add(buildSimpleProperty(currentAttribute, currentSimpleProperty));
+          properties.add(buildSimpleProperty(currentAttribute, currentSimpleProperty, false));
           if (((SingularAttribute<?, ?>) currentAttribute).isId()) {
             if (keyView == null) {
               keyView = new JPAEdmKey(JPAEdmProperty.this);
@@ -321,12 +321,13 @@ public class JPAEdmProperty extends JPAEdmBaseViewImpl implements
 
     }
 
-    private SimpleProperty buildSimpleProperty(final Attribute<?, ?> jpaAttribute, final SimpleProperty simpleProperty)
+    private SimpleProperty buildSimpleProperty(final Attribute<?, ?> jpaAttribute, final SimpleProperty simpleProperty,
+        final boolean isFK)
         throws ODataJPAModelException,
         ODataJPARuntimeException {
 
       JPAEdmNameBuilder
-          .build((JPAEdmPropertyView) JPAEdmProperty.this, isBuildModeComplexType, skipDefaultNaming);
+          .build((JPAEdmPropertyView) JPAEdmProperty.this, isBuildModeComplexType, skipDefaultNaming, isFK);
       EdmSimpleTypeKind simpleTypeKind = JPATypeConvertor
           .convertToEdmSimpleType(jpaAttribute
               .getJavaType(), jpaAttribute);
@@ -360,7 +361,7 @@ public class JPAEdmProperty extends JPAEdmBaseViewImpl implements
               if (referencedColumn != null && referencedColumn.name().equals((joinColumn.referencedColumnName()))) {
                 currentRefAttribute = referencedAttribute;
                 currentSimpleProperty = new SimpleProperty();
-                properties.add(buildSimpleProperty(currentRefAttribute, currentSimpleProperty));
+                properties.add(buildSimpleProperty(currentRefAttribute, currentSimpleProperty, true));
                 break;
               }
             }

http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/2dd0181d/odata2-jpa-processor/jpa-core/src/test/java/org/apache/olingo/odata2/jpa/processor/core/access/model/JPAEdmNameBuilderTest.java
----------------------------------------------------------------------
diff --git a/odata2-jpa-processor/jpa-core/src/test/java/org/apache/olingo/odata2/jpa/processor/core/access/model/JPAEdmNameBuilderTest.java b/odata2-jpa-processor/jpa-core/src/test/java/org/apache/olingo/odata2/jpa/processor/core/access/model/JPAEdmNameBuilderTest.java
index 542d37f..aebea64 100644
--- a/odata2-jpa-processor/jpa-core/src/test/java/org/apache/olingo/odata2/jpa/processor/core/access/model/JPAEdmNameBuilderTest.java
+++ b/odata2-jpa-processor/jpa-core/src/test/java/org/apache/olingo/odata2/jpa/processor/core/access/model/JPAEdmNameBuilderTest.java
@@ -49,7 +49,7 @@ public class JPAEdmNameBuilderTest {
     EasyMock.expect(propertyView.getEdmSimpleProperty()).andStubReturn(simpleProperty);
     EasyMock.replay(propertyView);
 
-    JPAEdmNameBuilder.build(propertyView, false, false);
+    JPAEdmNameBuilder.build(propertyView, false, false,false);
     assertEquals("Id", simpleProperty.getName());
   }
 
@@ -69,7 +69,7 @@ public class JPAEdmNameBuilderTest {
     EasyMock.expect(propertyView.getEdmSimpleProperty()).andStubReturn(simpleProperty);
     EasyMock.replay(propertyView);
 
-    JPAEdmNameBuilder.build(propertyView, false, true);
+    JPAEdmNameBuilder.build(propertyView, false, true,false);
     assertEquals("id", simpleProperty.getName());
   }
 


[07/13] git commit: [OLINGO-255] fixed

Posted by mi...@apache.org.
[OLINGO-255] fixed


Project: http://git-wip-us.apache.org/repos/asf/olingo-odata2/repo
Commit: http://git-wip-us.apache.org/repos/asf/olingo-odata2/commit/15abea36
Tree: http://git-wip-us.apache.org/repos/asf/olingo-odata2/tree/15abea36
Diff: http://git-wip-us.apache.org/repos/asf/olingo-odata2/diff/15abea36

Branch: refs/heads/OLINGO-231_PocForAndroid
Commit: 15abea36ed0b9f74d5d6b3c0c7a68b9717566642
Parents: 2541c88
Author: Stephan Klevenz <sk...@apache.org>
Authored: Fri Apr 25 10:21:48 2014 +0200
Committer: Stephan Klevenz <sk...@apache.org>
Committed: Fri Apr 25 10:21:48 2014 +0200

----------------------------------------------------------------------
 .../processor/core/util/ClassHelperTest.java    |  2 +-
 .../core/ep/consumer/JsonEntryConsumer.java     |  5 ++-
 .../core/ep/consumer/JsonFeedConsumer.java      |  3 +-
 .../consumer/JsonEntryDeepInsertEntryTest.java  | 16 +++++++
 .../resources/JsonInlineRoomWithInlineNull.json | 44 ++++++++++++++++++++
 5 files changed, 67 insertions(+), 3 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/15abea36/odata2-annotation-processor/annotation-processor-core/src/test/java/org/apache/olingo/odata2/annotation/processor/core/util/ClassHelperTest.java
----------------------------------------------------------------------
diff --git a/odata2-annotation-processor/annotation-processor-core/src/test/java/org/apache/olingo/odata2/annotation/processor/core/util/ClassHelperTest.java b/odata2-annotation-processor/annotation-processor-core/src/test/java/org/apache/olingo/odata2/annotation/processor/core/util/ClassHelperTest.java
index 3a1aba0..4da0960 100644
--- a/odata2-annotation-processor/annotation-processor-core/src/test/java/org/apache/olingo/odata2/annotation/processor/core/util/ClassHelperTest.java
+++ b/odata2-annotation-processor/annotation-processor-core/src/test/java/org/apache/olingo/odata2/annotation/processor/core/util/ClassHelperTest.java
@@ -96,7 +96,7 @@ public class ClassHelperTest {
   //
 
   @EdmEntityType
-  @SuppressWarnings("unused")
+//  @SuppressWarnings("unused")
   private class SimpleEntity {
     @EdmKey
     @EdmProperty

http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/15abea36/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/ep/consumer/JsonEntryConsumer.java
----------------------------------------------------------------------
diff --git a/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/ep/consumer/JsonEntryConsumer.java b/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/ep/consumer/JsonEntryConsumer.java
index 5bae8e7..1a6bca2 100644
--- a/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/ep/consumer/JsonEntryConsumer.java
+++ b/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/ep/consumer/JsonEntryConsumer.java
@@ -280,7 +280,8 @@ public class JsonEntryConsumer {
       throw new EntityProviderException(EntityProviderException.ILLEGAL_ARGUMENT.addContent(navigationPropertyName));
     }
 
-    if (reader.peek() == JsonToken.BEGIN_OBJECT) {
+    JsonToken peek = reader.peek();
+    if (peek == JsonToken.BEGIN_OBJECT) {
       reader.beginObject();
       String name = reader.nextName();
       if (FormatJson.DEFERRED.equals(name)) {
@@ -342,6 +343,8 @@ public class JsonEntryConsumer {
         }
       }
       reader.endObject();
+    } else if (peek == JsonToken.NULL) {
+      reader.nextNull();
     } else {
       final EdmNavigationProperty navigationProperty =
           (EdmNavigationProperty) eia.getEntityType().getProperty(navigationPropertyName);

http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/15abea36/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/ep/consumer/JsonFeedConsumer.java
----------------------------------------------------------------------
diff --git a/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/ep/consumer/JsonFeedConsumer.java b/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/ep/consumer/JsonFeedConsumer.java
index f607286..04edbdc 100644
--- a/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/ep/consumer/JsonFeedConsumer.java
+++ b/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/ep/consumer/JsonFeedConsumer.java
@@ -82,7 +82,8 @@ public class JsonFeedConsumer {
   }
 
   private void readFeed() throws IOException, EdmException, EntityProviderException {
-    if (reader.peek() == JsonToken.BEGIN_ARRAY) {
+    JsonToken peek = reader.peek();
+    if (peek == JsonToken.BEGIN_ARRAY) {
       readArrayContent();
     } else {
       reader.beginObject();

http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/15abea36/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ep/consumer/JsonEntryDeepInsertEntryTest.java
----------------------------------------------------------------------
diff --git a/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ep/consumer/JsonEntryDeepInsertEntryTest.java b/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ep/consumer/JsonEntryDeepInsertEntryTest.java
index 4919d99..1a057af 100644
--- a/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ep/consumer/JsonEntryDeepInsertEntryTest.java
+++ b/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ep/consumer/JsonEntryDeepInsertEntryTest.java
@@ -51,6 +51,7 @@ public class JsonEntryDeepInsertEntryTest extends AbstractConsumerTest {
 
   private static final String EMPLOYEE_WITH_INLINE_TEAM = "JsonEmployeeWithInlineTeam.json";
   private static final String INLINE_ROOM_WITH_INLINE_BUILDING = "JsonInlineRoomWithInlineBuilding.json";
+  private static final String INLINE_ROOM_WITH_INLINE_NULL = "JsonInlineRoomWithInlineNull.json";
 
   @Test
   public void innerEntryNoMediaResourceWithoutCallback() throws Exception {
@@ -266,6 +267,21 @@ public class JsonEntryDeepInsertEntryTest extends AbstractConsumerTest {
     assertEquals("http://localhost:8080/ReferenceScenario.svc/Buildings('1')/nb_Rooms", associationUris.get(0));
   }
 
+  @Test
+  public void inlineRoomWithInlineNullWithCallbacks() throws Exception {
+    EntryCallback buildingCallback = new EntryCallback();
+    EntryCallback roomCallback = new EntryCallback(buildingCallback);
+    EntityProviderReadProperties readProperties =
+        EntityProviderReadProperties.init().mergeSemantic(false).callback(roomCallback).build();
+    ODataEntry outerEntry = prepareAndExecuteEntry(INLINE_ROOM_WITH_INLINE_NULL, "Employees", readProperties);
+
+    ODataEntry innerRoom = (ODataEntry) outerEntry.getProperties().get("ne_Room");
+    assertNull(innerRoom);
+
+    innerRoom = roomCallback.getEntry();
+    assertNull(innerRoom);
+  }
+
   private class EntryCallback implements OnReadInlineContent {
     private ODataEntry entry;
     private EntryCallback innerCallback;

http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/15abea36/odata2-lib/odata-core/src/test/resources/JsonInlineRoomWithInlineNull.json
----------------------------------------------------------------------
diff --git a/odata2-lib/odata-core/src/test/resources/JsonInlineRoomWithInlineNull.json b/odata2-lib/odata-core/src/test/resources/JsonInlineRoomWithInlineNull.json
new file mode 100644
index 0000000..a4b8c5e
--- /dev/null
+++ b/odata2-lib/odata-core/src/test/resources/JsonInlineRoomWithInlineNull.json
@@ -0,0 +1,44 @@
+{
+	"d" : {
+		"__metadata" : {
+			"id" : "http://localhost:8080/ReferenceScenario.svc/Employees('1')",
+			"uri" : "http://localhost:8080/ReferenceScenario.svc/Employees('1')",
+			"type" : "RefScenario.Employee",
+			"content_type" : "image/jpeg",
+			"media_src" : "Employees('1')/$value",
+			"edit_media" : "http://localhost:8080/ReferenceScenario.svc/Employees('1')/$value"
+		},
+		"EmployeeId" : "1",
+		"EmployeeName" : "Walter Winter",
+		"ManagerId" : "1",
+		"RoomId" : "1",
+		"TeamId" : "1",
+		"Location" : {
+			"__metadata" : {
+				"type" : "RefScenario.c_Location"
+			},
+			"City" : {
+				"__metadata" : {
+					"type" : "RefScenario.c_City"
+				},
+				"PostalCode" : "69124",
+				"CityName" : "Heidelberg"
+			},
+			"Country" : "Germany"
+		},
+		"Age" : 52,
+		"EntryDate" : "\/Date(915148800000)\/",
+		"ImageUrl" : "Employees('1')/$value",
+		"ne_Manager" : {
+			"__deferred" : {
+				"uri" : "http://localhost:8080/ReferenceScenario.svc/Employees('1')/ne_Manager"
+			}
+		},
+		"ne_Team" : {
+			"__deferred" : {
+				"uri" : "http://localhost:8080/ReferenceScenario.svc/Employees('1')/ne_Team"
+			}
+		},
+		"ne_Room" : null
+	}
+}


[03/13] git commit: [OLINGO-235] code cleanup

Posted by mi...@apache.org.
[OLINGO-235] code cleanup


Project: http://git-wip-us.apache.org/repos/asf/olingo-odata2/repo
Commit: http://git-wip-us.apache.org/repos/asf/olingo-odata2/commit/74dff0f3
Tree: http://git-wip-us.apache.org/repos/asf/olingo-odata2/tree/74dff0f3
Diff: http://git-wip-us.apache.org/repos/asf/olingo-odata2/diff/74dff0f3

Branch: refs/heads/OLINGO-231_PocForAndroid
Commit: 74dff0f3acbe7c693fa026995f9efe70e7cc4c81
Parents: 2211ce4
Author: Stephan Klevenz <sk...@apache.org>
Authored: Wed Apr 16 16:35:57 2014 +0200
Committer: Stephan Klevenz <sk...@apache.org>
Committed: Wed Apr 16 16:35:57 2014 +0200

----------------------------------------------------------------------
 .../annotation/processor/core/util/ClassHelper.java   | 11 ++++++-----
 .../processor/core/util/ClassHelperTest.java          |  1 -
 .../api/exception/ODataJPARuntimeException.java       |  1 -
 .../jpa/processor/core/access/data/JPAEntity.java     |  2 +-
 .../processor/core/access/data/JPAEntityParser.java   |  4 ++--
 .../processor/core/access/model/JPATypeConvertor.java |  4 ++--
 .../data/JPAEntityParserTestForStaticMethods.java     |  2 +-
 .../core/mock/ODataJPAServiceFactoryMock.java         |  6 +++---
 .../processor/core/mock/OnJPAWriteContentMock.java    |  4 ++--
 .../jpa/processor/core/mock/data/JPATypeMock.java     | 12 ++++++------
 .../processor/ref/converter/BlobToByteConverter.java  |  4 ++--
 .../odata2/jpa/processor/ref/model/Material.java      |  2 +-
 .../odata2/jpa/processor/ref/model/NoteKey.java       | 14 +++++++-------
 .../jpa/processor/ref/extension/OnDBWriteContent.java |  4 ++--
 .../odata2/api/ep/EntityProviderReadProperties.java   |  2 +-
 15 files changed, 36 insertions(+), 37 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/74dff0f3/odata2-annotation-processor/annotation-processor-core/src/main/java/org/apache/olingo/odata2/annotation/processor/core/util/ClassHelper.java
----------------------------------------------------------------------
diff --git a/odata2-annotation-processor/annotation-processor-core/src/main/java/org/apache/olingo/odata2/annotation/processor/core/util/ClassHelper.java b/odata2-annotation-processor/annotation-processor-core/src/main/java/org/apache/olingo/odata2/annotation/processor/core/util/ClassHelper.java
index d81d9cf..24082ff 100644
--- a/odata2-annotation-processor/annotation-processor-core/src/main/java/org/apache/olingo/odata2/annotation/processor/core/util/ClassHelper.java
+++ b/odata2-annotation-processor/annotation-processor-core/src/main/java/org/apache/olingo/odata2/annotation/processor/core/util/ClassHelper.java
@@ -101,7 +101,7 @@ public class ClassHelper {
     return annotatedClasses;
   }
 
-  private static URI getResourceUri(String packageToScan, ClassLoader classLoader) {
+  private static URI getResourceUri(final String packageToScan, final ClassLoader classLoader) {
     String folderToScan = packageToScan.replace(PACKAGE_SEPARATOR, RESOURCE_SEPARATOR);
     URL url = classLoader.getResource(folderToScan);
     if (url == null) {
@@ -115,15 +115,16 @@ public class ClassHelper {
       return uri;
     } catch (URISyntaxException e) {
       throw new IllegalArgumentException("Invalid folder path for path URL '" + url +
-              "' from thread context class loader.");
+          "' from thread context class loader.");
     }
   }
 
-  private static boolean isJarFile(URI uri) {
+  private static boolean isJarFile(final URI uri) {
     return JAR_FILE_ENDING.equals(uri.getScheme());
   }
 
-  private static Collection<String> getClassFqnFromDir(final FilenameFilter ff, File folder, String packageToScan) {
+  private static Collection<String> getClassFqnFromDir(final FilenameFilter ff, final File folder,
+      final String packageToScan) {
     List<String> classFiles = new ArrayList<String>();
     String[] classFilesForFolder = folder.list(ff);
     for (String name : classFilesForFolder) {
@@ -139,7 +140,7 @@ public class ClassHelper {
     return classFiles;
   }
 
-  private static Collection<String> getClassFqnFromJar(URI uri, String packageToScan) {
+  private static Collection<String> getClassFqnFromJar(final URI uri, final String packageToScan) {
     final String jarFilePath;
     String filepath = uri.getSchemeSpecificPart().substring(5);
     String[] split = filepath.split(JAR_RESOURCE_SEPARATOR);

http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/74dff0f3/odata2-annotation-processor/annotation-processor-core/src/test/java/org/apache/olingo/odata2/annotation/processor/core/util/ClassHelperTest.java
----------------------------------------------------------------------
diff --git a/odata2-annotation-processor/annotation-processor-core/src/test/java/org/apache/olingo/odata2/annotation/processor/core/util/ClassHelperTest.java b/odata2-annotation-processor/annotation-processor-core/src/test/java/org/apache/olingo/odata2/annotation/processor/core/util/ClassHelperTest.java
index 42dd259..3a1aba0 100644
--- a/odata2-annotation-processor/annotation-processor-core/src/test/java/org/apache/olingo/odata2/annotation/processor/core/util/ClassHelperTest.java
+++ b/odata2-annotation-processor/annotation-processor-core/src/test/java/org/apache/olingo/odata2/annotation/processor/core/util/ClassHelperTest.java
@@ -78,7 +78,6 @@ public class ClassHelperTest {
     Assert.assertEquals(SimpleEntity.class.getName(), loadedClasses.get(0).getName());
   }
 
-
   @Test
   public void loadSingleEntityFromJar() throws ODataException {
     String packageToScan = AnnotatedEntity.class.getPackage().getName();

http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/74dff0f3/odata2-jpa-processor/jpa-api/src/main/java/org/apache/olingo/odata2/jpa/processor/api/exception/ODataJPARuntimeException.java
----------------------------------------------------------------------
diff --git a/odata2-jpa-processor/jpa-api/src/main/java/org/apache/olingo/odata2/jpa/processor/api/exception/ODataJPARuntimeException.java b/odata2-jpa-processor/jpa-api/src/main/java/org/apache/olingo/odata2/jpa/processor/api/exception/ODataJPARuntimeException.java
index bac5ca3..9863544 100644
--- a/odata2-jpa-processor/jpa-api/src/main/java/org/apache/olingo/odata2/jpa/processor/api/exception/ODataJPARuntimeException.java
+++ b/odata2-jpa-processor/jpa-api/src/main/java/org/apache/olingo/odata2/jpa/processor/api/exception/ODataJPARuntimeException.java
@@ -98,5 +98,4 @@ public class ODataJPARuntimeException extends ODataJPAException {
 
   private static final long serialVersionUID = -5230976355642443012L;
 
-
 }

http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/74dff0f3/odata2-jpa-processor/jpa-core/src/main/java/org/apache/olingo/odata2/jpa/processor/core/access/data/JPAEntity.java
----------------------------------------------------------------------
diff --git a/odata2-jpa-processor/jpa-core/src/main/java/org/apache/olingo/odata2/jpa/processor/core/access/data/JPAEntity.java b/odata2-jpa-processor/jpa-core/src/main/java/org/apache/olingo/odata2/jpa/processor/core/access/data/JPAEntity.java
index b263644..ec05d6b 100644
--- a/odata2-jpa-processor/jpa-core/src/main/java/org/apache/olingo/odata2/jpa/processor/core/access/data/JPAEntity.java
+++ b/odata2-jpa-processor/jpa-core/src/main/java/org/apache/olingo/odata2/jpa/processor/core/access/data/JPAEntity.java
@@ -315,7 +315,7 @@ public class JPAEntity {
   }
 
   protected void setProperty(final Method method, final Object entity, final Object entityPropertyValue,
-      EdmSimpleType type) throws
+      final EdmSimpleType type) throws
       IllegalAccessException, IllegalArgumentException, InvocationTargetException, ODataJPARuntimeException {
     if (entityPropertyValue != null) {
       Class<?> parameterType = method.getParameterTypes()[0];

http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/74dff0f3/odata2-jpa-processor/jpa-core/src/main/java/org/apache/olingo/odata2/jpa/processor/core/access/data/JPAEntityParser.java
----------------------------------------------------------------------
diff --git a/odata2-jpa-processor/jpa-core/src/main/java/org/apache/olingo/odata2/jpa/processor/core/access/data/JPAEntityParser.java b/odata2-jpa-processor/jpa-core/src/main/java/org/apache/olingo/odata2/jpa/processor/core/access/data/JPAEntityParser.java
index 7fc9744..1314ed2 100644
--- a/odata2-jpa-processor/jpa-core/src/main/java/org/apache/olingo/odata2/jpa/processor/core/access/data/JPAEntityParser.java
+++ b/odata2-jpa-processor/jpa-core/src/main/java/org/apache/olingo/odata2/jpa/processor/core/access/data/JPAEntityParser.java
@@ -258,7 +258,7 @@ public final class JPAEntityParser {
     return propertyValue;
   }
 
-  public static String getString(Clob clob) throws ODataJPARuntimeException {
+  public static String getString(final Clob clob) throws ODataJPARuntimeException {
     try {
       Reader stringReader = clob.getCharacterStream();
       StringWriter buffer = null;
@@ -305,7 +305,7 @@ public final class JPAEntityParser {
 
   }
 
-  public static byte[] getBytes(Blob blob) throws ODataJPARuntimeException {
+  public static byte[] getBytes(final Blob blob) throws ODataJPARuntimeException {
     try {
       InputStream is = null;
       ByteArrayOutputStream buffer = null;

http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/74dff0f3/odata2-jpa-processor/jpa-core/src/main/java/org/apache/olingo/odata2/jpa/processor/core/access/model/JPATypeConvertor.java
----------------------------------------------------------------------
diff --git a/odata2-jpa-processor/jpa-core/src/main/java/org/apache/olingo/odata2/jpa/processor/core/access/model/JPATypeConvertor.java b/odata2-jpa-processor/jpa-core/src/main/java/org/apache/olingo/odata2/jpa/processor/core/access/model/JPATypeConvertor.java
index c5c2722..685ee83 100644
--- a/odata2-jpa-processor/jpa-core/src/main/java/org/apache/olingo/odata2/jpa/processor/core/access/model/JPATypeConvertor.java
+++ b/odata2-jpa-processor/jpa-core/src/main/java/org/apache/olingo/odata2/jpa/processor/core/access/model/JPATypeConvertor.java
@@ -106,7 +106,7 @@ public class JPATypeConvertor {
         .addContent(jpaType.toString()), null);
   }
 
-  private static boolean isBlob(Attribute<?, ?> currentAttribute) {
+  private static boolean isBlob(final Attribute<?, ?> currentAttribute) {
     if (currentAttribute != null) {
       AnnotatedElement annotatedElement = (AnnotatedElement) currentAttribute.getJavaMember();
       if (annotatedElement != null && annotatedElement.getAnnotation(Lob.class) != null) {
@@ -116,7 +116,7 @@ public class JPATypeConvertor {
     return false;
   }
 
-  private static TemporalType determineTemporalType(Attribute<?, ?> currentAttribute)
+  private static TemporalType determineTemporalType(final Attribute<?, ?> currentAttribute)
       throws ODataJPAModelException {
     if (currentAttribute != null) {
       AnnotatedElement annotatedElement = (AnnotatedElement) currentAttribute.getJavaMember();

http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/74dff0f3/odata2-jpa-processor/jpa-core/src/test/java/org/apache/olingo/odata2/jpa/processor/core/access/data/JPAEntityParserTestForStaticMethods.java
----------------------------------------------------------------------
diff --git a/odata2-jpa-processor/jpa-core/src/test/java/org/apache/olingo/odata2/jpa/processor/core/access/data/JPAEntityParserTestForStaticMethods.java b/odata2-jpa-processor/jpa-core/src/test/java/org/apache/olingo/odata2/jpa/processor/core/access/data/JPAEntityParserTestForStaticMethods.java
index 44f1f4b..efb388d 100644
--- a/odata2-jpa-processor/jpa-core/src/test/java/org/apache/olingo/odata2/jpa/processor/core/access/data/JPAEntityParserTestForStaticMethods.java
+++ b/odata2-jpa-processor/jpa-core/src/test/java/org/apache/olingo/odata2/jpa/processor/core/access/data/JPAEntityParserTestForStaticMethods.java
@@ -281,7 +281,7 @@ public class JPAEntityParserTestForStaticMethods {
     }
   }
 
-  private FileInputStream getFileStream(String name) throws SerialException, FileNotFoundException {
+  private FileInputStream getFileStream(final String name) throws SerialException, FileNotFoundException {
     final String fileName = "SalesOrderProcessingMappingModels.xml";
     FileInputStream fis;
 

http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/74dff0f3/odata2-jpa-processor/jpa-core/src/test/java/org/apache/olingo/odata2/jpa/processor/core/mock/ODataJPAServiceFactoryMock.java
----------------------------------------------------------------------
diff --git a/odata2-jpa-processor/jpa-core/src/test/java/org/apache/olingo/odata2/jpa/processor/core/mock/ODataJPAServiceFactoryMock.java b/odata2-jpa-processor/jpa-core/src/test/java/org/apache/olingo/odata2/jpa/processor/core/mock/ODataJPAServiceFactoryMock.java
index 8535fe4..5fdeece 100644
--- a/odata2-jpa-processor/jpa-core/src/test/java/org/apache/olingo/odata2/jpa/processor/core/mock/ODataJPAServiceFactoryMock.java
+++ b/odata2-jpa-processor/jpa-core/src/test/java/org/apache/olingo/odata2/jpa/processor/core/mock/ODataJPAServiceFactoryMock.java
@@ -26,21 +26,21 @@ import org.apache.olingo.odata2.jpa.processor.api.exception.ODataJPARuntimeExcep
 public class ODataJPAServiceFactoryMock extends ODataJPAServiceFactory {
   private ODataContext context = null;
 
-  public ODataJPAServiceFactoryMock(ODataContext context) {
+  public ODataJPAServiceFactoryMock(final ODataContext context) {
     this.context = context;
   }
 
   @Override
   public ODataJPAContext initializeODataJPAContext() throws ODataJPARuntimeException {
     ODataJPAContext oDataJPAContext = null;
-    oDataJPAContext = ODataJPAContextMock.mockODataJPAContext(this.context);
+    oDataJPAContext = ODataJPAContextMock.mockODataJPAContext(context);
     setOnWriteJPAContent(new OnJPAWriteContentMock());
     return oDataJPAContext;
   }
 
   public ODataJPAContext initializeODataJPAContextX() throws ODataJPARuntimeException {
     ODataJPAContext oDataJPAContext = null;
-    oDataJPAContext = ODataJPAContextMock.mockODataJPAContext(this.context);
+    oDataJPAContext = ODataJPAContextMock.mockODataJPAContext(context);
     setOnWriteJPAContent(null);
     return oDataJPAContext;
   }

http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/74dff0f3/odata2-jpa-processor/jpa-core/src/test/java/org/apache/olingo/odata2/jpa/processor/core/mock/OnJPAWriteContentMock.java
----------------------------------------------------------------------
diff --git a/odata2-jpa-processor/jpa-core/src/test/java/org/apache/olingo/odata2/jpa/processor/core/mock/OnJPAWriteContentMock.java b/odata2-jpa-processor/jpa-core/src/test/java/org/apache/olingo/odata2/jpa/processor/core/mock/OnJPAWriteContentMock.java
index 6a59361..e0069ce 100644
--- a/odata2-jpa-processor/jpa-core/src/test/java/org/apache/olingo/odata2/jpa/processor/core/mock/OnJPAWriteContentMock.java
+++ b/odata2-jpa-processor/jpa-core/src/test/java/org/apache/olingo/odata2/jpa/processor/core/mock/OnJPAWriteContentMock.java
@@ -32,7 +32,7 @@ import org.apache.olingo.odata2.jpa.processor.api.exception.ODataJPARuntimeExcep
 public class OnJPAWriteContentMock implements OnJPAWriteContent {
 
   @Override
-  public Blob getJPABlob(byte[] binaryData) throws ODataJPARuntimeException {
+  public Blob getJPABlob(final byte[] binaryData) throws ODataJPARuntimeException {
     try {
       return new SerialBlob(binaryData);
     } catch (SerialException e) {
@@ -44,7 +44,7 @@ public class OnJPAWriteContentMock implements OnJPAWriteContent {
   }
 
   @Override
-  public Clob getJPAClob(char[] characterData) throws ODataJPARuntimeException {
+  public Clob getJPAClob(final char[] characterData) throws ODataJPARuntimeException {
     try {
       return new SerialClob(characterData);
     } catch (SerialException e) {

http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/74dff0f3/odata2-jpa-processor/jpa-core/src/test/java/org/apache/olingo/odata2/jpa/processor/core/mock/data/JPATypeMock.java
----------------------------------------------------------------------
diff --git a/odata2-jpa-processor/jpa-core/src/test/java/org/apache/olingo/odata2/jpa/processor/core/mock/data/JPATypeMock.java b/odata2-jpa-processor/jpa-core/src/test/java/org/apache/olingo/odata2/jpa/processor/core/mock/data/JPATypeMock.java
index be1475c..dd8207b 100644
--- a/odata2-jpa-processor/jpa-core/src/test/java/org/apache/olingo/odata2/jpa/processor/core/mock/data/JPATypeMock.java
+++ b/odata2-jpa-processor/jpa-core/src/test/java/org/apache/olingo/odata2/jpa/processor/core/mock/data/JPATypeMock.java
@@ -60,7 +60,7 @@ public class JPATypeMock {
     return mClob;
   }
 
-  public void setMClob(Clob mClob) {
+  public void setMClob(final Clob mClob) {
     this.mClob = mClob;
   }
 
@@ -68,7 +68,7 @@ public class JPATypeMock {
     return mC;
   }
 
-  public void setMC(char mC) {
+  public void setMC(final char mC) {
     this.mC = mC;
   }
 
@@ -76,7 +76,7 @@ public class JPATypeMock {
     return mCArray;
   }
 
-  public void setMCArray(char[] mCArray) {
+  public void setMCArray(final char[] mCArray) {
     this.mCArray = mCArray;
   }
 
@@ -84,7 +84,7 @@ public class JPATypeMock {
     return mChar;
   }
 
-  public void setMChar(Character mChar) {
+  public void setMChar(final Character mChar) {
     this.mChar = mChar;
   }
 
@@ -92,7 +92,7 @@ public class JPATypeMock {
     return mCharArray;
   }
 
-  public void setMCharArray(Character[] mCharArray) {
+  public void setMCharArray(final Character[] mCharArray) {
     this.mCharArray = mCharArray;
   }
 
@@ -159,7 +159,7 @@ public class JPATypeMock {
     return mBlob;
   }
 
-  public void setMBlob(Blob mBlob) {
+  public void setMBlob(final Blob mBlob) {
     this.mBlob = mBlob;
   }
 

http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/74dff0f3/odata2-jpa-processor/jpa-ref/src/main/java/org/apache/olingo/odata2/jpa/processor/ref/converter/BlobToByteConverter.java
----------------------------------------------------------------------
diff --git a/odata2-jpa-processor/jpa-ref/src/main/java/org/apache/olingo/odata2/jpa/processor/ref/converter/BlobToByteConverter.java b/odata2-jpa-processor/jpa-ref/src/main/java/org/apache/olingo/odata2/jpa/processor/ref/converter/BlobToByteConverter.java
index 8e9c6c2..b6b01cf 100644
--- a/odata2-jpa-processor/jpa-ref/src/main/java/org/apache/olingo/odata2/jpa/processor/ref/converter/BlobToByteConverter.java
+++ b/odata2-jpa-processor/jpa-ref/src/main/java/org/apache/olingo/odata2/jpa/processor/ref/converter/BlobToByteConverter.java
@@ -33,7 +33,7 @@ import org.hsqldb.jdbc.JDBCBlob;
 public class BlobToByteConverter implements AttributeConverter<Blob, byte[]> {
 
   @Override
-  public byte[] convertToDatabaseColumn(Blob arg0) {
+  public byte[] convertToDatabaseColumn(final Blob arg0) {
     ByteArrayOutputStream buffer = new ByteArrayOutputStream();
     InputStream is;
     try {
@@ -53,7 +53,7 @@ public class BlobToByteConverter implements AttributeConverter<Blob, byte[]> {
   }
 
   @Override
-  public Blob convertToEntityAttribute(byte[] arg0) {
+  public Blob convertToEntityAttribute(final byte[] arg0) {
     try {
       return new JDBCBlob(arg0);
     } catch (SQLException e) {

http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/74dff0f3/odata2-jpa-processor/jpa-ref/src/main/java/org/apache/olingo/odata2/jpa/processor/ref/model/Material.java
----------------------------------------------------------------------
diff --git a/odata2-jpa-processor/jpa-ref/src/main/java/org/apache/olingo/odata2/jpa/processor/ref/model/Material.java b/odata2-jpa-processor/jpa-ref/src/main/java/org/apache/olingo/odata2/jpa/processor/ref/model/Material.java
index 83483de..356909f 100644
--- a/odata2-jpa-processor/jpa-ref/src/main/java/org/apache/olingo/odata2/jpa/processor/ref/model/Material.java
+++ b/odata2-jpa-processor/jpa-ref/src/main/java/org/apache/olingo/odata2/jpa/processor/ref/model/Material.java
@@ -74,7 +74,7 @@ public class Material {
     return materialImage;
   }
 
-  public void setMaterialImage(Blob materialImage) {
+  public void setMaterialImage(final Blob materialImage) {
     this.materialImage = materialImage;
   }
 

http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/74dff0f3/odata2-jpa-processor/jpa-ref/src/main/java/org/apache/olingo/odata2/jpa/processor/ref/model/NoteKey.java
----------------------------------------------------------------------
diff --git a/odata2-jpa-processor/jpa-ref/src/main/java/org/apache/olingo/odata2/jpa/processor/ref/model/NoteKey.java b/odata2-jpa-processor/jpa-ref/src/main/java/org/apache/olingo/odata2/jpa/processor/ref/model/NoteKey.java
index 6ca1067..2585f97 100644
--- a/odata2-jpa-processor/jpa-ref/src/main/java/org/apache/olingo/odata2/jpa/processor/ref/model/NoteKey.java
+++ b/odata2-jpa-processor/jpa-ref/src/main/java/org/apache/olingo/odata2/jpa/processor/ref/model/NoteKey.java
@@ -32,7 +32,7 @@ public class NoteKey implements Serializable {
     return creationTime;
   }
 
-  public void setCreationTime(Calendar creationTime) {
+  public void setCreationTime(final Calendar creationTime) {
     this.creationTime = creationTime;
   }
 
@@ -40,7 +40,7 @@ public class NoteKey implements Serializable {
     return creationDate;
   }
 
-  public void setCreationDate(Calendar creationDate) {
+  public void setCreationDate(final Calendar creationDate) {
     this.creationDate = creationDate;
   }
 
@@ -48,7 +48,7 @@ public class NoteKey implements Serializable {
     return createdBy;
   }
 
-  public void setCreatedBy(String createdBy) {
+  public void setCreatedBy(final String createdBy) {
     this.createdBy = createdBy;
   }
 
@@ -58,17 +58,17 @@ public class NoteKey implements Serializable {
   }
 
   @Override
-  public boolean equals(Object obj) {
+  public boolean equals(final Object obj) {
     if (obj instanceof Note) {
       Note note = (Note) obj;
 
-      if (!note.getCreatedBy().equals(this.getCreatedBy())) {
+      if (!note.getCreatedBy().equals(getCreatedBy())) {
         return false;
       }
-      if (!note.getCreationDate().equals(this.getCreationDate())) {
+      if (!note.getCreationDate().equals(getCreationDate())) {
         return false;
       }
-      if (!note.getCreationTime().equals(this.getCreationTime())) {
+      if (!note.getCreationTime().equals(getCreationTime())) {
         return false;
       }
       return true;

http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/74dff0f3/odata2-jpa-processor/jpa-web/src/main/java/org/apache/olingo/odata2/jpa/processor/ref/extension/OnDBWriteContent.java
----------------------------------------------------------------------
diff --git a/odata2-jpa-processor/jpa-web/src/main/java/org/apache/olingo/odata2/jpa/processor/ref/extension/OnDBWriteContent.java b/odata2-jpa-processor/jpa-web/src/main/java/org/apache/olingo/odata2/jpa/processor/ref/extension/OnDBWriteContent.java
index 220b904..678b62a 100644
--- a/odata2-jpa-processor/jpa-web/src/main/java/org/apache/olingo/odata2/jpa/processor/ref/extension/OnDBWriteContent.java
+++ b/odata2-jpa-processor/jpa-web/src/main/java/org/apache/olingo/odata2/jpa/processor/ref/extension/OnDBWriteContent.java
@@ -32,7 +32,7 @@ import org.hsqldb.jdbc.JDBCClob;
 public class OnDBWriteContent implements OnJPAWriteContent {
 
   @Override
-  public Blob getJPABlob(byte[] binaryData) throws ODataJPARuntimeException {
+  public Blob getJPABlob(final byte[] binaryData) throws ODataJPARuntimeException {
     try {
       return new JDBCBlob(binaryData);
     } catch (SerialException e) {
@@ -44,7 +44,7 @@ public class OnDBWriteContent implements OnJPAWriteContent {
   }
 
   @Override
-  public Clob getJPAClob(char[] characterData) throws ODataJPARuntimeException {
+  public Clob getJPAClob(final char[] characterData) throws ODataJPARuntimeException {
     try {
       return new JDBCClob(new String(characterData));
     } catch (SQLException e) {

http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/74dff0f3/odata2-lib/odata-api/src/main/java/org/apache/olingo/odata2/api/ep/EntityProviderReadProperties.java
----------------------------------------------------------------------
diff --git a/odata2-lib/odata-api/src/main/java/org/apache/olingo/odata2/api/ep/EntityProviderReadProperties.java b/odata2-lib/odata-api/src/main/java/org/apache/olingo/odata2/api/ep/EntityProviderReadProperties.java
index 3df4758..6012d96 100644
--- a/odata2-lib/odata-api/src/main/java/org/apache/olingo/odata2/api/ep/EntityProviderReadProperties.java
+++ b/odata2-lib/odata-api/src/main/java/org/apache/olingo/odata2/api/ep/EntityProviderReadProperties.java
@@ -98,7 +98,7 @@ public class EntityProviderReadProperties {
   }
 
   /**
-   * Builder for {@link EntityProviderReadProperties}.  
+   * Builder for {@link EntityProviderReadProperties}.
    */
   public static class EntityProviderReadPropertiesBuilder {
     private final EntityProviderReadProperties properties = new EntityProviderReadProperties();


[13/13] git commit: Merge branch 'master' into OLINGO-231_PocForAndroid

Posted by mi...@apache.org.
Merge branch 'master' into OLINGO-231_PocForAndroid

Conflicts:
	odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/ep/consumer/XmlEntityConsumer.java
	odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ep/consumer/XmlPropertyConsumerTest.java


Project: http://git-wip-us.apache.org/repos/asf/olingo-odata2/repo
Commit: http://git-wip-us.apache.org/repos/asf/olingo-odata2/commit/28333eff
Tree: http://git-wip-us.apache.org/repos/asf/olingo-odata2/tree/28333eff
Diff: http://git-wip-us.apache.org/repos/asf/olingo-odata2/diff/28333eff

Branch: refs/heads/OLINGO-231_PocForAndroid
Commit: 28333efff58a8bab0f2f0198eb3dd37ec41fb93c
Parents: 3f1de10 1ac8e7d
Author: Michael Bolz <mi...@sap.com>
Authored: Tue Apr 29 13:57:53 2014 +0200
Committer: Michael Bolz <mi...@sap.com>
Committed: Tue Apr 29 13:57:53 2014 +0200

----------------------------------------------------------------------
 .../processor/core/util/ClassHelper.java        |  53 ++--
 .../processor/core/util/ClassHelperTest.java    |  21 +-
 .../api/exception/ODataJPARuntimeException.java |   1 -
 .../processor/core/access/data/JPAEntity.java   |   2 +-
 .../core/access/data/JPAEntityParser.java       |   4 +-
 .../core/access/model/JPAEdmNameBuilder.java    |   6 +-
 .../core/access/model/JPATypeConvertor.java     |   4 +-
 .../processor/core/model/JPAEdmProperty.java    |   9 +-
 .../JPAEntityParserTestForStaticMethods.java    |   2 +-
 .../access/model/JPAEdmNameBuilderTest.java     |   4 +-
 .../core/mock/ODataJPAServiceFactoryMock.java   |   6 +-
 .../core/mock/OnJPAWriteContentMock.java        |   4 +-
 .../processor/core/mock/data/JPATypeMock.java   |  12 +-
 .../ref/converter/BlobToByteConverter.java      |   4 +-
 .../jpa/processor/ref/model/Material.java       |   2 +-
 .../odata2/jpa/processor/ref/model/NoteKey.java |  14 +-
 .../ref/extension/OnDBWriteContent.java         |   4 +-
 .../api/ep/EntityProviderReadProperties.java    |  19 +-
 .../api/ep/EntityProviderWriteProperties.java   |  27 +-
 .../olingo/odata2/core/ODataRequestHandler.java |   9 +-
 .../odata2/core/batch/BatchRequestParser.java   | 102 ++++---
 .../odata2/core/batch/BatchRequestWriter.java   |  24 +-
 .../odata2/core/batch/BatchResponseParser.java  |  11 +-
 .../core/ep/consumer/JsonEntryConsumer.java     |  19 +-
 .../core/ep/consumer/JsonFeedConsumer.java      |   3 +-
 .../core/ep/consumer/JsonPropertyConsumer.java  |  33 ++-
 .../core/ep/consumer/XmlEntityConsumer.java     |   7 +-
 .../core/ep/consumer/XmlEntryConsumer.java      |  22 +-
 .../core/ep/consumer/XmlPropertyConsumer.java   |  32 ++-
 .../ep/producer/AtomEntryEntityProducer.java    |  36 ++-
 .../ep/producer/JsonEntryEntityProducer.java    |  21 +-
 .../odata2/core/ContentNegotiatorTest.java      |   8 +
 .../core/batch/BatchRequestParserTest.java      |   2 +
 .../odata2/core/batch/BatchRequestTest.java     | 285 +++++++++++++++++++
 .../core/batch/BatchRequestWriterTest.java      |  22 +-
 .../core/batch/BatchResponseParserTest.java     |   1 -
 .../odata2/core/batch/BatchResponseTest.java    | 141 +++++++++
 .../ep/ODataEntityProviderPropertiesTest.java   |   9 +
 .../consumer/JsonEntryDeepInsertEntryTest.java  |  16 ++
 .../ep/consumer/JsonPropertyConsumerTest.java   |  53 +++-
 .../ep/consumer/XmlPropertyConsumerTest.java    | 103 +++++--
 .../core/ep/producer/AtomEntryProducerTest.java |  30 ++
 .../producer/JsonEntryEntityProducerTest.java   |  24 ++
 .../resources/JsonInlineRoomWithInlineNull.json |  44 +++
 .../src/test/resources/batchResponse.batch      |   2 -
 .../odata2/fit/basic/ServiceResolutionTest.java |  18 ++
 .../odata2/fit/ref/EntryJsonChangeTest.java     |  30 +-
 .../odata2/fit/ref/FunctionImportXmlTest.java   |  68 ++++-
 .../odata2/testutil/helper/StringHelper.java    |  99 ++++++-
 49 files changed, 1223 insertions(+), 249 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/28333eff/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/ep/consumer/XmlEntityConsumer.java
----------------------------------------------------------------------
diff --cc odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/ep/consumer/XmlEntityConsumer.java
index 13d8805,5d73862..85068bf
--- a/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/ep/consumer/XmlEntityConsumer.java
+++ b/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/ep/consumer/XmlEntityConsumer.java
@@@ -113,10 -114,9 +113,11 @@@ public class XmlEntityConsumer 
      XmlPropertyConsumer xec = new XmlPropertyConsumer();
  
      try {
 -      reader = XmlHelper.createStreamReader(content);
 -      return xec.readProperty(reader, edmProperty, properties.getMergeSemantic(), properties.getTypeMappings(),
 -          properties);
 +      reader = XmlStreamFactory.createStreamReader(content);
-       Map<String, Object> result =
-           xec.readProperty(reader, edmProperty, properties.getMergeSemantic(), properties.getTypeMappings());
-       return result;
++      return xec.readProperty(reader, edmProperty,
++              properties.getMergeSemantic(),
++              properties.getTypeMappings(),
++              properties);
      } catch (EntityProviderException e) {
        cachedException = e;
        throw cachedException;

http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/28333eff/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/ep/consumer/XmlEntryConsumer.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/28333eff/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/ep/consumer/XmlPropertyConsumer.java
----------------------------------------------------------------------
diff --cc odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/ep/consumer/XmlPropertyConsumer.java
index 02bdb0f,3887333..db51a79
--- a/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/ep/consumer/XmlPropertyConsumer.java
+++ b/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/ep/consumer/XmlPropertyConsumer.java
@@@ -34,12 -39,9 +35,12 @@@ import org.apache.olingo.odata2.core.ep
  import org.apache.olingo.odata2.core.ep.aggregator.EntityPropertyInfo;
  import org.apache.olingo.odata2.core.ep.aggregator.EntityTypeMapping;
  import org.apache.olingo.odata2.core.ep.util.FormatXml;
 +import org.apache.olingo.odata2.api.xml.XMLStreamConstants;
 +import org.apache.olingo.odata2.api.xml.XMLStreamException;
 +import org.apache.olingo.odata2.api.xml.XMLStreamReader;
  
  /**
-  *  
+  * XML property consumer.
   */
  public class XmlPropertyConsumer {
  

http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/28333eff/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/ep/producer/AtomEntryEntityProducer.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/28333eff/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ep/consumer/XmlPropertyConsumerTest.java
----------------------------------------------------------------------
diff --cc odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ep/consumer/XmlPropertyConsumerTest.java
index 0bf231a,c33b4ea..edd931c
--- a/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ep/consumer/XmlPropertyConsumerTest.java
+++ b/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ep/consumer/XmlPropertyConsumerTest.java
@@@ -36,7 -39,7 +37,8 @@@ import org.apache.olingo.odata2.api.edm
  import org.apache.olingo.odata2.api.edm.EdmSimpleTypeException;
  import org.apache.olingo.odata2.api.edm.EdmSimpleTypeKind;
  import org.apache.olingo.odata2.api.ep.EntityProviderException;
 +import org.apache.olingo.odata2.api.xml.XMLStreamReader;
+ import org.apache.olingo.odata2.api.ep.EntityProviderReadProperties;
  import org.apache.olingo.odata2.testutil.mock.MockFacade;
  import org.junit.Test;
  

http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/28333eff/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ep/producer/AtomEntryProducerTest.java
----------------------------------------------------------------------


[11/13] git commit: [OLINGO-256] Changed batch write/read to be RFC1341 compliant

Posted by mi...@apache.org.
[OLINGO-256] Changed batch write/read to be RFC1341 compliant


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

Branch: refs/heads/OLINGO-231_PocForAndroid
Commit: a9380800aac9571c38059173a0fd90fd98229214
Parents: e851250
Author: Michael Bolz <mi...@apache.org>
Authored: Tue Apr 29 09:15:51 2014 +0200
Committer: Michael Bolz <mi...@apache.org>
Committed: Tue Apr 29 09:41:49 2014 +0200

----------------------------------------------------------------------
 .../odata2/core/batch/BatchRequestParser.java   | 24 ++++++++++----------
 .../odata2/core/batch/BatchRequestWriter.java   | 11 ++++-----
 .../odata2/core/batch/BatchResponseParser.java  | 11 +++++++--
 .../core/batch/BatchRequestParserTest.java      |  2 ++
 .../odata2/core/batch/BatchRequestTest.java     |  2 ++
 .../core/batch/BatchRequestWriterTest.java      |  2 +-
 .../odata2/core/batch/BatchResponseTest.java    |  2 +-
 .../odata2/testutil/helper/StringHelper.java    | 18 +++++++++++----
 8 files changed, 45 insertions(+), 27 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/a9380800/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/batch/BatchRequestParser.java
----------------------------------------------------------------------
diff --git a/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/batch/BatchRequestParser.java b/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/batch/BatchRequestParser.java
index 2404ad8..1211cf8 100644
--- a/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/batch/BatchRequestParser.java
+++ b/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/batch/BatchRequestParser.java
@@ -155,13 +155,12 @@ public class BatchRequestParser {
 
   private BatchRequestPart parseMultipart(final Scanner scanner, final String boundary, final boolean isChangeSet)
       throws BatchException {
-    Map<String, String> mimeHeaders = new HashMap<String, String>();
-    BatchRequestPart multipart = null;
     List<ODataRequest> requests = new ArrayList<ODataRequest>();
+    BatchRequestPart multipart;
     if (scanner.hasNext("--" + boundary + REG_EX_ZERO_OR_MORE_WHITESPACES)) {
       scanner.next();
       currentLineNumber++;
-      mimeHeaders = parseHeaders(scanner);
+      Map<String, String> mimeHeaders = parseHeaders(scanner);
       currentMimeHeaderContentId = mimeHeaders.get(BatchHelper.HTTP_CONTENT_ID.toLowerCase(Locale.ENGLISH));
 
       String contentType = mimeHeaders.get(HttpHeaders.CONTENT_TYPE.toLowerCase(Locale.ENGLISH));
@@ -173,7 +172,7 @@ public class BatchRequestParser {
           validateEncoding(mimeHeaders.get(BatchHelper.HTTP_CONTENT_TRANSFER_ENCODING.toLowerCase(Locale.ENGLISH)));
           parseNewLine(scanner);// mandatory
 
-          requests.add(parseRequest(scanner, isChangeSet));
+          requests.add(parseRequest(scanner, true, boundary));
           multipart = new BatchRequestPartImpl(false, requests);
         } else {
           throw new BatchException(BatchException.INVALID_CONTENT_TYPE.addContent(HttpContentType.APPLICATION_HTTP));
@@ -182,7 +181,7 @@ public class BatchRequestParser {
         if (HttpContentType.APPLICATION_HTTP.equalsIgnoreCase(contentType)) {
           validateEncoding(mimeHeaders.get(BatchHelper.HTTP_CONTENT_TRANSFER_ENCODING.toLowerCase(Locale.ENGLISH)));
           parseNewLine(scanner);// mandatory
-          requests.add(parseRequest(scanner, isChangeSet));
+          requests.add(parseRequest(scanner, false, boundary));
           multipart = new BatchRequestPartImpl(false, requests);
         } else if (contentType.matches(REG_EX_OPTIONAL_WHITESPACE + HttpContentType.MULTIPART_MIXED + ANY_CHARACTERS)) {
           String changeSetBoundary = getBoundary(contentType);
@@ -220,7 +219,8 @@ public class BatchRequestParser {
 
   }
 
-  private ODataRequest parseRequest(final Scanner scanner, final boolean isChangeSet) throws BatchException {
+  private ODataRequest parseRequest(final Scanner scanner, final boolean isChangeSet, final String boundary)
+          throws BatchException {
     if (scanner.hasNext(REG_EX_REQUEST_LINE)) {
       scanner.next(REG_EX_REQUEST_LINE);
       currentLineNumber++;
@@ -245,7 +245,7 @@ public class BatchRequestParser {
         throw new BatchException(BatchException.INVALID_QUERY_OPERATION_METHOD.addContent(currentLineNumber));
       }
       ODataHttpMethod httpMethod = ODataHttpMethod.valueOf(method);
-      Map<String, List<String>> headers = parseRequestHeaders(scanner);
+      Map<String, List<String>> headers = parseRequestHeaders(scanner, boundary);
       if (currentMimeHeaderContentId != null) {
         List<String> headerList = new ArrayList<String>();
         headerList.add(currentMimeHeaderContentId);
@@ -255,12 +255,9 @@ public class BatchRequestParser {
       String contentType = getContentTypeHeader(headers);
       List<String> acceptHeaders = getAcceptHeader(headers);
       List<Locale> acceptLanguages = getAcceptLanguageHeader(headers);
-      parseNewLine(scanner);
       InputStream body = new ByteArrayInputStream(new byte[0]);
       if (isChangeSet) {
         body = parseBody(scanner);
-      } else {
-        parseNewLine(scanner);
       }
 
       ODataRequestBuilder requestBuilder = ODataRequest.method(httpMethod)
@@ -283,9 +280,12 @@ public class BatchRequestParser {
 
   }
 
-  private Map<String, List<String>> parseRequestHeaders(final Scanner scanner) throws BatchException {
+  private Map<String, List<String>> parseRequestHeaders(final Scanner scanner, final String boundary)
+          throws BatchException {
     Map<String, List<String>> headers = new HashMap<String, List<String>>();
-    while (scanner.hasNext() && !scanner.hasNext(REG_EX_BLANK_LINE)) {
+    while (scanner.hasNext()
+            && !scanner.hasNext(REG_EX_BLANK_LINE)
+            && !scanner.hasNext("--" + boundary + REG_EX_ZERO_OR_MORE_WHITESPACES)) {
       if (scanner.hasNext(REG_EX_HEADER)) {
         scanner.next(REG_EX_HEADER);
         currentLineNumber++;

http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/a9380800/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/batch/BatchRequestWriter.java
----------------------------------------------------------------------
diff --git a/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/batch/BatchRequestWriter.java b/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/batch/BatchRequestWriter.java
index 4622d37..40cf0e0 100644
--- a/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/batch/BatchRequestWriter.java
+++ b/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/batch/BatchRequestWriter.java
@@ -57,7 +57,7 @@ public class BatchRequestWriter {
             request.getContentId());
       }
     }
-    writer.append("--").append(boundary).append("--").append(LF).append(LF);
+    writer.append(LF).append("--").append(boundary).append("--");
     InputStream batchRequestBody;
     batchRequestBody = new ByteArrayInputStream(BatchHelper.getBytes(writer.toString()));
     return batchRequestBody;
@@ -69,13 +69,13 @@ public class BatchRequestWriter {
       boundary = BatchHelper.generateBoundary("changeset");
     }
     writer.append(HttpHeaders.CONTENT_TYPE).append(COLON).append(SP).append(
-        HttpContentType.MULTIPART_MIXED + "; boundary=" + boundary).append(LF).append(LF);
+        HttpContentType.MULTIPART_MIXED + "; boundary=" + boundary).append(LF);
     for (BatchChangeSetPart request : batchChangeSet.getChangeSetParts()) {
-      writer.append("--").append(boundary).append(LF);
+      writer.append(LF).append("--").append(boundary).append(LF);
       appendRequestBodyPart(request.getMethod(), request.getUri(), request.getBody(), request.getHeaders(), request
           .getContentId());
     }
-    writer.append("--").append(boundary).append("--").append(LF).append(LF);
+    writer.append(LF).append("--").append(boundary).append("--").append(LF);
   }
 
   private void appendRequestBodyPart(final String method, final String uri, final String body,
@@ -98,7 +98,6 @@ public class BatchRequestWriter {
     if (!isContentLengthPresent && body != null && !body.isEmpty()) {
       writer.append(HttpHeaders.CONTENT_LENGTH).append(COLON).append(SP).append(BatchHelper.getBytes(body).length)
           .append(LF);
-
     }
     appendHeader(headers);
 
@@ -106,14 +105,12 @@ public class BatchRequestWriter {
       writer.append(LF);
       writer.append(body);
     }
-    writer.append(LF).append(LF);
   }
 
   private void appendHeader(final Map<String, String> headers) {
     for (Map.Entry<String, String> headerMap : headers.entrySet()) {
       String name = headerMap.getKey();
       writer.append(name).append(COLON).append(SP).append(headerMap.getValue()).append(LF);
-
     }
   }
 

http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/a9380800/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/batch/BatchResponseParser.java
----------------------------------------------------------------------
diff --git a/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/batch/BatchResponseParser.java b/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/batch/BatchResponseParser.java
index 84b90b0..0dfe77b 100644
--- a/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/batch/BatchResponseParser.java
+++ b/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/batch/BatchResponseParser.java
@@ -157,7 +157,7 @@ public class BatchResponseParser {
           }
           scanner.next(changeSetCloseDelimiter);
           currentLineNumber++;
-          parseNewLine(scanner);
+          parseOptionalEmptyLine(scanner);
         } else {
           throw new BatchException(BatchException.INVALID_CONTENT_TYPE.addContent(HttpContentType.MULTIPART_MIXED
               + " or " + HttpContentType.APPLICATION_HTTP));
@@ -358,7 +358,14 @@ public class BatchResponseParser {
     }
   }
 
-  private String trimQuota(String boundary) {
+  private void parseOptionalEmptyLine(final Scanner scanner) {
+      if (scanner.hasNext() && scanner.hasNext(REG_EX_BLANK_LINE)) {
+        scanner.next();
+        currentLineNumber++;
+      }
+    }
+
+      private String trimQuota(String boundary) {
     if (boundary.matches("\".*\"")) {
       boundary = boundary.replace("\"", "");
     }

http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/a9380800/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/batch/BatchRequestParserTest.java
----------------------------------------------------------------------
diff --git a/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/batch/BatchRequestParserTest.java b/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/batch/BatchRequestParserTest.java
index f66a864..e1315fb 100644
--- a/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/batch/BatchRequestParserTest.java
+++ b/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/batch/BatchRequestParserTest.java
@@ -40,6 +40,7 @@ import org.apache.olingo.odata2.core.ODataPathSegmentImpl;
 import org.apache.olingo.odata2.core.PathInfoImpl;
 import org.apache.olingo.odata2.testutil.helper.StringHelper;
 import org.junit.BeforeClass;
+import org.junit.Ignore;
 import org.junit.Test;
 
 /**
@@ -347,6 +348,7 @@ public class BatchRequestParserTest {
   }
 
   @Test(expected = BatchException.class)
+  @Ignore("What should here throw an exception")
   public void testMimeHeaderContentId() throws BatchException {
     String batch = "--batch_8194-cf13-1f56" + LF
         + MIME_HEADERS

http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/a9380800/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/batch/BatchRequestTest.java
----------------------------------------------------------------------
diff --git a/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/batch/BatchRequestTest.java b/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/batch/BatchRequestTest.java
index 40c3218..b3f41a0 100644
--- a/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/batch/BatchRequestTest.java
+++ b/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/batch/BatchRequestTest.java
@@ -121,6 +121,7 @@ public class BatchRequestTest {
     assertTrue(requestBody.contains("--changeset_"));
     assertTrue(requestBody.contains("PUT Employees('2') HTTP/1.1"));
     assertTrue(requestBody.contains("{\"Возраст\":40}"));
+    assertEquals(16, batchRequestStream.linesCount());
 
     String contentType = "multipart/mixed; boundary=" + BOUNDARY;
     BatchRequestParser parser = new BatchRequestParser(contentType, parseProperties);
@@ -161,6 +162,7 @@ public class BatchRequestTest {
     assertTrue(requestBody.contains("GET Employees HTTP/1.1"));
     assertTrue(requestBody.contains("POST Employees HTTP/1.1"));
     assertTrue(requestBody.contains(body));
+    assertEquals(23, batchRequestStream.linesCount());
 
     String contentType = "multipart/mixed; boundary=" + BOUNDARY;
     BatchRequestParser parser = new BatchRequestParser(contentType, parseProperties);

http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/a9380800/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/batch/BatchRequestWriterTest.java
----------------------------------------------------------------------
diff --git a/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/batch/BatchRequestWriterTest.java b/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/batch/BatchRequestWriterTest.java
index 496686d..89bdea3 100644
--- a/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/batch/BatchRequestWriterTest.java
+++ b/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/batch/BatchRequestWriterTest.java
@@ -67,7 +67,7 @@ public class BatchRequestWriterTest {
     assertTrue(requestBody.contains("--batch_"));
     assertTrue(requestBody.contains("GET Employees HTTP/1.1"));
     checkHeaders(headers, requestBody);
-    assertEquals(10, StringHelper.countLines(requestBody));
+    assertEquals(8, StringHelper.countLines(requestBody));
   }
 
   @Test

http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/a9380800/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/batch/BatchResponseTest.java
----------------------------------------------------------------------
diff --git a/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/batch/BatchResponseTest.java b/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/batch/BatchResponseTest.java
index 29dd774..c438a0f 100644
--- a/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/batch/BatchResponseTest.java
+++ b/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/batch/BatchResponseTest.java
@@ -136,6 +136,6 @@ public class BatchResponseTest {
     StringHelper.Stream content = StringHelper.toStream(body);
     List<BatchSingleResponse> result = parser.parse(content.asStream());
     assertEquals(2, result.size());
-    assertEquals("Failing content:\n" + content.asString(), 19, content.countCrLf());
+    assertEquals("Failing content:\n" + content.asString(), 20, content.linesCount());
   }
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/a9380800/odata2-lib/odata-testutil/src/main/java/org/apache/olingo/odata2/testutil/helper/StringHelper.java
----------------------------------------------------------------------
diff --git a/odata2-lib/odata-testutil/src/main/java/org/apache/olingo/odata2/testutil/helper/StringHelper.java b/odata2-lib/odata-testutil/src/main/java/org/apache/olingo/odata2/testutil/helper/StringHelper.java
index d5191f0..feb4ddd 100644
--- a/odata2-lib/odata-testutil/src/main/java/org/apache/olingo/odata2/testutil/helper/StringHelper.java
+++ b/odata2-lib/odata-testutil/src/main/java/org/apache/olingo/odata2/testutil/helper/StringHelper.java
@@ -67,7 +67,14 @@ public class StringHelper {
       return print(System.out);
     }
 
-    public int countCrLf() {
+    /**
+     * Number of lines separated by line breaks (<code>CRLF</code>).
+     * A content string like <code>text\r\nmoreText</code> will result in
+     * a line count of <code>2</code>.
+     *
+     * @return lines count
+     */
+    public int linesCount() {
       return StringHelper.countLines(asString(), "\r\n");
     }
   }
@@ -120,14 +127,17 @@ public class StringHelper {
   }
 
   public static int countLines(String content, String lineBreak) {
-    int lastPos = 0;
-    int count = -1;
+    if(content == null) {
+      return -1;
+    }
+
+    int lastPos = content.indexOf(lineBreak);
+    int count = 1;
 
     while (lastPos >= 0) {
       lastPos = content.indexOf(lineBreak, lastPos+1);
       count++;
     }
-
     return count;
   }
 


[10/13] git commit: [OLINGO-243] Fixed wrong content type handling

Posted by mi...@apache.org.
[OLINGO-243] Fixed wrong content type handling


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

Branch: refs/heads/OLINGO-231_PocForAndroid
Commit: e85125093cb782103a112fe0f8368a0ab2aae8a1
Parents: 55b1c84
Author: Michael Bolz <mi...@apache.org>
Authored: Mon Apr 28 10:58:24 2014 +0200
Committer: Michael Bolz <mi...@apache.org>
Committed: Mon Apr 28 10:58:24 2014 +0200

----------------------------------------------------------------------
 .../olingo/odata2/core/ODataRequestHandler.java |  9 ++-
 .../odata2/core/ContentNegotiatorTest.java      |  8 +++
 .../odata2/fit/ref/FunctionImportXmlTest.java   | 68 +++++++++++++++++++-
 3 files changed, 80 insertions(+), 5 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/e8512509/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/ODataRequestHandler.java
----------------------------------------------------------------------
diff --git a/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/ODataRequestHandler.java b/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/ODataRequestHandler.java
index f244bf7..0b1da19 100644
--- a/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/ODataRequestHandler.java
+++ b/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/ODataRequestHandler.java
@@ -481,8 +481,13 @@ public class ODataRequestHandler {
   private List<String> getSupportedContentTypes(final UriInfoImpl uriInfo, final ODataHttpMethod method)
       throws ODataException {
     Class<? extends ODataProcessor> processorFeature = Dispatcher.mapUriTypeToProcessorFeature(uriInfo);
-    if (ODataHttpMethod.POST.equals(method)) {
-      UriType uriType = uriInfo.getUriType();
+    UriType uriType = uriInfo.getUriType();
+    //
+    if (uriType == UriType.URI11) {
+      processorFeature = EntitySetProcessor.class;
+    } else if ((uriType == UriType.URI10)) {
+      processorFeature = EntityProcessor.class;
+    } else if (ODataHttpMethod.POST.equals(method)) {
       if (uriType == UriType.URI1 || uriType == UriType.URI6B) {
         processorFeature = EntityProcessor.class;
       }

http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/e8512509/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ContentNegotiatorTest.java
----------------------------------------------------------------------
diff --git a/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ContentNegotiatorTest.java b/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ContentNegotiatorTest.java
index a45da48..ff12314 100644
--- a/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ContentNegotiatorTest.java
+++ b/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ContentNegotiatorTest.java
@@ -47,6 +47,14 @@ public class ContentNegotiatorTest {
     assertEquals(expected, contentType.toContentTypeString());
   }
 
+  @Test
+  public void defaultContentTypeForEmptyList() throws ODataException {
+    List<ContentType> contentTypes = Arrays.asList();
+    List<ContentType> supportedTypes = Arrays.asList(ContentType.APPLICATION_ATOM_XML, ContentType.APPLICATION_XML);
+
+    negotiateContentType(contentTypes, supportedTypes, "application/atom+xml");
+  }
+
   @Test(expected = IllegalArgumentException.class)
   public void invalidContentNegotiatorCreation() throws ODataException {
     final ContentType contentType = new ContentNegotiator().doContentNegotiation(null, null, null);

http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/e8512509/odata2-lib/odata-fit/src/test/java/org/apache/olingo/odata2/fit/ref/FunctionImportXmlTest.java
----------------------------------------------------------------------
diff --git a/odata2-lib/odata-fit/src/test/java/org/apache/olingo/odata2/fit/ref/FunctionImportXmlTest.java b/odata2-lib/odata-fit/src/test/java/org/apache/olingo/odata2/fit/ref/FunctionImportXmlTest.java
index 6a45963..bdf62e5 100644
--- a/odata2-lib/odata-fit/src/test/java/org/apache/olingo/odata2/fit/ref/FunctionImportXmlTest.java
+++ b/odata2-lib/odata-fit/src/test/java/org/apache/olingo/odata2/fit/ref/FunctionImportXmlTest.java
@@ -25,10 +25,12 @@ import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertNull;
+import junit.framework.Assert;
 
 import org.apache.http.HttpResponse;
 import org.apache.olingo.odata2.api.commons.HttpContentType;
 import org.apache.olingo.odata2.api.commons.HttpHeaders;
+import org.apache.olingo.odata2.core.commons.ContentType;
 import org.apache.olingo.odata2.testutil.server.ServletType;
 import org.junit.Test;
 
@@ -51,10 +53,59 @@ public class FunctionImportXmlTest extends AbstractRefXmlTest {
 
     assertFalse(getBody(callUri("EmployeeSearch?q='-'")).contains("entry"));
 
-    response = callUri("AllLocations");
+    response = callUri("AllLocations", HttpHeaders.ACCEPT, HttpContentType.APPLICATION_XML);
     checkMediaType(response, HttpContentType.APPLICATION_XML_UTF8);
     assertXpathExists("/d:AllLocations/d:element/d:City[d:CityName=\"" + CITY_2_NAME + "\"]", getBody(response));
 
+    response = callUri("AllUsedRoomIds", HttpHeaders.ACCEPT, HttpContentType.APPLICATION_XML);
+    checkMediaType(response, HttpContentType.APPLICATION_XML_UTF8);
+    assertXpathExists("/d:AllUsedRoomIds[d:element=\"3\"]", getBody(response));
+
+    response = callUri("MaximalAge", HttpHeaders.ACCEPT, HttpContentType.APPLICATION_XML);
+    checkMediaType(response, HttpContentType.APPLICATION_XML_UTF8);
+    assertXpathEvaluatesTo(EMPLOYEE_3_AGE, "/d:MaximalAge", getBody(response));
+
+    response = callUri("MostCommonLocation", HttpHeaders.ACCEPT, HttpContentType.APPLICATION_XML);
+    checkMediaType(response, HttpContentType.APPLICATION_XML_UTF8);
+    assertXpathEvaluatesTo(CITY_2_NAME, "/d:MostCommonLocation/d:City/d:CityName", getBody(response));
+
+    checkUri("ManagerPhoto?Id='1'");
+
+    response = callUri("ManagerPhoto/$value?Id='1'");
+    checkMediaType(response, IMAGE_JPEG);
+    assertNull(response.getFirstHeader(HttpHeaders.ETAG));
+    assertNotNull(getBody(response));
+
+    response = callUri("OldestEmployee", HttpHeaders.ACCEPT, HttpContentType.APPLICATION_XML);
+    checkMediaType(response, HttpContentType.APPLICATION_XML_UTF8);
+    assertXpathEvaluatesTo(EMPLOYEE_3_NAME, "/atom:entry/m:properties/d:EmployeeName", getBody(response));
+
+    response = callUri("OldestEmployee?$format=xml");
+    checkMediaType(response, HttpContentType.APPLICATION_XML_UTF8);
+    assertXpathEvaluatesTo(EMPLOYEE_3_NAME, "/atom:entry/m:properties/d:EmployeeName", getBody(response));
+
+    badRequest("AllLocations/$count");
+    badRequest("AllUsedRoomIds/$value");
+    badRequest("MaximalAge()");
+    badRequest("MostCommonLocation/City/CityName");
+    badRequest("ManagerPhoto");
+    badRequest("OldestEmployee()");
+    notFound("ManagerPhoto?Id='2'");
+  }
+
+  @Test
+  public void functionImportsDefaultAccept() throws Exception {
+    HttpResponse response = callUri("EmployeeSearch('1')/ne_Room/Id/$value?q='alter'");
+    checkMediaType(response, HttpContentType.TEXT_PLAIN_UTF8);
+    checkEtag(response, "W/\"1\"");
+    assertEquals("1", getBody(response));
+
+    assertFalse(getBody(callUri("EmployeeSearch?q='-'")).contains("entry"));
+
+    response = callUri("AllLocations");
+    checkMediaType(response, ContentType.APPLICATION_ATOM_XML_FEED_CS_UTF_8);
+    assertXpathExists("/d:AllLocations/d:element/d:City[d:CityName=\"" + CITY_2_NAME + "\"]", getBody(response));
+
     response = callUri("AllUsedRoomIds");
     checkMediaType(response, HttpContentType.APPLICATION_XML_UTF8);
     assertXpathExists("/d:AllUsedRoomIds[d:element=\"3\"]", getBody(response));
@@ -74,8 +125,8 @@ public class FunctionImportXmlTest extends AbstractRefXmlTest {
     assertNull(response.getFirstHeader(HttpHeaders.ETAG));
     assertNotNull(getBody(response));
 
-    response = callUri("OldestEmployee", HttpHeaders.ACCEPT, HttpContentType.APPLICATION_XML);
-    checkMediaType(response, HttpContentType.APPLICATION_XML_UTF8);
+    response = callUri("OldestEmployee");
+    checkMediaType(response, HttpContentType.APPLICATION_ATOM_XML_ENTRY_UTF8);
     assertXpathEvaluatesTo(EMPLOYEE_3_NAME, "/atom:entry/m:properties/d:EmployeeName", getBody(response));
 
     response = callUri("OldestEmployee?$format=xml");
@@ -91,6 +142,17 @@ public class FunctionImportXmlTest extends AbstractRefXmlTest {
     notFound("ManagerPhoto?Id='2'");
   }
 
+  @Override
+  public void checkMediaType(final HttpResponse response, final String expectedContentType) {
+    checkMediaType(response, ContentType.parse(expectedContentType));
+  }
+
+  private void checkMediaType(final HttpResponse response, final ContentType expectedContentType) {
+    ContentType responseContentType =
+        ContentType.parse(response.getFirstHeader(HttpHeaders.CONTENT_TYPE).getValue());
+    Assert.assertEquals(expectedContentType, responseContentType);
+  }
+
   @Test
   public void select() throws Exception {
     HttpResponse response = callUri("EmployeeSearch?q='ede'&$select=Age");


[06/13] git commit: [OLINGO-251] clean up code

Posted by mi...@apache.org.
[OLINGO-251] clean up code


Project: http://git-wip-us.apache.org/repos/asf/olingo-odata2/repo
Commit: http://git-wip-us.apache.org/repos/asf/olingo-odata2/commit/2541c88f
Tree: http://git-wip-us.apache.org/repos/asf/olingo-odata2/tree/2541c88f
Diff: http://git-wip-us.apache.org/repos/asf/olingo-odata2/diff/2541c88f

Branch: refs/heads/OLINGO-231_PocForAndroid
Commit: 2541c88f1ec4e0a5f38f693f708b2527fd891910
Parents: b9bcff1
Author: Stephan Klevenz <sk...@apache.org>
Authored: Wed Apr 23 10:41:02 2014 +0200
Committer: Stephan Klevenz <sk...@apache.org>
Committed: Wed Apr 23 10:41:02 2014 +0200

----------------------------------------------------------------------
 .../olingo/odata2/api/ep/EntityProviderWriteProperties.java  | 8 ++++----
 .../odata2/core/ep/ODataEntityProviderPropertiesTest.java    | 4 ++--
 .../odata2/core/ep/producer/AtomEntryProducerTest.java       | 4 ++--
 .../apache/olingo/odata2/fit/ref/EntryJsonChangeTest.java    | 2 +-
 4 files changed, 9 insertions(+), 9 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/2541c88f/odata2-lib/odata-api/src/main/java/org/apache/olingo/odata2/api/ep/EntityProviderWriteProperties.java
----------------------------------------------------------------------
diff --git a/odata2-lib/odata-api/src/main/java/org/apache/olingo/odata2/api/ep/EntityProviderWriteProperties.java b/odata2-lib/odata-api/src/main/java/org/apache/olingo/odata2/api/ep/EntityProviderWriteProperties.java
index 93c1082..822fc84 100644
--- a/odata2-lib/odata-api/src/main/java/org/apache/olingo/odata2/api/ep/EntityProviderWriteProperties.java
+++ b/odata2-lib/odata-api/src/main/java/org/apache/olingo/odata2/api/ep/EntityProviderWriteProperties.java
@@ -122,8 +122,8 @@ public class EntityProviderWriteProperties {
   /**
    * Gets the additional links that should be in the payload.
    * @return the additional links as Map where the navigation-property name is the key and
-     *       a key predicate is the value -
-     *       a key predicate is a Map from key-property names to their values
+   * a key predicate is the value -
+   * a key predicate is a Map from key-property names to their values
    */
   public final Map<String, Map<String, Object>> getAdditionalLinks() {
     return additionalLinks;
@@ -220,8 +220,8 @@ public class EntityProviderWriteProperties {
     /**
      * Sets additional links from this entity to other entities.
      * @param links a Map where the navigation-property name is the key and
-     *              a key predicate is the value -
-     *              a key predicate is a Map from key-property names to their values
+     * a key predicate is the value -
+     * a key predicate is a Map from key-property names to their values
      * @return properties builder
      */
     public ODataEntityProviderPropertiesBuilder additionalLinks(final Map<String, Map<String, Object>> links) {

http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/2541c88f/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ep/ODataEntityProviderPropertiesTest.java
----------------------------------------------------------------------
diff --git a/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ep/ODataEntityProviderPropertiesTest.java b/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ep/ODataEntityProviderPropertiesTest.java
index b5d178e..3b0d5ab 100644
--- a/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ep/ODataEntityProviderPropertiesTest.java
+++ b/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ep/ODataEntityProviderPropertiesTest.java
@@ -62,7 +62,7 @@ public class ODataEntityProviderPropertiesTest extends BaseTest {
     callbacks.put("aCallback", new MyCallback(null, null));
     ExpandSelectTreeNode expandSelectTree = new ExpandSelectTreeNodeImpl();
     URI selfLink = new URI("http://some.uri");
-    Map<String, Map<String, Object>> links = new HashMap<String, Map<String,Object>>();
+    Map<String, Map<String, Object>> links = new HashMap<String, Map<String, Object>>();
     links.put("aNavigationProperty", Collections.<String, Object> emptyMap());
     final EntityProviderWriteProperties properties = EntityProviderWriteProperties.serviceRoot(serviceRoot)
         .callbacks(callbacks)
@@ -106,7 +106,7 @@ public class ODataEntityProviderPropertiesTest extends BaseTest {
     callbacks.put("aCallback", new MyCallback(null, null));
     ExpandSelectTreeNode expandSelectTree = new ExpandSelectTreeNodeImpl();
     URI selfLink = new URI("http://some.uri");
-    Map<String, Map<String, Object>> links = new HashMap<String, Map<String,Object>>();
+    Map<String, Map<String, Object>> links = new HashMap<String, Map<String, Object>>();
     links.put("aNavigationProperty", Collections.<String, Object> emptyMap());
     final EntityProviderWriteProperties properties = EntityProviderWriteProperties.serviceRoot(serviceRoot)
         .callbacks(callbacks)

http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/2541c88f/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 c4bcb22..a87698d 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
@@ -725,7 +725,7 @@ public class AtomEntryProducerTest extends AbstractProviderTest {
     links.put("nr_Building", buildingData);
     final ODataResponse response = createAtomEntityProvider().writeEntry(
         MockFacade.getMockEdm().getDefaultEntityContainer().getEntitySet("Rooms"), roomData,
-         EntityProviderWriteProperties.serviceRoot(BASE_URI).additionalLinks(links).build());
+        EntityProviderWriteProperties.serviceRoot(BASE_URI).additionalLinks(links).build());
     final String xmlString = verifyResponse(response);
 
     assertXpathExists("/a:entry/a:link[@title='nr_Building']", xmlString);
@@ -740,7 +740,7 @@ public class AtomEntryProducerTest extends AbstractProviderTest {
     links.put("nr_Employees", employeeData);
     final ODataResponse response = createAtomEntityProvider().writeEntry(
         MockFacade.getMockEdm().getDefaultEntityContainer().getEntitySet("Rooms"), roomData,
-         EntityProviderWriteProperties.serviceRoot(BASE_URI).additionalLinks(links).build());
+        EntityProviderWriteProperties.serviceRoot(BASE_URI).additionalLinks(links).build());
     final String xmlString = verifyResponse(response);
 
     assertXpathExists("/a:entry/a:link[@title='nr_Employees']", xmlString);

http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/2541c88f/odata2-lib/odata-fit/src/test/java/org/apache/olingo/odata2/fit/ref/EntryJsonChangeTest.java
----------------------------------------------------------------------
diff --git a/odata2-lib/odata-fit/src/test/java/org/apache/olingo/odata2/fit/ref/EntryJsonChangeTest.java b/odata2-lib/odata-fit/src/test/java/org/apache/olingo/odata2/fit/ref/EntryJsonChangeTest.java
index 9c1df43..7be20f2 100644
--- a/odata2-lib/odata-fit/src/test/java/org/apache/olingo/odata2/fit/ref/EntryJsonChangeTest.java
+++ b/odata2-lib/odata-fit/src/test/java/org/apache/olingo/odata2/fit/ref/EntryJsonChangeTest.java
@@ -93,7 +93,7 @@ public class EntryJsonChangeTest extends AbstractRefTest {
     data.put("Version", 42);
     Map<String, Object> key = new HashMap<String, Object>();
     key.put("Id", "1");
-    Map<String, Map<String, Object>> links = new HashMap<String, Map<String,Object>>();
+    Map<String, Map<String, Object>> links = new HashMap<String, Map<String, Object>>();
     links.put("nr_Building", key);
     final String requestBody = StringHelper.inputStreamToString(
         (InputStream) EntityProvider.writeEntry(HttpContentType.APPLICATION_JSON, linkedEntitySet, data,


[02/13] git commit: [OLINGO-235] reader option to switch off validation of facets

Posted by mi...@apache.org.
[OLINGO-235] reader option to switch off validation of facets

Change-Id: Ie35a7b5ce4e72f0d21a546e35768a36718635f06

Signed-off-by: Stephan Klevenz <sk...@apache.org>


Project: http://git-wip-us.apache.org/repos/asf/olingo-odata2/repo
Commit: http://git-wip-us.apache.org/repos/asf/olingo-odata2/commit/2211ce41
Tree: http://git-wip-us.apache.org/repos/asf/olingo-odata2/tree/2211ce41
Diff: http://git-wip-us.apache.org/repos/asf/olingo-odata2/diff/2211ce41

Branch: refs/heads/OLINGO-231_PocForAndroid
Commit: 2211ce410c4bd2c45181037b931244ad6504efd9
Parents: e1b6ead
Author: Klaus Straubinger <kl...@sap.com>
Authored: Fri Apr 11 14:03:03 2014 +0200
Committer: Stephan Klevenz <sk...@apache.org>
Committed: Wed Apr 16 16:28:30 2014 +0200

----------------------------------------------------------------------
 .../api/ep/EntityProviderReadProperties.java    |  19 +++-
 .../core/ep/consumer/JsonEntryConsumer.java     |  14 ++-
 .../core/ep/consumer/JsonPropertyConsumer.java  |  33 +++---
 .../core/ep/consumer/XmlEntityConsumer.java     |   5 +-
 .../core/ep/consumer/XmlEntryConsumer.java      |  22 ++--
 .../core/ep/consumer/XmlPropertyConsumer.java   |  32 +++---
 .../ep/consumer/JsonPropertyConsumerTest.java   |  53 ++++++++--
 .../ep/consumer/XmlPropertyConsumerTest.java    | 103 ++++++++++++++-----
 .../odata2/fit/basic/ServiceResolutionTest.java |  18 ++++
 9 files changed, 220 insertions(+), 79 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/2211ce41/odata2-lib/odata-api/src/main/java/org/apache/olingo/odata2/api/ep/EntityProviderReadProperties.java
----------------------------------------------------------------------
diff --git a/odata2-lib/odata-api/src/main/java/org/apache/olingo/odata2/api/ep/EntityProviderReadProperties.java b/odata2-lib/odata-api/src/main/java/org/apache/olingo/odata2/api/ep/EntityProviderReadProperties.java
index a012487..3df4758 100644
--- a/odata2-lib/odata-api/src/main/java/org/apache/olingo/odata2/api/ep/EntityProviderReadProperties.java
+++ b/odata2-lib/odata-api/src/main/java/org/apache/olingo/odata2/api/ep/EntityProviderReadProperties.java
@@ -31,10 +31,10 @@ import org.apache.olingo.odata2.api.ep.callback.OnReadInlineContent;
  * <ul>
  * <li>the <code>mergeSemantic</code></li>
  * <li>the <code>callback for inlined navigation properties</code></li>
- * <li>and the <code>type mappings</code></li>
+ * <li>the <code>type mappings</code></li>
+ * <li>and <code>validatingFacets</code></li>
  * </ul>
  * </p>
- * 
  */
 public class EntityProviderReadProperties {
   /** Callback which is necessary if entity contains inlined navigation properties. */
@@ -51,6 +51,9 @@ public class EntityProviderReadProperties {
    * Supported mappings are documented in {@link org.apache.olingo.odata2.api.edm.EdmSimpleType}.
    */
   final private Map<String, Object> typeMappings;
+  /** whether the constraints expressed in properties' facets are validated */
+  private boolean validatingFacets = true;
+
   final private Map<String, String> validatedPrefix2NamespaceUri;
 
   private EntityProviderReadProperties() {
@@ -90,8 +93,12 @@ public class EntityProviderReadProperties {
     return merge;
   }
 
+  public boolean isValidatingFacets() {
+    return validatingFacets;
+  }
+
   /**
-   *  
+   * Builder for {@link EntityProviderReadProperties}.  
    */
   public static class EntityProviderReadPropertiesBuilder {
     private final EntityProviderReadProperties properties = new EntityProviderReadProperties();
@@ -103,6 +110,7 @@ public class EntityProviderReadProperties {
       properties.callback = propertiesFrom.callback;
       addValidatedPrefixes(propertiesFrom.validatedPrefix2NamespaceUri);
       addTypeMappings(propertiesFrom.typeMappings);
+      properties.validatingFacets = propertiesFrom.validatingFacets;
     }
 
     /**
@@ -134,6 +142,11 @@ public class EntityProviderReadProperties {
       return this;
     }
 
+    public EntityProviderReadPropertiesBuilder isValidatingFacets(final boolean validatingFacets) {
+      properties.validatingFacets = validatingFacets;
+      return this;
+    }
+
     public EntityProviderReadProperties build() {
       return properties;
     }

http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/2211ce41/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/ep/consumer/JsonEntryConsumer.java
----------------------------------------------------------------------
diff --git a/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/ep/consumer/JsonEntryConsumer.java b/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/ep/consumer/JsonEntryConsumer.java
index 11350b1..5bae8e7 100644
--- a/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/ep/consumer/JsonEntryConsumer.java
+++ b/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/ep/consumer/JsonEntryConsumer.java
@@ -168,8 +168,8 @@ public class JsonEntryConsumer {
       ensureODataEntryExists();
       EntityPropertyInfo propertyInfo = eia.getPropertyInfo(name);
       if (propertyInfo != null) {
-        JsonPropertyConsumer jpc = new JsonPropertyConsumer();
-        Object propertyValue = jpc.readPropertyValue(reader, propertyInfo, typeMappings.get(name));
+        Object propertyValue = new JsonPropertyConsumer()
+            .readPropertyValue(reader, propertyInfo, typeMappings.get(name), readProperties);
         if (properties.containsKey(name)) {
           throw new EntityProviderException(EntityProviderException.DOUBLE_PROPERTY.addContent(name));
         }
@@ -303,7 +303,10 @@ public class JsonEntryConsumer {
         try {
           if (callback == null) {
             inlineReadProperties =
-                EntityProviderReadProperties.init().mergeSemantic(readProperties.getMergeSemantic()).build();
+                EntityProviderReadProperties.init()
+                    .mergeSemantic(readProperties.getMergeSemantic())
+                    .isValidatingFacets(readProperties.isValidatingFacets())
+                    .build();
 
           } else {
             inlineReadProperties = callback.receiveReadProperties(readProperties, navigationProperty);
@@ -348,7 +351,10 @@ public class JsonEntryConsumer {
       EntityProviderReadProperties inlineReadProperties;
       if (callback == null) {
         inlineReadProperties =
-            EntityProviderReadProperties.init().mergeSemantic(readProperties.getMergeSemantic()).build();
+            EntityProviderReadProperties.init()
+                .mergeSemantic(readProperties.getMergeSemantic())
+                .isValidatingFacets(readProperties.isValidatingFacets())
+                .build();
       } else {
         try {
           inlineReadProperties = callback.receiveReadProperties(readProperties, navigationProperty);

http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/2211ce41/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/ep/consumer/JsonPropertyConsumer.java
----------------------------------------------------------------------
diff --git a/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/ep/consumer/JsonPropertyConsumer.java b/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/ep/consumer/JsonPropertyConsumer.java
index af1262d..1c3ef59 100644
--- a/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/ep/consumer/JsonPropertyConsumer.java
+++ b/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/ep/consumer/JsonPropertyConsumer.java
@@ -24,6 +24,7 @@ import java.util.Map;
 
 import org.apache.olingo.odata2.api.edm.Edm;
 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.EdmProperty;
 import org.apache.olingo.odata2.api.edm.EdmSimpleType;
@@ -39,7 +40,7 @@ import com.google.gson.stream.JsonReader;
 import com.google.gson.stream.JsonToken;
 
 /**
- *  
+ * JSON property consumer.
  */
 public class JsonPropertyConsumer {
 
@@ -55,10 +56,10 @@ public class JsonPropertyConsumer {
       if (FormatJson.D.equals(nextName)) {
         reader.beginObject();
         nextName = reader.nextName();
-        handleName(reader, typeMappings, entityPropertyInfo, result, nextName);
+        handleName(reader, typeMappings, entityPropertyInfo, readProperties, result, nextName);
         reader.endObject();
       } else {
-        handleName(reader, typeMappings, entityPropertyInfo, result, nextName);
+        handleName(reader, typeMappings, entityPropertyInfo, readProperties, result, nextName);
       }
       reader.endObject();
 
@@ -78,8 +79,8 @@ public class JsonPropertyConsumer {
   }
 
   private void handleName(final JsonReader reader, final Map<String, Object> typeMappings,
-      final EntityPropertyInfo entityPropertyInfo, final Map<String, Object> result, final String nextName)
-      throws EntityProviderException {
+      final EntityPropertyInfo entityPropertyInfo, final EntityProviderReadProperties readProperties,
+      final Map<String, Object> result, final String nextName) throws EntityProviderException {
     if (!entityPropertyInfo.getName().equals(nextName)) {
       throw new EntityProviderException(EntityProviderException.ILLEGAL_ARGUMENT.addContent(nextName));
     }
@@ -87,16 +88,16 @@ public class JsonPropertyConsumer {
     if (typeMappings != null) {
       mapping = typeMappings.get(nextName);
     }
-    Object propertyValue = readPropertyValue(reader, entityPropertyInfo, mapping);
+    Object propertyValue = readPropertyValue(reader, entityPropertyInfo, mapping, readProperties);
     result.put(nextName, propertyValue);
   }
 
   protected Object readPropertyValue(final JsonReader reader, final EntityPropertyInfo entityPropertyInfo,
-      final Object typeMapping) throws EntityProviderException {
+      final Object typeMapping, final EntityProviderReadProperties readProperties) throws EntityProviderException {
     try {
       return entityPropertyInfo.isComplex() ?
-          readComplexProperty(reader, (EntityComplexPropertyInfo) entityPropertyInfo, typeMapping) :
-          readSimpleProperty(reader, entityPropertyInfo, typeMapping);
+          readComplexProperty(reader, (EntityComplexPropertyInfo) entityPropertyInfo, typeMapping, readProperties) :
+          readSimpleProperty(reader, entityPropertyInfo, typeMapping, readProperties);
     } catch (final EdmException e) {
       throw new EntityProviderException(EntityProviderException.EXCEPTION_OCCURRED.addContent(e.getClass()
           .getSimpleName()), e);
@@ -107,7 +108,8 @@ public class JsonPropertyConsumer {
   }
 
   private Object readSimpleProperty(final JsonReader reader, final EntityPropertyInfo entityPropertyInfo,
-      final Object typeMapping) throws EdmException, EntityProviderException, IOException {
+      final Object typeMapping, final EntityProviderReadProperties readProperties)
+      throws EdmException, EntityProviderException, IOException {
     final EdmSimpleType type = (EdmSimpleType) entityPropertyInfo.getType();
     Object value = null;
     final JsonToken tokenType = reader.peek();
@@ -148,15 +150,18 @@ public class JsonPropertyConsumer {
     }
 
     final Class<?> typeMappingClass = typeMapping == null ? type.getDefaultType() : (Class<?>) typeMapping;
-    return type.valueOfString((String) value, EdmLiteralKind.JSON, entityPropertyInfo.getFacets(), typeMappingClass);
+    final EdmFacets facets = readProperties == null || readProperties.isValidatingFacets() ?
+        entityPropertyInfo.getFacets() : null;
+    return type.valueOfString((String) value, EdmLiteralKind.JSON, facets, typeMappingClass);
   }
 
   @SuppressWarnings("unchecked")
   private Object readComplexProperty(final JsonReader reader, final EntityComplexPropertyInfo complexPropertyInfo,
-      final Object typeMapping) throws EdmException, EntityProviderException, IOException {
+      final Object typeMapping, final EntityProviderReadProperties readProperties)
+      throws EdmException, EntityProviderException, IOException {
     if (reader.peek().equals(JsonToken.NULL)) {
       reader.nextNull();
-      if (complexPropertyInfo.isMandatory()) {
+      if ((readProperties == null || readProperties.isValidatingFacets()) && complexPropertyInfo.isMandatory()) {
         throw new EntityProviderException(EntityProviderException.INVALID_PROPERTY_VALUE.addContent(complexPropertyInfo
             .getName()));
       }
@@ -200,7 +205,7 @@ public class JsonPropertyConsumer {
         if (childPropertyInfo == null) {
           throw new EntityProviderException(EntityProviderException.INVALID_PROPERTY.addContent(childName));
         }
-        Object childData = readPropertyValue(reader, childPropertyInfo, mapping.get(childName));
+        Object childData = readPropertyValue(reader, childPropertyInfo, mapping.get(childName), readProperties);
         if (data.containsKey(childName)) {
           throw new EntityProviderException(EntityProviderException.DOUBLE_PROPERTY.addContent(childName));
         }

http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/2211ce41/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/ep/consumer/XmlEntityConsumer.java
----------------------------------------------------------------------
diff --git a/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/ep/consumer/XmlEntityConsumer.java b/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/ep/consumer/XmlEntityConsumer.java
index c7fca98..5d73862 100644
--- a/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/ep/consumer/XmlEntityConsumer.java
+++ b/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/ep/consumer/XmlEntityConsumer.java
@@ -115,9 +115,8 @@ public class XmlEntityConsumer {
 
     try {
       reader = XmlHelper.createStreamReader(content);
-      Map<String, Object> result =
-          xec.readProperty(reader, edmProperty, properties.getMergeSemantic(), properties.getTypeMappings());
-      return result;
+      return xec.readProperty(reader, edmProperty, properties.getMergeSemantic(), properties.getTypeMappings(),
+          properties);
     } catch (EntityProviderException e) {
       cachedException = e;
       throw cachedException;

http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/2211ce41/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/ep/consumer/XmlEntryConsumer.java
----------------------------------------------------------------------
diff --git a/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/ep/consumer/XmlEntryConsumer.java b/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/ep/consumer/XmlEntryConsumer.java
index 6b9cd5f..a6111d1 100644
--- a/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/ep/consumer/XmlEntryConsumer.java
+++ b/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/ep/consumer/XmlEntryConsumer.java
@@ -130,17 +130,18 @@ public class XmlEntryConsumer {
     } else if (FormatXml.ATOM_LINK.equals(currentHandledStartTagName)) {
       readLink(reader, eia, readProperties);
     } else if (FormatXml.ATOM_CONTENT.equals(currentHandledStartTagName)) {
-      readContent(reader, eia);
+      readContent(reader, eia, readProperties);
     } else if (FormatXml.M_PROPERTIES.equals(currentHandledStartTagName)) {
-      readProperties(reader, eia);
+      readProperties(reader, eia, readProperties);
     } else if (!readProperties.getMergeSemantic()) {
-      readCustomElement(reader, currentHandledStartTagName, eia);
+      readCustomElement(reader, currentHandledStartTagName, eia, readProperties);
     } else {
       skipStartedTag(reader);
     }
   }
 
-  private void readCustomElement(final XMLStreamReader reader, final String tagName, final EntityInfoAggregator eia)
+  private void readCustomElement(final XMLStreamReader reader, final String tagName, final EntityInfoAggregator eia,
+      final EntityProviderReadProperties readProperties)
       throws EdmException, EntityProviderException, XMLStreamException {
     EntityPropertyInfo targetPathInfo = eia.getTargetPathInfo(tagName);
     NamespaceContext nsctx = reader.getNamespaceContext();
@@ -165,7 +166,8 @@ public class XmlEntryConsumer {
             final EntityPropertyInfo propertyInfo = getValidatedPropertyInfo(eia, tagName);
             final Class<?> typeMapping = typeMappings.getMappingClass(propertyInfo.getName());
             final EdmSimpleType type = (EdmSimpleType) propertyInfo.getType();
-            final Object value = type.valueOfString(text, EdmLiteralKind.DEFAULT, propertyInfo.getFacets(),
+            final Object value = type.valueOfString(text, EdmLiteralKind.DEFAULT,
+                readProperties == null || readProperties.isValidatingFacets() ? propertyInfo.getFacets() : null,
                 typeMapping == null ? type.getDefaultType() : typeMapping);
             properties.put(tagName, value);
           }
@@ -524,7 +526,8 @@ public class XmlEntryConsumer {
     }
   }
 
-  private void readContent(final XMLStreamReader reader, final EntityInfoAggregator eia)
+  private void readContent(final XMLStreamReader reader, final EntityInfoAggregator eia,
+      final EntityProviderReadProperties readProperties)
       throws EntityProviderException, XMLStreamException, EdmException {
     reader.require(XMLStreamConstants.START_ELEMENT, Edm.NAMESPACE_ATOM_2005, FormatXml.ATOM_CONTENT);
 
@@ -534,7 +537,7 @@ public class XmlEntryConsumer {
     reader.nextTag();
 
     if (reader.isStartElement() && reader.getLocalName().equals(FormatXml.M_PROPERTIES)) {
-      readProperties(reader, eia);
+      readProperties(reader, eia, readProperties);
     } else if (reader.isEndElement()) {
       reader.require(XMLStreamConstants.END_ELEMENT, Edm.NAMESPACE_ATOM_2005, FormatXml.ATOM_CONTENT);
     } else {
@@ -553,7 +556,8 @@ public class XmlEntryConsumer {
     reader.require(XMLStreamConstants.END_ELEMENT, Edm.NAMESPACE_ATOM_2005, FormatXml.ATOM_ID);
   }
 
-  private void readProperties(final XMLStreamReader reader, final EntityInfoAggregator entitySet)
+  private void readProperties(final XMLStreamReader reader, final EntityInfoAggregator entitySet,
+      final EntityProviderReadProperties readProperties)
       throws XMLStreamException, EdmException, EntityProviderException {
     // validate namespace
     reader.require(XMLStreamConstants.START_ELEMENT, Edm.NAMESPACE_M_2007_08, FormatXml.M_PROPERTIES);
@@ -580,7 +584,7 @@ public class XmlEntryConsumer {
             throw new EntityProviderException(EntityProviderException.DOUBLE_PROPERTY.addContent(closeTag));
           }
           property = getValidatedPropertyInfo(entitySet, closeTag);
-          final Object value = xpc.readStartedElement(reader, property, typeMappings);
+          final Object value = xpc.readStartedElement(reader, property, typeMappings, readProperties);
           properties.put(closeTag, value);
           closeTag = null;
         }

http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/2211ce41/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/ep/consumer/XmlPropertyConsumer.java
----------------------------------------------------------------------
diff --git a/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/ep/consumer/XmlPropertyConsumer.java b/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/ep/consumer/XmlPropertyConsumer.java
index 28cacef..3887333 100644
--- a/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/ep/consumer/XmlPropertyConsumer.java
+++ b/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/ep/consumer/XmlPropertyConsumer.java
@@ -33,6 +33,7 @@ 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.ep.EntityProviderException;
+import org.apache.olingo.odata2.api.ep.EntityProviderReadProperties;
 import org.apache.olingo.odata2.core.ep.aggregator.EntityComplexPropertyInfo;
 import org.apache.olingo.odata2.core.ep.aggregator.EntityInfoAggregator;
 import org.apache.olingo.odata2.core.ep.aggregator.EntityPropertyInfo;
@@ -40,27 +41,27 @@ import org.apache.olingo.odata2.core.ep.aggregator.EntityTypeMapping;
 import org.apache.olingo.odata2.core.ep.util.FormatXml;
 
 /**
- *  
+ * XML property consumer.
  */
 public class XmlPropertyConsumer {
 
   protected static final String TRUE = "true";
   protected static final String FALSE = "false";
 
-  public Map<String, Object>
-      readProperty(final XMLStreamReader reader, final EdmProperty property, final boolean merge)
-          throws EntityProviderException {
-    return readProperty(reader, property, merge, null);
+  public Map<String, Object> readProperty(final XMLStreamReader reader, final EdmProperty property,
+      final boolean merge, final EntityProviderReadProperties readProperties) throws EntityProviderException {
+    return readProperty(reader, property, merge, null, readProperties);
   }
 
   public Map<String, Object> readProperty(final XMLStreamReader reader, final EdmProperty property,
-      final boolean merge, final Map<String, Object> typeMappings) throws EntityProviderException {
+      final boolean merge, final Map<String, Object> typeMappings, final EntityProviderReadProperties readProperties)
+      throws EntityProviderException {
     EntityPropertyInfo eia = EntityInfoAggregator.create(property);
 
     try {
       reader.next();
 
-      Object value = readStartedElement(reader, eia, EntityTypeMapping.create(typeMappings));
+      Object value = readStartedElement(reader, eia, EntityTypeMapping.create(typeMappings), readProperties);
 
       if (eia.isComplex() && merge) {
         mergeWithDefaultValues(value, eia);
@@ -110,7 +111,8 @@ public class XmlPropertyConsumer {
   }
 
   protected Object readStartedElement(final XMLStreamReader reader, final EntityPropertyInfo propertyInfo,
-      final EntityTypeMapping typeMappings) throws EntityProviderException, EdmException {
+      final EntityTypeMapping typeMappings, final EntityProviderReadProperties readProperties)
+      throws EntityProviderException, EdmException {
     final String name = propertyInfo.getName();
     Object result = null;
 
@@ -123,7 +125,7 @@ public class XmlPropertyConsumer {
       }
 
       if (TRUE.equals(nullAttribute)) {
-        if (propertyInfo.isMandatory()) {
+        if ((readProperties == null || readProperties.isValidatingFacets()) && propertyInfo.isMandatory()) {
           throw new EntityProviderException(EntityProviderException.INVALID_PROPERTY_VALUE.addContent(name));
         }
         reader.nextTag();
@@ -147,13 +149,14 @@ public class XmlPropertyConsumer {
           if (childProperty == null) {
             throw new EntityProviderException(EntityProviderException.INVALID_PROPERTY.addContent(childName));
           }
-          final Object value = readStartedElement(reader, childProperty, typeMappings.getEntityTypeMapping(name));
+          final Object value = readStartedElement(reader, childProperty, typeMappings.getEntityTypeMapping(name),
+              readProperties);
           name2Value.put(childName, value);
           reader.nextTag();
         }
         result = name2Value;
       } else {
-        result = convert(propertyInfo, reader.getElementText(), typeMappings.getMappingClass(name));
+        result = convert(propertyInfo, reader.getElementText(), typeMappings.getMappingClass(name), readProperties);
       }
       reader.require(XMLStreamConstants.END_ELEMENT, Edm.NAMESPACE_D_2007_08, name);
 
@@ -164,10 +167,11 @@ public class XmlPropertyConsumer {
     }
   }
 
-  private Object convert(final EntityPropertyInfo property, final String value, final Class<?> typeMapping)
-      throws EdmSimpleTypeException {
+  private Object convert(final EntityPropertyInfo property, final String value, final Class<?> typeMapping,
+      final EntityProviderReadProperties readProperties) throws EdmSimpleTypeException {
     final EdmSimpleType type = (EdmSimpleType) property.getType();
-    return type.valueOfString(value, EdmLiteralKind.DEFAULT, property.getFacets(),
+    return type.valueOfString(value, EdmLiteralKind.DEFAULT,
+        readProperties == null || readProperties.isValidatingFacets() ? property.getFacets() : null,
         typeMapping == null ? type.getDefaultType() : typeMapping);
   }
 }

http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/2211ce41/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ep/consumer/JsonPropertyConsumerTest.java
----------------------------------------------------------------------
diff --git a/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ep/consumer/JsonPropertyConsumerTest.java b/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ep/consumer/JsonPropertyConsumerTest.java
index b52df8b..7d51314 100644
--- a/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ep/consumer/JsonPropertyConsumerTest.java
+++ b/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ep/consumer/JsonPropertyConsumerTest.java
@@ -186,7 +186,7 @@ public class JsonPropertyConsumerTest extends BaseTest {
     reader.nextName();
 
     JsonPropertyConsumer jpc = new JsonPropertyConsumer();
-    Object value = jpc.readPropertyValue(reader, entityPropertyInfo, null);
+    Object value = jpc.readPropertyValue(reader, entityPropertyInfo, null, null);
     assertEquals("Team 1", value);
   }
 
@@ -208,6 +208,30 @@ public class JsonPropertyConsumerTest extends BaseTest {
     assertEquals(propertyValue, resultMap.get("Name"));
   }
 
+  @Test(expected = EntityProviderException.class)
+  public void simplePropertyViolatingValidation() throws Exception {
+    EdmProperty property = (EdmProperty) MockFacade.getMockEdm().getEntityType("RefScenario", "Room")
+        .getProperty("Name");
+    EdmFacets facets = mock(EdmFacets.class);
+    when(facets.getMaxLength()).thenReturn(10);
+    when(property.getFacets()).thenReturn(facets);
+    new JsonPropertyConsumer().readPropertyStandalone(prepareReader("{\"Name\":\"TooLongName\"}"), property, null);
+  }
+
+  @Test
+  public void simplePropertyIgnoringValidation() throws Exception {
+    EdmProperty property = (EdmProperty) MockFacade.getMockEdm().getEntityType("RefScenario", "Room")
+        .getProperty("Name");
+    EdmFacets facets = mock(EdmFacets.class);
+    when(facets.getMaxLength()).thenReturn(10);
+    when(property.getFacets()).thenReturn(facets);
+    final EntityProviderReadProperties readProperties = mock(EntityProviderReadProperties.class);
+    final Map<String, Object> resultMap = new JsonPropertyConsumer()
+        .readPropertyStandalone(prepareReader("{\"Name\":\"TooLongName\"}"), property, readProperties);
+    assertTrue(resultMap.containsKey("Name"));
+    assertEquals("TooLongName", resultMap.get("Name"));
+  }
+
   @Test
   public void simplePropertyNull() throws Exception {
     JsonReader reader = prepareReader("{\"Name\":null}");
@@ -405,7 +429,7 @@ public class JsonPropertyConsumerTest extends BaseTest {
 
     JsonPropertyConsumer jpc = new JsonPropertyConsumer();
     @SuppressWarnings("unchecked")
-    Map<String, Object> result = (Map<String, Object>) jpc.readPropertyValue(reader, entityPropertyInfo, null);
+    Map<String, Object> result = (Map<String, Object>) jpc.readPropertyValue(reader, entityPropertyInfo, null, null);
 
     assertEquals(2, result.size());
     assertEquals("Heidelberg", result.get("CityName"));
@@ -422,7 +446,7 @@ public class JsonPropertyConsumerTest extends BaseTest {
 
     JsonPropertyConsumer jpc = new JsonPropertyConsumer();
     @SuppressWarnings("unchecked")
-    Map<String, Object> result = (Map<String, Object>) jpc.readPropertyValue(reader, entityPropertyInfo, null);
+    Map<String, Object> result = (Map<String, Object>) jpc.readPropertyValue(reader, entityPropertyInfo, null, null);
 
     assertEquals(2, result.size());
     assertEquals("Heidelberg", result.get("CityName"));
@@ -443,7 +467,7 @@ public class JsonPropertyConsumerTest extends BaseTest {
 
     JsonPropertyConsumer jpc = new JsonPropertyConsumer();
     @SuppressWarnings("unchecked")
-    Map<String, Object> result = (Map<String, Object>) jpc.readPropertyValue(reader, entityPropertyInfo, null);
+    Map<String, Object> result = (Map<String, Object>) jpc.readPropertyValue(reader, entityPropertyInfo, null, null);
 
     assertEquals(2, result.size());
     assertEquals("Germany", result.get("Country"));
@@ -560,6 +584,23 @@ public class JsonPropertyConsumerTest extends BaseTest {
   }
 
   @Test
+  public void complexPropertyNullValueNotAllowedButNotValidated() throws Exception {
+    final EdmProperty property = (EdmProperty) MockFacade.getMockEdm().getDefaultEntityContainer()
+        .getEntitySet("Employees").getEntityType().getProperty("Location");
+    EdmFacets facets = mock(EdmFacets.class);
+    when(facets.isNullable()).thenReturn(false);
+    when(property.getFacets()).thenReturn(facets);
+    final EntityProviderReadProperties readProperties = mock(EntityProviderReadProperties.class);
+
+    final Map<String, Object> propertyData = new JsonPropertyConsumer()
+        .readPropertyStandalone(prepareReader("{\"Location\":null}"), property, readProperties);
+    assertNotNull(propertyData);
+    assertEquals(1, propertyData.size());
+    assertTrue(propertyData.containsKey("Location"));
+    assertNull(propertyData.get("Location"));
+  }
+
+  @Test
   public void complexPropertyEmpty() throws Exception {
     final String cityProperty = "{\"d\":{\"City\":{}}}";
     JsonReader reader = prepareReader(cityProperty);
@@ -584,7 +625,7 @@ public class JsonPropertyConsumerTest extends BaseTest {
         (EdmProperty) MockFacade.getMockEdm().getComplexType("RefScenario", "c_Location").getProperty("City");
     EntityComplexPropertyInfo entityPropertyInfo = (EntityComplexPropertyInfo) EntityInfoAggregator.create(property);
 
-    new JsonPropertyConsumer().readPropertyValue(reader, entityPropertyInfo, null);
+    new JsonPropertyConsumer().readPropertyValue(reader, entityPropertyInfo, null, null);
   }
 
   @Test(expected = EntityProviderException.class)
@@ -596,7 +637,7 @@ public class JsonPropertyConsumerTest extends BaseTest {
         (EdmProperty) MockFacade.getMockEdm().getComplexType("RefScenario", "c_Location").getProperty("City");
     EntityComplexPropertyInfo entityPropertyInfo = (EntityComplexPropertyInfo) EntityInfoAggregator.create(property);
 
-    new JsonPropertyConsumer().readPropertyValue(reader, entityPropertyInfo, null);
+    new JsonPropertyConsumer().readPropertyValue(reader, entityPropertyInfo, null, null);
   }
 
   private JsonReader prepareReader(final String json) throws UnsupportedEncodingException {

http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/2211ce41/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ep/consumer/XmlPropertyConsumerTest.java
----------------------------------------------------------------------
diff --git a/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ep/consumer/XmlPropertyConsumerTest.java b/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ep/consumer/XmlPropertyConsumerTest.java
index e1e1f9d..c33b4ea 100644
--- a/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ep/consumer/XmlPropertyConsumerTest.java
+++ b/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ep/consumer/XmlPropertyConsumerTest.java
@@ -19,6 +19,7 @@
 package org.apache.olingo.odata2.core.ep.consumer;
 
 import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertTrue;
@@ -38,11 +39,12 @@ import org.apache.olingo.odata2.api.edm.EdmProperty;
 import org.apache.olingo.odata2.api.edm.EdmSimpleTypeException;
 import org.apache.olingo.odata2.api.edm.EdmSimpleTypeKind;
 import org.apache.olingo.odata2.api.ep.EntityProviderException;
+import org.apache.olingo.odata2.api.ep.EntityProviderReadProperties;
 import org.apache.olingo.odata2.testutil.mock.MockFacade;
 import org.junit.Test;
 
 /**
- *  
+ * Tests consuming XML properties.
  */
 public class XmlPropertyConsumerTest extends AbstractXmlConsumerTest {
 
@@ -57,7 +59,7 @@ public class XmlPropertyConsumerTest extends AbstractXmlConsumerTest {
     final EdmProperty property =
         (EdmProperty) MockFacade.getMockEdm().getEntityType("RefScenario", "Employee").getProperty("Age");
 
-    Map<String, Object> resultMap = new XmlPropertyConsumer().readProperty(reader, property, false);
+    Map<String, Object> resultMap = new XmlPropertyConsumer().readProperty(reader, property, false, null);
 
     assertEquals(Integer.valueOf(67), resultMap.get("Age"));
   }
@@ -70,7 +72,8 @@ public class XmlPropertyConsumerTest extends AbstractXmlConsumerTest {
         (EdmProperty) MockFacade.getMockEdm().getEntityType("RefScenario", "Employee").getProperty("Age");
 
     Map<String, Object> typeMappings = createTypeMappings("Age", Long.class);
-    Map<String, Object> resultMap = new XmlPropertyConsumer().readProperty(reader, property, false, typeMappings);
+    Map<String, Object> resultMap = new XmlPropertyConsumer().readProperty(reader, property, false, typeMappings,
+        null);
 
     assertEquals(Long.valueOf(67), resultMap.get("Age"));
   }
@@ -83,7 +86,8 @@ public class XmlPropertyConsumerTest extends AbstractXmlConsumerTest {
         (EdmProperty) MockFacade.getMockEdm().getEntityType("RefScenario", "Employee").getProperty("Age");
 
     Map<String, Object> typeMappings = null;
-    Map<String, Object> resultMap = new XmlPropertyConsumer().readProperty(reader, property, false, typeMappings);
+    Map<String, Object> resultMap = new XmlPropertyConsumer().readProperty(reader, property, false, typeMappings,
+        null);
 
     assertEquals(Integer.valueOf(67), resultMap.get("Age"));
   }
@@ -96,7 +100,8 @@ public class XmlPropertyConsumerTest extends AbstractXmlConsumerTest {
         (EdmProperty) MockFacade.getMockEdm().getEntityType("RefScenario", "Employee").getProperty("Age");
 
     Map<String, Object> typeMappings = new HashMap<String, Object>();
-    Map<String, Object> resultMap = new XmlPropertyConsumer().readProperty(reader, property, false, typeMappings);
+    Map<String, Object> resultMap = new XmlPropertyConsumer().readProperty(reader, property, false, typeMappings,
+        null);
 
     assertEquals(Integer.valueOf(67), resultMap.get("Age"));
   }
@@ -108,7 +113,7 @@ public class XmlPropertyConsumerTest extends AbstractXmlConsumerTest {
     final EdmProperty property =
         (EdmProperty) MockFacade.getMockEdm().getEntityType("RefScenario", "Employee").getProperty("EmployeeName");
 
-    Map<String, Object> resultMap = new XmlPropertyConsumer().readProperty(reader, property, false);
+    Map<String, Object> resultMap = new XmlPropertyConsumer().readProperty(reader, property, false, null);
 
     assertEquals("Max Mustermann", resultMap.get("EmployeeName"));
   }
@@ -120,7 +125,7 @@ public class XmlPropertyConsumerTest extends AbstractXmlConsumerTest {
     final EdmProperty property =
         (EdmProperty) MockFacade.getMockEdm().getEntityType("RefScenario", "Employee").getProperty("EmployeeName");
 
-    final Map<String, Object> resultMap = new XmlPropertyConsumer().readProperty(reader, property, false);
+    final Map<String, Object> resultMap = new XmlPropertyConsumer().readProperty(reader, property, false, null);
 
     assertTrue(resultMap.containsKey("EmployeeName"));
     assertEquals("", resultMap.get("EmployeeName"));
@@ -134,7 +139,7 @@ public class XmlPropertyConsumerTest extends AbstractXmlConsumerTest {
     final EdmProperty property =
         (EdmProperty) MockFacade.getMockEdm().getEntityType("RefScenario", "Employee").getProperty("EntryDate");
 
-    final Map<String, Object> resultMap = new XmlPropertyConsumer().readProperty(reader, property, false);
+    final Map<String, Object> resultMap = new XmlPropertyConsumer().readProperty(reader, property, false, null);
 
     assertTrue(resultMap.containsKey("EntryDate"));
     assertNull(resultMap.get("EntryDate"));
@@ -148,7 +153,7 @@ public class XmlPropertyConsumerTest extends AbstractXmlConsumerTest {
     final EdmProperty property =
         (EdmProperty) MockFacade.getMockEdm().getEntityType("RefScenario", "Employee").getProperty("EntryDate");
 
-    final Map<String, Object> resultMap = new XmlPropertyConsumer().readProperty(reader, property, false);
+    final Map<String, Object> resultMap = new XmlPropertyConsumer().readProperty(reader, property, false, null);
 
     assertEquals(86400000L, ((Calendar) resultMap.get("EntryDate")).getTimeInMillis());
   }
@@ -160,7 +165,7 @@ public class XmlPropertyConsumerTest extends AbstractXmlConsumerTest {
     final EdmProperty property =
         (EdmProperty) MockFacade.getMockEdm().getEntityType("RefScenario", "Employee").getProperty("Age");
 
-    new XmlPropertyConsumer().readProperty(reader, property, false);
+    new XmlPropertyConsumer().readProperty(reader, property, false, null);
   }
 
   @Test(expected = EntityProviderException.class)
@@ -171,7 +176,7 @@ public class XmlPropertyConsumerTest extends AbstractXmlConsumerTest {
     final EdmProperty property =
         (EdmProperty) MockFacade.getMockEdm().getEntityType("RefScenario", "Employee").getProperty("Age");
 
-    new XmlPropertyConsumer().readProperty(reader, property, false);
+    new XmlPropertyConsumer().readProperty(reader, property, false, null);
   }
 
   @Test(expected = EntityProviderException.class)
@@ -185,7 +190,35 @@ public class XmlPropertyConsumerTest extends AbstractXmlConsumerTest {
     when(facets.isNullable()).thenReturn(false);
     when(property.getFacets()).thenReturn(facets);
 
-    new XmlPropertyConsumer().readProperty(reader, property, false);
+    new XmlPropertyConsumer().readProperty(reader, property, false, null);
+  }
+
+  @Test(expected = EntityProviderException.class)
+  public void violatedValidation() throws Exception {
+    final String xml = "<Name xmlns=\"" + Edm.NAMESPACE_D_2007_08 + "\">TooLongName</Name>";
+    EdmProperty property = (EdmProperty) MockFacade.getMockEdm().getEntityType("RefScenario", "Team")
+        .getProperty("Name");
+    EdmFacets facets = mock(EdmFacets.class);
+    when(facets.getMaxLength()).thenReturn(10);
+    when(property.getFacets()).thenReturn(facets);
+
+    new XmlPropertyConsumer().readProperty(createReaderForTest(xml, true), property, false, null);
+  }
+
+  @Test
+  public void ignoringValidation() throws Exception {
+    final String xml = "<Name xmlns=\"" + Edm.NAMESPACE_D_2007_08 + "\">TooLongName</Name>";
+    EdmProperty property = (EdmProperty) MockFacade.getMockEdm().getEntityType("RefScenario", "Team")
+        .getProperty("Name");
+    EdmFacets facets = mock(EdmFacets.class);
+    when(facets.getMaxLength()).thenReturn(10);
+    when(property.getFacets()).thenReturn(facets);
+    final EntityProviderReadProperties readProperties = mock(EntityProviderReadProperties.class);
+
+    final Map<String, Object> resultMap = new XmlPropertyConsumer()
+        .readProperty(createReaderForTest(xml, true), property, false, readProperties);
+    assertTrue(resultMap.containsKey("Name"));
+    assertEquals("TooLongName", resultMap.get("Name"));
   }
 
   @Test
@@ -204,7 +237,7 @@ public class XmlPropertyConsumerTest extends AbstractXmlConsumerTest {
     final EdmProperty property =
         (EdmProperty) MockFacade.getMockEdm().getEntityType("RefScenario", "Employee").getProperty("Location");
 
-    Map<String, Object> resultMap = new XmlPropertyConsumer().readProperty(reader, property, false);
+    Map<String, Object> resultMap = new XmlPropertyConsumer().readProperty(reader, property, false, null);
 
     Map<String, Object> locationMap = (Map<String, Object>) resultMap.get("Location");
     assertEquals("Germany", locationMap.get("Country"));
@@ -232,7 +265,7 @@ public class XmlPropertyConsumerTest extends AbstractXmlConsumerTest {
     final EdmProperty property =
         (EdmProperty) MockFacade.getMockEdm().getEntityType("RefScenario", "Employee").getProperty("Location");
 
-    Map<String, Object> resultMap = new XmlPropertyConsumer().readProperty(reader, property, false);
+    Map<String, Object> resultMap = new XmlPropertyConsumer().readProperty(reader, property, false, null);
 
     Map<String, Object> locationMap = (Map<String, Object>) resultMap.get("Location");
     assertEquals("Germany", locationMap.get("Country"));
@@ -258,7 +291,8 @@ public class XmlPropertyConsumerTest extends AbstractXmlConsumerTest {
 
     try {
       Map<String, Object> resultMap = new XmlPropertyConsumer().readProperty(reader, property, false,
-          createTypeMappings("Location", createTypeMappings("City", createTypeMappings("PostalCode", Integer.class))));
+          createTypeMappings("Location", createTypeMappings("City", createTypeMappings("PostalCode", Integer.class))),
+          null);
       assertNotNull(resultMap);
     } catch (EntityProviderException e) {
       assertTrue(e.getCause() instanceof EdmSimpleTypeException);
@@ -293,7 +327,7 @@ public class XmlPropertyConsumerTest extends AbstractXmlConsumerTest {
             createTypeMappings("City",
                 createTypeMappings("CityName", String.class, "PostalCode", Long.class)));
     Map<String, Object> resultMap =
-        new XmlPropertyConsumer().readProperty(reader, locationComplexProperty, false, typeMappings);
+        new XmlPropertyConsumer().readProperty(reader, locationComplexProperty, false, typeMappings, null);
 
     // verify
     Map<String, Object> locationMap = (Map<String, Object>) resultMap.get("Location");
@@ -320,7 +354,7 @@ public class XmlPropertyConsumerTest extends AbstractXmlConsumerTest {
     final EdmProperty property =
         (EdmProperty) MockFacade.getMockEdm().getEntityType("RefScenario", "Employee").getProperty("Location");
 
-    Object prop = new XmlPropertyConsumer().readProperty(reader, property, false);
+    Object prop = new XmlPropertyConsumer().readProperty(reader, property, false, null);
     Map<String, Object> resultMap = (Map<String, Object>) prop;
 
     Map<String, Object> locationMap = (Map<String, Object>) resultMap.get("Location");
@@ -345,7 +379,7 @@ public class XmlPropertyConsumerTest extends AbstractXmlConsumerTest {
     final EdmProperty property =
         (EdmProperty) MockFacade.getMockEdm().getEntityType("RefScenario", "Employee").getProperty("Location");
 
-    new XmlPropertyConsumer().readProperty(reader, property, false);
+    new XmlPropertyConsumer().readProperty(reader, property, false, null);
   }
 
   @Test(expected = EntityProviderException.class)
@@ -363,7 +397,7 @@ public class XmlPropertyConsumerTest extends AbstractXmlConsumerTest {
     final EdmProperty property =
         (EdmProperty) MockFacade.getMockEdm().getEntityType("RefScenario", "Employee").getProperty("Location");
 
-    new XmlPropertyConsumer().readProperty(reader, property, false);
+    new XmlPropertyConsumer().readProperty(reader, property, false, null);
   }
 
   @Test(expected = EntityProviderException.class)
@@ -381,7 +415,7 @@ public class XmlPropertyConsumerTest extends AbstractXmlConsumerTest {
     final EdmProperty property =
         (EdmProperty) MockFacade.getMockEdm().getEntityType("RefScenario", "Employee").getProperty("Location");
 
-    new XmlPropertyConsumer().readProperty(reader, property, false);
+    new XmlPropertyConsumer().readProperty(reader, property, false, null);
   }
 
   @Test(expected = EntityProviderException.class)
@@ -399,7 +433,7 @@ public class XmlPropertyConsumerTest extends AbstractXmlConsumerTest {
     final EdmProperty property =
         (EdmProperty) MockFacade.getMockEdm().getEntityType("RefScenario", "Employee").getProperty("Location");
 
-    new XmlPropertyConsumer().readProperty(reader, property, false);
+    new XmlPropertyConsumer().readProperty(reader, property, false, null);
   }
 
   @Test
@@ -418,7 +452,7 @@ public class XmlPropertyConsumerTest extends AbstractXmlConsumerTest {
     final EdmProperty property =
         (EdmProperty) MockFacade.getMockEdm().getEntityType("RefScenario", "Employee").getProperty("Location");
 
-    Map<String, Object> resultMap = new XmlPropertyConsumer().readProperty(reader, property, false);
+    Map<String, Object> resultMap = new XmlPropertyConsumer().readProperty(reader, property, false, null);
 
     Map<String, Object> locationMap = (Map<String, Object>) resultMap.get("Location");
     assertEquals("Germany", locationMap.get("Country"));
@@ -435,7 +469,7 @@ public class XmlPropertyConsumerTest extends AbstractXmlConsumerTest {
     final EdmProperty property =
         (EdmProperty) MockFacade.getMockEdm().getEntityType("RefScenario", "Employee").getProperty("Location");
 
-    final Map<String, Object> resultMap = new XmlPropertyConsumer().readProperty(reader, property, false);
+    final Map<String, Object> resultMap = new XmlPropertyConsumer().readProperty(reader, property, false, null);
 
     assertTrue(resultMap.containsKey("Location"));
     assertNull(resultMap.get("Location"));
@@ -452,7 +486,24 @@ public class XmlPropertyConsumerTest extends AbstractXmlConsumerTest {
     when(facets.isNullable()).thenReturn(false);
     when(property.getFacets()).thenReturn(facets);
 
-    new XmlPropertyConsumer().readProperty(reader, property, false);
+    new XmlPropertyConsumer().readProperty(reader, property, false, null);
+  }
+
+  @Test
+  public void complexPropertyNullValueNotAllowedButNotValidated() throws Exception {
+    final String xml = "<Location xmlns=\"" + Edm.NAMESPACE_D_2007_08
+        + "\" m:null=\"true\" xmlns:m=\"" + Edm.NAMESPACE_M_2007_08 + "\" />";
+    EdmProperty property = (EdmProperty) MockFacade.getMockEdm().getEntityType("RefScenario", "Employee")
+        .getProperty("Location");
+    EdmFacets facets = mock(EdmFacets.class);
+    when(facets.isNullable()).thenReturn(false);
+    when(property.getFacets()).thenReturn(facets);
+    final EntityProviderReadProperties readProperties = mock(EntityProviderReadProperties.class);
+
+    final Map<String, Object> resultMap = new XmlPropertyConsumer()
+        .readProperty(createReaderForTest(xml, true), property, false, readProperties);
+    assertFalse(resultMap.isEmpty());
+    assertNull(resultMap.get("Location"));
   }
 
   @Test(expected = EntityProviderException.class)
@@ -465,7 +516,7 @@ public class XmlPropertyConsumerTest extends AbstractXmlConsumerTest {
     final EdmProperty property =
         (EdmProperty) MockFacade.getMockEdm().getEntityType("RefScenario", "Employee").getProperty("Location");
 
-    new XmlPropertyConsumer().readProperty(reader, property, false);
+    new XmlPropertyConsumer().readProperty(reader, property, false, null);
   }
 
   @Test
@@ -475,7 +526,7 @@ public class XmlPropertyConsumerTest extends AbstractXmlConsumerTest {
     final EdmProperty property =
         (EdmProperty) MockFacade.getMockEdm().getEntityType("RefScenario", "Employee").getProperty("Location");
 
-    final Map<String, Object> resultMap = new XmlPropertyConsumer().readProperty(reader, property, false);
+    final Map<String, Object> resultMap = new XmlPropertyConsumer().readProperty(reader, property, false, null);
 
     assertNotNull(resultMap.get("Location"));
     @SuppressWarnings("unchecked")

http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/2211ce41/odata2-lib/odata-fit/src/test/java/org/apache/olingo/odata2/fit/basic/ServiceResolutionTest.java
----------------------------------------------------------------------
diff --git a/odata2-lib/odata-fit/src/test/java/org/apache/olingo/odata2/fit/basic/ServiceResolutionTest.java b/odata2-lib/odata-fit/src/test/java/org/apache/olingo/odata2/fit/basic/ServiceResolutionTest.java
index 621701e..8ee0883 100644
--- a/odata2-lib/odata-fit/src/test/java/org/apache/olingo/odata2/fit/basic/ServiceResolutionTest.java
+++ b/odata2-lib/odata-fit/src/test/java/org/apache/olingo/odata2/fit/basic/ServiceResolutionTest.java
@@ -255,6 +255,24 @@ public class ServiceResolutionTest extends BaseTest {
   }
 
   @Test
+  public void testMetadataUriWithMatrixParameter() throws ClientProtocolException, IOException, ODataException,
+      URISyntaxException {
+    server.setPathSplit(3);
+    startServer();
+
+    final String endpoint = server.getEndpoint().toString();
+    final HttpGet get = new HttpGet(URI.create(endpoint + "aaa/bbb;n=2,3;m=1/ccc/$metadata"));
+    final HttpResponse response = httpClient.execute(get);
+
+    assertEquals(HttpStatusCodes.OK.getStatusCode(), response.getStatusLine().getStatusCode());
+
+    final ODataContext ctx = service.getProcessor().getContext();
+    assertNotNull(ctx);
+    assertEquals(endpoint + "aaa/bbb;n=2,3;m=1/ccc/", ctx.getPathInfo().getServiceRoot().toASCIIString());
+    assertEquals("$metadata", ctx.getPathInfo().getODataSegments().get(0).getPath());
+  }
+
+  @Test
   public void testBaseUriWithEncoding() throws ClientProtocolException, IOException, ODataException,
       URISyntaxException {
     server.setPathSplit(3);


[12/13] git commit: [OLINGO-256] Minor code clean up

Posted by mi...@apache.org.
[OLINGO-256] Minor code clean up


Project: http://git-wip-us.apache.org/repos/asf/olingo-odata2/repo
Commit: http://git-wip-us.apache.org/repos/asf/olingo-odata2/commit/1ac8e7d3
Tree: http://git-wip-us.apache.org/repos/asf/olingo-odata2/tree/1ac8e7d3
Diff: http://git-wip-us.apache.org/repos/asf/olingo-odata2/diff/1ac8e7d3

Branch: refs/heads/OLINGO-231_PocForAndroid
Commit: 1ac8e7d33152fc5a03bbb6e4cd42537cf130743d
Parents: a938080
Author: Michael Bolz <mi...@apache.org>
Authored: Tue Apr 29 11:09:44 2014 +0200
Committer: Michael Bolz <mi...@apache.org>
Committed: Tue Apr 29 11:09:44 2014 +0200

----------------------------------------------------------------------
 .../odata2/core/batch/BatchRequestParser.java   | 84 +++++++++++---------
 .../odata2/core/batch/BatchRequestWriter.java   | 13 +--
 2 files changed, 55 insertions(+), 42 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/1ac8e7d3/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/batch/BatchRequestParser.java
----------------------------------------------------------------------
diff --git a/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/batch/BatchRequestParser.java b/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/batch/BatchRequestParser.java
index 1211cf8..6584ee9 100644
--- a/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/batch/BatchRequestParser.java
+++ b/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/batch/BatchRequestParser.java
@@ -155,8 +155,7 @@ public class BatchRequestParser {
 
   private BatchRequestPart parseMultipart(final Scanner scanner, final String boundary, final boolean isChangeSet)
       throws BatchException {
-    List<ODataRequest> requests = new ArrayList<ODataRequest>();
-    BatchRequestPart multipart;
+
     if (scanner.hasNext("--" + boundary + REG_EX_ZERO_OR_MORE_WHITESPACES)) {
       scanner.next();
       currentLineNumber++;
@@ -168,41 +167,9 @@ public class BatchRequestParser {
         throw new BatchException(BatchException.MISSING_CONTENT_TYPE);
       }
       if (isChangeSet) {
-        if (HttpContentType.APPLICATION_HTTP.equalsIgnoreCase(contentType)) {
-          validateEncoding(mimeHeaders.get(BatchHelper.HTTP_CONTENT_TRANSFER_ENCODING.toLowerCase(Locale.ENGLISH)));
-          parseNewLine(scanner);// mandatory
-
-          requests.add(parseRequest(scanner, true, boundary));
-          multipart = new BatchRequestPartImpl(false, requests);
-        } else {
-          throw new BatchException(BatchException.INVALID_CONTENT_TYPE.addContent(HttpContentType.APPLICATION_HTTP));
-        }
+        return parseBatchRequestPartInChangeset(scanner, boundary, mimeHeaders, contentType);
       } else {
-        if (HttpContentType.APPLICATION_HTTP.equalsIgnoreCase(contentType)) {
-          validateEncoding(mimeHeaders.get(BatchHelper.HTTP_CONTENT_TRANSFER_ENCODING.toLowerCase(Locale.ENGLISH)));
-          parseNewLine(scanner);// mandatory
-          requests.add(parseRequest(scanner, false, boundary));
-          multipart = new BatchRequestPartImpl(false, requests);
-        } else if (contentType.matches(REG_EX_OPTIONAL_WHITESPACE + HttpContentType.MULTIPART_MIXED + ANY_CHARACTERS)) {
-          String changeSetBoundary = getBoundary(contentType);
-          if (boundary.equals(changeSetBoundary)) {
-            throw new BatchException(BatchException.INVALID_CHANGESET_BOUNDARY.addContent(currentLineNumber));
-          }
-          List<ODataRequest> changeSetRequests = new LinkedList<ODataRequest>();
-          parseNewLine(scanner);// mandatory
-          Pattern changeSetCloseDelimiter =
-              Pattern.compile("--" + changeSetBoundary + "--" + REG_EX_ZERO_OR_MORE_WHITESPACES);
-          while (!scanner.hasNext(changeSetCloseDelimiter)) {
-            BatchRequestPart part = parseMultipart(scanner, changeSetBoundary, true);
-            changeSetRequests.addAll(part.getRequests());
-          }
-          scanner.next(changeSetCloseDelimiter);
-          currentLineNumber++;
-          multipart = new BatchRequestPartImpl(true, changeSetRequests);
-        } else {
-          throw new BatchException(BatchException.INVALID_CONTENT_TYPE.addContent(HttpContentType.MULTIPART_MIXED
-              + " or " + HttpContentType.APPLICATION_HTTP));
-        }
+        return parseBatchRequestPart(scanner, boundary, mimeHeaders, contentType);
       }
     } else if (scanner.hasNext(boundary + REG_EX_ZERO_OR_MORE_WHITESPACES)) {
       currentLineNumber++;
@@ -215,8 +182,51 @@ public class BatchRequestParser {
       currentLineNumber++;
       throw new BatchException(BatchException.MISSING_BOUNDARY_DELIMITER.addContent(currentLineNumber));
     }
-    return multipart;
+  }
+
+  private BatchRequestPart parseBatchRequestPart(final Scanner scanner, final String boundary,
+                                                 final Map<String, String> mimeHeaders,
+                                                 final String contentType) throws BatchException {
+    if (HttpContentType.APPLICATION_HTTP.equalsIgnoreCase(contentType)) {
+      validateEncoding(mimeHeaders.get(BatchHelper.HTTP_CONTENT_TRANSFER_ENCODING.toLowerCase(Locale.ENGLISH)));
+      parseNewLine(scanner);// mandatory
+      List<ODataRequest> requests = new ArrayList<ODataRequest>(1);
+      requests.add(parseRequest(scanner, false, boundary));
+      return new BatchRequestPartImpl(false, requests);
+    } else if (contentType.matches(REG_EX_OPTIONAL_WHITESPACE + HttpContentType.MULTIPART_MIXED + ANY_CHARACTERS)) {
+      String changeSetBoundary = getBoundary(contentType);
+      if (boundary.equals(changeSetBoundary)) {
+        throw new BatchException(BatchException.INVALID_CHANGESET_BOUNDARY.addContent(currentLineNumber));
+      }
+      List<ODataRequest> changeSetRequests = new LinkedList<ODataRequest>();
+      parseNewLine(scanner);// mandatory
+      Pattern changeSetCloseDelimiter =
+          Pattern.compile("--" + changeSetBoundary + "--" + REG_EX_ZERO_OR_MORE_WHITESPACES);
+      while (!scanner.hasNext(changeSetCloseDelimiter)) {
+        BatchRequestPart part = parseMultipart(scanner, changeSetBoundary, true);
+        changeSetRequests.addAll(part.getRequests());
+      }
+      scanner.next(changeSetCloseDelimiter);
+      currentLineNumber++;
+      return new BatchRequestPartImpl(true, changeSetRequests);
+    } else {
+      throw new BatchException(BatchException.INVALID_CONTENT_TYPE.addContent(HttpContentType.MULTIPART_MIXED
+          + " or " + HttpContentType.APPLICATION_HTTP));
+    }
+  }
 
+  private BatchRequestPart parseBatchRequestPartInChangeset(final Scanner scanner, final String boundary,
+                                                            final Map<String, String> mimeHeaders,
+                                                            final String contentType) throws BatchException {
+    if (HttpContentType.APPLICATION_HTTP.equalsIgnoreCase(contentType)) {
+      validateEncoding(mimeHeaders.get(BatchHelper.HTTP_CONTENT_TRANSFER_ENCODING.toLowerCase(Locale.ENGLISH)));
+      parseNewLine(scanner);// mandatory
+      List<ODataRequest> requests = new ArrayList<ODataRequest>(1);
+      requests.add(parseRequest(scanner, true, boundary));
+      return new BatchRequestPartImpl(false, requests);
+    } else {
+      throw new BatchException(BatchException.INVALID_CONTENT_TYPE.addContent(HttpContentType.APPLICATION_HTTP));
+    }
   }
 
   private ODataRequest parseRequest(final Scanner scanner, final boolean isChangeSet, final String boundary)

http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/1ac8e7d3/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/batch/BatchRequestWriter.java
----------------------------------------------------------------------
diff --git a/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/batch/BatchRequestWriter.java b/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/batch/BatchRequestWriter.java
index 40cf0e0..63453c2 100644
--- a/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/batch/BatchRequestWriter.java
+++ b/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/batch/BatchRequestWriter.java
@@ -38,6 +38,8 @@ public class BatchRequestWriter {
   private static final String COLON = ":";
   private static final String SP = " ";
   private static final String LF = "\r\n";
+  public static final String BOUNDARY_PREAMBLE = "changeset";
+  public static final String HTTP_1_1 = "HTTP/1.1";
   private String batchBoundary;
   private StringBuilder writer = new StringBuilder();
 
@@ -48,7 +50,7 @@ public class BatchRequestWriter {
       throw new IllegalArgumentException();
     }
     for (BatchPart batchPart : batchParts) {
-      writer.append("--" + boundary).append(LF);
+      writer.append("--").append(boundary).append(LF);
       if (batchPart instanceof BatchChangeSet) {
         appendChangeSet((BatchChangeSet) batchPart);
       } else if (batchPart instanceof BatchQueryPart) {
@@ -64,9 +66,9 @@ public class BatchRequestWriter {
   }
 
   private void appendChangeSet(final BatchChangeSet batchChangeSet) {
-    String boundary = BatchHelper.generateBoundary("changeset");
+    String boundary = BatchHelper.generateBoundary(BOUNDARY_PREAMBLE);
     while (boundary.equals(batchBoundary) || !boundary.matches(REG_EX_BOUNDARY)) {
-      boundary = BatchHelper.generateBoundary("changeset");
+      boundary = BatchHelper.generateBoundary(BOUNDARY_PREAMBLE);
     }
     writer.append(HttpHeaders.CONTENT_TYPE).append(COLON).append(SP).append(
         HttpContentType.MULTIPART_MIXED + "; boundary=" + boundary).append(LF);
@@ -83,7 +85,8 @@ public class BatchRequestWriter {
     boolean isContentLengthPresent = false;
     writer.append(HttpHeaders.CONTENT_TYPE).append(COLON).append(SP).append(HttpContentType.APPLICATION_HTTP)
         .append(LF);
-    writer.append(BatchHelper.HTTP_CONTENT_TRANSFER_ENCODING).append(COLON).append(SP).append("binary").append(LF);
+    writer.append(BatchHelper.HTTP_CONTENT_TRANSFER_ENCODING).append(COLON).append(SP)
+            .append(BatchHelper.BINARY_ENCODING).append(LF);
     if (contentId != null) {
       writer.append(BatchHelper.HTTP_CONTENT_ID).append(COLON).append(SP).append(contentId).append(LF);
     }
@@ -92,7 +95,7 @@ public class BatchRequestWriter {
       isContentLengthPresent = true;
     }
     writer.append(LF);
-    writer.append(method).append(SP).append(uri).append(SP).append("HTTP/1.1");
+    writer.append(method).append(SP).append(uri).append(SP).append(HTTP_1_1);
     writer.append(LF);
 
     if (!isContentLengthPresent && body != null && !body.isEmpty()) {


[05/13] git commit: [OLINGO-251] entity writer can serialize additional links

Posted by mi...@apache.org.
[OLINGO-251] entity writer can serialize additional links

Change-Id: I84e4037eaad71baa96c82482c3b438e500b67f5e

Signed-off-by: Stephan Klevenz <sk...@apache.org>


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

Branch: refs/heads/OLINGO-231_PocForAndroid
Commit: b9bcff10ff51c1a3013a38d8e273edfe4af84a56
Parents: 2dd0181
Author: Klaus Straubinger <kl...@sap.com>
Authored: Wed Apr 23 09:48:48 2014 +0200
Committer: Stephan Klevenz <sk...@apache.org>
Committed: Wed Apr 23 10:32:50 2014 +0200

----------------------------------------------------------------------
 .../api/ep/EntityProviderWriteProperties.java   | 27 +++++++++++++--
 .../ep/producer/AtomEntryEntityProducer.java    | 36 ++++++++++++--------
 .../ep/producer/JsonEntryEntityProducer.java    | 21 +++++++++---
 .../ep/ODataEntityProviderPropertiesTest.java   |  9 +++++
 .../core/ep/producer/AtomEntryProducerTest.java | 30 ++++++++++++++++
 .../producer/JsonEntryEntityProducerTest.java   | 24 +++++++++++++
 .../odata2/fit/ref/EntryJsonChangeTest.java     | 30 +++++++++++++---
 7 files changed, 152 insertions(+), 25 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/b9bcff10/odata2-lib/odata-api/src/main/java/org/apache/olingo/odata2/api/ep/EntityProviderWriteProperties.java
----------------------------------------------------------------------
diff --git a/odata2-lib/odata-api/src/main/java/org/apache/olingo/odata2/api/ep/EntityProviderWriteProperties.java b/odata2-lib/odata-api/src/main/java/org/apache/olingo/odata2/api/ep/EntityProviderWriteProperties.java
index 98cabb8..93c1082 100644
--- a/odata2-lib/odata-api/src/main/java/org/apache/olingo/odata2/api/ep/EntityProviderWriteProperties.java
+++ b/odata2-lib/odata-api/src/main/java/org/apache/olingo/odata2/api/ep/EntityProviderWriteProperties.java
@@ -43,6 +43,7 @@ public class EntityProviderWriteProperties {
   private Map<String, ODataCallback> callbacks = Collections.emptyMap();
   private URI selfLink;
   private boolean includeSimplePropertyType;
+  private Map<String, Map<String, Object>> additionalLinks;
 
   private EntityProviderWriteProperties() {}
 
@@ -118,6 +119,16 @@ public class EntityProviderWriteProperties {
     return nextLink;
   }
 
+  /**
+   * Gets the additional links that should be in the payload.
+   * @return the additional links as Map where the navigation-property name is the key and
+     *       a key predicate is the value -
+     *       a key predicate is a Map from key-property names to their values
+   */
+  public final Map<String, Map<String, Object>> getAdditionalLinks() {
+    return additionalLinks;
+  }
+
   public static ODataEntityProviderPropertiesBuilder serviceRoot(final URI serviceRoot) {
     return new ODataEntityProviderPropertiesBuilder().serviceRoot(serviceRoot);
   }
@@ -187,8 +198,7 @@ public class EntityProviderWriteProperties {
 
     /**
      * Set a expand select tree which results from $expand and $select query parameter. Usually the data structure is
-     * constructed
-     * by the uri parser.
+     * constructed by the URI parser.
      * @param expandSelectTree data structure
      * @return properties builder
      */
@@ -207,6 +217,18 @@ public class EntityProviderWriteProperties {
       return this;
     }
 
+    /**
+     * Sets additional links from this entity to other entities.
+     * @param links a Map where the navigation-property name is the key and
+     *              a key predicate is the value -
+     *              a key predicate is a Map from key-property names to their values
+     * @return properties builder
+     */
+    public ODataEntityProviderPropertiesBuilder additionalLinks(final Map<String, Map<String, Object>> links) {
+      properties.additionalLinks = links;
+      return this;
+    }
+
     public ODataEntityProviderPropertiesBuilder fromProperties(final EntityProviderWriteProperties properties) {
       this.properties.mediaResourceMimeType = properties.getMediaResourceMimeType();
       this.properties.inlineCountType = properties.getInlineCountType();
@@ -216,6 +238,7 @@ public class EntityProviderWriteProperties {
       this.properties.callbacks = properties.getCallbacks();
       this.properties.selfLink = properties.getSelfLink();
       this.properties.includeSimplePropertyType = properties.includeSimplePropertyType;
+      this.properties.additionalLinks = properties.additionalLinks;
       return this;
     }
   }

http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/b9bcff10/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 307c828..95702dd 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
@@ -58,7 +58,6 @@ import org.apache.olingo.odata2.core.commons.Encoder;
 import org.apache.olingo.odata2.core.edm.EdmDateTimeOffset;
 import org.apache.olingo.odata2.core.ep.aggregator.EntityInfoAggregator;
 import org.apache.olingo.odata2.core.ep.aggregator.EntityPropertyInfo;
-import org.apache.olingo.odata2.core.ep.aggregator.NavigationPropertyInfo;
 import org.apache.olingo.odata2.core.ep.util.FormatXml;
 
 /**
@@ -182,29 +181,36 @@ public class AtomEntryEntityProducer {
   private void appendAtomNavigationLinks(final XMLStreamWriter writer, final EntityInfoAggregator eia,
       final Map<String, Object> data) throws EntityProviderException, EdmException, URISyntaxException {
     for (String name : eia.getSelectedNavigationPropertyNames()) {
-      NavigationPropertyInfo info = eia.getNavigationPropertyInfo(name);
-      boolean isFeed = (info.getMultiplicity() == EdmMultiplicity.MANY);
-      String self = createSelfLink(eia, data, info.getName());
-      appendAtomNavigationLink(writer, self, info.getName(), isFeed, eia, data);
+      final boolean isFeed = (eia.getNavigationPropertyInfo(name).getMultiplicity() == EdmMultiplicity.MANY);
+      final Map<String, Map<String, Object>> links = properties.getAdditionalLinks();
+      final Map<String, Object> key = links == null ? null : links.get(name);
+      if (key == null || key.isEmpty()) {
+        appendAtomNavigationLink(writer, createSelfLink(eia, data, name), name, isFeed, eia, data);
+      } else {
+        final EntityInfoAggregator targetEntityInfo = EntityInfoAggregator.create(
+            eia.getEntitySet().getRelatedEntitySet((EdmNavigationProperty) eia.getEntityType().getProperty(name)));
+        appendAtomNavigationLink(writer, createSelfLink(targetEntityInfo, key, null), name, null, eia, data);
+      }
     }
   }
 
-  private void appendAtomNavigationLink(final XMLStreamWriter writer, final String self,
-      final String navigationPropertyName, final boolean isFeed, final EntityInfoAggregator eia,
+  private void appendAtomNavigationLink(final XMLStreamWriter writer, final String target,
+      final String navigationPropertyName, final Boolean isFeed, final EntityInfoAggregator eia,
       final Map<String, Object> data) throws EntityProviderException, EdmException, URISyntaxException {
     try {
       writer.writeStartElement(FormatXml.ATOM_LINK);
-      writer.writeAttribute(FormatXml.ATOM_HREF, self);
+      writer.writeAttribute(FormatXml.ATOM_HREF, target);
       writer.writeAttribute(FormatXml.ATOM_REL, Edm.NAMESPACE_REL_2007_08 + navigationPropertyName);
       writer.writeAttribute(FormatXml.ATOM_TITLE, navigationPropertyName);
-      if (isFeed) {
-        writer.writeAttribute(FormatXml.ATOM_TYPE, ContentType.APPLICATION_ATOM_XML_FEED.toString());
-        appendInlineFeed(writer, navigationPropertyName, eia, data, self);
-      } else {
-        writer.writeAttribute(FormatXml.ATOM_TYPE, ContentType.APPLICATION_ATOM_XML_ENTRY.toString());
-        appendInlineEntry(writer, navigationPropertyName, eia, data);
+      if (isFeed != null) {
+        if (isFeed) {
+          writer.writeAttribute(FormatXml.ATOM_TYPE, ContentType.APPLICATION_ATOM_XML_FEED.toString());
+          appendInlineFeed(writer, navigationPropertyName, eia, data, target);
+        } else {
+          writer.writeAttribute(FormatXml.ATOM_TYPE, ContentType.APPLICATION_ATOM_XML_ENTRY.toString());
+          appendInlineEntry(writer, navigationPropertyName, eia, data);
+        }
       }
-
       writer.writeEndElement();
     } catch (XMLStreamException e) {
       throw new EntityProviderException(EntityProviderException.COMMON, e);

http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/b9bcff10/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/ep/producer/JsonEntryEntityProducer.java
----------------------------------------------------------------------
diff --git a/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/ep/producer/JsonEntryEntityProducer.java b/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/ep/producer/JsonEntryEntityProducer.java
index 6ae5677..8ad5d42 100644
--- a/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/ep/producer/JsonEntryEntityProducer.java
+++ b/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/ep/producer/JsonEntryEntityProducer.java
@@ -110,10 +110,10 @@ public class JsonEntryEntityProducer {
           if (properties.getCallbacks() != null && properties.getCallbacks().containsKey(navigationPropertyName)) {
             writeExpandedNavigationProperty(writer, entityInfo, data, type, navigationPropertyName);
           } else {
-            writeDeferredUri(navigationPropertyName);
+            writeDeferredUri(entityInfo, navigationPropertyName);
           }
         } else {
-          writeDeferredUri(navigationPropertyName);
+          writeDeferredUri(entityInfo, navigationPropertyName);
         }
       }
     }
@@ -240,10 +240,23 @@ public class JsonEntryEntityProducer {
     jsonStreamWriter.endObject();
   }
 
-  private void writeDeferredUri(final String navigationPropertyName) throws IOException {
+  private void writeDeferredUri(final EntityInfoAggregator entityInfo, final String navigationPropertyName)
+      throws IOException, EntityProviderException, EdmException {
     jsonStreamWriter.beginObject()
         .name(FormatJson.DEFERRED);
-    JsonLinkEntityProducer.appendUri(jsonStreamWriter, location + "/" + Encoder.encode(navigationPropertyName));
+    String target = null;
+    final Map<String, Map<String, Object>> links = properties.getAdditionalLinks();
+    final Map<String, Object> key = links == null ? null : links.get(navigationPropertyName);
+    if (key == null || key.isEmpty()) {
+      target = location + "/" + Encoder.encode(navigationPropertyName);
+    } else {
+      final EntityInfoAggregator targetEntityInfo = EntityInfoAggregator.create(
+          entityInfo.getEntitySet().getRelatedEntitySet(
+              (EdmNavigationProperty) entityInfo.getEntityType().getProperty(navigationPropertyName)));
+      target = (properties.getServiceRoot() == null ? "" : properties.getServiceRoot().toASCIIString())
+          + AtomEntryEntityProducer.createSelfLink(targetEntityInfo, key, null);
+    }
+    JsonLinkEntityProducer.appendUri(jsonStreamWriter, target);
     jsonStreamWriter.endObject();
   }
 

http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/b9bcff10/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ep/ODataEntityProviderPropertiesTest.java
----------------------------------------------------------------------
diff --git a/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ep/ODataEntityProviderPropertiesTest.java b/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ep/ODataEntityProviderPropertiesTest.java
index e0e85f6..b5d178e 100644
--- a/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ep/ODataEntityProviderPropertiesTest.java
+++ b/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ep/ODataEntityProviderPropertiesTest.java
@@ -22,6 +22,7 @@ import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertTrue;
 
 import java.net.URI;
+import java.util.Collections;
 import java.util.HashMap;
 import java.util.Map;
 
@@ -61,6 +62,8 @@ public class ODataEntityProviderPropertiesTest extends BaseTest {
     callbacks.put("aCallback", new MyCallback(null, null));
     ExpandSelectTreeNode expandSelectTree = new ExpandSelectTreeNodeImpl();
     URI selfLink = new URI("http://some.uri");
+    Map<String, Map<String, Object>> links = new HashMap<String, Map<String,Object>>();
+    links.put("aNavigationProperty", Collections.<String, Object> emptyMap());
     final EntityProviderWriteProperties properties = EntityProviderWriteProperties.serviceRoot(serviceRoot)
         .callbacks(callbacks)
         .expandSelectTree(expandSelectTree)
@@ -70,6 +73,7 @@ public class ODataEntityProviderPropertiesTest extends BaseTest {
         .nextLink("http://localhost")
         .selfLink(selfLink)
         .includeSimplePropertyType(true)
+        .additionalLinks(links)
         .build();
 
     assertEquals("Wrong amount of callbacks.", 1, properties.getCallbacks().size());
@@ -82,6 +86,7 @@ public class ODataEntityProviderPropertiesTest extends BaseTest {
     assertEquals("Wrong inline count.", Integer.valueOf(1), properties.getInlineCount());
     assertEquals("Wrong nextLink", "http://localhost", properties.getNextLink());
     assertTrue("Simple property types should be true", properties.isIncludeSimplePropertyType());
+    assertEquals(Collections.emptyMap(), properties.getAdditionalLinks().get("aNavigationProperty"));
   }
 
   @Test
@@ -101,6 +106,8 @@ public class ODataEntityProviderPropertiesTest extends BaseTest {
     callbacks.put("aCallback", new MyCallback(null, null));
     ExpandSelectTreeNode expandSelectTree = new ExpandSelectTreeNodeImpl();
     URI selfLink = new URI("http://some.uri");
+    Map<String, Map<String, Object>> links = new HashMap<String, Map<String,Object>>();
+    links.put("aNavigationProperty", Collections.<String, Object> emptyMap());
     final EntityProviderWriteProperties properties = EntityProviderWriteProperties.serviceRoot(serviceRoot)
         .callbacks(callbacks)
         .expandSelectTree(expandSelectTree)
@@ -110,6 +117,7 @@ public class ODataEntityProviderPropertiesTest extends BaseTest {
         .nextLink("http://localhost")
         .selfLink(selfLink)
         .includeSimplePropertyType(true)
+        .additionalLinks(links)
         .build();
 
     //
@@ -127,5 +135,6 @@ public class ODataEntityProviderPropertiesTest extends BaseTest {
     assertEquals("Wrong inline count.", Integer.valueOf(1), fromProperties.getInlineCount());
     assertEquals("Wrong nextLink", "http://localhost", fromProperties.getNextLink());
     assertTrue("Simple property types should be true", fromProperties.isIncludeSimplePropertyType());
+    assertEquals(Collections.emptyMap(), fromProperties.getAdditionalLinks().get("aNavigationProperty"));
   }
 }

http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/b9bcff10/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 dd36e11..c4bcb22 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
@@ -720,6 +720,36 @@ public class AtomEntryProducerTest extends AbstractProviderTest {
   }
 
   @Test
+  public void additionalLink() throws Exception {
+    Map<String, Map<String, Object>> links = new HashMap<String, Map<String, Object>>();
+    links.put("nr_Building", buildingData);
+    final ODataResponse response = createAtomEntityProvider().writeEntry(
+        MockFacade.getMockEdm().getDefaultEntityContainer().getEntitySet("Rooms"), roomData,
+         EntityProviderWriteProperties.serviceRoot(BASE_URI).additionalLinks(links).build());
+    final String xmlString = verifyResponse(response);
+
+    assertXpathExists("/a:entry/a:link[@title='nr_Building']", xmlString);
+    assertXpathNotExists("/a:entry/a:link[@href=\"Rooms('1')/nr_Building\"]", xmlString);
+    assertXpathExists("/a:entry/a:link[@href=\"Buildings('1')\"]", xmlString);
+    assertXpathNotExists("/a:entry/a:link[@type='application/atom+xml;type=entry']", xmlString);
+  }
+
+  @Test
+  public void additionalLinkToOneOfMany() throws Exception {
+    Map<String, Map<String, Object>> links = new HashMap<String, Map<String, Object>>();
+    links.put("nr_Employees", employeeData);
+    final ODataResponse response = createAtomEntityProvider().writeEntry(
+        MockFacade.getMockEdm().getDefaultEntityContainer().getEntitySet("Rooms"), roomData,
+         EntityProviderWriteProperties.serviceRoot(BASE_URI).additionalLinks(links).build());
+    final String xmlString = verifyResponse(response);
+
+    assertXpathExists("/a:entry/a:link[@title='nr_Employees']", xmlString);
+    assertXpathNotExists("/a:entry/a:link[@href=\"Rooms('1')/nr_Employees\"]", xmlString);
+    assertXpathExists("/a:entry/a:link[@href=\"Employees('1')\"]", xmlString);
+    assertXpathNotExists("/a:entry/a:link[@type='application/atom+xml;type=feed']", xmlString);
+  }
+
+  @Test
   public void serializeWithCustomSrcAttributeOnEmployee() throws Exception {
     AtomEntityProvider ser = createAtomEntityProvider();
     Map<String, Object> localEmployeeData = new HashMap<String, Object>(employeeData);

http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/b9bcff10/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 0a6f08a..8efd99a 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
@@ -737,6 +737,30 @@ public class JsonEntryEntityProducerTest extends BaseTest {
     assertEquals("right", jsonMap.get("content_type"));
   }
 
+  @Test
+  public void additionalLink() throws Exception {
+    final EdmEntitySet entitySet = MockFacade.getMockEdm().getDefaultEntityContainer().getEntitySet("Rooms");
+    Map<String, Object> data = new HashMap<String, Object>();
+    data.put("Id", "1");
+    Map<String, Object> key = new HashMap<String, Object>();
+    key.put("Id", "3");
+    Map<String, Map<String, Object>> links = new HashMap<String, Map<String, Object>>();
+    links.put("nr_Building", key);
+    final EntityProviderWriteProperties properties = EntityProviderWriteProperties
+        .serviceRoot(URI.create(BASE_URI))
+        .additionalLinks(links)
+        .build();
+
+    final ODataResponse response = new JsonEntityProvider().writeEntry(entitySet, data, properties);
+    final String json = verifyResponse(response);
+    assertEquals("{\"d\":{\"__metadata\":{\"id\":\"" + BASE_URI + "Rooms('1')\","
+        + "\"uri\":\"" + BASE_URI + "Rooms('1')\",\"type\":\"RefScenario.Room\"},"
+        + "\"Id\":\"1\",\"Name\":null,\"Seats\":null,\"Version\":null,"
+        + "\"nr_Employees\":{\"__deferred\":{\"uri\":\"" + BASE_URI + "Rooms('1')/nr_Employees\"}},"
+        + "\"nr_Building\":{\"__deferred\":{\"uri\":\"" + BASE_URI + "Buildings('3')\"}}}}",
+        json);
+  }
+
   private String verifyResponse(final ODataResponse response) throws IOException {
     assertNotNull(response);
     assertNotNull(response.getEntity());

http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/b9bcff10/odata2-lib/odata-fit/src/test/java/org/apache/olingo/odata2/fit/ref/EntryJsonChangeTest.java
----------------------------------------------------------------------
diff --git a/odata2-lib/odata-fit/src/test/java/org/apache/olingo/odata2/fit/ref/EntryJsonChangeTest.java b/odata2-lib/odata-fit/src/test/java/org/apache/olingo/odata2/fit/ref/EntryJsonChangeTest.java
index 8fd04ce..9c1df43 100644
--- a/odata2-lib/odata-fit/src/test/java/org/apache/olingo/odata2/fit/ref/EntryJsonChangeTest.java
+++ b/odata2-lib/odata-fit/src/test/java/org/apache/olingo/odata2/fit/ref/EntryJsonChangeTest.java
@@ -21,10 +21,18 @@ package org.apache.olingo.odata2.fit.ref;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 
+import java.io.InputStream;
+import java.util.HashMap;
+import java.util.Map;
+
 import org.apache.http.HttpResponse;
 import org.apache.olingo.odata2.api.commons.HttpContentType;
 import org.apache.olingo.odata2.api.commons.HttpStatusCodes;
 import org.apache.olingo.odata2.api.commons.ODataHttpMethod;
+import org.apache.olingo.odata2.api.edm.EdmEntitySet;
+import org.apache.olingo.odata2.api.ep.EntityProvider;
+import org.apache.olingo.odata2.api.ep.EntityProviderWriteProperties;
+import org.apache.olingo.odata2.testutil.helper.StringHelper;
 import org.apache.olingo.odata2.testutil.server.ServletType;
 import org.junit.Test;
 
@@ -74,10 +82,24 @@ public class EntryJsonChangeTest extends AbstractRefTest {
 
   @Test
   public void createEntryWithLink() throws Exception {
-    final String requestBody = "{\"Id\":\"99\",\"Name\":\"new room\",\"Seats\":19,\"Version\":42,"
-        + "\"nr_Building\":{\"__deferred\":{\"uri\":\"" + getEndpoint() + "Buildings('1')\"}}}";
-    final HttpResponse response =
-        postUri("Rooms()", requestBody, HttpContentType.APPLICATION_JSON, HttpStatusCodes.CREATED);
+    HttpResponse response = callUri("$metadata");
+    final EdmEntitySet linkedEntitySet = EntityProvider.readMetadata(response.getEntity().getContent(), false)
+        .getDefaultEntityContainer().getEntitySet("Rooms");
+    getBody(response);
+    Map<String, Object> data = new HashMap<String, Object>();
+    data.put("Id", "99");
+    data.put("Name", "new room");
+    data.put("Seats", 19);
+    data.put("Version", 42);
+    Map<String, Object> key = new HashMap<String, Object>();
+    key.put("Id", "1");
+    Map<String, Map<String, Object>> links = new HashMap<String, Map<String,Object>>();
+    links.put("nr_Building", key);
+    final String requestBody = StringHelper.inputStreamToString(
+        (InputStream) EntityProvider.writeEntry(HttpContentType.APPLICATION_JSON, linkedEntitySet, data,
+            EntityProviderWriteProperties.serviceRoot(getEndpoint()).additionalLinks(links).build())
+            .getEntity());
+    response = postUri("Rooms()", requestBody, HttpContentType.APPLICATION_JSON, HttpStatusCodes.CREATED);
     assertFalse(getBody(response).isEmpty());
     checkUri("Rooms('104')/nr_Building?$format=json");
     assertEquals("{\"d\":{\"Name\":\"Building 1\"}}", getBody(callUri("Rooms('104')/nr_Building/Name?$format=json")));


[08/13] git commit: [OLINGO-256] Added more tests

Posted by mi...@apache.org.
[OLINGO-256] Added more tests


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

Branch: refs/heads/OLINGO-231_PocForAndroid
Commit: d75041c4545302ec431a23ac894ee0498aeab18a
Parents: 15abea3
Author: Michael Bolz <mi...@apache.org>
Authored: Fri Apr 25 14:14:20 2014 +0200
Committer: Michael Bolz <mi...@apache.org>
Committed: Fri Apr 25 15:07:04 2014 +0200

----------------------------------------------------------------------
 .../odata2/core/batch/BatchRequestTest.java     | 283 +++++++++++++++++++
 .../core/batch/BatchRequestWriterTest.java      |  22 +-
 .../core/batch/BatchResponseParserTest.java     |   1 -
 .../odata2/core/batch/BatchResponseTest.java    | 141 +++++++++
 .../src/test/resources/batchResponse.batch      |   2 -
 .../odata2/testutil/helper/StringHelper.java    |  82 ++++++
 6 files changed, 518 insertions(+), 13 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/d75041c4/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/batch/BatchRequestTest.java
----------------------------------------------------------------------
diff --git a/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/batch/BatchRequestTest.java b/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/batch/BatchRequestTest.java
new file mode 100644
index 0000000..40c3218
--- /dev/null
+++ b/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/batch/BatchRequestTest.java
@@ -0,0 +1,283 @@
+/*******************************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ ******************************************************************************/
+package org.apache.olingo.odata2.core.batch;
+
+import org.apache.olingo.odata2.api.batch.BatchException;
+import org.apache.olingo.odata2.api.batch.BatchRequestPart;
+import org.apache.olingo.odata2.api.client.batch.BatchChangeSet;
+import org.apache.olingo.odata2.api.client.batch.BatchChangeSetPart;
+import org.apache.olingo.odata2.api.client.batch.BatchPart;
+import org.apache.olingo.odata2.api.client.batch.BatchQueryPart;
+import org.apache.olingo.odata2.api.ep.EntityProviderBatchProperties;
+import org.apache.olingo.odata2.core.PathInfoImpl;
+import org.apache.olingo.odata2.testutil.helper.StringHelper;
+import org.junit.Test;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+
+/**
+ * Test creation of a batch request with BatchRequestWriter and
+ * then parsing this request again with BatchRequestParser.
+ */
+public class BatchRequestTest {
+
+  private static final String POST = "POST";
+  private static final String GET = "GET";
+  private static final String PUT = "PUT";
+  private static final String BOUNDARY = "batch_123";
+  private static final String SERVICE_ROOT = "http://localhost/odata/";
+
+  private EntityProviderBatchProperties parseProperties;
+
+  public BatchRequestTest() throws URISyntaxException {
+    PathInfoImpl pathInfo = new PathInfoImpl();
+    pathInfo.setServiceRoot(new URI(SERVICE_ROOT));
+    parseProperties = EntityProviderBatchProperties.init().pathInfo(pathInfo).build();
+  }
+
+  private void checkMimeHeaders(final String requestBody) {
+    assertTrue(requestBody.contains("Content-Type: application/http"));
+    assertTrue(requestBody.contains("Content-Transfer-Encoding: binary"));
+  }
+
+  @Test
+  public void testBatchQueryPart() throws BatchException, IOException {
+    List<BatchPart> batch = new ArrayList<BatchPart>();
+    Map<String, String> headers = new HashMap<String, String>();
+    headers.put("Accept", "application/json");
+    BatchPart request = BatchQueryPart.method(GET).uri("Employees").headers(headers).build();
+    batch.add(request);
+
+    BatchRequestWriter writer = new BatchRequestWriter();
+    InputStream batchRequest = writer.writeBatchRequest(batch, BOUNDARY);
+    assertNotNull(batchRequest);
+
+    StringHelper.Stream batchRequestStream = StringHelper.toStream(batchRequest);
+    String requestBody = batchRequestStream.asString();
+    checkMimeHeaders(requestBody);
+
+    assertTrue(requestBody.contains("--batch_"));
+    assertTrue(requestBody.contains("GET Employees HTTP/1.1"));
+    checkHeaders(headers, requestBody);
+
+    String contentType = "multipart/mixed; boundary=" + BOUNDARY;
+    BatchRequestParser parser = new BatchRequestParser(contentType, parseProperties);
+    List<BatchRequestPart> parseResult = parser.parse(batchRequestStream.asStream());
+    assertEquals(1, parseResult.size());
+  }
+
+  @Test
+  public void testBatchChangeSet() throws IOException, BatchException {
+    List<BatchPart> batch = new ArrayList<BatchPart>();
+    Map<String, String> headers = new HashMap<String, String>();
+    headers.put("content-type", "application/json");
+    BatchChangeSetPart request = BatchChangeSetPart.method(PUT)
+        .uri("Employees('2')")
+        .body("{\"Возраст\":40}")
+        .headers(headers)
+        .contentId("111")
+        .build();
+    BatchChangeSet changeSet = BatchChangeSet.newBuilder().build();
+    changeSet.add(request);
+    batch.add(changeSet);
+
+    BatchRequestWriter writer = new BatchRequestWriter();
+    InputStream batchRequest = writer.writeBatchRequest(batch, BOUNDARY);
+    assertNotNull(batchRequest);
+
+    StringHelper.Stream batchRequestStream = StringHelper.toStream(batchRequest);
+    String requestBody = batchRequestStream.asString();
+    checkMimeHeaders(requestBody);
+    checkHeaders(headers, requestBody);
+
+    assertTrue(requestBody.contains("--batch_"));
+    assertTrue(requestBody.contains("--changeset_"));
+    assertTrue(requestBody.contains("PUT Employees('2') HTTP/1.1"));
+    assertTrue(requestBody.contains("{\"Возраст\":40}"));
+
+    String contentType = "multipart/mixed; boundary=" + BOUNDARY;
+    BatchRequestParser parser = new BatchRequestParser(contentType, parseProperties);
+    List<BatchRequestPart> parseResult = parser.parse(batchRequestStream.asStream());
+    assertEquals(1, parseResult.size());
+  }
+
+  @Test
+  public void testBatchWithGetAndPost() throws BatchException, IOException {
+    List<BatchPart> batch = new ArrayList<BatchPart>();
+    Map<String, String> headers = new HashMap<String, String>();
+    headers.put("Accept", "application/json");
+    BatchPart request = BatchQueryPart.method(GET).uri("Employees").headers(headers).contentId("000").build();
+    batch.add(request);
+
+    Map<String, String> changeSetHeaders = new HashMap<String, String>();
+    changeSetHeaders.put("content-type", "application/json");
+    String body = "/9j/4AAQSkZJRgABAQEBLAEsAAD/4RM0RXhpZgAATU0AKgAAAAgABwESAAMAAAABAAEA";
+    BatchChangeSetPart changeRequest = BatchChangeSetPart.method(POST)
+        .uri("Employees")
+        .body(body)
+        .headers(changeSetHeaders)
+        .contentId("111")
+        .build();
+    BatchChangeSet changeSet = BatchChangeSet.newBuilder().build();
+    changeSet.add(changeRequest);
+    batch.add(changeSet);
+    BatchRequestWriter writer = new BatchRequestWriter();
+    InputStream batchRequest = writer.writeBatchRequest(batch, BOUNDARY);
+    assertNotNull(batchRequest);
+
+    StringHelper.Stream batchRequestStream = StringHelper.toStream(batchRequest);
+    String requestBody = batchRequestStream.asString();
+    checkMimeHeaders(requestBody);
+
+    checkHeaders(headers, requestBody);
+    checkHeaders(changeSetHeaders, requestBody);
+    assertTrue(requestBody.contains("GET Employees HTTP/1.1"));
+    assertTrue(requestBody.contains("POST Employees HTTP/1.1"));
+    assertTrue(requestBody.contains(body));
+
+    String contentType = "multipart/mixed; boundary=" + BOUNDARY;
+    BatchRequestParser parser = new BatchRequestParser(contentType, parseProperties);
+    List<BatchRequestPart> parseResult = parser.parse(batchRequestStream.asStream());
+    assertEquals(2, parseResult.size());
+  }
+
+  @Test
+  public void testChangeSetWithContentIdReferencing() throws BatchException, IOException {
+    List<BatchPart> batch = new ArrayList<BatchPart>();
+
+    Map<String, String> changeSetHeaders = new HashMap<String, String>();
+    changeSetHeaders.put("content-type", "application/json");
+    String body = "/9j/4AAQSkZJRgABAQEBLAEsAAD/4RM0RXhpZgAATU0AKgAAAAgABwESAAMAAAABAAEA";
+    BatchChangeSetPart changeRequest = BatchChangeSetPart.method(POST)
+        .uri("Employees('2')")
+        .body(body)
+        .headers(changeSetHeaders)
+        .contentId("1")
+        .build();
+    BatchChangeSet changeSet = BatchChangeSet.newBuilder().build();
+    changeSet.add(changeRequest);
+
+    changeSetHeaders = new HashMap<String, String>();
+    changeSetHeaders.put("content-type", "application/json;odata=verbose");
+    BatchChangeSetPart changeRequest2 = BatchChangeSetPart.method(PUT)
+        .uri("$/ManagerId")
+        .body("{\"ManagerId\":1}")
+        .headers(changeSetHeaders)
+        .contentId("2")
+        .build();
+    changeSet.add(changeRequest2);
+    batch.add(changeSet);
+
+    BatchRequestWriter writer = new BatchRequestWriter();
+    InputStream batchRequest = writer.writeBatchRequest(batch, BOUNDARY);
+    assertNotNull(batchRequest);
+
+    StringHelper.Stream batchRequestStream = StringHelper.toStream(batchRequest);
+    String requestBody = batchRequestStream.asString();
+    checkMimeHeaders(requestBody);
+
+    assertTrue(requestBody.contains("POST Employees('2') HTTP/1.1"));
+    assertTrue(requestBody.contains("PUT $/ManagerId HTTP/1.1"));
+    assertTrue(requestBody.contains(BatchHelper.HTTP_CONTENT_ID + ": 1"));
+    assertTrue(requestBody.contains(BatchHelper.HTTP_CONTENT_ID + ": 2"));
+    assertTrue(requestBody.contains(body));
+
+    String contentType = "multipart/mixed; boundary=" + BOUNDARY;
+    BatchRequestParser parser = new BatchRequestParser(contentType, parseProperties);
+    List<BatchRequestPart> parseResult = parser.parse(batchRequestStream.asStream());
+    assertEquals(1, parseResult.size());
+  }
+
+  @Test
+  public void testBatchWithTwoChangeSets() throws BatchException, IOException {
+    List<BatchPart> batch = new ArrayList<BatchPart>();
+
+    Map<String, String> changeSetHeaders = new HashMap<String, String>();
+    changeSetHeaders.put("content-type", "application/json");
+    changeSetHeaders.put("content-Id", "111");
+    String body = "/9j/4AAQSkZJRgABAQEBLAEsAAD/4RM0RXhpZgAATU0AKgAAAAgABwESAAMAAAABAAEA";
+    BatchChangeSetPart changeRequest = BatchChangeSetPart.method(POST)
+        .uri("Employees")
+        .body(body)
+        .headers(changeSetHeaders)
+        .build();
+    BatchChangeSet changeSet = BatchChangeSet.newBuilder().build();
+    changeSet.add(changeRequest);
+    batch.add(changeSet);
+
+    Map<String, String> changeSetHeaders2 = new HashMap<String, String>();
+    changeSetHeaders2.put("content-type", "application/json;odata=verbose");
+    changeSetHeaders2.put("content-Id", "222");
+    BatchChangeSetPart changeRequest2 = BatchChangeSetPart.method(PUT)
+        .uri("Employees('2')/ManagerId")
+        .body("{\"ManagerId\":1}")
+        .headers(changeSetHeaders2)
+        .build();
+    BatchChangeSet changeSet2 = BatchChangeSet.newBuilder().build();
+    changeSet2.add(changeRequest2);
+    batch.add(changeSet2);
+
+    BatchRequestWriter writer = new BatchRequestWriter();
+    InputStream batchRequest = writer.writeBatchRequest(batch, BOUNDARY);
+    assertNotNull(batchRequest);
+
+    StringHelper.Stream batchRequestStream = StringHelper.toStream(batchRequest);
+    String requestBody = batchRequestStream.asString();
+    checkMimeHeaders(requestBody);
+
+    assertTrue(requestBody.contains("POST Employees HTTP/1.1"));
+    assertTrue(requestBody.contains("PUT Employees('2')/ManagerId HTTP/1.1"));
+
+    assertTrue(requestBody.contains(body));
+
+    String contentType = "multipart/mixed; boundary=" + BOUNDARY;
+    BatchRequestParser parser = new BatchRequestParser(contentType, parseProperties);
+    List<BatchRequestPart> parseResult = parser.parse(batchRequestStream.asStream());
+    assertEquals(2, parseResult.size());
+  }
+
+  private void checkHeaders(final Map<String, String> headers, final String requestBody) {
+    for (Map.Entry<String, String> header : headers.entrySet()) {
+      assertTrue(requestBody.contains(header.getKey() + ": " + header.getValue()));
+    }
+  }
+
+  @Test(expected = IllegalArgumentException.class)
+  public void testBatchQueryPartWithInvalidMethod() throws BatchException, IOException {
+    BatchQueryPart.method(PUT).uri("Employees").build();
+
+  }
+
+  @Test(expected = IllegalArgumentException.class)
+  public void testBatchChangeSetPartWithInvalidMethod() throws BatchException, IOException {
+    BatchChangeSetPart.method(GET).uri("Employees('2')").build();
+
+  }
+}

http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/d75041c4/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/batch/BatchRequestWriterTest.java
----------------------------------------------------------------------
diff --git a/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/batch/BatchRequestWriterTest.java b/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/batch/BatchRequestWriterTest.java
index 1331e73..496686d 100644
--- a/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/batch/BatchRequestWriterTest.java
+++ b/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/batch/BatchRequestWriterTest.java
@@ -18,8 +18,13 @@
  ******************************************************************************/
 package org.apache.olingo.odata2.core.batch;
 
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertTrue;
+import org.apache.olingo.odata2.api.batch.BatchException;
+import org.apache.olingo.odata2.api.client.batch.BatchChangeSet;
+import org.apache.olingo.odata2.api.client.batch.BatchChangeSetPart;
+import org.apache.olingo.odata2.api.client.batch.BatchPart;
+import org.apache.olingo.odata2.api.client.batch.BatchQueryPart;
+import org.apache.olingo.odata2.testutil.helper.StringHelper;
+import org.junit.Test;
 
 import java.io.IOException;
 import java.io.InputStream;
@@ -28,13 +33,9 @@ import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
-import org.apache.olingo.odata2.api.batch.BatchException;
-import org.apache.olingo.odata2.api.client.batch.BatchChangeSet;
-import org.apache.olingo.odata2.api.client.batch.BatchChangeSetPart;
-import org.apache.olingo.odata2.api.client.batch.BatchPart;
-import org.apache.olingo.odata2.api.client.batch.BatchQueryPart;
-import org.apache.olingo.odata2.testutil.helper.StringHelper;
-import org.junit.Test;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
 
 public class BatchRequestWriterTest {
 
@@ -59,13 +60,14 @@ public class BatchRequestWriterTest {
     BatchRequestWriter writer = new BatchRequestWriter();
     InputStream batchRequest = writer.writeBatchRequest(batch, BOUNDARY);
 
-    String requestBody = StringHelper.inputStreamToString(batchRequest);
+    String requestBody = StringHelper.toStream(batchRequest).asString();
     assertNotNull(batchRequest);
     checkMimeHeaders(requestBody);
 
     assertTrue(requestBody.contains("--batch_"));
     assertTrue(requestBody.contains("GET Employees HTTP/1.1"));
     checkHeaders(headers, requestBody);
+    assertEquals(10, StringHelper.countLines(requestBody));
   }
 
   @Test

http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/d75041c4/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/batch/BatchResponseParserTest.java
----------------------------------------------------------------------
diff --git a/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/batch/BatchResponseParserTest.java b/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/batch/BatchResponseParserTest.java
index 06daa2a..592c054 100644
--- a/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/batch/BatchResponseParserTest.java
+++ b/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/batch/BatchResponseParserTest.java
@@ -48,7 +48,6 @@ public class BatchResponseParserTest {
         + "Content-length: 22" + LF
         + LF
         + "Frederic Fall MODIFIED" + LF
-        + LF
         + "--batch_123--";
 
     InputStream in = new ByteArrayInputStream(getResponse.getBytes());

http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/d75041c4/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/batch/BatchResponseTest.java
----------------------------------------------------------------------
diff --git a/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/batch/BatchResponseTest.java b/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/batch/BatchResponseTest.java
new file mode 100644
index 0000000..29dd774
--- /dev/null
+++ b/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/batch/BatchResponseTest.java
@@ -0,0 +1,141 @@
+/*******************************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ ******************************************************************************/
+package org.apache.olingo.odata2.core.batch;
+
+import org.apache.olingo.odata2.api.batch.BatchException;
+import org.apache.olingo.odata2.api.batch.BatchResponsePart;
+import org.apache.olingo.odata2.api.client.batch.BatchSingleResponse;
+import org.apache.olingo.odata2.api.commons.HttpStatusCodes;
+import org.apache.olingo.odata2.api.processor.ODataResponse;
+import org.apache.olingo.odata2.testutil.helper.StringHelper;
+import org.junit.Test;
+
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+
+import static org.junit.Assert.*;
+
+/**
+ * Test creation of a batch response with BatchResponseWriter and
+ * then parsing this response again with BatchResponseParser.
+ */
+public class BatchResponseTest {
+
+  @Test
+  public void testBatchResponse() throws BatchException, IOException {
+    List<BatchResponsePart> parts = new ArrayList<BatchResponsePart>();
+    ODataResponse response = ODataResponse.entity("Walter Winter")
+        .status(HttpStatusCodes.OK)
+        .contentHeader("application/json")
+        .build();
+    List<ODataResponse> responses = new ArrayList<ODataResponse>(1);
+    responses.add(response);
+    parts.add(BatchResponsePart.responses(responses).changeSet(false).build());
+
+    ODataResponse changeSetResponse = ODataResponse.status(HttpStatusCodes.NO_CONTENT).build();
+    responses = new ArrayList<ODataResponse>(1);
+    responses.add(changeSetResponse);
+    parts.add(BatchResponsePart.responses(responses).changeSet(true).build());
+
+    BatchResponseWriter writer = new BatchResponseWriter();
+    ODataResponse batchResponse = writer.writeResponse(parts);
+
+    assertEquals(202, batchResponse.getStatus().getStatusCode());
+    assertNotNull(batchResponse.getEntity());
+    String body = (String) batchResponse.getEntity();
+
+    assertTrue(body.contains("--batch"));
+    assertTrue(body.contains("--changeset"));
+    assertTrue(body.contains("HTTP/1.1 200 OK"));
+    assertTrue(body.contains("Content-Type: application/http"));
+    assertTrue(body.contains("Content-Transfer-Encoding: binary"));
+    assertTrue(body.contains("Walter Winter"));
+    assertTrue(body.contains("multipart/mixed; boundary=changeset"));
+    assertTrue(body.contains("HTTP/1.1 204 No Content"));
+
+    String contentHeader = batchResponse.getContentHeader();
+    BatchResponseParser parser = new BatchResponseParser(contentHeader);
+    List<BatchSingleResponse> result = parser.parse(new ByteArrayInputStream(body.getBytes()));
+    assertEquals(2, result.size());
+  }
+
+  @Test
+  public void testChangeSetResponse() throws BatchException, IOException {
+    List<BatchResponsePart> parts = new ArrayList<BatchResponsePart>();
+    ODataResponse changeSetResponse = ODataResponse.status(HttpStatusCodes.NO_CONTENT).build();
+    List<ODataResponse> responses = new ArrayList<ODataResponse>(1);
+    responses.add(changeSetResponse);
+    parts.add(BatchResponsePart.responses(responses).changeSet(true).build());
+
+    BatchResponseWriter writer = new BatchResponseWriter();
+    ODataResponse batchResponse = writer.writeResponse(parts);
+
+    assertEquals(202, batchResponse.getStatus().getStatusCode());
+    assertNotNull(batchResponse.getEntity());
+    String body = (String) batchResponse.getEntity();
+    assertTrue(body.contains("--batch"));
+    assertTrue(body.contains("--changeset"));
+    assertTrue(body.indexOf("--changeset") != body.lastIndexOf("--changeset"));
+    assertFalse(body.contains("HTTP/1.1 200 OK" + "\r\n"));
+    assertTrue(body.contains("Content-Type: application/http" + "\r\n"));
+    assertTrue(body.contains("Content-Transfer-Encoding: binary" + "\r\n"));
+    assertTrue(body.contains("HTTP/1.1 204 No Content" + "\r\n"));
+    assertTrue(body.contains("Content-Type: multipart/mixed; boundary=changeset"));
+
+    String contentHeader = batchResponse.getContentHeader();
+    BatchResponseParser parser = new BatchResponseParser(contentHeader);
+    List<BatchSingleResponse> result = parser.parse(new ByteArrayInputStream(body.getBytes()));
+    assertEquals(1, result.size());
+  }
+
+  @Test
+  public void testTwoChangeSetResponse() throws BatchException, IOException {
+    List<BatchResponsePart> parts = new ArrayList<BatchResponsePart>();
+    ODataResponse changeSetResponse = ODataResponse.status(HttpStatusCodes.NO_CONTENT).build();
+    ODataResponse changeSetResponseTwo = ODataResponse.status(HttpStatusCodes.NO_CONTENT).build();
+    List<ODataResponse> responses = new ArrayList<ODataResponse>(1);
+    responses.add(changeSetResponse);
+    responses.add(changeSetResponseTwo);
+    parts.add(BatchResponsePart.responses(responses).changeSet(true).build());
+
+    BatchResponseWriter writer = new BatchResponseWriter();
+    ODataResponse batchResponse = writer.writeResponse(parts);
+
+    assertEquals(202, batchResponse.getStatus().getStatusCode());
+    assertNotNull(batchResponse.getEntity());
+    String body = (String) batchResponse.getEntity();
+    assertTrue(body.contains("--batch"));
+    assertTrue(body.contains("--changeset"));
+    assertTrue(body.indexOf("--changeset") != body.lastIndexOf("--changeset"));
+    assertFalse(body.contains("HTTP/1.1 200 OK" + "\r\n"));
+    assertTrue(body.contains("Content-Type: application/http" + "\r\n"));
+    assertTrue(body.contains("Content-Transfer-Encoding: binary" + "\r\n"));
+    assertTrue(body.contains("HTTP/1.1 204 No Content" + "\r\n"));
+    assertTrue(body.contains("Content-Type: multipart/mixed; boundary=changeset"));
+
+    String contentHeader = batchResponse.getContentHeader();
+    BatchResponseParser parser = new BatchResponseParser(contentHeader);
+    StringHelper.Stream content = StringHelper.toStream(body);
+    List<BatchSingleResponse> result = parser.parse(content.asStream());
+    assertEquals(2, result.size());
+    assertEquals("Failing content:\n" + content.asString(), 19, content.countCrLf());
+  }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/d75041c4/odata2-lib/odata-core/src/test/resources/batchResponse.batch
----------------------------------------------------------------------
diff --git a/odata2-lib/odata-core/src/test/resources/batchResponse.batch b/odata2-lib/odata-core/src/test/resources/batchResponse.batch
index ff65bb1..f9e043b 100644
--- a/odata2-lib/odata-core/src/test/resources/batchResponse.batch
+++ b/odata2-lib/odata-core/src/test/resources/batchResponse.batch
@@ -21,7 +21,6 @@ Content-Type: application/json
 Content-Length: 918
 
 {"d":{"__metadata":{"id":"http://localhost:19000/ClientBatchTest/Employees('7')","uri":"http://localhost:19000/ClientBatchTest/Employees('7')","type":"RefScenario.Employee","content_type":"application/octet-stream","media_src":"Employees('7')/$value","edit_media":"http://localhost:19000/ClientBatchTest/Employees('7')/$value"},"EmployeeId":"7","EmployeeName":"Employee 7","ManagerId":null,"RoomId":null,"TeamId":null,"Location":{"__metadata":{"type":"RefScenario.c_Location"},"City":{"__metadata":{"type":"RefScenario.c_City"},"PostalCode":null,"CityName":null},"Country":null},"Age":0,"EntryDate":null,"ImageUrl":null,"ne_Manager":{"__deferred":{"uri":"http://localhost:19000/ClientBatchTest/Employees('7')/ne_Manager"}},"ne_Team":{"__deferred":{"uri":"http://localhost:19000/ClientBatchTest/Employees('7')/ne_Team"}},"ne_Room":{"__deferred":{"uri":"http://localhost:19000/ClientBatchTest/Employees('7')/ne_Room"}}}}
-
 --changeset_12ks93js84d--
 
 --batch_123
@@ -35,5 +34,4 @@ Content-Type: text/plain;charset=utf-8
 Content-length: 13
 
 Frederic Fall
-
 --batch_123--
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/d75041c4/odata2-lib/odata-testutil/src/main/java/org/apache/olingo/odata2/testutil/helper/StringHelper.java
----------------------------------------------------------------------
diff --git a/odata2-lib/odata-testutil/src/main/java/org/apache/olingo/odata2/testutil/helper/StringHelper.java b/odata2-lib/odata-testutil/src/main/java/org/apache/olingo/odata2/testutil/helper/StringHelper.java
index 3d17fbff..1d46767 100644
--- a/odata2-lib/odata-testutil/src/main/java/org/apache/olingo/odata2/testutil/helper/StringHelper.java
+++ b/odata2-lib/odata-testutil/src/main/java/org/apache/olingo/odata2/testutil/helper/StringHelper.java
@@ -35,6 +35,72 @@ import org.apache.olingo.odata2.testutil.TestUtilRuntimeException;
  */
 public class StringHelper {
 
+
+  public static class Stream {
+    private final byte[] data;
+
+    private Stream(byte[] data) {
+      this.data = data;
+    }
+
+    public Stream(String content, String charset) throws UnsupportedEncodingException {
+      this(content.getBytes(charset));
+    }
+
+    public InputStream asStream() {
+      return new ByteArrayInputStream(data);
+    }
+
+    public byte[] asArray() {
+      return data;
+    }
+
+    public String asString() {
+      return asString("UTF-8");
+    }
+
+    public String asString(String charsetName) {
+      return new String(data, Charset.forName(charsetName));
+    }
+
+    public Stream print(OutputStream out) throws IOException {
+      out.write(data);
+      return this;
+    }
+
+    public Stream print() throws IOException {
+      return print(System.out);
+    }
+
+    public int countCrLf() {
+      return StringHelper.countLines(asString(), "\r\n");
+    }
+  }
+
+  public static Stream toStream(InputStream stream) throws IOException {
+    byte[] result = new byte[0];
+    byte[] tmp = new byte[8192];
+    int readCount = stream.read(tmp);
+    while (readCount >= 0) {
+      byte[] innerTmp = new byte[result.length + readCount];
+      System.arraycopy(result, 0, innerTmp, 0, result.length);
+      System.arraycopy(tmp, 0, innerTmp, result.length, readCount);
+      result = innerTmp;
+      readCount = stream.read(tmp);
+    }
+    stream.close();
+    return new Stream(result);
+  }
+
+  public static Stream toStream(String content) {
+    try {
+      return new Stream(content, "UTF-8");
+    } catch (UnsupportedEncodingException e) {
+      throw new RuntimeException("UTF-8 should be supported on each system.");
+    }
+  }
+
+
   public static String inputStreamToString(final InputStream in, final boolean preserveLineBreaks) throws IOException {
     final BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(in, Charset.forName("UTF-8")));
     final StringBuilder stringBuilder = new StringBuilder();
@@ -54,6 +120,22 @@ public class StringHelper {
     return result;
   }
 
+  public static int countLines(String content) {
+    return countLines(content, "\r\n");
+  }
+
+  public static int countLines(String content, String lineBreak) {
+    int lastPos = 0;
+    int count = -1;
+
+    while (lastPos >= 0) {
+      lastPos = content.indexOf(lineBreak, lastPos+1);
+      count++;
+    }
+
+    return count;
+  }
+
   public static String inputStreamToString(final InputStream in) throws IOException {
     return inputStreamToString(in, false);
   }


[09/13] git commit: [OLINGO-256] Added missing import

Posted by mi...@apache.org.
[OLINGO-256] Added missing import


Project: http://git-wip-us.apache.org/repos/asf/olingo-odata2/repo
Commit: http://git-wip-us.apache.org/repos/asf/olingo-odata2/commit/55b1c846
Tree: http://git-wip-us.apache.org/repos/asf/olingo-odata2/tree/55b1c846
Diff: http://git-wip-us.apache.org/repos/asf/olingo-odata2/diff/55b1c846

Branch: refs/heads/OLINGO-231_PocForAndroid
Commit: 55b1c8464e0c84f48210fb0d986975c954bc93ee
Parents: d75041c
Author: Michael Bolz <mi...@apache.org>
Authored: Fri Apr 25 15:24:32 2014 +0200
Committer: Michael Bolz <mi...@apache.org>
Committed: Fri Apr 25 15:24:32 2014 +0200

----------------------------------------------------------------------
 .../apache/olingo/odata2/testutil/helper/StringHelper.java    | 7 +------
 1 file changed, 1 insertion(+), 6 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/55b1c846/odata2-lib/odata-testutil/src/main/java/org/apache/olingo/odata2/testutil/helper/StringHelper.java
----------------------------------------------------------------------
diff --git a/odata2-lib/odata-testutil/src/main/java/org/apache/olingo/odata2/testutil/helper/StringHelper.java b/odata2-lib/odata-testutil/src/main/java/org/apache/olingo/odata2/testutil/helper/StringHelper.java
index 1d46767..d5191f0 100644
--- a/odata2-lib/odata-testutil/src/main/java/org/apache/olingo/odata2/testutil/helper/StringHelper.java
+++ b/odata2-lib/odata-testutil/src/main/java/org/apache/olingo/odata2/testutil/helper/StringHelper.java
@@ -18,12 +18,7 @@
  ******************************************************************************/
 package org.apache.olingo.odata2.testutil.helper;
 
-import java.io.BufferedReader;
-import java.io.ByteArrayInputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.io.UnsupportedEncodingException;
+import java.io.*;
 import java.nio.charset.Charset;
 import java.util.Random;