package org.handwerkszeug.riak.ease.internal;
import org.handwerkszeug.riak.RiakClient;
import org.handwerkszeug.riak.ease.ExceptionHandler;
import org.handwerkszeug.riak.ease.RiakCommand;
import org.handwerkszeug.riak.model.RiakContentsResponse;
import org.handwerkszeug.riak.model.RiakResponse;
import org.handwerkszeug.riak.op.RiakOperations;
import org.handwerkszeug.riak.op.RiakResponseHandler;
/**
* @author taichi
* @param <V>
* @param <OP>
*/
public abstract class AbstractRiakCommand<V, OP extends RiakOperations>
implements RiakCommand<V> {
protected final RiakClient<OP> client;
protected final ExceptionHandler handler;
protected AbstractRiakCommand(RiakClient<OP> client,
ExceptionHandler handler) {
this.client = client;
this.handler = handler;
}
protected <T> void onError(ResultHolder<T> holder, RiakResponse response)
throws Exception {
try {
this.handler.handle(AbstractRiakCommand.this, response);
} finally {
holder.fail(response.getMessage());
}
}
public abstract class EaseHandler<T> implements RiakResponseHandler<T> {
private final ResultHolder<?> holder;
protected EaseHandler(ResultHolder<?> holder) {
this.holder = holder;
}
@Override
public void onError(RiakResponse response) throws Exception {
AbstractRiakCommand.this.onError(this.holder, response);
}
}
protected class SimpleEaseHandler<T> implements RiakResponseHandler<T> {
final ResultHolder<T> holder;
public SimpleEaseHandler(ResultHolder<T> holder) {
this.holder = holder;
}
@Override
public void onError(RiakResponse response) throws Exception {
AbstractRiakCommand.this.onError(this.holder, response);
}
@Override
public void handle(RiakContentsResponse<T> response) throws Exception {
this.holder.setResult(response.getContents());
}
}
}