package com.lambdaworks.redis.protocol;
import java.util.ArrayList;
import java.util.List;
import java.util.function.Consumer;
import com.lambdaworks.redis.output.CommandOutput;
import io.netty.buffer.ByteBuf;
/**
* Wrapper for a command.
*
* @author Mark Paluch
*/
public class CommandWrapper<K, V, T> implements RedisCommand<K, V, T>, CompleteableCommand<T>, DecoratedCommand<K, V, T> {
protected final RedisCommand<K, V, T> command;
private final List<Consumer<? super T>> onComplete = new ArrayList<>();
public CommandWrapper(RedisCommand<K, V, T> command) {
this.command = command;
}
@Override
public CommandOutput<K, V, T> getOutput() {
return command.getOutput();
}
@Override
public void complete() {
command.complete();
for (Consumer<? super T> consumer : onComplete) {
if (getOutput() != null) {
consumer.accept(getOutput().get());
} else {
consumer.accept(null);
}
}
}
@Override
public void cancel() {
command.cancel();
}
@Override
public CommandArgs<K, V> getArgs() {
return command.getArgs();
}
@Override
public boolean completeExceptionally(Throwable throwable) {
return command.completeExceptionally(throwable);
}
@Override
public ProtocolKeyword getType() {
return command.getType();
}
@Override
public void encode(ByteBuf buf) {
command.encode(buf);
}
@Override
public boolean isCancelled() {
return command.isCancelled();
}
@Override
public void setOutput(CommandOutput<K, V, T> output) {
command.setOutput(output);
}
@Override
public void onComplete(Consumer<? super T> action) {
onComplete.add(action);
}
@Override
public String toString() {
final StringBuilder sb = new StringBuilder();
sb.append(getClass().getSimpleName());
sb.append(" [type=").append(getType());
sb.append(", output=").append(getOutput());
sb.append(", commandType=").append(command.getClass().getName());
sb.append(']');
return sb.toString();
}
@Override
public boolean isDone() {
return command.isDone();
}
@Override
public RedisCommand<K, V, T> getDelegate() {
return command;
}
/**
* Unwrap a wrapped command.
*
* @param wrapped
* @param <K>
* @param <V>
* @param <T>
* @return
*/
public static <K, V, T> RedisCommand<K, V, T> unwrap(RedisCommand<K, V, T> wrapped) {
RedisCommand<K, V, T> result = wrapped;
while (result instanceof DecoratedCommand<?, ?, ?>) {
result = ((DecoratedCommand<K, V, T>) result).getDelegate();
}
return result;
}
}