From a32a98dd00e2d0c8c5e948fabb108074ac9c80ac Mon Sep 17 00:00:00 2001 From: Ravi Chodavarapu Date: Thu, 3 Mar 2016 23:03:46 +0000 Subject: [PATCH] Allow direct byte array entities in responses --- .../datamill/http/ResponseBuilder.java | 1 + .../datamill/http/impl/BytesEntity.java | 36 +++++++++++++++++++ .../http/impl/ResponseBuilderImpl.java | 5 +++ .../datamill/http/impl/BytesEntityTest.java | 32 +++++++++++++++++ 4 files changed, 74 insertions(+) create mode 100644 core/src/main/java/org/chodavarapu/datamill/http/impl/BytesEntity.java create mode 100644 core/src/test/java/org/chodavarapu/datamill/http/impl/BytesEntityTest.java diff --git a/core/src/main/java/org/chodavarapu/datamill/http/ResponseBuilder.java b/core/src/main/java/org/chodavarapu/datamill/http/ResponseBuilder.java index 92ac899..b348125 100644 --- a/core/src/main/java/org/chodavarapu/datamill/http/ResponseBuilder.java +++ b/core/src/main/java/org/chodavarapu/datamill/http/ResponseBuilder.java @@ -15,6 +15,7 @@ public interface ResponseBuilder { Observable notFound(); Observable ok(); Observable ok(String content); + Observable ok(byte[] content); Observable unauthorized(); Observable unauthorized(String content); } diff --git a/core/src/main/java/org/chodavarapu/datamill/http/impl/BytesEntity.java b/core/src/main/java/org/chodavarapu/datamill/http/impl/BytesEntity.java new file mode 100644 index 0000000..41f3570 --- /dev/null +++ b/core/src/main/java/org/chodavarapu/datamill/http/impl/BytesEntity.java @@ -0,0 +1,36 @@ +package org.chodavarapu.datamill.http.impl; + +import org.chodavarapu.datamill.http.Entity; +import org.chodavarapu.datamill.json.JsonObject; +import rx.Observable; + +/** + * @author Ravi Chodavarapu (rchodava@gmail.com) + */ +public class BytesEntity implements Entity { + private byte[] bytes; + + public BytesEntity(byte[] bytes) { + this.bytes = bytes; + } + + @Override + public Observable asBytes() { + return Observable.just(bytes); + } + + @Override + public Observable asChunks() { + return asBytes(); + } + + @Override + public Observable asJson() { + return asString().map(json -> new JsonObject(json)); + } + + @Override + public Observable asString() { + return asBytes().map(bytes -> new String(bytes)); + } +} diff --git a/core/src/main/java/org/chodavarapu/datamill/http/impl/ResponseBuilderImpl.java b/core/src/main/java/org/chodavarapu/datamill/http/impl/ResponseBuilderImpl.java index 745f078..4537bd0 100644 --- a/core/src/main/java/org/chodavarapu/datamill/http/impl/ResponseBuilderImpl.java +++ b/core/src/main/java/org/chodavarapu/datamill/http/impl/ResponseBuilderImpl.java @@ -61,6 +61,11 @@ public Observable ok(String content) { return Observable.just(new ResponseImpl(Status.OK, headers, new ValueEntity(new StringValue(content)))); } + @Override + public Observable ok(byte[] content) { + return Observable.just(new ResponseImpl(Status.OK, headers, new BytesEntity(content))); + } + @Override public Observable unauthorized() { return Observable.just(new ResponseImpl(Status.UNAUTHORIZED, headers)); diff --git a/core/src/test/java/org/chodavarapu/datamill/http/impl/BytesEntityTest.java b/core/src/test/java/org/chodavarapu/datamill/http/impl/BytesEntityTest.java new file mode 100644 index 0000000..b22d6fd --- /dev/null +++ b/core/src/test/java/org/chodavarapu/datamill/http/impl/BytesEntityTest.java @@ -0,0 +1,32 @@ +package org.chodavarapu.datamill.http.impl; + +import org.apache.commons.io.output.ByteArrayOutputStream; +import org.junit.Test; + +import java.io.IOException; + +import static org.junit.Assert.assertEquals; + +/** + * @author Ravi Chodavarapu (rchodava@gmail.com) + */ +public class BytesEntityTest { + @Test + public void entityTests() { + assertEquals("test", new BytesEntity("test".getBytes()).asString().toBlocking().last()); + assertEquals("test", new String(new BytesEntity("test".getBytes()).asBytes().toBlocking().last())); + assertEquals("test", new String(new BytesEntity("test".getBytes()) + .asChunks() + .collect( + () -> new ByteArrayOutputStream(), + (stream, chunk) -> { + try { + stream.write(chunk); + } catch (IOException e) { + } + }) + .map(stream -> stream.toByteArray()).toBlocking().last())); + assertEquals("value", new BytesEntity("{\"name\":\"value\"}".getBytes()) + .asJson().toBlocking().last().get("name").asString()); + } +}