// Copyright (C) 2011 - Will Glozer. All rights reserved. package com.lambdaworks.redis.output; import java.nio.ByteBuffer; import com.lambdaworks.redis.codec.RedisCodec; import com.lambdaworks.redis.internal.LettuceAssert; /** * Abstract representation of the output of a redis command. * * @param <K> Key type. * @param <V> Value type. * @param <T> Output type. * * @author Will Glozer */ public abstract class CommandOutput<K, V, T> { protected final RedisCodec<K, V> codec; protected T output; protected String error; /** * Initialize a new instance that encodes and decodes keys and values using the supplied codec. * * @param codec Codec used to encode/decode keys and values, must not be {@literal null}. * @param output Initial value of output. */ public CommandOutput(RedisCodec<K, V> codec, T output) { LettuceAssert.notNull(codec, "RedisCodec must not be null"); this.codec = codec; this.output = output; } /** * Get the command output. * * @return The command output. */ public T get() { return output; } /** * Set the command output to a sequence of bytes, or null. Concrete {@link CommandOutput} implementations must override this * method unless they only receive an integer value which cannot be null. * * @param bytes The command output, or null. */ public void set(ByteBuffer bytes) { throw new IllegalStateException(); } /** * Set the command output to a 64-bit signed integer. Concrete {@link CommandOutput} implementations must override this * method unless they only receive a byte array value. * * @param integer The command output. */ public void set(long integer) { throw new IllegalStateException(); } /** * Set command output to an error message from the server. * * @param error Error message. */ public void setError(ByteBuffer error) { this.error = decodeAscii(error); } /** * Set command output to an error message from the client. * * @param error Error message. */ public void setError(String error) { this.error = error; } /** * Check if the command resulted in an error. * * @return true if command resulted in an error. */ public boolean hasError() { return this.error != null; } /** * Get the error that occurred. * * @return The error. */ public String getError() { return error; } /** * Mark the command output complete. * * @param depth Remaining depth of output queue. * */ public void complete(int depth) { // nothing to do by default } protected String decodeAscii(ByteBuffer bytes) { if(bytes == null) { return null; } char[] chars = new char[bytes.remaining()]; for (int i = 0; i < chars.length; i++) { chars[i] = (char) bytes.get(); } return new String(chars); } @Override public String toString() { final StringBuilder sb = new StringBuilder(); sb.append(getClass().getSimpleName()); sb.append(" [output=").append(output); sb.append(", error='").append(error).append('\''); sb.append(']'); return sb.toString(); } public void multi(int count) { } }