Repository: olingo-odata4 Updated Branches: refs/heads/master 00a5b1d2e -> 89a6a69de
[OLINGO-1080] Support Entity Iterator in batch requests Signed-off-by: Christian Amend <[email protected]> Project: http://git-wip-us.apache.org/repos/asf/olingo-odata4/repo Commit: http://git-wip-us.apache.org/repos/asf/olingo-odata4/commit/89a6a69d Tree: http://git-wip-us.apache.org/repos/asf/olingo-odata4/tree/89a6a69d Diff: http://git-wip-us.apache.org/repos/asf/olingo-odata4/diff/89a6a69d Branch: refs/heads/master Commit: 89a6a69de7a8c57fc4d2f59012019395ef2e001f Parents: 00a5b1d Author: i050510 <[email protected]> Authored: Wed Feb 8 09:08:56 2017 +0530 Committer: Christian Amend <[email protected]> Committed: Wed Mar 1 17:01:25 2017 +0100 ---------------------------------------------------------------------- .../serializer/BatchResponseSerializer.java | 23 ++- .../serializer/BatchResponseSerializerTest.java | 188 +++++++++++++++++++ 2 files changed, 204 insertions(+), 7 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/89a6a69d/lib/server-core/src/main/java/org/apache/olingo/server/core/serializer/BatchResponseSerializer.java ---------------------------------------------------------------------- diff --git a/lib/server-core/src/main/java/org/apache/olingo/server/core/serializer/BatchResponseSerializer.java b/lib/server-core/src/main/java/org/apache/olingo/server/core/serializer/BatchResponseSerializer.java index 7ef81b0..62d74cb 100644 --- a/lib/server-core/src/main/java/org/apache/olingo/server/core/serializer/BatchResponseSerializer.java +++ b/lib/server-core/src/main/java/org/apache/olingo/server/core/serializer/BatchResponseSerializer.java @@ -35,6 +35,7 @@ import org.apache.olingo.commons.api.ex.ODataRuntimeException; import org.apache.olingo.commons.api.format.ContentType; import org.apache.olingo.commons.api.http.HttpHeader; import org.apache.olingo.commons.api.http.HttpStatusCode; +import org.apache.olingo.server.api.ODataContent; import org.apache.olingo.server.api.ODataResponse; import org.apache.olingo.server.api.deserializer.batch.ODataResponsePart; import org.apache.olingo.server.api.serializer.BatchSerializerException; @@ -243,19 +244,27 @@ public class BatchResponseSerializer { } private byte[] getBody(final ODataResponse response) { - if (response == null || response.getContent() == null) { + if (response == null || (response.getContent() == null && + response.getODataContent() == null)) { return new byte[0]; } try { ByteArrayOutputStream output = new ByteArrayOutputStream(); ByteBuffer inBuffer = ByteBuffer.allocate(BUFFER_SIZE); - ReadableByteChannel ic = Channels.newChannel(response.getContent()); - WritableByteChannel oc = Channels.newChannel(output); - while (ic.read(inBuffer) > 0) { - inBuffer.flip(); - oc.write(inBuffer); - inBuffer.rewind(); + if (response.getContent() == null) { + if (response.getODataContent() != null) { + ODataContent res = response.getODataContent(); + res.write(Channels.newChannel(output)); + } + } else { + ReadableByteChannel ic = Channels.newChannel(response.getContent()); + WritableByteChannel oc = Channels.newChannel(output); + while (ic.read(inBuffer) > 0) { + inBuffer.flip(); + oc.write(inBuffer); + inBuffer.rewind(); + } } return output.toByteArray(); } catch (IOException e) { http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/89a6a69d/lib/server-core/src/test/java/org/apache/olingo/server/core/serializer/BatchResponseSerializerTest.java ---------------------------------------------------------------------- diff --git a/lib/server-core/src/test/java/org/apache/olingo/server/core/serializer/BatchResponseSerializerTest.java b/lib/server-core/src/test/java/org/apache/olingo/server/core/serializer/BatchResponseSerializerTest.java index cf427bf..e9ffb48 100644 --- a/lib/server-core/src/test/java/org/apache/olingo/server/core/serializer/BatchResponseSerializerTest.java +++ b/lib/server-core/src/test/java/org/apache/olingo/server/core/serializer/BatchResponseSerializerTest.java @@ -22,6 +22,7 @@ import static org.junit.Assert.assertArrayEquals; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; +import static org.mockito.Mockito.mock; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; @@ -34,11 +35,19 @@ import java.util.Random; import java.util.UUID; import org.apache.commons.io.IOUtils; +import org.apache.olingo.commons.api.data.ContextURL; +import org.apache.olingo.commons.api.data.Entity; +import org.apache.olingo.commons.api.data.EntityIterator; +import org.apache.olingo.commons.api.edm.EdmEntityType; import org.apache.olingo.commons.api.format.ContentType; import org.apache.olingo.commons.api.http.HttpHeader; import org.apache.olingo.commons.api.http.HttpStatusCode; +import org.apache.olingo.server.api.OData; import org.apache.olingo.server.api.ODataResponse; +import org.apache.olingo.server.api.ServiceMetadata; import org.apache.olingo.server.api.deserializer.batch.ODataResponsePart; +import org.apache.olingo.server.api.serializer.EntityCollectionSerializerOptions; +import org.apache.olingo.server.api.serializer.SerializerStreamResult; import org.apache.olingo.server.core.deserializer.batch.BatchLineReader; import org.junit.Test; @@ -490,4 +499,183 @@ public class BatchResponseSerializerTest { } return b.toString(); } + + @Test + public void testODataContentResponse() throws Exception { + List<ODataResponsePart> parts = new ArrayList<ODataResponsePart>(); + ServiceMetadata serviceMetadata = mock(ServiceMetadata.class); + final EdmEntityType edmEntityType = mock(EdmEntityType.class); + EntityIterator entityCollection = new EntityIterator() { + + @Override + public Entity next() { + return null; + } + + @Override + public boolean hasNext() { + return false; + } + }; + + SerializerStreamResult serializerResult = OData.newInstance(). + createSerializer(ContentType.APPLICATION_JSON).entityCollectionStreamed( + serviceMetadata, + edmEntityType, + entityCollection, + EntityCollectionSerializerOptions.with().contextURL + (ContextURL.with().oDataPath("http://host/svc").build()).build()); + ODataResponse response = new ODataResponse(); + response.setODataContent(serializerResult.getODataContent()); + response.setStatusCode(HttpStatusCode.NO_CONTENT.getStatusCode()); + parts.add(new ODataResponsePart(response, false)); + + BatchResponseSerializer serializer = new BatchResponseSerializer(); + final InputStream content = serializer.serialize(parts, BOUNDARY); + + assertNotNull(content); + + final BatchLineReader reader = new BatchLineReader(content); + final List<String> body = reader.toList(); + reader.close(); + + int line = 0; + assertEquals(9, body.size()); + assertEquals("--" + BOUNDARY + CRLF, body.get(line++)); + assertEquals("Content-Type: application/http" + CRLF, body.get(line++)); + assertEquals("Content-Transfer-Encoding: binary" + CRLF, body.get(line++)); + assertEquals(CRLF, body.get(line++)); + assertEquals("HTTP/1.1 204 No Content" + CRLF, body.get(line++)); + assertEquals("Content-Length: 47" + CRLF, body.get(line++)); + assertEquals(CRLF, body.get(line++)); + assertEquals("{\"@odata.context\":\"../../$metadata\",\"value\":[]}" + CRLF, body.get(line++)); + assertEquals("--" + BOUNDARY + "--" + CRLF, body.get(line++)); + } + + @Test + public void changeSetODataContentResponse() throws Exception { + List<ODataResponsePart> parts = new ArrayList<ODataResponsePart>(); + ServiceMetadata serviceMetadata = mock(ServiceMetadata.class); + final EdmEntityType edmEntityType = mock(EdmEntityType.class); + EntityIterator entityCollection = new EntityIterator() { + + @Override + public Entity next() { + return null; + } + + @Override + public boolean hasNext() { + return false; + } + }; + + SerializerStreamResult serializerResult = OData.newInstance(). + createSerializer(ContentType.APPLICATION_JSON).entityCollectionStreamed( + serviceMetadata, + edmEntityType, + entityCollection, + EntityCollectionSerializerOptions.with().contextURL + (ContextURL.with().oDataPath("http://host/svc").build()).build()); + ODataResponse response = new ODataResponse(); + response.setODataContent(serializerResult.getODataContent()); + response.setStatusCode(HttpStatusCode.NO_CONTENT.getStatusCode()); + response.setHeader(HttpHeader.CONTENT_ID, "1"); + parts.add(new ODataResponsePart(response, true)); + + BatchResponseSerializer serializer = new BatchResponseSerializer(); + final InputStream content = serializer.serialize(parts, BOUNDARY); + + assertNotNull(content); + + final BatchLineReader reader = new BatchLineReader(content); + final List<String> body = reader.toList(); + reader.close(); + + int line = 0; + assertEquals(14, body.size()); + assertEquals("--" + BOUNDARY + CRLF, body.get(line++)); + assertTrue(body.get(line++).startsWith("Content-Type: multipart/mixed; boundary=changeset_")); + assertEquals(CRLF, body.get(line++)); + assertTrue(body.get(line++).startsWith("--changeset_")); + assertEquals("Content-Type: application/http" + CRLF, body.get(line++)); + assertEquals("Content-Transfer-Encoding: binary" + CRLF, body.get(line++)); + assertEquals("Content-ID: 1" + CRLF, body.get(line++)); + assertEquals(CRLF, body.get(line++)); + assertEquals("HTTP/1.1 204 No Content" + CRLF, body.get(line++)); + assertEquals("Content-Length: 47" + CRLF, body.get(line++)); + assertEquals(CRLF, body.get(line++)); + assertEquals("{\"@odata.context\":\"../../$metadata\",\"value\":[]}" + CRLF, body.get(line++)); + assertTrue(body.get(line++).startsWith("--changeset_")); + assertEquals("--" + BOUNDARY + "--" + CRLF, body.get(line++)); + } + + @Test + public void testODataContentWithODataResponse() throws Exception { + List<ODataResponsePart> parts = new ArrayList<ODataResponsePart>(); + + ODataResponse response = new ODataResponse(); + response.setStatusCode(HttpStatusCode.OK.getStatusCode()); + response.setHeader(HttpHeader.CONTENT_TYPE, ContentType.TEXT_PLAIN.toContentTypeString()); + String bigData = generateData(10000); + response.setContent(IOUtils.toInputStream(bigData)); + parts.add(new ODataResponsePart(response, false)); + + ServiceMetadata serviceMetadata = mock(ServiceMetadata.class); + final EdmEntityType edmEntityType = mock(EdmEntityType.class); + EntityIterator entityCollection = new EntityIterator() { + + @Override + public Entity next() { + return null; + } + + @Override + public boolean hasNext() { + return false; + } + }; + + SerializerStreamResult serializerResult = OData.newInstance(). + createSerializer(ContentType.APPLICATION_JSON).entityCollectionStreamed( + serviceMetadata, + edmEntityType, + entityCollection, + EntityCollectionSerializerOptions.with().contextURL + (ContextURL.with().oDataPath("http://host/svc").build()).build()); + ODataResponse response1 = new ODataResponse(); + response1.setODataContent(serializerResult.getODataContent()); + response1.setStatusCode(HttpStatusCode.OK.getStatusCode()); + parts.add(new ODataResponsePart(response1, false)); + + BatchResponseSerializer serializer = new BatchResponseSerializer(); + final InputStream content = serializer.serialize(parts, BOUNDARY); + + assertNotNull(content); + + final BatchLineReader reader = new BatchLineReader(content); + final List<String> body = reader.toList(); + reader.close(); + + int line = 0; + assertEquals(18, body.size()); + assertEquals("--" + BOUNDARY + CRLF, body.get(line++)); + assertEquals("Content-Type: application/http" + CRLF, body.get(line++)); + assertEquals("Content-Transfer-Encoding: binary" + CRLF, body.get(line++)); + assertEquals(CRLF, body.get(line++)); + assertEquals("HTTP/1.1 200 OK" + CRLF, body.get(line++)); + assertEquals("Content-Type: text/plain" + CRLF, body.get(line++)); + assertEquals("Content-Length: 10000" + CRLF, body.get(line++)); + assertEquals(CRLF, body.get(line++)); + assertEquals(bigData + CRLF, body.get(line++)); + assertEquals("--" + BOUNDARY + CRLF, body.get(line++)); + assertEquals("Content-Type: application/http" + CRLF, body.get(line++)); + assertEquals("Content-Transfer-Encoding: binary" + CRLF, body.get(line++)); + assertEquals(CRLF, body.get(line++)); + assertEquals("HTTP/1.1 200 OK" + CRLF, body.get(line++)); + assertEquals("Content-Length: 47" + CRLF, body.get(line++)); + assertEquals(CRLF, body.get(line++)); + assertEquals("{\"@odata.context\":\"../../$metadata\",\"value\":[]}" + CRLF, body.get(line++)); + assertEquals("--" + BOUNDARY + "--" + CRLF, body.get(line++)); + } }
