package com.google.sitebricks.client; import com.google.inject.Injector; import com.google.inject.TypeLiteral; import com.ning.http.client.Response; import net.jcip.annotations.NotThreadSafe; import java.io.IOException; import java.io.InputStream; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.logging.Logger; /** * @author Dhanji R. Prasanna (dhanji@gmail.com) * @author Jeanfrancois Arcand (jfarcand@apache.org) */ @NotThreadSafe class WebResponseImpl implements WebResponse { private final Injector injector; private final Response response; // memo field private Map<String, String> headers; public WebResponseImpl(Injector injector, Response response) { this.injector = injector; this.response = response; } public Map<String, String> getHeaders() { if (null != this.headers) return this.headers; // translate from ahc http client headers final Map<String, String> headers = new HashMap<String, String>(); for (Map.Entry<String, List<String>> header : response.getHeaders().entrySet()) { for (String value : header.getValue()) { headers.put(header.getKey(), value); } } return this.headers = headers; } public <T> ResponseTransportBuilder<T> to(final Class<T> data) { TypeLiteral<T> typeLiteral = TypeLiteral.get(data); return to(typeLiteral); } @Override public <T> ResponseTransportBuilder<T> to(final TypeLiteral<T> data) { return new ResponseTransportBuilder<T>() { public T using(Class<? extends Transport> transportKey) { InputStream in = null; try { in = response.getResponseBodyAsStream(); return injector.getInstance(transportKey).in(in, data); } catch (IOException e) { throw new TransportException(e); // // ugly stream closing here, to abstract it away from user code // } finally { try { if (null != in) in.close(); } catch (IOException e) { // strange, unrecoverable error =( Logger.getLogger(WebResponseImpl.class.getName()).severe("Could not close input stream to in-memory byte array: " + e); } } } }; } public int status() { return response.getStatusCode(); } @Override public String toString() { try { return response.getResponseBody(); } catch (IOException e) { // TODO return ""; } } }