package glaze.client.wire.tasks;
import glaze.client.Response;
import glaze.client.sync.SyncClient;
import glaze.spi.Registry;
import java.io.Serializable;
import java.util.concurrent.Callable;
import org.apache.http.client.methods.HttpRequestBase;
import org.apache.http.client.methods.HttpUriRequest;
/**
* Convenience class for remote distributed request execution.
*
* @param <T>
* response type
*/
public abstract class CallableRequest<T extends Serializable> implements Callable<T>, Serializable
{
public interface SerializableResponseCallback<T extends Serializable> extends Serializable
{
T onException(Exception e);
T onResponse(T response);
}
private static final long serialVersionUID = -7750147708791590508L;
private final SerializableRequest request;
private SerializableResponseCallback<T> callback;
public CallableRequest(HttpUriRequest request, SerializableResponseCallback<T> callback)
{
this.request = SerializableRequest.from(request);
this.callback = callback;
}
@Override
public T call() throws Exception
{
try {
HttpRequestBase matReq = request.materialize();
SyncClient defaultClient = defaultClient();
T result = execute(defaultClient, matReq);
return callback.onResponse(result);
} catch (Exception e) {
return callback.onException(e);
}
}
public void setCallback(SerializableResponseCallback<T> callback)
{
this.callback = callback;
}
protected SyncClient defaultClient()
{
return Registry.lookup(SyncClient.class);
}
@SuppressWarnings("unchecked")
protected T execute(SyncClient client, HttpUriRequest request)
{
Response response = client.execute(request);
return (T) new SerializableResponse(response);
}
protected SerializableResponseCallback<T> getCallback()
{
return callback;
}
protected SerializableRequest getHttpRequest()
{
return request;
}
}