From 3b8f9431326b9ab70260ef1175dc41eda986a744 Mon Sep 17 00:00:00 2001 From: Danilo Ascione Date: Tue, 16 Feb 2016 11:02:13 +0100 Subject: [PATCH 1/3] Intercept feed interruption --- .../impl/changes/ContinuousChangesFeed.java | 27 ++++++++++++------- 1 file changed, 18 insertions(+), 9 deletions(-) diff --git a/org.ektorp/src/main/java/org/ektorp/impl/changes/ContinuousChangesFeed.java b/org.ektorp/src/main/java/org/ektorp/impl/changes/ContinuousChangesFeed.java index 1750ceab..1ae12d9a 100644 --- a/org.ektorp/src/main/java/org/ektorp/impl/changes/ContinuousChangesFeed.java +++ b/org.ektorp/src/main/java/org/ektorp/impl/changes/ContinuousChangesFeed.java @@ -1,18 +1,23 @@ package org.ektorp.impl.changes; -import java.io.*; -import java.util.*; -import java.util.concurrent.*; -import java.util.concurrent.atomic.*; - import com.fasterxml.jackson.core.JsonParseException; import com.fasterxml.jackson.databind.JsonMappingException; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.node.NullNode; -import org.ektorp.changes.*; +import org.ektorp.changes.ChangesFeed; +import org.ektorp.changes.DocumentChange; import org.ektorp.http.HttpResponse; -import org.ektorp.util.*; -import org.slf4j.*; +import org.ektorp.util.Exceptions; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.*; +import java.util.HashSet; +import java.util.Set; +import java.util.concurrent.BlockingQueue; +import java.util.concurrent.LinkedBlockingQueue; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicInteger; /** * * @author henrik lundgren @@ -117,7 +122,11 @@ public void run() { String reason = !shouldRun ? "Cancelled" : "EOF"; LOG.info("Changes feed stopped. Reason: " + reason); } catch (Exception e) { - handleException(e); + if(!shouldRun) { + LOG.info("Changes feed was interrupted"); + } else { + handleException(e); + } } finally { sendInterruptMarker(); httpResponse.abort(); From 271f893184fc3e38cb413a061a6ab81244663690 Mon Sep 17 00:00:00 2001 From: Attila Czabany Date: Tue, 16 Feb 2016 15:21:38 +0100 Subject: [PATCH 2/3] proper NPE handling with empty streams --- .../main/java/org/ektorp/http/StdHttpResponse.java | 6 +++++- .../main/java/org/ektorp/http/StdResponseHandler.java | 11 +++++++++-- 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/org.ektorp/src/main/java/org/ektorp/http/StdHttpResponse.java b/org.ektorp/src/main/java/org/ektorp/http/StdHttpResponse.java index a84248ee..96672b99 100644 --- a/org.ektorp/src/main/java/org/ektorp/http/StdHttpResponse.java +++ b/org.ektorp/src/main/java/org/ektorp/http/StdHttpResponse.java @@ -72,7 +72,11 @@ public String getContentType() { public InputStream getContent() { try { - return new ConnectionReleasingInputStream(entity.getContent()); + InputStream content = entity.getContent(); + if(content == null) { + return null; + } + return new ConnectionReleasingInputStream(content); } catch (Exception e) { throw Exceptions.propagate(e); } diff --git a/org.ektorp/src/main/java/org/ektorp/http/StdResponseHandler.java b/org.ektorp/src/main/java/org/ektorp/http/StdResponseHandler.java index 2038fc71..39249467 100644 --- a/org.ektorp/src/main/java/org/ektorp/http/StdResponseHandler.java +++ b/org.ektorp/src/main/java/org/ektorp/http/StdResponseHandler.java @@ -68,10 +68,17 @@ protected static JsonNode responseBodyAsNode(InputStream inputStream, ObjectMapp return mapper.readTree(inputStream); } + @edu.umd.cs.findbugs.annotations.SuppressWarnings( + value="NP_LOAD_OF_KNOWN_NULL_VALUE", + justification="The response sould be null only if it is not a valid OK message. " + + "In that case, it is safe to die. In any case, this method should be owerwritten if the class is extended.") protected static T checkResponseBodyOkAndReturnDefaultValue(HttpResponse hr, T defaultValue, ObjectMapper mapper) throws IOException { - InputStream content = hr.getContent(); + InputStream content = null; try { content = hr.getContent(); + if(content == null){ + return defaultValue; + } JsonNode body = responseBodyAsNode(content, MAPPER); JsonNode okNode = body.get("ok"); if (okNode != null) { @@ -90,7 +97,7 @@ protected static T checkResponseBodyOkAndReturnDefaultValue(HttpResponse hr, public T error(HttpResponse hr) { throw StdResponseHandler.createDbAccessException(hr); } - + public T success(HttpResponse hr) throws Exception { return checkResponseBodyOkAndReturnDefaultValue(hr, null, MAPPER); } From 447f201b03535b27e325bfa6fd739d2eef1e1668 Mon Sep 17 00:00:00 2001 From: Attila Czabany Date: Tue, 16 Feb 2016 18:07:43 +0100 Subject: [PATCH 3/3] typo in supress warning comment --- .../src/main/java/org/ektorp/http/StdResponseHandler.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/org.ektorp/src/main/java/org/ektorp/http/StdResponseHandler.java b/org.ektorp/src/main/java/org/ektorp/http/StdResponseHandler.java index 39249467..8bf7ff62 100644 --- a/org.ektorp/src/main/java/org/ektorp/http/StdResponseHandler.java +++ b/org.ektorp/src/main/java/org/ektorp/http/StdResponseHandler.java @@ -70,7 +70,7 @@ protected static JsonNode responseBodyAsNode(InputStream inputStream, ObjectMapp @edu.umd.cs.findbugs.annotations.SuppressWarnings( value="NP_LOAD_OF_KNOWN_NULL_VALUE", - justification="The response sould be null only if it is not a valid OK message. " + justification="The response should be null only if it is not a valid OK message. " + "In that case, it is safe to die. In any case, this method should be owerwritten if the class is extended.") protected static T checkResponseBodyOkAndReturnDefaultValue(HttpResponse hr, T defaultValue, ObjectMapper mapper) throws IOException { InputStream content = null;