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/18 11:21:38 UTC

olingo-odata2 git commit: [OLINGO-733] Minor adaptions and more tests

Repository: olingo-odata2
Updated Branches:
  refs/heads/OLINGO-733_BatchFix be1b8ca59 -> 243f707b3


[OLINGO-733] Minor adaptions 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/243f707b
Tree: http://git-wip-us.apache.org/repos/asf/olingo-odata2/tree/243f707b
Diff: http://git-wip-us.apache.org/repos/asf/olingo-odata2/diff/243f707b

Branch: refs/heads/OLINGO-733_BatchFix
Commit: 243f707b3f5f72c77e4a66390a8486da5548e24c
Parents: be1b8ca
Author: mibo <mi...@mirb.de>
Authored: Sat Jul 18 11:21:24 2015 +0200
Committer: mibo <mi...@mirb.de>
Committed: Sat Jul 18 11:21:24 2015 +0200

----------------------------------------------------------------------
 .../odata2/api/processor/ODataResponse.java     | 21 +++++-
 .../odata2/core/batch/BatchResponseWriter.java  | 22 ++++--
 .../v2/BufferedReaderIncludingLineEndings.java  |  1 -
 .../olingo/odata2/core/ODataResponseTest.java   | 26 +++++--
 .../core/batch/BatchResponseWriterTest.java     | 74 ++++++++++++++++++++
 .../odata2/testutil/helper/StringHelper.java    |  6 +-
 6 files changed, 136 insertions(+), 14 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/243f707b/odata2-lib/odata-api/src/main/java/org/apache/olingo/odata2/api/processor/ODataResponse.java
----------------------------------------------------------------------
diff --git a/odata2-lib/odata-api/src/main/java/org/apache/olingo/odata2/api/processor/ODataResponse.java b/odata2-lib/odata-api/src/main/java/org/apache/olingo/odata2/api/processor/ODataResponse.java
index a4a4daf..f74d488 100644
--- a/odata2-lib/odata-api/src/main/java/org/apache/olingo/odata2/api/processor/ODataResponse.java
+++ b/odata2-lib/odata-api/src/main/java/org/apache/olingo/odata2/api/processor/ODataResponse.java
@@ -23,6 +23,8 @@ import java.io.IOException;
 import java.io.InputStream;
 import java.nio.charset.Charset;
 import java.util.Set;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
 
 import org.apache.olingo.odata2.api.commons.HttpStatusCodes;
 import org.apache.olingo.odata2.api.exception.ODataException;
@@ -41,6 +43,7 @@ import org.apache.olingo.odata2.api.rt.RuntimeDelegate;
 public abstract class ODataResponse {
 
   private static final Charset DEFAULT_CHARSET = Charset.forName("utf-8");
+  public static final Pattern CHARSET_MATCHER_PATTERN = Pattern.compile("(charset=[\\w-]*)", Pattern.CASE_INSENSITIVE);
 
   /**
    * Do not subclass ODataResponse!
@@ -68,12 +71,28 @@ public abstract class ODataResponse {
     } else if(obj instanceof byte[]) {
       return new ByteArrayInputStream((byte[]) obj);
     } else if(obj instanceof String) {
-      return new ByteArrayInputStream(((String) obj).getBytes(DEFAULT_CHARSET));
+      return getInputStream((String) obj);
     }
     throw new ODataException("Entity is not an instance of an InputStream (entity class: " +
         (obj == null ? "NULL": obj.getClass()) + ")");
   }
 
+  private InputStream getInputStream(String stringEntity) throws ODataException {
+    try {
+      String contentHeader = getContentHeader();
+      Charset charset = DEFAULT_CHARSET;
+      if(contentHeader != null) {
+        Matcher matcher = CHARSET_MATCHER_PATTERN.matcher(contentHeader);
+        if(matcher.find()) {
+          charset = Charset.forName(matcher.group(0).split("=")[1]);
+        }
+      }
+      return new ByteArrayInputStream(stringEntity.getBytes(charset));
+    } catch (Exception e) {
+      throw new ODataException("Unexpected exception for wrapping of String entity into InputStream.");
+    }
+  }
+
   /**
    * Close the underlying entity input stream (if such a stream is available) and release all with this repsonse
    * associated resources.

http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/243f707b/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 b386e31..bff2f03 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
@@ -18,10 +18,6 @@
  ******************************************************************************/
 package org.apache.olingo.odata2.core.batch;
 
-import java.io.ByteArrayInputStream;
-import java.nio.charset.Charset;
-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.HttpContentType;
@@ -29,17 +25,33 @@ 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 java.util.List;
+
 public class BatchResponseWriter {
   private static final String COLON = ":";
   private static final String SP = " ";
   private static final String CRLF = "\r\n";
   private BatchHelper.BodyBuilder writer = new BatchHelper.BodyBuilder();
 //  private static final Charset DEFAULT_CHARSET = BatchHelper.DEFAULT_CHARSET;
+  private final boolean writeEntityAsUtf8String;
+
+  public BatchResponseWriter() {
+    this(true);
+  }
+
+  public BatchResponseWriter(boolean writeEntityAsUtf8String) {
+    this.writeEntityAsUtf8String = writeEntityAsUtf8String;
+  }
 
   public ODataResponse writeResponse(final List<BatchResponsePart> batchResponseParts) throws BatchException {
     String boundary = BatchHelper.generateBoundary("batch");
     appendResponsePart(batchResponseParts, boundary);
-    String batchResponseBody = writer.getContentAsString(BatchHelper.DEFAULT_CHARSET);
+    final Object batchResponseBody;
+    if(writeEntityAsUtf8String) {
+      batchResponseBody = writer.getContentAsString(BatchHelper.DEFAULT_CHARSET);
+    } else {
+      batchResponseBody = writer.getContentAsStream();
+    }
     return ODataResponse.entity(batchResponseBody).status(HttpStatusCodes.ACCEPTED)
         .header(HttpHeaders.CONTENT_TYPE, HttpContentType.MULTIPART_MIXED + "; boundary=" + boundary)
         .header(HttpHeaders.CONTENT_LENGTH, String.valueOf(writer.getLength()))

http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/243f707b/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 b20ec98..a8a8af9 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
@@ -18,7 +18,6 @@
  ******************************************************************************/
 package org.apache.olingo.odata2.core.batch.v2;
 
-import org.apache.olingo.odata2.api.commons.HttpHeaders;
 import org.apache.olingo.odata2.core.commons.ContentType;
 
 import java.io.IOException;

http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/243f707b/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 22a693e..25c65b5 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
@@ -57,19 +57,33 @@ public class ODataResponseTest extends BaseTest {
   }
 
   @Test
-  public void buildEntityAsStreamResponseTest() throws ODataException {
-    ODataResponse response = ODataResponse.entity(new ByteArrayInputStream("abc".getBytes())).build();
+  public void buildEntityAsStreamResponseTest() throws Exception {
+    ODataResponse response = ODataResponse.entity("abc").build();
     assertNull(response.getStatus());
-    assertNotNull(response.getEntityAsStream());
+    InputStream entityAsStream = response.getEntityAsStream();
+    assertNotNull(entityAsStream);
+    assertEquals("abc", StringHelper.inputStreamToString(entityAsStream));
   }
 
   @Test
-  public void buildEntityAsStreamResponseFailTest() throws Exception {
-    ODataResponse response = ODataResponse.entity("abc").build();
+  public void buildEntityAsStreamResponseTestCharset() throws Exception {
+    ODataResponse response = ODataResponse.entity("äbc")
+        .contentHeader("app/json; charset=utf-8").build();
     assertNull(response.getStatus());
     InputStream entityAsStream = response.getEntityAsStream();
     assertNotNull(entityAsStream);
-    assertEquals("abc", StringHelper.inputStreamToString(entityAsStream));
+    assertEquals("äbc", StringHelper.inputStreamToString(entityAsStream));
+  }
+
+  @Test
+  public void buildEntityAsStreamResponseTestCharsetIso() throws Exception {
+    ODataResponse response = ODataResponse.entity("äbc")
+        .contentHeader("app/json; charset=iso-8859-1").build();
+    assertNull(response.getStatus());
+    InputStream entityAsStream = response.getEntityAsStream();
+    assertNotNull(entityAsStream);
+    StringHelper.Stream s = StringHelper.toStream(entityAsStream);
+    assertEquals("äbc", s.asString("iso-8859-1"));
   }
 
   @Test

http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/243f707b/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 b8f6b02..40c0789 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
@@ -204,4 +204,78 @@ public class BatchResponseWriterTest {
     assertTrue(lines.get(index++).toString().startsWith("--batch"));
   }
 
+  @Test
+  public void testResponseIso() throws Exception {
+    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)
+            .build();
+    List<ODataResponse> responses = new ArrayList<ODataResponse>(1);
+    responses.add(response);
+    parts.add(BatchResponsePart.responses(responses).changeSet(false).build());
+    BatchResponseWriter writer = new BatchResponseWriter(false);
+    ODataResponse batchResponse = writer.writeResponse(parts);
+
+    assertEquals(202, batchResponse.getStatus().getStatusCode());
+    assertNotNull(batchResponse.getEntity());
+
+    BufferedReaderIncludingLineEndings reader =
+        new BufferedReaderIncludingLineEndings(batchResponse.getEntityAsStream());
+    List<Line> lines = reader.toLineList();
+    reader.close();
+    int index = 0;
+
+    assertTrue(lines.get(index++).toString().startsWith("--batch"));
+    assertEquals("Content-Type: application/http" + CRLF, lines.get(index++).toString());
+    assertEquals("Content-Transfer-Encoding: binary" + CRLF, lines.get(index++).toString());
+    assertEquals(CRLF, lines.get(index++).toString());
+    assertEquals("HTTP/1.1 200 OK" + CRLF, lines.get(index++).toString());
+    assertEquals("Content-Type: application/json; charset=iso-8859-1" + CRLF, lines.get(index++).toString());
+    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"));
+  }
+
+  @Test
+  public void testResponseUtf() throws Exception {
+    List<BatchResponsePart> parts = new ArrayList<BatchResponsePart>();
+    String charset = "utf-8";
+    StringHelper.Stream stream = StringHelper.toStream("Wälter Winter", charset);
+    ODataResponse response =
+        ODataResponse.entity(stream.asString(charset))
+            .contentHeader("application/json; charset=" + charset)
+            .status(HttpStatusCodes.OK)
+            .build();
+    List<ODataResponse> responses = new ArrayList<ODataResponse>(1);
+    responses.add(response);
+    parts.add(BatchResponsePart.responses(responses).changeSet(false).build());
+    BatchResponseWriter writer = new BatchResponseWriter();
+    ODataResponse batchResponse = writer.writeResponse(parts);
+
+    assertEquals(202, batchResponse.getStatus().getStatusCode());
+    assertNotNull(batchResponse.getEntity());
+//    String body = (String) batchResponse.getEntity();
+
+    BufferedReaderIncludingLineEndings reader =
+        new BufferedReaderIncludingLineEndings(batchResponse.getEntityAsStream());
+    List<Line> lines = reader.toLineList();
+    reader.close();
+    int index = 0;
+
+    assertTrue(lines.get(index++).toString().startsWith("--batch"));
+    assertEquals("Content-Type: application/http" + CRLF, lines.get(index++).toString());
+    assertEquals("Content-Transfer-Encoding: binary" + CRLF, lines.get(index++).toString());
+    assertEquals(CRLF, lines.get(index++).toString());
+    assertEquals("HTTP/1.1 200 OK" + CRLF, lines.get(index++).toString());
+    assertEquals("Content-Type: application/json; charset=" + charset + CRLF, lines.get(index++).toString());
+    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"));
+  }
 }

http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/243f707b/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 2fd6f8a..c6e7278 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
@@ -117,8 +117,12 @@ public class StringHelper {
   }
 
   public static Stream toStream(final String content) {
+    return toStream(content, "utf-8");
+  }
+
+  public static Stream toStream(final String content, final String charset) {
     try {
-      return new Stream(content, "UTF-8");
+      return new Stream(content, charset);
     } catch (UnsupportedEncodingException e) {
       throw new RuntimeException("UTF-8 should be supported on each system.");
     }