JCLOUDS-1187: Do not load Json payloads to memory when serializing objects
Project: http://git-wip-us.apache.org/repos/asf/jclouds/repo Commit: http://git-wip-us.apache.org/repos/asf/jclouds/commit/a43acaff Tree: http://git-wip-us.apache.org/repos/asf/jclouds/tree/a43acaff Diff: http://git-wip-us.apache.org/repos/asf/jclouds/diff/a43acaff Branch: refs/heads/master Commit: a43acaffce0cc04e05c15c55bd94cadcd55843f1 Parents: 37101b7 Author: Ignasi Barrera <[email protected]> Authored: Sun Oct 23 19:27:35 2016 +0200 Committer: Ignasi Barrera <[email protected]> Committed: Tue Oct 25 15:19:20 2016 +0200 ---------------------------------------------------------------------- .../org/jclouds/http/functions/ParseJson.java | 5 ++-- core/src/main/java/org/jclouds/io/Payload.java | 2 +- core/src/main/java/org/jclouds/json/Json.java | 13 ++++++++++ .../org/jclouds/json/internal/GsonWrapper.java | 26 ++++++++++++++++++++ 4 files changed, 42 insertions(+), 4 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/jclouds/blob/a43acaff/core/src/main/java/org/jclouds/http/functions/ParseJson.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/jclouds/http/functions/ParseJson.java b/core/src/main/java/org/jclouds/http/functions/ParseJson.java index 58457ed..9b5d414 100644 --- a/core/src/main/java/org/jclouds/http/functions/ParseJson.java +++ b/core/src/main/java/org/jclouds/http/functions/ParseJson.java @@ -30,7 +30,6 @@ import org.jclouds.http.HttpResponse; import org.jclouds.http.HttpResponseException; import org.jclouds.json.Json; import org.jclouds.logging.Logger; -import org.jclouds.util.Strings2; import com.google.common.base.Function; import com.google.inject.TypeLiteral; @@ -57,8 +56,8 @@ public class ParseJson<T> implements Function<HttpResponse, T> { * parses the http response body to create a new {@code <T>}. */ public T apply(HttpResponse from) { - InputStream gson = from.getPayload().getInput(); try { + InputStream gson = from.getPayload().openStream(); return apply(gson); } catch (Exception e) { StringBuilder message = new StringBuilder(); @@ -80,7 +79,7 @@ public class ParseJson<T> implements Function<HttpResponse, T> { @SuppressWarnings("unchecked") public <V> V apply(InputStream stream, Type type) throws IOException { try { - return (V) json.fromJson(Strings2.toStringAndClose(stream), type); + return (V) json.fromJson(stream, type); } finally { if (stream != null) stream.close(); http://git-wip-us.apache.org/repos/asf/jclouds/blob/a43acaff/core/src/main/java/org/jclouds/io/Payload.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/jclouds/io/Payload.java b/core/src/main/java/org/jclouds/io/Payload.java index 4754f33..543c3d7 100644 --- a/core/src/main/java/org/jclouds/io/Payload.java +++ b/core/src/main/java/org/jclouds/io/Payload.java @@ -30,7 +30,7 @@ public interface Payload extends Closeable { /** * Creates a new InputStream object of the payload. * - * @deprecated see openStream + * @deprecated see {@link Payload#openStream()}. */ @Deprecated InputStream getInput(); http://git-wip-us.apache.org/repos/asf/jclouds/blob/a43acaff/core/src/main/java/org/jclouds/json/Json.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/jclouds/json/Json.java b/core/src/main/java/org/jclouds/json/Json.java index 53e555d..35b2a14 100644 --- a/core/src/main/java/org/jclouds/json/Json.java +++ b/core/src/main/java/org/jclouds/json/Json.java @@ -16,6 +16,7 @@ */ package org.jclouds.json; +import java.io.InputStream; import java.lang.reflect.Type; public interface Json { @@ -42,5 +43,17 @@ public interface Json { * {@link #fromJson(Object, Type)} */ <T> T fromJson(String json, Class<T> classOfT); + + /** + * Deserialize the generic object from json. If the object is not a generic type, use + * {@link #fromJson(Object, Class)} + */ + <T> T fromJson(InputStream json, Type type); + + /** + * Deserialize the object from json. If the object is a generic type, use + * {@link #fromJson(Object, Type)} + */ + <T> T fromJson(InputStream json, Class<T> classOfT); } http://git-wip-us.apache.org/repos/asf/jclouds/blob/a43acaff/core/src/main/java/org/jclouds/json/internal/GsonWrapper.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/jclouds/json/internal/GsonWrapper.java b/core/src/main/java/org/jclouds/json/internal/GsonWrapper.java index 6f45df1..59ef71a 100644 --- a/core/src/main/java/org/jclouds/json/internal/GsonWrapper.java +++ b/core/src/main/java/org/jclouds/json/internal/GsonWrapper.java @@ -16,6 +16,11 @@ */ package org.jclouds.json.internal; +import static org.jclouds.util.Closeables2.closeQuietly; + +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.Reader; import java.lang.reflect.Type; import javax.inject.Inject; @@ -46,6 +51,27 @@ public class GsonWrapper extends ForwardingObject implements Json { public <T> T fromJson(String json, Class<T> classOfT) { return gson.fromJson(json, classOfT); } + + @SuppressWarnings("unchecked") + @Override + public <T> T fromJson(InputStream json, Type type) { + Reader reader = new InputStreamReader(json); + try { + return (T) gson.fromJson(reader, type); + } finally { + closeQuietly(reader); + } + } + + @Override + public <T> T fromJson(InputStream json, Class<T> classOfT) { + Reader reader = new InputStreamReader(json); + try { + return gson.fromJson(reader, classOfT); + } finally { + closeQuietly(reader); + } + } @Override public String toJson(Object src) {
