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/10/14 20:35:24 UTC

[37/39] git commit: [OLINGO-453] Batch request writer bug fix

[OLINGO-453] Batch request writer bug fix

Signed-off-by: Christian Amend <ch...@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/24119a78
Tree: http://git-wip-us.apache.org/repos/asf/olingo-odata2/tree/24119a78
Diff: http://git-wip-us.apache.org/repos/asf/olingo-odata2/diff/24119a78

Branch: refs/heads/Olingo-129_PocJpaDataStore
Commit: 24119a786547f7b8a406b5147b3bb282b663bd6d
Parents: 86c4ddc
Author: Christian Holzer <c....@sap.com>
Authored: Tue Oct 14 13:52:49 2014 +0200
Committer: Christian Amend <ch...@apache.org>
Committed: Tue Oct 14 14:01:56 2014 +0200

----------------------------------------------------------------------
 .../odata2/core/batch/BatchRequestWriter.java   | 30 +++++------
 .../odata2/core/batch/BatchRequestTest.java     | 16 +-----
 .../core/batch/BatchRequestWriterTest.java      | 52 +++++++++++++++++++-
 3 files changed, 67 insertions(+), 31 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/24119a78/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 a7ddfa1..9ec21cd 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
@@ -37,7 +37,7 @@ public class BatchRequestWriter {
 
   private static final String COLON = ":";
   private static final String SP = " ";
-  private static final String LF = "\r\n";
+  private static final String CRLF = "\r\n";
   public static final String BOUNDARY_PREAMBLE = "changeset";
   public static final String HTTP_1_1 = "HTTP/1.1";
   private String batchBoundary;
@@ -50,7 +50,7 @@ public class BatchRequestWriter {
       throw new IllegalArgumentException();
     }
     for (BatchPart batchPart : batchParts) {
-      writer.append("--").append(boundary).append(LF);
+      writer.append("--").append(boundary).append(CRLF);
       if (batchPart instanceof BatchChangeSet) {
         appendChangeSet((BatchChangeSet) batchPart);
       } else if (batchPart instanceof BatchQueryPart) {
@@ -58,8 +58,10 @@ public class BatchRequestWriter {
         appendRequestBodyPart(request.getMethod(), request.getUri(), null, request.getHeaders(),
             request.getContentId());
       }
+      
+      writer.append(CRLF);  // CRLF belongs to the boundary delimiter or boundary closing delimiter
     }
-    writer.append(LF).append("--").append(boundary).append("--");
+    writer.append("--").append(boundary).append("--");
     InputStream batchRequestBody;
     batchRequestBody = new ByteArrayInputStream(BatchHelper.getBytes(writer.toString()));
     return batchRequestBody;
@@ -71,41 +73,41 @@ public class BatchRequestWriter {
       boundary = BatchHelper.generateBoundary(BOUNDARY_PREAMBLE);
     }
     writer.append(HttpHeaders.CONTENT_TYPE).append(COLON).append(SP).append(
-        HttpContentType.MULTIPART_MIXED + "; boundary=" + boundary).append(LF);
+        HttpContentType.MULTIPART_MIXED + "; boundary=" + boundary).append(CRLF);
     for (BatchChangeSetPart request : batchChangeSet.getChangeSetParts()) {
-      writer.append(LF).append("--").append(boundary).append(LF);
+      writer.append(CRLF).append("--").append(boundary).append(CRLF);
       appendRequestBodyPart(request.getMethod(), request.getUri(), request.getBody(), request.getHeaders(), request
           .getContentId());
     }
-    writer.append(LF).append("--").append(boundary).append("--").append(LF);
+    writer.append(CRLF).append("--").append(boundary).append("--").append(CRLF);
   }
 
   private void appendRequestBodyPart(final String method, final String uri, final String body,
       final Map<String, String> headers, final String contentId) {
     boolean isContentLengthPresent = false;
     writer.append(HttpHeaders.CONTENT_TYPE).append(COLON).append(SP).append(HttpContentType.APPLICATION_HTTP)
-        .append(LF);
+        .append(CRLF);
     writer.append(BatchHelper.HTTP_CONTENT_TRANSFER_ENCODING).append(COLON).append(SP)
-        .append(BatchHelper.BINARY_ENCODING).append(LF);
+        .append(BatchHelper.BINARY_ENCODING).append(CRLF);
     if (contentId != null) {
-      writer.append(BatchHelper.HTTP_CONTENT_ID).append(COLON).append(SP).append(contentId).append(LF);
+      writer.append(BatchHelper.HTTP_CONTENT_ID).append(COLON).append(SP).append(contentId).append(CRLF);
     }
     String contentLength = getHeaderValue(headers, HttpHeaders.CONTENT_LENGTH);
     if (contentLength != null && !contentLength.isEmpty()) {
       isContentLengthPresent = true;
     }
-    writer.append(LF);
+    writer.append(CRLF);
     writer.append(method).append(SP).append(uri).append(SP).append(HTTP_1_1);
-    writer.append(LF);
+    writer.append(CRLF);
 
     if (!isContentLengthPresent && body != null && !body.isEmpty()) {
       writer.append(HttpHeaders.CONTENT_LENGTH).append(COLON).append(SP).append(BatchHelper.getBytes(body).length)
-          .append(LF);
+          .append(CRLF);
     }
     appendHeader(headers);
+    writer.append(CRLF);
 
     if (body != null && !body.isEmpty()) {
-      writer.append(LF);
       writer.append(body);
     }
   }
@@ -113,7 +115,7 @@ public class BatchRequestWriter {
   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);
+      writer.append(name).append(COLON).append(SP).append(headerMap.getValue()).append(CRLF);
     }
   }
 

http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/24119a78/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 116bfd7..f526920 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
@@ -41,7 +41,6 @@ import org.apache.olingo.odata2.api.ep.EntityProviderBatchProperties;
 import org.apache.olingo.odata2.core.PathInfoImpl;
 import org.apache.olingo.odata2.core.batch.v2.BatchParser;
 import org.apache.olingo.odata2.testutil.helper.StringHelper;
-import org.junit.Ignore;
 import org.junit.Test;
 
 /**
@@ -132,19 +131,6 @@ public class BatchRequestTest {
   }
 
   @Test
-      /*
-       * --batch_123
-       * Content-Type: application/http
-       * Content-Transfer-Encoding: binary
-       * Content-Id: 000
-       * 
-       * GET Employees HTTP/1.1
-       * Accept: application/json <- Missing CRLF => Even ABAP can`t understand this request
-       * --batch_123
-       * ...
-       * ....
-       */
-  @Ignore
   public void testBatchWithGetAndPost() throws BatchException, IOException {
     List<BatchPart> batch = new ArrayList<BatchPart>();
     Map<String, String> headers = new HashMap<String, String>();
@@ -176,7 +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());
+    assertEquals(25, batchRequestStream.linesCount());
 
     String contentType = "multipart/mixed; boundary=" + BOUNDARY;
     BatchParser parser = new BatchParser(contentType, parseProperties, true);

http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/24119a78/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 051e1da..e8f7cd4 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
@@ -24,6 +24,7 @@ import static org.junit.Assert.assertTrue;
 
 import java.io.IOException;
 import java.io.InputStream;
+import java.io.InputStreamReader;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
@@ -34,6 +35,8 @@ 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.core.batch.v2.BufferedReaderIncludingLineEndings;
+import org.apache.olingo.odata2.core.batch.v2.BufferedReaderIncludingLineEndings.Line;
 import org.apache.olingo.odata2.testutil.helper.StringHelper;
 import org.junit.Test;
 
@@ -43,6 +46,7 @@ public class BatchRequestWriterTest {
   private static final String GET = "GET";
   private static final String PUT = "PUT";
   private static final String BOUNDARY = "batch_123";
+  private static final Object CRLF = "\r\n";
 
   private void checkMimeHeaders(final String requestBody) {
     assertTrue(requestBody.contains("Content-Type: application/http"));
@@ -67,7 +71,7 @@ public class BatchRequestWriterTest {
     assertTrue(requestBody.contains("--batch_"));
     assertTrue(requestBody.contains("GET Employees HTTP/1.1"));
     checkHeaders(headers, requestBody);
-    assertEquals(8, StringHelper.countLines(requestBody));
+    assertEquals(9, StringHelper.countLines(requestBody));
   }
 
   @Test
@@ -122,7 +126,7 @@ public class BatchRequestWriterTest {
     BatchRequestWriter writer = new BatchRequestWriter();
     InputStream batchRequest = writer.writeBatchRequest(batch, BOUNDARY);
 
-    String requestBody = StringHelper.inputStreamToString(batchRequest);
+    String requestBody = StringHelper.inputStreamToString(batchRequest, true);
     assertNotNull(batchRequest);
     checkMimeHeaders(requestBody);
 
@@ -134,6 +138,50 @@ public class BatchRequestWriterTest {
   }
 
   @Test
+  public void testGetRequest() throws 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("123").build();
+
+    batch.add(request);
+    batch.add(request);
+
+    BatchRequestWriter writer = new BatchRequestWriter();
+    InputStream batchRequest = writer.writeBatchRequest(batch, BOUNDARY);
+    
+    BufferedReaderIncludingLineEndings reader =
+        new BufferedReaderIncludingLineEndings(new InputStreamReader(batchRequest));
+    List<Line> lines = reader.toList();
+    reader.close();
+    
+    int line = 0;
+    assertEquals("--" + BOUNDARY + CRLF, lines.get(line++).toString());
+    assertEquals("Content-Type: application/http" + CRLF, lines.get(line++).toString());
+    assertEquals("Content-Transfer-Encoding: binary" + CRLF, lines.get(line++).toString());
+    assertEquals("Content-Id: 123" + CRLF, lines.get(line++).toString());
+    assertEquals(CRLF, lines.get(line++).toString());
+    assertEquals("GET Employees HTTP/1.1" + CRLF, lines.get(line++).toString());
+    assertEquals("Accept: application/json" + CRLF, lines.get(line++).toString());
+    assertEquals(CRLF, lines.get(line++).toString());   // Belongs to the GET request [OData Protocol - 2.2.7.2.1]
+    
+    assertEquals(CRLF, lines.get(line++).toString());   // Belongs conceptually to the boundary [RFC 2046 - 5.1.1]
+    assertEquals("--" + BOUNDARY + CRLF, lines.get(line++).toString());
+    assertEquals("Content-Type: application/http" + CRLF, lines.get(line++).toString());
+    assertEquals("Content-Transfer-Encoding: binary" + CRLF, lines.get(line++).toString());
+    assertEquals("Content-Id: 123" + CRLF, lines.get(line++).toString());
+    assertEquals(CRLF, lines.get(line++).toString());
+    assertEquals("GET Employees HTTP/1.1" + CRLF, lines.get(line++).toString());
+    assertEquals("Accept: application/json" + CRLF, lines.get(line++).toString());
+    assertEquals(CRLF, lines.get(line++).toString());   // Belongs to the GET request [OData Protocol - 2.2.7.2.1]
+    
+    assertEquals(CRLF, lines.get(line++).toString());   // Belongs conceptually to the boundary [RFC 2046 - 5.1.1]
+    assertEquals("--" + BOUNDARY + "--", lines.get(line++).toString());
+    assertEquals(19, lines.size());
+  }
+
+  @Test
   public void testChangeSetWithContentIdReferencing() throws BatchException, IOException {
     List<BatchPart> batch = new ArrayList<BatchPart>();