package com.couchbase.lite.ektorp; import java.io.IOException; import java.io.InputStream; import java.net.URISyntaxException; import java.util.concurrent.CountDownLatch; import org.ektorp.http.HttpResponse; import org.ektorp.util.Exceptions; import android.util.Log; import com.couchbase.lite.Database; import com.couchbase.lite.router.Router; import com.couchbase.lite.router.RouterCallbackBlock; import com.couchbase.lite.router.URLConnection; public class CBLiteHttpResponse implements HttpResponse, RouterCallbackBlock { private URLConnection conn; private Router router; private InputStream is; final CountDownLatch doneSignal = new CountDownLatch(1); public static CBLiteHttpResponse of(URLConnection conn, Router router) throws IOException { return new CBLiteHttpResponse(conn, router); } private CBLiteHttpResponse(URLConnection conn, Router router) throws IOException { this.conn = conn; this.router = router; } @Override public void abort() { router.stop(); } @Override public int getCode() { getContent(); return conn.getResponseCode(); } @Override public InputStream getContent() { try { doneSignal.await(); } catch (InterruptedException e) { Log.e(Database.TAG, "Interupted waiting for response", e); } return is; } @Override public String getETag() { return conn.getHeaderField("ETag"); } @Override public long getContentLength() { getContent(); return conn.getContentLength(); } @Override public String getContentType() { getContent(); return conn.getContentType(); } @Override public String getRequestURI() { try { return conn.getURL().toURI().toString(); } catch (URISyntaxException e) { throw Exceptions.propagate(e); } } @Override public boolean isSuccessful() { return conn.getResponseCode() < 300; } @Override public void releaseConnection() { try { router.stop(); // needed to clean up changes listeners } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } /** RouterCallbackBlock **/ @Override public void onResponseReady() { doneSignal.countDown(); is = conn.getResponseInputStream(); } }