/* * COMSAT * Copyright (C) 2014-2015, Parallel Universe Software Co. All rights reserved. * * This program and the accompanying materials are dual-licensed under * either the terms of the Eclipse Public License v1.0 as published by * the Eclipse Foundation * * or (per the licensee's choosing) * * under the terms of the GNU Lesser General Public License version 3.0 * as published by the Free Software Foundation. */ package co.paralleluniverse.fibers.httpasyncclient; import co.paralleluniverse.strands.SettableFuture; import java.io.IOException; import java.util.concurrent.Future; import org.apache.http.HttpHost; import org.apache.http.HttpRequest; import org.apache.http.HttpResponse; import org.apache.http.client.methods.HttpUriRequest; import org.apache.http.concurrent.FutureCallback; import org.apache.http.impl.nio.client.CloseableHttpAsyncClient; import org.apache.http.nio.protocol.HttpAsyncRequestProducer; import org.apache.http.nio.protocol.HttpAsyncResponseConsumer; import org.apache.http.protocol.HttpContext; public class FiberCloseableHttpAsyncClient extends CloseableHttpAsyncClient { private final CloseableHttpAsyncClient client; private FiberCloseableHttpAsyncClient(CloseableHttpAsyncClient client) { this.client = client; } public static CloseableHttpAsyncClient wrap(CloseableHttpAsyncClient client) { return new FiberCloseableHttpAsyncClient(client); }; @Override public boolean isRunning() { return client.isRunning(); } @Override public void start() { client.start(); } @Override public <T> Future<T> execute(HttpAsyncRequestProducer requestProducer, HttpAsyncResponseConsumer<T> responseConsumer, final FutureCallback<T> callback) { final SettableFuture<T> future = new SettableFuture<>(); client.execute(requestProducer, responseConsumer, wrapCallbackWithFuture(future, callback)); return future; } @Override public Future<HttpResponse> execute(HttpHost target, HttpRequest request, HttpContext context, FutureCallback<HttpResponse> callback) { final SettableFuture<HttpResponse> future = new SettableFuture<>(); client.execute(target, request, context, wrapCallbackWithFuture(future, callback)); return future; } @Override public Future<HttpResponse> execute(HttpHost target, HttpRequest request, FutureCallback<HttpResponse> callback) { final SettableFuture<HttpResponse> future = new SettableFuture<>(); client.execute(target, request, wrapCallbackWithFuture(future, callback)); return future; } @Override public Future<HttpResponse> execute(HttpUriRequest request, FutureCallback<HttpResponse> callback) { final SettableFuture<HttpResponse> future = new SettableFuture<>(); client.execute(request, wrapCallbackWithFuture(future, callback)); return future; } @Override public Future<HttpResponse> execute(HttpUriRequest request, HttpContext context, FutureCallback<HttpResponse> callback) { final SettableFuture<HttpResponse> future = new SettableFuture<>(); client.execute(request, context, wrapCallbackWithFuture(future, callback)); return future; } @Override public void close() throws IOException { client.close(); } @Override public <T> Future<T> execute(HttpAsyncRequestProducer requestProducer, HttpAsyncResponseConsumer<T> responseConsumer, HttpContext context, FutureCallback<T> callback) { final SettableFuture<T> future = new SettableFuture<>(); client.execute(requestProducer, responseConsumer, context, wrapCallbackWithFuture(future, callback)); return future; } private static <T> FutureCallback<T> wrapCallbackWithFuture(final SettableFuture<T> future, final FutureCallback<T> callback) { return new FutureCallback<T>() { @Override public void completed(T result) { future.set(result); callback.completed(result); } @Override public void failed(Exception ex) { future.setException(ex); callback.failed(ex); } @Override public void cancelled() { future.cancel(true); callback.cancelled(); } }; } }