/sitebricks-client/src/main/java/com/google/sitebricks/client/WebResponseImpl.java

http://github.com/dhanji/sitebricks · Java · 93 lines · 68 code · 14 blank · 11 comment · 6 complexity · d223d82995b52843813c37f93f412d7a MD5 · raw file

  1. package com.google.sitebricks.client;
  2. import com.google.inject.Injector;
  3. import com.google.inject.TypeLiteral;
  4. import com.ning.http.client.Response;
  5. import net.jcip.annotations.NotThreadSafe;
  6. import java.io.IOException;
  7. import java.io.InputStream;
  8. import java.util.HashMap;
  9. import java.util.List;
  10. import java.util.Map;
  11. import java.util.logging.Logger;
  12. /**
  13. * @author Dhanji R. Prasanna (dhanji@gmail.com)
  14. * @author Jeanfrancois Arcand (jfarcand@apache.org)
  15. */
  16. @NotThreadSafe
  17. class WebResponseImpl implements WebResponse {
  18. private final Injector injector;
  19. private final Response response;
  20. // memo field
  21. private Map<String, String> headers;
  22. public WebResponseImpl(Injector injector, Response response) {
  23. this.injector = injector;
  24. this.response = response;
  25. }
  26. public Map<String, String> getHeaders() {
  27. if (null != this.headers)
  28. return this.headers;
  29. // translate from ahc http client headers
  30. final Map<String, String> headers = new HashMap<String, String>();
  31. for (Map.Entry<String, List<String>> header : response.getHeaders().entrySet()) {
  32. for (String value : header.getValue()) {
  33. headers.put(header.getKey(), value);
  34. }
  35. }
  36. return this.headers = headers;
  37. }
  38. public <T> ResponseTransportBuilder<T> to(final Class<T> data) {
  39. TypeLiteral<T> typeLiteral = TypeLiteral.get(data);
  40. return to(typeLiteral);
  41. }
  42. @Override
  43. public <T> ResponseTransportBuilder<T> to(final TypeLiteral<T> data) {
  44. return new ResponseTransportBuilder<T>() {
  45. public T using(Class<? extends Transport> transportKey) {
  46. InputStream in = null;
  47. try {
  48. in = response.getResponseBodyAsStream();
  49. return injector.getInstance(transportKey).in(in, data);
  50. } catch (IOException e) {
  51. throw new TransportException(e);
  52. //
  53. // ugly stream closing here, to abstract it away from user code
  54. //
  55. } finally {
  56. try {
  57. if (null != in)
  58. in.close();
  59. } catch (IOException e) {
  60. // strange, unrecoverable error =(
  61. Logger.getLogger(WebResponseImpl.class.getName()).severe("Could not close input stream to in-memory byte array: " + e);
  62. }
  63. }
  64. }
  65. };
  66. }
  67. public int status() {
  68. return response.getStatusCode();
  69. }
  70. @Override
  71. public String toString() {
  72. try {
  73. return response.getResponseBody();
  74. } catch (IOException e) {
  75. // TODO
  76. return "";
  77. }
  78. }
  79. }