From 15400193ae77b45e9c8b88d5c5f8b0a38cf5a396 Mon Sep 17 00:00:00 2001 From: Marcus Linke Date: Tue, 16 Feb 2016 23:28:02 +0100 Subject: [PATCH 1/2] Fix issue #461 --- .../core/async/JsonStreamProcessor.java | 9 ++- .../core/async/JsonStreamProcessorTest.java | 65 +++++++++++++++++++ 2 files changed, 72 insertions(+), 2 deletions(-) create mode 100644 src/test/java/com/github/dockerjava/core/async/JsonStreamProcessorTest.java diff --git a/src/main/java/com/github/dockerjava/core/async/JsonStreamProcessor.java b/src/main/java/com/github/dockerjava/core/async/JsonStreamProcessor.java index 7e6c497e6..b17f4b220 100644 --- a/src/main/java/com/github/dockerjava/core/async/JsonStreamProcessor.java +++ b/src/main/java/com/github/dockerjava/core/async/JsonStreamProcessor.java @@ -10,6 +10,7 @@ import com.fasterxml.jackson.core.JsonParser; import com.fasterxml.jackson.core.JsonToken; import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.node.ObjectNode; import com.github.dockerjava.api.async.ResultCallback; /** @@ -41,8 +42,12 @@ public void processResponseStream(InputStream response, ResultCallback result JsonToken nextToken = jp.nextToken(); while (!closed && nextToken != null && nextToken != JsonToken.END_OBJECT) { try { - T next = OBJECT_MAPPER.readValue(jp, clazz); - resultCallback.onNext(next); + ObjectNode objectNode = OBJECT_MAPPER.readTree(jp); + + if (!objectNode.isEmpty(null)) { + T next = OBJECT_MAPPER.treeToValue(objectNode, clazz); + resultCallback.onNext(next); + } } catch (Exception e) { resultCallback.onError(e); } diff --git a/src/test/java/com/github/dockerjava/core/async/JsonStreamProcessorTest.java b/src/test/java/com/github/dockerjava/core/async/JsonStreamProcessorTest.java new file mode 100644 index 000000000..6c9ee8a15 --- /dev/null +++ b/src/test/java/com/github/dockerjava/core/async/JsonStreamProcessorTest.java @@ -0,0 +1,65 @@ +/* + * Created on 16.02.2016 + */ +package com.github.dockerjava.core.async; + +import static org.testng.Assert.assertFalse; + +import java.io.ByteArrayInputStream; +import java.io.Closeable; +import java.io.IOException; +import java.io.InputStream; +import java.util.ArrayList; +import java.util.List; + +import org.testng.annotations.Test; + +import com.github.dockerjava.api.async.ResultCallback; +import com.github.dockerjava.api.model.PullResponseItem; + + +/** + * + * @author Marcus Linke + * + */ +public class JsonStreamProcessorTest { + + @Test + public void processEmptyJson() throws Exception { + + InputStream response = new ByteArrayInputStream("{}".getBytes()); + + JsonStreamProcessor jsonStreamProcessor = new JsonStreamProcessor(PullResponseItem.class); + + final List completed = new ArrayList(); + + jsonStreamProcessor.processResponseStream(response, new ResultCallback() { + + @Override + public void close() throws IOException { + } + + @Override + public void onStart(Closeable closeable) { + } + + @Override + public void onNext(PullResponseItem object) { + assertFalse(true, "onNext called for empty json"); + } + + @Override + public void onError(Throwable throwable) { + } + + @Override + public void onComplete() { + completed.add(true); + } + }); + + assertFalse(completed.isEmpty(), "Stream processing not completed"); + } + +} From 14bf660387421f823f44d9d4e2cfeb12ad2d0e31 Mon Sep 17 00:00:00 2001 From: Marcus Linke Date: Wed, 17 Feb 2016 20:39:17 +0100 Subject: [PATCH 2/2] Add comment --- .../com/github/dockerjava/core/async/JsonStreamProcessor.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/github/dockerjava/core/async/JsonStreamProcessor.java b/src/main/java/com/github/dockerjava/core/async/JsonStreamProcessor.java index b17f4b220..8d9a64303 100644 --- a/src/main/java/com/github/dockerjava/core/async/JsonStreamProcessor.java +++ b/src/main/java/com/github/dockerjava/core/async/JsonStreamProcessor.java @@ -43,7 +43,7 @@ public void processResponseStream(InputStream response, ResultCallback result while (!closed && nextToken != null && nextToken != JsonToken.END_OBJECT) { try { ObjectNode objectNode = OBJECT_MAPPER.readTree(jp); - + // exclude empty item serialization into class #461 if (!objectNode.isEmpty(null)) { T next = OBJECT_MAPPER.treeToValue(objectNode, clazz); resultCallback.onNext(next);