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 2015/07/19 21:38:19 UTC

[4/6] olingo-odata2 git commit: [OLINGO-733] Code clean up and more tests

[OLINGO-733] Code clean up and 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/cc70e8a3
Tree: http://git-wip-us.apache.org/repos/asf/olingo-odata2/tree/cc70e8a3
Diff: http://git-wip-us.apache.org/repos/asf/olingo-odata2/diff/cc70e8a3

Branch: refs/heads/master
Commit: cc70e8a390c590409fa3cf952320cab7c53f0f23
Parents: 243f707
Author: mibo <mi...@mirb.de>
Authored: Sun Jul 19 08:17:13 2015 +0200
Committer: mibo <mi...@mirb.de>
Committed: Sun Jul 19 08:17:13 2015 +0200

----------------------------------------------------------------------
 .../olingo/odata2/core/ODataResponseImpl.java   |   2 -
 .../core/batch/BatchChangeSetPartImpl.java      |  13 +-
 .../olingo/odata2/core/batch/BatchHelper.java   |  35 +---
 .../odata2/core/batch/BatchResponseWriter.java  |  27 ++-
 .../odata2/core/batch/v2/BatchParser.java       |   1 -
 .../v2/BufferedReaderIncludingLineEndings.java  |  35 ----
 .../olingo/odata2/core/ODataResponseTest.java   |   2 -
 .../core/batch/BatchRequestWriterITTest.java    |  59 +++++--
 .../core/batch/BatchResponseWriterITTest.java   | 171 +++++++++++++++++++
 .../core/batch/BatchResponseWriterTest.java     |  39 ++---
 10 files changed, 262 insertions(+), 122 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/cc70e8a3/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/ODataResponseImpl.java
----------------------------------------------------------------------
diff --git a/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/ODataResponseImpl.java b/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/ODataResponseImpl.java
index dbfe46a..0bf58ee 100644
--- a/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/ODataResponseImpl.java
+++ b/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/ODataResponseImpl.java
@@ -20,14 +20,12 @@ package org.apache.olingo.odata2.core;
 
 import java.io.Closeable;
 import java.io.IOException;
-import java.io.InputStream;
 import java.util.HashMap;
 import java.util.Set;
 
 import org.apache.olingo.odata2.api.commons.HttpHeaders;
 import org.apache.olingo.odata2.api.commons.HttpStatusCodes;
 import org.apache.olingo.odata2.api.processor.ODataResponse;
-import org.apache.olingo.odata2.core.batch.BatchHelper;
 
 /**
  *  

http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/cc70e8a3/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/batch/BatchChangeSetPartImpl.java
----------------------------------------------------------------------
diff --git a/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/batch/BatchChangeSetPartImpl.java b/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/batch/BatchChangeSetPartImpl.java
index 1c12a42..b1d83ab 100644
--- a/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/batch/BatchChangeSetPartImpl.java
+++ b/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/batch/BatchChangeSetPartImpl.java
@@ -18,19 +18,14 @@
  ******************************************************************************/
 package org.apache.olingo.odata2.core.batch;
 
+import org.apache.olingo.odata2.api.client.batch.BatchChangeSetPart;
+
 import java.nio.charset.Charset;
 import java.util.Collections;
 import java.util.HashMap;
-import java.util.Locale;
 import java.util.Map;
 
-import org.apache.olingo.odata2.api.client.batch.BatchChangeSetPart;
-import org.apache.olingo.odata2.api.commons.HttpHeaders;
-import org.apache.olingo.odata2.core.commons.ContentType;
-
 public class BatchChangeSetPartImpl extends BatchChangeSetPart {
-  private static final Charset DEFAULT_CHARSET = Charset.forName("utf-8");
-  private static final String CONTENT_TYPE = "content-type";
   private String method;
   private Map<String, String> headers = new HashMap<String, String>();
   private String body;
@@ -98,10 +93,6 @@ public class BatchChangeSetPartImpl extends BatchChangeSetPart {
 
     @Override
     public BatchChangeSetPartBuilder headers(final Map<String, String> headers) {
-//      this.headers = new HashMap<String, String>(headers.size());
-//      for (Map.Entry<String, String> entry : headers.entrySet()) {
-//        this.headers.put(entry.getKey().toLowerCase(Locale.ENGLISH), entry.getValue());
-//      }
       this.headers = headers;
       return this;
     }

http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/cc70e8a3/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/batch/BatchHelper.java
----------------------------------------------------------------------
diff --git a/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/batch/BatchHelper.java b/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/batch/BatchHelper.java
index 4b7434e..41ad0be 100644
--- a/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/batch/BatchHelper.java
+++ b/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/batch/BatchHelper.java
@@ -18,6 +18,12 @@
  ******************************************************************************/
 package org.apache.olingo.odata2.core.batch;
 
+import org.apache.olingo.odata2.api.client.batch.BatchChangeSetPart;
+import org.apache.olingo.odata2.api.commons.HttpHeaders;
+import org.apache.olingo.odata2.api.processor.ODataResponse;
+import org.apache.olingo.odata2.core.commons.ContentType;
+import org.apache.olingo.odata2.core.exception.ODataRuntimeException;
+
 import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
 import java.io.IOException;
@@ -28,17 +34,9 @@ import java.nio.channels.Channels;
 import java.nio.channels.ReadableByteChannel;
 import java.nio.channels.WritableByteChannel;
 import java.nio.charset.Charset;
-import java.util.HashMap;
 import java.util.Map;
 import java.util.UUID;
 
-import org.apache.olingo.odata2.api.client.batch.BatchChangeSetPart;
-import org.apache.olingo.odata2.api.commons.HttpHeaders;
-import org.apache.olingo.odata2.api.processor.ODataResponse;
-import org.apache.olingo.odata2.core.ODataResponseImpl;
-import org.apache.olingo.odata2.core.commons.ContentType;
-import org.apache.olingo.odata2.core.exception.ODataRuntimeException;
-
 public class BatchHelper {
 
   public static final String BINARY_ENCODING = "binary";
@@ -62,27 +60,6 @@ public class BatchHelper {
     }
   }
 
-  public static String convertToString(ODataResponseImpl oDataResponse) {
-    Object entity = oDataResponse.getEntity();
-
-    if(entity == null) {
-      return null;
-    } else if(entity instanceof String) {
-      return (String) entity;
-    } else if(entity instanceof byte[]) {
-      String contentHeader = oDataResponse.getContentHeader();
-      Charset charset = getCharset(contentHeader);
-      return convertByteArray((byte[]) entity, charset);
-    } else if(entity instanceof InputStream) {
-      String contentHeader = oDataResponse.getContentHeader();
-      Charset charset = getCharset(contentHeader);
-      Body b = new Body(oDataResponse);
-      return convertByteArray(b.getContent(), charset);
-    }
-    throw new ODataRuntimeException("Unable to convert ODataResponse entity of type '" +
-        entity.getClass() + "' to String.");
-  }
-
   public static Charset extractCharset(Map<String, String> headers) {
     String contentType = null;
     for (Map.Entry<String, String> s : headers.entrySet()) {

http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/cc70e8a3/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/batch/BatchResponseWriter.java
----------------------------------------------------------------------
diff --git a/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/batch/BatchResponseWriter.java b/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/batch/BatchResponseWriter.java
index bff2f03..7ca0260 100644
--- a/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/batch/BatchResponseWriter.java
+++ b/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/batch/BatchResponseWriter.java
@@ -31,26 +31,37 @@ public class BatchResponseWriter {
   private static final String COLON = ":";
   private static final String SP = " ";
   private static final String CRLF = "\r\n";
+  private final boolean writeEntityAsInputStream;
   private BatchHelper.BodyBuilder writer = new BatchHelper.BodyBuilder();
-//  private static final Charset DEFAULT_CHARSET = BatchHelper.DEFAULT_CHARSET;
-  private final boolean writeEntityAsUtf8String;
 
+  /**
+   * Creates a BatchResponseWriter which write the <code>entity</code> as a String with
+   * default charset (see BatchHelper.DEFAULT_CHARSET).
+   */
   public BatchResponseWriter() {
-    this(true);
+    this(false);
   }
 
-  public BatchResponseWriter(boolean writeEntityAsUtf8String) {
-    this.writeEntityAsUtf8String = writeEntityAsUtf8String;
+  /**
+   * Creates a BatchResponseWriter
+   *
+   * @param writeEntityAsInputStream
+   *        if <code>true</code> the <code>entity</code> is set a InputStream.
+   *        if <code>false</code> the <code>entity</code> is set a String with
+   *        default charset (see BatchHelper.DEFAULT_CHARSET).
+   */
+  public BatchResponseWriter(boolean writeEntityAsInputStream) {
+    this.writeEntityAsInputStream = writeEntityAsInputStream;
   }
 
   public ODataResponse writeResponse(final List<BatchResponsePart> batchResponseParts) throws BatchException {
     String boundary = BatchHelper.generateBoundary("batch");
     appendResponsePart(batchResponseParts, boundary);
     final Object batchResponseBody;
-    if(writeEntityAsUtf8String) {
-      batchResponseBody = writer.getContentAsString(BatchHelper.DEFAULT_CHARSET);
-    } else {
+    if(writeEntityAsInputStream) {
       batchResponseBody = writer.getContentAsStream();
+    } else {
+      batchResponseBody = writer.getContentAsString(BatchHelper.DEFAULT_CHARSET);
     }
     return ODataResponse.entity(batchResponseBody).status(HttpStatusCodes.ACCEPTED)
         .header(HttpHeaders.CONTENT_TYPE, HttpContentType.MULTIPART_MIXED + "; boundary=" + boundary)

http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/cc70e8a3/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/batch/v2/BatchParser.java
----------------------------------------------------------------------
diff --git a/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/batch/v2/BatchParser.java b/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/batch/v2/BatchParser.java
index c1c2713..f872627 100644
--- a/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/batch/v2/BatchParser.java
+++ b/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/batch/v2/BatchParser.java
@@ -20,7 +20,6 @@ package org.apache.olingo.odata2.core.batch.v2;
 
 import java.io.IOException;
 import java.io.InputStream;
-import java.io.InputStreamReader;
 import java.util.LinkedList;
 import java.util.List;
 

http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/cc70e8a3/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/batch/v2/BufferedReaderIncludingLineEndings.java
----------------------------------------------------------------------
diff --git a/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/batch/v2/BufferedReaderIncludingLineEndings.java b/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/batch/v2/BufferedReaderIncludingLineEndings.java
index a8a8af9..d9a216c 100644
--- a/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/batch/v2/BufferedReaderIncludingLineEndings.java
+++ b/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/batch/v2/BufferedReaderIncludingLineEndings.java
@@ -226,39 +226,4 @@ public class BufferedReaderIncludingLineEndings {
       return String.valueOf(state);
     }
   }
-
-
-//    @Override
-//    public int hashCode() {
-//      final int prime = 31;
-//      int result = 1;
-//      result = prime * result + ((content == null) ? 0 : content.hashCode());
-//      result = prime * result + lineNumber;
-//      return result;
-//    }
-//
-//    @Override
-//    public boolean equals(final Object obj) {
-//      if (this == obj) {
-//        return true;
-//      }
-//      if (obj == null) {
-//        return false;
-//      }
-//      if (getClass() != obj.getClass()) {
-//        return false;
-//      }
-//      Line other = (Line) obj;
-//      if (content == null) {
-//        if (other.content != null) {
-//          return false;
-//        }
-//      } else if (!content.equals(other.content)) {
-//        return false;
-//      }
-//      if (lineNumber != other.lineNumber) {
-//        return false;
-//      }
-//      return true;
-//    }
 }

http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/cc70e8a3/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ODataResponseTest.java
----------------------------------------------------------------------
diff --git a/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ODataResponseTest.java b/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ODataResponseTest.java
index 25c65b5..f5fe501 100644
--- a/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ODataResponseTest.java
+++ b/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ODataResponseTest.java
@@ -24,7 +24,6 @@ import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertTrue;
 
-import java.io.ByteArrayInputStream;
 import java.io.InputStream;
 import java.util.Arrays;
 import java.util.HashSet;
@@ -32,7 +31,6 @@ import java.util.HashSet;
 import org.apache.olingo.odata2.api.commons.HttpContentType;
 import org.apache.olingo.odata2.api.commons.HttpHeaders;
 import org.apache.olingo.odata2.api.commons.HttpStatusCodes;
-import org.apache.olingo.odata2.api.exception.ODataException;
 import org.apache.olingo.odata2.api.processor.ODataResponse;
 import org.apache.olingo.odata2.testutil.fit.BaseTest;
 import org.apache.olingo.odata2.testutil.helper.StringHelper;

http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/cc70e8a3/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/batch/BatchRequestWriterITTest.java
----------------------------------------------------------------------
diff --git a/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/batch/BatchRequestWriterITTest.java b/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/batch/BatchRequestWriterITTest.java
index afcf26b..1faf807 100644
--- a/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/batch/BatchRequestWriterITTest.java
+++ b/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/batch/BatchRequestWriterITTest.java
@@ -42,6 +42,7 @@ import org.apache.olingo.odata2.api.processor.ODataRequest;
 import org.apache.olingo.odata2.core.PathInfoImpl;
 import org.apache.olingo.odata2.core.batch.v2.BatchParser;
 import org.apache.olingo.odata2.core.batch.v2.BufferedReaderIncludingLineEndings;
+import org.apache.olingo.odata2.testutil.helper.StringHelper;
 import org.junit.BeforeClass;
 import org.junit.Test;
 
@@ -128,6 +129,53 @@ public class BatchRequestWriterITTest {
   }
 
   @Test
+  public void testChangeSetIso() throws Exception {
+    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>();
+    String charset = "iso-8859-1";
+    changeSetHeaders.put("content-type", "application/json; charset=" + charset);
+    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 stream = writer.writeBatchRequest(batch, BOUNDARY);
+
+    final List<BatchRequestPart> parsedRequestParts = parseBatchRequest(stream);
+    assertEquals(2, parsedRequestParts.size());
+
+    // Get Request
+    final BatchRequestPart partGet = parsedRequestParts.get(0);
+    assertFalse(partGet.isChangeSet());
+    assertEquals(1, partGet.getRequests().size());
+    final ODataRequest oDataRequestGet = partGet.getRequests().get(0);
+    assertEquals("Employees", oDataRequestGet.getPathInfo().getODataSegments().get(0).getPath());
+    assertEquals("application/json", oDataRequestGet.getAcceptHeaders().get(0));
+
+    // Change set
+    final BatchRequestPart partChangeSet = parsedRequestParts.get(1);
+    assertTrue(partChangeSet.isChangeSet());
+    assertEquals(1, partChangeSet.getRequests().size());
+    final ODataRequest oDataRequestPost = partChangeSet.getRequests().get(0);
+    assertEquals("Employees", oDataRequestGet.getPathInfo().getODataSegments().get(0).getPath());
+    assertEquals("111", oDataRequestPost.getRequestHeaderValue(BatchHelper.MIME_HEADER_CONTENT_ID));
+    assertEquals(body, streamToString(oDataRequestPost.getBody()));
+    assertEquals("application/json; charset=" + charset,
+        oDataRequestPost.getRequestHeaderValue(HttpHeaders.CONTENT_TYPE));
+  }
+
+  @Test
   public void testTwoChangeSets() throws Exception {
     List<BatchPart> batch = new ArrayList<BatchPart>();
 
@@ -229,15 +277,6 @@ public class BatchRequestWriterITTest {
   }
 
   private String streamToString(final InputStream in) throws IOException {
-    final BufferedReaderIncludingLineEndings reader = new BufferedReaderIncludingLineEndings(in);
-    final StringBuilder builder = new StringBuilder();
-    String line;
-
-    while ((line = reader.readLine()) != null) {
-      builder.append(line);
-    }
-
-    reader.close();
-    return builder.toString();
+    return StringHelper.toStream(in).asString();
   }
 }

http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/cc70e8a3/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/batch/BatchResponseWriterITTest.java
----------------------------------------------------------------------
diff --git a/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/batch/BatchResponseWriterITTest.java b/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/batch/BatchResponseWriterITTest.java
index df84f39..23ab4ea 100644
--- a/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/batch/BatchResponseWriterITTest.java
+++ b/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/batch/BatchResponseWriterITTest.java
@@ -31,6 +31,7 @@ import org.apache.olingo.odata2.api.commons.HttpStatusCodes;
 import org.apache.olingo.odata2.api.processor.ODataResponse;
 import org.apache.olingo.odata2.core.batch.v2.BatchParser;
 import org.apache.olingo.odata2.core.commons.ContentType;
+import org.apache.olingo.odata2.testutil.helper.StringHelper;
 import org.junit.Test;
 
 public class BatchResponseWriterITTest {
@@ -176,4 +177,174 @@ public class BatchResponseWriterITTest {
     assertEquals("4", parserResponse.getHeaders().get(HttpHeaders.CONTENT_LENGTH));
     assertEquals("Test", parserResponse.getBody());
   }
+
+  @Test
+  public void testChangeSetUtf() throws Exception {
+    List<BatchResponsePart> parts = new ArrayList<BatchResponsePart>();
+    String charset= "utf-8";
+    StringHelper.Stream stream = StringHelper.toStream("Wälter Wünter", charset);
+    ODataResponse response = ODataResponse.entity(stream.asStream())
+        .status(HttpStatusCodes.OK)
+        .contentHeader("application/json; charset=" + charset)
+        .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).header(BatchHelper.MIME_HEADER_CONTENT_ID, "1").build();
+    responses = new ArrayList<ODataResponse>(2);
+    ODataResponse changeSetResponseEntity =
+        ODataResponse.status(HttpStatusCodes.OK).contentHeader(ContentType.APPLICATION_JSON.toContentTypeString())
+            .header(BatchHelper.MIME_HEADER_CONTENT_ID, "2")
+            .entity("Test\r\n").build();
+    ODataResponse changeSetResponseEntity2 =
+        ODataResponse.status(HttpStatusCodes.OK).contentHeader(ContentType.APPLICATION_JSON.toContentTypeString())
+            .header(BatchHelper.MIME_HEADER_CONTENT_ID, "2")
+            .entity("Test\n").build();
+    ODataResponse changeSetResponseEntity3 =
+        ODataResponse.status(HttpStatusCodes.OK).contentHeader(ContentType.APPLICATION_JSON.toContentTypeString())
+            .header(BatchHelper.MIME_HEADER_CONTENT_ID, "2")
+            .entity("Test").build();
+    responses.add(changeSetResponse);
+    responses.add(changeSetResponseEntity);
+    responses.add(changeSetResponseEntity2);
+    responses.add(changeSetResponseEntity3);
+
+    parts.add(BatchResponsePart.responses(responses).changeSet(true).build());
+
+    BatchResponseWriter writer = new BatchResponseWriter(true);
+    ODataResponse batchResponse = writer.writeResponse(parts);
+
+    assertEquals(202, batchResponse.getStatus().getStatusCode());
+    StringHelper.Stream responseStream = StringHelper.toStream(batchResponse.getEntityAsStream());
+    String body = responseStream.asString(charset);
+
+    // Get boundary
+    int lineEndingIndex = body.indexOf("\r\n");
+    String boundary = body.substring(2, lineEndingIndex);
+
+    // Parse response and test outputs
+    final BatchParser parser = new BatchParser("multipart/mixed;boundary=" + boundary, true);
+    List<BatchSingleResponse> parserResponses = parser.parseBatchResponse(responseStream.asStream());
+    assertEquals(5, parserResponses.size());
+
+    BatchSingleResponse parserResponse = parserResponses.get(0);
+    assertEquals("200", parserResponse.getStatusCode());
+    assertEquals("OK", parserResponse.getStatusInfo());
+    assertEquals("application/json; charset=" + charset, parserResponse.getHeaders().get(HttpHeaders.CONTENT_TYPE));
+    assertEquals("15", parserResponse.getHeaders().get(HttpHeaders.CONTENT_LENGTH));
+    assertEquals("Wälter Wünter", parserResponse.getBody());
+
+    parserResponse = parserResponses.get(1);
+    assertEquals("204", parserResponse.getStatusCode());
+    assertEquals("1", parserResponse.getContentId());
+    assertEquals("No Content", parserResponse.getStatusInfo());
+
+    parserResponse = parserResponses.get(2);
+    assertEquals("200", parserResponse.getStatusCode());
+    assertEquals("OK", parserResponse.getStatusInfo());
+    assertEquals("application/json", parserResponse.getHeaders().get(HttpHeaders.CONTENT_TYPE));
+    assertEquals("6", parserResponse.getHeaders().get(HttpHeaders.CONTENT_LENGTH));
+    assertEquals("Test\r\n", parserResponse.getBody());
+
+    parserResponse = parserResponses.get(3);
+    assertEquals("200", parserResponse.getStatusCode());
+    assertEquals("OK", parserResponse.getStatusInfo());
+    assertEquals("application/json", parserResponse.getHeaders().get(HttpHeaders.CONTENT_TYPE));
+    assertEquals("5", parserResponse.getHeaders().get(HttpHeaders.CONTENT_LENGTH));
+    assertEquals("Test\n", parserResponse.getBody());
+
+    parserResponse = parserResponses.get(4);
+    assertEquals("200", parserResponse.getStatusCode());
+    assertEquals("OK", parserResponse.getStatusInfo());
+    assertEquals("application/json", parserResponse.getHeaders().get(HttpHeaders.CONTENT_TYPE));
+    assertEquals("4", parserResponse.getHeaders().get(HttpHeaders.CONTENT_LENGTH));
+    assertEquals("Test", parserResponse.getBody());
+  }
+
+  @Test
+  public void testChangeSetIso() throws Exception {
+    List<BatchResponsePart> parts = new ArrayList<BatchResponsePart>();
+    String charset= "iso-8859-1";
+    StringHelper.Stream stream = StringHelper.toStream("Wälter Wünter", charset);
+    ODataResponse response = ODataResponse.entity(stream.asStream())
+        .status(HttpStatusCodes.OK)
+        .contentHeader("application/json; charset=" + charset)
+        .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).header(BatchHelper.MIME_HEADER_CONTENT_ID, "1").build();
+    responses = new ArrayList<ODataResponse>(2);
+    ODataResponse changeSetResponseEntity =
+        ODataResponse.status(HttpStatusCodes.OK).contentHeader(ContentType.APPLICATION_JSON.toContentTypeString())
+            .header(BatchHelper.MIME_HEADER_CONTENT_ID, "2")
+            .entity("Test\r\n").build();
+    ODataResponse changeSetResponseEntity2 =
+        ODataResponse.status(HttpStatusCodes.OK).contentHeader(ContentType.APPLICATION_JSON.toContentTypeString())
+            .header(BatchHelper.MIME_HEADER_CONTENT_ID, "2")
+            .entity("Test\n").build();
+    ODataResponse changeSetResponseEntity3 =
+        ODataResponse.status(HttpStatusCodes.OK).contentHeader(ContentType.APPLICATION_JSON.toContentTypeString())
+            .header(BatchHelper.MIME_HEADER_CONTENT_ID, "2")
+            .entity("Test").build();
+    responses.add(changeSetResponse);
+    responses.add(changeSetResponseEntity);
+    responses.add(changeSetResponseEntity2);
+    responses.add(changeSetResponseEntity3);
+
+    parts.add(BatchResponsePart.responses(responses).changeSet(true).build());
+
+    BatchResponseWriter writer = new BatchResponseWriter(true);
+    ODataResponse batchResponse = writer.writeResponse(parts);
+
+    assertEquals(202, batchResponse.getStatus().getStatusCode());
+    StringHelper.Stream responseStream = StringHelper.toStream(batchResponse.getEntityAsStream());
+    String body = responseStream.asString(charset);
+
+    // Get boundary
+    int lineEndingIndex = body.indexOf("\r\n");
+    String boundary = body.substring(2, lineEndingIndex);
+
+    // Parse response and test outputs
+    final BatchParser parser = new BatchParser("multipart/mixed;boundary=" + boundary, true);
+    List<BatchSingleResponse> parserResponses = parser.parseBatchResponse(responseStream.asStream());
+    assertEquals(5, parserResponses.size());
+
+    BatchSingleResponse parserResponse = parserResponses.get(0);
+    assertEquals("200", parserResponse.getStatusCode());
+    assertEquals("OK", parserResponse.getStatusInfo());
+    assertEquals("application/json; charset=" + charset, parserResponse.getHeaders().get(HttpHeaders.CONTENT_TYPE));
+    assertEquals("13", parserResponse.getHeaders().get(HttpHeaders.CONTENT_LENGTH));
+    assertEquals("Wälter Wünter", parserResponse.getBody());
+
+    parserResponse = parserResponses.get(1);
+    assertEquals("204", parserResponse.getStatusCode());
+    assertEquals("1", parserResponse.getContentId());
+    assertEquals("No Content", parserResponse.getStatusInfo());
+
+    parserResponse = parserResponses.get(2);
+    assertEquals("200", parserResponse.getStatusCode());
+    assertEquals("OK", parserResponse.getStatusInfo());
+    assertEquals("application/json", parserResponse.getHeaders().get(HttpHeaders.CONTENT_TYPE));
+    assertEquals("6", parserResponse.getHeaders().get(HttpHeaders.CONTENT_LENGTH));
+    assertEquals("Test\r\n", parserResponse.getBody());
+
+    parserResponse = parserResponses.get(3);
+    assertEquals("200", parserResponse.getStatusCode());
+    assertEquals("OK", parserResponse.getStatusInfo());
+    assertEquals("application/json", parserResponse.getHeaders().get(HttpHeaders.CONTENT_TYPE));
+    assertEquals("5", parserResponse.getHeaders().get(HttpHeaders.CONTENT_LENGTH));
+    assertEquals("Test\n", parserResponse.getBody());
+
+    parserResponse = parserResponses.get(4);
+    assertEquals("200", parserResponse.getStatusCode());
+    assertEquals("OK", parserResponse.getStatusInfo());
+    assertEquals("application/json", parserResponse.getHeaders().get(HttpHeaders.CONTENT_TYPE));
+    assertEquals("4", parserResponse.getHeaders().get(HttpHeaders.CONTENT_LENGTH));
+    assertEquals("Test", parserResponse.getBody());
+  }
 }

http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/cc70e8a3/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/batch/BatchResponseWriterTest.java
----------------------------------------------------------------------
diff --git a/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/batch/BatchResponseWriterTest.java b/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/batch/BatchResponseWriterTest.java
index 40c0789..128f2c8 100644
--- a/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/batch/BatchResponseWriterTest.java
+++ b/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/batch/BatchResponseWriterTest.java
@@ -18,18 +18,6 @@
  ******************************************************************************/
 package org.apache.olingo.odata2.core.batch;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertTrue;
-
-import java.io.ByteArrayInputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.util.ArrayList;
-import java.util.List;
-
-import org.apache.olingo.odata2.api.batch.BatchException;
 import org.apache.olingo.odata2.api.batch.BatchResponsePart;
 import org.apache.olingo.odata2.api.commons.HttpStatusCodes;
 import org.apache.olingo.odata2.api.exception.ODataException;
@@ -39,6 +27,14 @@ import org.apache.olingo.odata2.core.batch.v2.Line;
 import org.apache.olingo.odata2.testutil.helper.StringHelper;
 import org.junit.Test;
 
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+
 public class BatchResponseWriterTest {
 
   private static final String CRLF = "\r\n";
@@ -64,11 +60,7 @@ public class BatchResponseWriterTest {
 
     assertEquals(202, batchResponse.getStatus().getStatusCode());
     assertNotNull(batchResponse.getEntity());
-//    StringHelper.Stream stream = StringHelper.toStream((InputStream) batchResponse.getEntity());
-//    String body = stream.toString();
 
-//    BufferedReaderIncludingLineEndings reader =
-//        new BufferedReaderIncludingLineEndings(new InputStreamReader(new ByteArrayInputStream(body.getBytes())));
     BufferedReaderIncludingLineEndings reader =
         new BufferedReaderIncludingLineEndings(batchResponse.getEntityAsStream());
     List<Line> lines = reader.toLineList();
@@ -96,7 +88,7 @@ public class BatchResponseWriterTest {
     assertEquals(CRLF, lines.get(index++).toString());
     assertEquals(CRLF, lines.get(index++).toString());
     assertTrue(lines.get(index++).toString().startsWith("--changeset"));
-    assertTrue(lines.get(index++).toString().startsWith("--batch"));
+    assertTrue(lines.get(index).toString().startsWith("--batch"));
   }
 
   @Test
@@ -129,7 +121,7 @@ public class BatchResponseWriterTest {
     assertEquals("Content-Length: 13" + CRLF, lines.get(index++).toString());
     assertEquals(CRLF, lines.get(index++).toString());
     assertEquals("Walter Winter" + CRLF, lines.get(index++).toString());
-    assertTrue(lines.get(index++).toString().startsWith("--batch"));
+    assertTrue(lines.get(index).toString().startsWith("--batch"));
   }
 
   @Test
@@ -163,7 +155,7 @@ public class BatchResponseWriterTest {
     assertEquals(CRLF, lines.get(index++).toString());
     assertEquals(CRLF, lines.get(index++).toString());
     assertTrue(lines.get(index++).toString().startsWith("--changeset"));
-    assertTrue(lines.get(index++).toString().startsWith("--batch"));
+    assertTrue(lines.get(index).toString().startsWith("--batch"));
   }
 
   @Test
@@ -201,7 +193,7 @@ public class BatchResponseWriterTest {
     assertEquals("Content-Length: 13" + CRLF, lines.get(index++).toString());
     assertEquals(CRLF, lines.get(index++).toString());
     assertEquals("Walter Winter" + CRLF, lines.get(index++).toString());
-    assertTrue(lines.get(index++).toString().startsWith("--batch"));
+    assertTrue(lines.get(index).toString().startsWith("--batch"));
   }
 
   @Test
@@ -209,7 +201,6 @@ public class BatchResponseWriterTest {
     List<BatchResponsePart> parts = new ArrayList<BatchResponsePart>();
     StringHelper.Stream stream = StringHelper.toStream("Wälter Winter", "iso-8859-1");
     ODataResponse response =
-//        ODataResponse.entity(stream.asString("iso-8859-1"))
         ODataResponse.entity(stream.asStream())
             .contentHeader("application/json; charset=iso-8859-1")
             .status(HttpStatusCodes.OK)
@@ -217,7 +208,7 @@ public class BatchResponseWriterTest {
     List<ODataResponse> responses = new ArrayList<ODataResponse>(1);
     responses.add(response);
     parts.add(BatchResponsePart.responses(responses).changeSet(false).build());
-    BatchResponseWriter writer = new BatchResponseWriter(false);
+    BatchResponseWriter writer = new BatchResponseWriter(true);
     ODataResponse batchResponse = writer.writeResponse(parts);
 
     assertEquals(202, batchResponse.getStatus().getStatusCode());
@@ -238,7 +229,7 @@ public class BatchResponseWriterTest {
     assertEquals("Content-Length: 13" + CRLF, lines.get(index++).toString());
     assertEquals(CRLF, lines.get(index++).toString());
     assertEquals("Wälter Winter" + CRLF, lines.get(index++).toString());
-    assertTrue(lines.get(index++).toString().startsWith("--batch"));
+    assertTrue(lines.get(index).toString().startsWith("--batch"));
   }
 
   @Test
@@ -276,6 +267,6 @@ public class BatchResponseWriterTest {
     assertEquals("Content-Length: 14" + CRLF, lines.get(index++).toString());
     assertEquals(CRLF, lines.get(index++).toString());
     assertEquals("Wälter Winter" + CRLF, lines.get(index++).toString());
-    assertTrue(lines.get(index++).toString().startsWith("--batch"));
+    assertTrue(lines.get(index).toString().startsWith("--batch"));
   }
 }