From 18febb690ec22d3d134d8bd1265ef7e3eb142787 Mon Sep 17 00:00:00 2001 From: Nikita Date: Wed, 15 Jul 2015 20:31:44 +0300 Subject: [PATCH] lettuce sources removed. #183 --- .../java/com/lambdaworks/codec/Base16.java | 62 - .../java/com/lambdaworks/redis/KeyValue.java | 35 - .../redis/RedisAsyncConnection.java | 1322 ----------------- .../com/lambdaworks/redis/RedisClient.java | 223 --- .../RedisCommandInterruptedException.java | 16 - .../lambdaworks/redis/RedisConnection.java | 871 ----------- .../redis/RedisConnectionClosedException.java | 11 - .../redis/RedisConnectionException.java | 15 - .../com/lambdaworks/redis/RedisException.java | 24 - .../redis/RedisMovedException.java | 17 - .../redis/RedisTimeoutException.java | 7 - .../com/lambdaworks/redis/ScoredValue.java | 37 - .../lambdaworks/redis/ScriptOutputType.java | 22 - .../java/com/lambdaworks/redis/SortArgs.java | 124 -- .../com/lambdaworks/redis/ZStoreArgs.java | 91 -- .../lambdaworks/redis/codec/RedisCodec.java | 66 - .../redis/codec/Utf8StringCodec.java | 87 -- .../redis/output/BooleanListOutput.java | 25 - .../redis/output/BooleanOutput.java | 31 - .../redis/output/ByteArrayOutput.java | 27 - .../lambdaworks/redis/output/DateOutput.java | 24 - .../redis/output/DoubleOutput.java | 26 - .../redis/output/IntegerOutput.java | 31 - .../redis/output/KeyListOutput.java | 28 - .../lambdaworks/redis/output/KeyOutput.java | 26 - .../redis/output/KeyValueOutput.java | 37 - .../redis/output/ListMapOutput.java | 46 - .../redis/output/ListScanOutput.java | 23 - .../redis/output/ListScanResult.java | 25 - .../redis/output/MapKeyListOutput.java | 29 - .../lambdaworks/redis/output/MapOutput.java | 38 - .../redis/output/MapValueListOutput.java | 28 - .../redis/output/MapValueOutput.java | 26 - .../lambdaworks/redis/output/MultiOutput.java | 65 - .../redis/output/NestedMultiOutput.java | 55 - .../redis/output/ScoredValueListOutput.java | 38 - .../redis/output/StatusOutput.java | 28 - .../redis/output/StringListOutput.java | 26 - .../redis/output/ValueListOutput.java | 28 - .../lambdaworks/redis/output/ValueOutput.java | 26 - .../redis/output/ValueSetOutput.java | 28 - .../redis/output/ValueSetScanOutput.java | 27 - .../lambdaworks/redis/protocol/Charsets.java | 19 - .../lambdaworks/redis/protocol/Command.java | 133 -- .../redis/protocol/CommandArgs.java | 209 --- .../redis/protocol/CommandHandler.java | 101 -- .../redis/protocol/CommandKeyword.java | 21 - .../redis/protocol/CommandOutput.java | 147 -- .../redis/protocol/CommandType.java | 89 -- .../redis/protocol/ConnectionWatchdog.java | 145 -- .../redis/protocol/RedisStateMachine.java | 198 --- .../redis/pubsub/PubSubCommandHandler.java | 56 - .../redis/pubsub/PubSubOutput.java | 87 -- .../redis/pubsub/RedisPubSubAdapter.java | 37 - .../redis/pubsub/RedisPubSubConnection.java | 174 --- .../redis/pubsub/RedisPubSubListener.java | 61 - 56 files changed, 5298 deletions(-) delete mode 100644 src/main/java/com/lambdaworks/codec/Base16.java delete mode 100644 src/main/java/com/lambdaworks/redis/KeyValue.java delete mode 100644 src/main/java/com/lambdaworks/redis/RedisAsyncConnection.java delete mode 100644 src/main/java/com/lambdaworks/redis/RedisClient.java delete mode 100644 src/main/java/com/lambdaworks/redis/RedisCommandInterruptedException.java delete mode 100644 src/main/java/com/lambdaworks/redis/RedisConnection.java delete mode 100644 src/main/java/com/lambdaworks/redis/RedisConnectionClosedException.java delete mode 100644 src/main/java/com/lambdaworks/redis/RedisConnectionException.java delete mode 100644 src/main/java/com/lambdaworks/redis/RedisException.java delete mode 100644 src/main/java/com/lambdaworks/redis/RedisMovedException.java delete mode 100644 src/main/java/com/lambdaworks/redis/RedisTimeoutException.java delete mode 100644 src/main/java/com/lambdaworks/redis/ScoredValue.java delete mode 100644 src/main/java/com/lambdaworks/redis/ScriptOutputType.java delete mode 100644 src/main/java/com/lambdaworks/redis/SortArgs.java delete mode 100644 src/main/java/com/lambdaworks/redis/ZStoreArgs.java delete mode 100644 src/main/java/com/lambdaworks/redis/codec/RedisCodec.java delete mode 100644 src/main/java/com/lambdaworks/redis/codec/Utf8StringCodec.java delete mode 100644 src/main/java/com/lambdaworks/redis/output/BooleanListOutput.java delete mode 100644 src/main/java/com/lambdaworks/redis/output/BooleanOutput.java delete mode 100644 src/main/java/com/lambdaworks/redis/output/ByteArrayOutput.java delete mode 100644 src/main/java/com/lambdaworks/redis/output/DateOutput.java delete mode 100644 src/main/java/com/lambdaworks/redis/output/DoubleOutput.java delete mode 100644 src/main/java/com/lambdaworks/redis/output/IntegerOutput.java delete mode 100644 src/main/java/com/lambdaworks/redis/output/KeyListOutput.java delete mode 100644 src/main/java/com/lambdaworks/redis/output/KeyOutput.java delete mode 100644 src/main/java/com/lambdaworks/redis/output/KeyValueOutput.java delete mode 100644 src/main/java/com/lambdaworks/redis/output/ListMapOutput.java delete mode 100644 src/main/java/com/lambdaworks/redis/output/ListScanOutput.java delete mode 100644 src/main/java/com/lambdaworks/redis/output/ListScanResult.java delete mode 100644 src/main/java/com/lambdaworks/redis/output/MapKeyListOutput.java delete mode 100644 src/main/java/com/lambdaworks/redis/output/MapOutput.java delete mode 100644 src/main/java/com/lambdaworks/redis/output/MapValueListOutput.java delete mode 100644 src/main/java/com/lambdaworks/redis/output/MapValueOutput.java delete mode 100644 src/main/java/com/lambdaworks/redis/output/MultiOutput.java delete mode 100644 src/main/java/com/lambdaworks/redis/output/NestedMultiOutput.java delete mode 100644 src/main/java/com/lambdaworks/redis/output/ScoredValueListOutput.java delete mode 100644 src/main/java/com/lambdaworks/redis/output/StatusOutput.java delete mode 100644 src/main/java/com/lambdaworks/redis/output/StringListOutput.java delete mode 100644 src/main/java/com/lambdaworks/redis/output/ValueListOutput.java delete mode 100644 src/main/java/com/lambdaworks/redis/output/ValueOutput.java delete mode 100644 src/main/java/com/lambdaworks/redis/output/ValueSetOutput.java delete mode 100644 src/main/java/com/lambdaworks/redis/output/ValueSetScanOutput.java delete mode 100644 src/main/java/com/lambdaworks/redis/protocol/Charsets.java delete mode 100644 src/main/java/com/lambdaworks/redis/protocol/Command.java delete mode 100644 src/main/java/com/lambdaworks/redis/protocol/CommandArgs.java delete mode 100644 src/main/java/com/lambdaworks/redis/protocol/CommandHandler.java delete mode 100644 src/main/java/com/lambdaworks/redis/protocol/CommandKeyword.java delete mode 100644 src/main/java/com/lambdaworks/redis/protocol/CommandOutput.java delete mode 100644 src/main/java/com/lambdaworks/redis/protocol/CommandType.java delete mode 100644 src/main/java/com/lambdaworks/redis/protocol/ConnectionWatchdog.java delete mode 100644 src/main/java/com/lambdaworks/redis/protocol/RedisStateMachine.java delete mode 100644 src/main/java/com/lambdaworks/redis/pubsub/PubSubCommandHandler.java delete mode 100644 src/main/java/com/lambdaworks/redis/pubsub/PubSubOutput.java delete mode 100644 src/main/java/com/lambdaworks/redis/pubsub/RedisPubSubAdapter.java delete mode 100644 src/main/java/com/lambdaworks/redis/pubsub/RedisPubSubConnection.java delete mode 100644 src/main/java/com/lambdaworks/redis/pubsub/RedisPubSubListener.java diff --git a/src/main/java/com/lambdaworks/codec/Base16.java b/src/main/java/com/lambdaworks/codec/Base16.java deleted file mode 100644 index 7318199c3..000000000 --- a/src/main/java/com/lambdaworks/codec/Base16.java +++ /dev/null @@ -1,62 +0,0 @@ -// Copyright (C) 2011 - Will Glozer. All rights reserved. - -package com.lambdaworks.codec; - -/** - * High-performance base16 (AKA hex) codec. - * - * @author Will Glozer - */ -public class Base16 { - private static final char[] upper = "0123456789ABCDEF".toCharArray(); - private static final char[] lower = "0123456789abcdef".toCharArray(); - private static final byte[] decode = new byte[128]; - - static { - for (int i = 0; i < 10; i++) { - decode['0' + i] = (byte) i; - decode['A' + i] = (byte) (10 + i); - decode['a' + i] = (byte) (10 + i); - } - } - - /** - * Encode bytes to base16 chars. - * - * @param src Bytes to encode. - * @param upper Use upper or lowercase chars. - * - * @return Encoded chars. - */ - public static char[] encode(byte[] src, boolean upper) { - char[] table = upper ? Base16.upper : Base16.lower; - char[] dst = new char[src.length * 2]; - - for (int si = 0, di = 0; si < src.length; si++) { - byte b = src[si]; - dst[di++] = table[(b & 0xf0) >>> 4]; - dst[di++] = table[(b & 0x0f)]; - } - - return dst; - } - - /** - * Decode base16 chars to bytes. - * - * @param src Chars to decode. - * - * @return Decoded bytes. - */ - public static byte[] decode(char[] src) { - byte[] dst = new byte[src.length / 2]; - - for (int si = 0, di = 0; di < dst.length; di++) { - byte high = decode[src[si++] & 0x7f]; - byte low = decode[src[si++] & 0x7f]; - dst[di] = (byte) ((high << 4) + low); - } - - return dst; - } -} diff --git a/src/main/java/com/lambdaworks/redis/KeyValue.java b/src/main/java/com/lambdaworks/redis/KeyValue.java deleted file mode 100644 index 1b2ddcbad..000000000 --- a/src/main/java/com/lambdaworks/redis/KeyValue.java +++ /dev/null @@ -1,35 +0,0 @@ -// Copyright (C) 2011 - Will Glozer. All rights reserved. - -package com.lambdaworks.redis; - -/** - * A key-value pair. - * - * @author Will Glozer - */ -public class KeyValue { - public final K key; - public final V value; - - public KeyValue(K key, V value) { - this.key = key; - this.value = value; - } - - @Override - public boolean equals(Object o) { - if (o == null || getClass() != o.getClass()) return false; - KeyValue that = (KeyValue) o; - return key.equals(that.key) && value.equals(that.value); - } - - @Override - public int hashCode() { - return 31 * key.hashCode() + value.hashCode(); - } - - @Override - public String toString() { - return String.format("(%s, %s)", key, value); - } -} diff --git a/src/main/java/com/lambdaworks/redis/RedisAsyncConnection.java b/src/main/java/com/lambdaworks/redis/RedisAsyncConnection.java deleted file mode 100644 index 42d260fbc..000000000 --- a/src/main/java/com/lambdaworks/redis/RedisAsyncConnection.java +++ /dev/null @@ -1,1322 +0,0 @@ -// Copyright (C) 2011 - Will Glozer. All rights reserved. - -package com.lambdaworks.redis; - -import static com.lambdaworks.redis.protocol.CommandKeyword.AFTER; -import static com.lambdaworks.redis.protocol.CommandKeyword.AND; -import static com.lambdaworks.redis.protocol.CommandKeyword.BEFORE; -import static com.lambdaworks.redis.protocol.CommandKeyword.ENCODING; -import static com.lambdaworks.redis.protocol.CommandKeyword.FLUSH; -import static com.lambdaworks.redis.protocol.CommandKeyword.GETNAME; -import static com.lambdaworks.redis.protocol.CommandKeyword.IDLETIME; -import static com.lambdaworks.redis.protocol.CommandKeyword.KILL; -import static com.lambdaworks.redis.protocol.CommandKeyword.LEN; -import static com.lambdaworks.redis.protocol.CommandKeyword.LIMIT; -import static com.lambdaworks.redis.protocol.CommandKeyword.LIST; -import static com.lambdaworks.redis.protocol.CommandKeyword.LOAD; -import static com.lambdaworks.redis.protocol.CommandKeyword.NO; -import static com.lambdaworks.redis.protocol.CommandKeyword.NOSAVE; -import static com.lambdaworks.redis.protocol.CommandKeyword.NOT; -import static com.lambdaworks.redis.protocol.CommandKeyword.ONE; -import static com.lambdaworks.redis.protocol.CommandKeyword.OR; -import static com.lambdaworks.redis.protocol.CommandKeyword.REFCOUNT; -import static com.lambdaworks.redis.protocol.CommandKeyword.RESET; -import static com.lambdaworks.redis.protocol.CommandKeyword.RESETSTAT; -import static com.lambdaworks.redis.protocol.CommandKeyword.SETNAME; -import static com.lambdaworks.redis.protocol.CommandKeyword.WITHSCORES; -import static com.lambdaworks.redis.protocol.CommandKeyword.XOR; -import static com.lambdaworks.redis.protocol.CommandType.*; - -import java.security.MessageDigest; -import java.security.NoSuchAlgorithmException; -import java.util.ArrayList; -import java.util.Date; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.concurrent.BlockingQueue; -import java.util.concurrent.TimeUnit; -import java.util.concurrent.TimeoutException; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import com.lambdaworks.codec.Base16; -import com.lambdaworks.redis.codec.RedisCodec; -import com.lambdaworks.redis.output.BooleanListOutput; -import com.lambdaworks.redis.output.BooleanOutput; -import com.lambdaworks.redis.output.ByteArrayOutput; -import com.lambdaworks.redis.output.DateOutput; -import com.lambdaworks.redis.output.DoubleOutput; -import com.lambdaworks.redis.output.IntegerOutput; -import com.lambdaworks.redis.output.KeyListOutput; -import com.lambdaworks.redis.output.KeyOutput; -import com.lambdaworks.redis.output.KeyValueOutput; -import com.lambdaworks.redis.output.ListMapOutput; -import com.lambdaworks.redis.output.ListScanOutput; -import com.lambdaworks.redis.output.ListScanResult; -import com.lambdaworks.redis.output.MapKeyListOutput; -import com.lambdaworks.redis.output.MapOutput; -import com.lambdaworks.redis.output.MapValueListOutput; -import com.lambdaworks.redis.output.MapValueOutput; -import com.lambdaworks.redis.output.MultiOutput; -import com.lambdaworks.redis.output.NestedMultiOutput; -import com.lambdaworks.redis.output.ScoredValueListOutput; -import com.lambdaworks.redis.output.StatusOutput; -import com.lambdaworks.redis.output.StringListOutput; -import com.lambdaworks.redis.output.ValueListOutput; -import com.lambdaworks.redis.output.ValueOutput; -import com.lambdaworks.redis.output.ValueSetOutput; -import com.lambdaworks.redis.output.ValueSetScanOutput; -import com.lambdaworks.redis.protocol.Command; -import com.lambdaworks.redis.protocol.CommandArgs; -import com.lambdaworks.redis.protocol.CommandKeyword; -import com.lambdaworks.redis.protocol.CommandOutput; -import com.lambdaworks.redis.protocol.CommandType; -import com.lambdaworks.redis.protocol.ConnectionWatchdog; - -import io.netty.channel.Channel; -import io.netty.channel.ChannelHandler; -import io.netty.channel.ChannelHandlerContext; -import io.netty.channel.ChannelInboundHandlerAdapter; -import io.netty.channel.EventLoopGroup; -import io.netty.util.concurrent.Future; -import io.netty.util.concurrent.Promise; - -/** - * An asynchronous thread-safe connection to a redis server. Multiple threads may - * share one {@link RedisAsyncConnection} provided they avoid blocking and transactional - * operations such as {@link #blpop} and {@link #multi()}/{@link #exec}. - * - * A {@link ConnectionWatchdog} monitors each connection and reconnects - * automatically until {@link #close} is called. All pending commands will be - * (re)sent after successful reconnection. - * - * @author Will Glozer - */ -@ChannelHandler.Sharable -public class RedisAsyncConnection extends ChannelInboundHandlerAdapter { - - private Logger log = LoggerFactory.getLogger(getClass()); - - protected BlockingQueue> queue; - protected RedisCodec codec; - protected Channel channel; - protected long timeout; - protected TimeUnit unit; - protected MultiOutput multi; - private String password; - private int db; - private boolean closed; - private EventLoopGroup eventLoopGroup; - private RedisClient redisClient; - - private volatile boolean reconnect; - - public void setReconnect(boolean reconnect) { - this.reconnect = reconnect; - } - - public boolean isReconnect() { - return reconnect; - } - - /** - * Initialize a new connection. - * - * @param queue Command queue. - * @param codec Codec used to encode/decode keys and values. - * @param timeout Maximum time to wait for a response. - * @param unit Unit of time for the timeout. - * @param eventLoopGroup - */ - public RedisAsyncConnection(RedisClient redisClient, BlockingQueue> queue, RedisCodec codec, long timeout, TimeUnit unit, EventLoopGroup eventLoopGroup) { - this.queue = queue; - this.codec = codec; - this.timeout = timeout; - this.unit = unit; - this.eventLoopGroup = eventLoopGroup; - this.redisClient = redisClient; - } - - /** - * Set the command timeout for this connection. - * - * @param timeout Command timeout. - * @param unit Unit of time for the timeout. - */ - public void setTimeout(long timeout, TimeUnit unit) { - this.timeout = timeout; - this.unit = unit; - } - - public Future append(K key, V value) { - return dispatch(APPEND, new IntegerOutput(codec), key, value); - } - - public String auth(String password) { - CommandArgs args = new CommandArgs(codec).add(password); - Future cmd = dispatch(AUTH, new StatusOutput(codec), args); - String status = await(cmd, timeout, unit); - if ("OK".equals(status)) this.password = password; - return status; - } - - public Future bgrewriteaof() { - return dispatch(BGREWRITEAOF, new StatusOutput(codec)); - } - - public Future bgsave() { - return dispatch(BGSAVE, new StatusOutput(codec)); - } - - public Future bitcount(K key) { - CommandArgs args = new CommandArgs(codec).addKey(key); - return dispatch(BITCOUNT, new IntegerOutput(codec), args); - } - - public Future bitcount(K key, long start, long end) { - CommandArgs args = new CommandArgs(codec); - args.addKey(key).add(start).add(end); - return dispatch(BITCOUNT, new IntegerOutput(codec), args); - } - - public Future bitopAnd(K destination, K... keys) { - CommandArgs args = new CommandArgs(codec); - args.add(AND).addKey(destination).addKeys(keys); - return dispatch(BITOP, new IntegerOutput(codec), args); - } - - public Future bitopNot(K destination, K source) { - CommandArgs args = new CommandArgs(codec); - args.add(NOT).addKey(destination).addKey(source); - return dispatch(BITOP, new IntegerOutput(codec), args); - } - - public Future bitopOr(K destination, K... keys) { - CommandArgs args = new CommandArgs(codec); - args.add(OR).addKey(destination).addKeys(keys); - return dispatch(BITOP, new IntegerOutput(codec), args); - } - - public Future bitopXor(K destination, K... keys) { - CommandArgs args = new CommandArgs(codec); - args.add(XOR).addKey(destination).addKeys(keys); - return dispatch(BITOP, new IntegerOutput(codec), args); - } - - public Future> blpop(long timeout, K... keys) { - CommandArgs args = new CommandArgs(codec).addKeys(keys).add(timeout); - return dispatch(BLPOP, new KeyValueOutput(codec), args); - } - - public Future> brpop(long timeout, K... keys) { - CommandArgs args = new CommandArgs(codec).addKeys(keys).add(timeout); - return dispatch(BRPOP, new KeyValueOutput(codec), args); - } - - public Future brpoplpush(long timeout, K source, K destination) { - CommandArgs args = new CommandArgs(codec); - args.addKey(source).addKey(destination).add(timeout); - return dispatch(BRPOPLPUSH, new ValueOutput(codec), args); - } - - public Future clientGetname() { - CommandArgs args = new CommandArgs(codec).add(GETNAME); - return dispatch(CLIENT, new KeyOutput(codec), args); - } - - public Future clientSetname(K name) { - CommandArgs args = new CommandArgs(codec).add(SETNAME).addKey(name); - return dispatch(CLIENT, new StatusOutput(codec), args); - } - - public Future clientKill(String addr) { - CommandArgs args = new CommandArgs(codec).add(KILL).add(addr); - return dispatch(CLIENT, new StatusOutput(codec), args); - } - - public Future clientList() { - CommandArgs args = new CommandArgs(codec).add(LIST); - return dispatch(CLIENT, new StatusOutput(codec), args); - } - - public Future> configGet(String parameter) { - CommandArgs args = new CommandArgs(codec).add(GET).add(parameter); - return dispatch(CONFIG, new StringListOutput(codec), args); - } - - public Future configResetstat() { - CommandArgs args = new CommandArgs(codec).add(RESETSTAT); - return dispatch(CONFIG, new StatusOutput(codec), args); - } - - public Future configSet(String parameter, String value) { - CommandArgs args = new CommandArgs(codec).add(SET).add(parameter).add(value); - return dispatch(CONFIG, new StatusOutput(codec), args); - } - - public Future dbsize() { - return dispatch(DBSIZE, new IntegerOutput(codec)); - } - - public Future debugObject(K key) { - CommandArgs args = new CommandArgs(codec).add(OBJECT).addKey(key); - return dispatch(DEBUG, new StatusOutput(codec), args); - } - - public Future decr(K key) { - return dispatch(DECR, new IntegerOutput(codec), key); - } - - public Future decrby(K key, long amount) { - CommandArgs args = new CommandArgs(codec).addKey(key).add(amount); - return dispatch(DECRBY, new IntegerOutput(codec), args); - } - - public Future del(K... keys) { - CommandArgs args = new CommandArgs(codec).addKeys(keys); - return dispatch(DEL, new IntegerOutput(codec), args); - } - - public Future discard() { - if (multi != null) { - multi.cancel(); - multi = null; - } - return dispatch(DISCARD, new StatusOutput(codec)); - } - - public Future dump(K key) { - CommandArgs args = new CommandArgs(codec).addKey(key); - return dispatch(DUMP, new ByteArrayOutput(codec), args); - } - - public Future echo(V msg) { - CommandArgs args = new CommandArgs(codec).addValue(msg); - return dispatch(ECHO, new ValueOutput(codec), args); - } - - public Future eval(V script, ScriptOutputType type, K[] keys, V... values) { - CommandArgs args = new CommandArgs(codec); - args.add(script.toString()).add(keys.length).addKeys(keys).addMapValues(values); - CommandOutput output = newScriptOutput(codec, type); - return dispatch(EVAL, output, args); - } - - public Future eval(V script, ScriptOutputType type, List keys, V... values) { - CommandArgs args = new CommandArgs(codec); - args.add(script.toString()).add(keys.size()).addKeys(keys).addMapValues(values); - CommandOutput output = newScriptOutput(codec, type); - return dispatch(EVAL, output, args); - } - - public Future evalR(V script, ScriptOutputType type, List keys, List values, List rawValues) { - CommandArgs args = new CommandArgs(codec); - args.add(script.toString()).add(keys.size()).addKeys(keys); - for (Object value : values) { - args.addMapValue((V) value); - } - for (Object value : rawValues) { - if (value instanceof String) { - args.add((String) value); - } else if (value instanceof Integer) { - args.add((Integer) value); - } else if (value instanceof Long) { - args.add((Long) value); - } else if (value instanceof Double) { - args.add((Double) value); - } else if (value instanceof byte[]) { - args.add((byte[]) value); - } else { - throw new IllegalArgumentException("Unsupported raw value type: " + value.getClass()); - } - } - CommandOutput output = newScriptOutput(codec, type); - return dispatch(EVAL, output, args); - } - - public Future evalsha(String digest, ScriptOutputType type, List keys, V... values) { - CommandArgs args = new CommandArgs(codec); - args.add(digest).add(keys.size()).addKeys(keys).addMapValues(values); - CommandOutput output = newScriptOutput(codec, type); - return dispatch(EVALSHA, output, args); - } - - public Future evalsha(String digest, ScriptOutputType type, K[] keys, V... values) { - CommandArgs args = new CommandArgs(codec); - args.add(digest).add(keys.length).addKeys(keys).addMapValues(values); - CommandOutput output = newScriptOutput(codec, type); - return dispatch(EVALSHA, output, args); - } - - public Future exists(K key) { - return dispatch(EXISTS, new BooleanOutput(codec), key); - } - - public Future expire(K key, long seconds) { - CommandArgs args = new CommandArgs(codec).addKey(key).add(seconds); - return dispatch(EXPIRE, new BooleanOutput(codec), args); - } - - public Future expireat(K key, Date timestamp) { - return expireat(key, timestamp.getTime() / 1000); - } - - public Future expireat(K key, long timestamp) { - CommandArgs args = new CommandArgs(codec).addKey(key).add(timestamp); - return dispatch(EXPIREAT, new BooleanOutput(codec), args); - } - - public Future> exec() { - MultiOutput multi = this.multi; - this.multi = null; - if (multi == null) multi = new MultiOutput(codec); - return dispatch(EXEC, multi); - } - - public Future flushall() { - return dispatch(FLUSHALL, new StatusOutput(codec)); - } - - public Future flushdb() { - return dispatch(FLUSHDB, new StatusOutput(codec)); - } - - public Future get(K key) { - return dispatch(GET, new ValueOutput(codec), key); - } - - public Future getbit(K key, long offset) { - CommandArgs args = new CommandArgs(codec).addKey(key).add(offset); - return dispatch(GETBIT, new IntegerOutput(codec), args); - } - - public Future getrange(K key, long start, long end) { - CommandArgs args = new CommandArgs(codec).addKey(key).add(start).add(end); - return dispatch(GETRANGE, new ValueOutput(codec), args); - } - - public Future getset(K key, V value) { - return dispatch(GETSET, new ValueOutput(codec), key, value); - } - - public Future hdel(K key, K... fields) { - CommandArgs args = new CommandArgs(codec).addKey(key).addMapKeys(fields); - return dispatch(HDEL, new IntegerOutput(codec), args); - } - - public Future hexists(K key, K field) { - CommandArgs args = new CommandArgs(codec).addKey(key).addMapKey(field); - return dispatch(HEXISTS, new BooleanOutput(codec), args); - } - - public Future hget(K key, K field) { - CommandArgs args = new CommandArgs(codec).addKey(key).addMapKey(field); - return dispatch(HGET, new MapValueOutput(codec), args); - } - - public Future hincrby(K key, K field, long amount) { - CommandArgs args = new CommandArgs(codec).addKey(key).addMapKey(field).add(amount); - return dispatch(HINCRBY, new IntegerOutput(codec), args); - } - - public Future hincrbyfloat(K key, K field, String amount) { - CommandArgs args = new CommandArgs(codec).addKey(key).addMapKey(field).add(amount); - return dispatch(HINCRBYFLOAT, new StatusOutput(codec), args); - } - - public Future> hgetall(K key) { - return dispatch(HGETALL, new MapOutput(codec), key); - } - - public Future> hkeys(K key) { - return dispatch(HKEYS, new MapKeyListOutput(codec), key); - } - - public Future hlen(K key) { - return dispatch(HLEN, new IntegerOutput(codec), key); - } - - public Future> hmget(K key, K... fields) { - CommandArgs args = new CommandArgs(codec).addKey(key).addMapKeys(fields); - return dispatch(HMGET, new ValueListOutput(codec), args); - } - - public Future hmset(K key, Map map) { - CommandArgs args = new CommandArgs(codec).addKey(key).add(map); - return dispatch(HMSET, new StatusOutput(codec), args); - } - - public Future hset(K key, K field, V value) { - CommandArgs args = new CommandArgs(codec).addKey(key).addMapKey(field).addMapValue(value); - return dispatch(HSET, new BooleanOutput(codec), args); - } - - public Future hsetnx(K key, K field, V value) { - CommandArgs args = new CommandArgs(codec).addKey(key).addMapKey(field).addMapValue(value); - return dispatch(HSETNX, new BooleanOutput(codec), args); - } - - public Future> hvals(K key) { - return dispatch(HVALS, new MapValueListOutput(codec), key); - } - - public Future incr(K key) { - return dispatch(INCR, new IntegerOutput(codec), key); - } - - public Future incrby(K key, long amount) { - CommandArgs args = new CommandArgs(codec).addKey(key).add(amount); - return dispatch(INCRBY, new IntegerOutput(codec), args); - } - - public Future incrbyfloat(K key, String amount) { - CommandArgs args = new CommandArgs(codec).addKey(key).add(amount); - return dispatch(INCRBYFLOAT, new StatusOutput(codec), args); - } - - public Future info() { - return dispatch(INFO, new StatusOutput(codec)); - } - - public Future info(String section) { - CommandArgs args = new CommandArgs(codec).add(section); - return dispatch(INFO, new StatusOutput(codec), args); - } - - public Future> keys(K pattern) { - return dispatch(KEYS, new KeyListOutput(codec), pattern); - } - - public Future lastsave() { - return dispatch(LASTSAVE, new DateOutput(codec)); - } - - public Future lindex(K key, long index) { - CommandArgs args = new CommandArgs(codec).addKey(key).add(index); - return dispatch(LINDEX, new MapValueOutput(codec), args); - } - - public Future linsert(K key, boolean before, V pivot, V value) { - CommandArgs args = new CommandArgs(codec); - args.addKey(key).add(before ? BEFORE : AFTER).addValue(pivot).addValue(value); - return dispatch(LINSERT, new IntegerOutput(codec), args); - } - - public Future llen(K key) { - return dispatch(LLEN, new IntegerOutput(codec), key); - } - - public Future lpop(K key) { - return dispatch(LPOP, new MapValueOutput(codec), key); - } - - public Future lpush(K key, V... values) { - return dispatch(LPUSH, new IntegerOutput(codec), key, values); - } - - public Future lpushx(K key, V value) { - return dispatch(LPUSHX, new IntegerOutput(codec), key, value); - } - - public Future> lrange(K key, long start, long stop) { - CommandArgs args = new CommandArgs(codec).addKey(key).add(start).add(stop); - return dispatch(LRANGE, new ValueListOutput(codec), args); - } - - public Future lrem(K key, long count, V value) { - CommandArgs args = new CommandArgs(codec).addKey(key).add(count).addMapValue(value); - return dispatch(LREM, new IntegerOutput(codec), args); - } - - public Future lset(K key, long index, V value) { - CommandArgs args = new CommandArgs(codec).addKey(key).add(index).addValue(value); - return dispatch(LSET, new StatusOutput(codec), args); - } - - public Future ltrim(K key, long start, long stop) { - CommandArgs args = new CommandArgs(codec).addKey(key).add(start).add(stop); - return dispatch(LTRIM, new StatusOutput(codec), args); - } - - public Future migrate(String host, int port, K key, int db, long timeout) { - CommandArgs args = new CommandArgs(codec); - args.add(host).add(port).addKey(key).add(db).add(timeout); - return dispatch(MIGRATE, new StatusOutput(codec), args); - } - - public Future> mget(K... keys) { - CommandArgs args = new CommandArgs(codec).addKeys(keys); - return dispatch(MGET, new ValueListOutput(codec), args); - } - - public Future move(K key, int db) { - CommandArgs args = new CommandArgs(codec).addKey(key).add(db); - return dispatch(MOVE, new BooleanOutput(codec), args); - } - - public boolean isMultiMode() { - return multi != null; - } - - public Future multi() { - Future cmd = dispatch(MULTI, new StatusOutput(codec)); - multi = (multi == null ? new MultiOutput(codec) : multi); - return cmd; - } - - public Future mset(Map map) { - CommandArgs args = new CommandArgs(codec).add(map); - return dispatch(MSET, new StatusOutput(codec), args); - } - - public Future msetnx(Map map) { - CommandArgs args = new CommandArgs(codec).add(map); - return dispatch(MSETNX, new BooleanOutput(codec), args); - } - - public Future objectEncoding(K key) { - CommandArgs args = new CommandArgs(codec).add(ENCODING).addKey(key); - return dispatch(OBJECT, new StatusOutput(codec), args); - } - - public Future objectIdletime(K key) { - CommandArgs args = new CommandArgs(codec).add(IDLETIME).addKey(key); - return dispatch(OBJECT, new IntegerOutput(codec), args); - } - - public Future objectRefcount(K key) { - CommandArgs args = new CommandArgs(codec).add(REFCOUNT).addKey(key); - return dispatch(OBJECT, new IntegerOutput(codec), args); - } - - public Future persist(K key) { - return dispatch(PERSIST, new BooleanOutput(codec), key); - } - - public Future pexpire(K key, long milliseconds) { - CommandArgs args = new CommandArgs(codec).addKey(key).add(milliseconds); - return dispatch(PEXPIRE, new BooleanOutput(codec), args); - } - - public Future pexpireat(K key, Date timestamp) { - return pexpireat(key, timestamp.getTime()); - } - - public Future pexpireat(K key, long timestamp) { - CommandArgs args = new CommandArgs(codec).addKey(key).add(timestamp); - return dispatch(PEXPIREAT, new BooleanOutput(codec), args); - } - - public Future ping() { - return dispatch(PING, new StatusOutput(codec)); - } - - public Future pttl(K key) { - CommandArgs args = new CommandArgs(codec).addKey(key); - return dispatch(PTTL, new IntegerOutput(codec), args); - } - - public Future publish(K channel, V message) { - CommandArgs args = new CommandArgs(codec).add(channel.toString()).addValue(message); - return dispatch(PUBLISH, new IntegerOutput(codec), args); - } - - public Future quit() { - return dispatch(QUIT, new StatusOutput(codec)); - } - - public Future randomkey() { - return dispatch(RANDOMKEY, new ValueOutput(codec)); - } - - public Future rename(K key, K newKey) { - CommandArgs args = new CommandArgs(codec).addKey(key).addKey(newKey); - return dispatch(RENAME, new StatusOutput(codec), args); - } - - public Future renamenx(K key, K newKey) { - CommandArgs args = new CommandArgs(codec).addKey(key).addKey(newKey); - return dispatch(RENAMENX, new BooleanOutput(codec), args); - } - - public Future restore(K key, long ttl, byte[] value) { - CommandArgs args = new CommandArgs(codec).addKey(key).add(ttl).add(value); - return dispatch(RESTORE, new StatusOutput(codec), args); - } - - public Future rpop(K key) { - return dispatch(RPOP, new ValueOutput(codec), key); - } - - public Future rpoplpush(K source, K destination) { - CommandArgs args = new CommandArgs(codec).addKey(source).addKey(destination); - return dispatch(RPOPLPUSH, new ValueOutput(codec), args); - } - - public Future rpush(K key, V... values) { - CommandArgs args = new CommandArgs(codec).addKey(key).addMapValues(values); - return dispatch(RPUSH, new IntegerOutput(codec), args); - } - - public Future rpushx(K key, V value) { - return dispatch(RPUSHX, new IntegerOutput(codec), key, value); - } - - public Future sadd(K key, V... members) { - CommandArgs args = new CommandArgs(codec).addKey(key).addMapValues(members); - return dispatch(SADD, new IntegerOutput(codec), args); - } - - public Future save() { - return dispatch(SAVE, new StatusOutput(codec)); - } - - public Future scard(K key) { - return dispatch(SCARD, new IntegerOutput(codec), key); - } - - public Future> scriptExists(String... digests) { - CommandArgs args = new CommandArgs(codec).add(EXISTS); - for (String sha : digests) args.add(sha); - return dispatch(SCRIPT, new BooleanListOutput(codec), args); - } - - public Future scriptFlush() { - CommandArgs args = new CommandArgs(codec).add(FLUSH); - return dispatch(SCRIPT, new StatusOutput(codec), args); - } - - public Future scriptKill() { - CommandArgs args = new CommandArgs(codec).add(KILL); - return dispatch(SCRIPT, new StatusOutput(codec), args); - } - - public Future scriptLoad(V script) { - CommandArgs args = new CommandArgs(codec).add(LOAD).add(script.toString()); - return dispatch(SCRIPT, new StatusOutput(codec), args); - } - - public Future> sdiff(K... keys) { - CommandArgs args = new CommandArgs(codec).addKeys(keys); - return dispatch(SDIFF, new ValueSetOutput(codec), args); - } - - public Future sdiffstore(K destination, K... keys) { - CommandArgs args = new CommandArgs(codec).addKey(destination).addKeys(keys); - return dispatch(SDIFFSTORE, new IntegerOutput(codec), args); - } - - public String select(int db) { - CommandArgs args = new CommandArgs(codec).add(db); - Future cmd = dispatch(SELECT, new StatusOutput(codec), args); - String status = await(cmd, timeout, unit); - if ("OK".equals(status)) this.db = db; - return status; - } - - public Future set(K key, V value) { - return dispatch(SET, new StatusOutput(codec), key, value); - } - - public Future setbit(K key, long offset, int value) { - CommandArgs args = new CommandArgs(codec).addKey(key).add(offset).add(value); - return dispatch(SETBIT, new IntegerOutput(codec), args); - } - - public Future setex(K key, long seconds, V value) { - CommandArgs args = new CommandArgs(codec).addKey(key).add(seconds).addValue(value); - return dispatch(SETEX, new StatusOutput(codec), args); - } - - public Future psetex(K key, long millis, V value) { - CommandArgs args = new CommandArgs(codec).addKey(key).add(millis).addValue(value); - return dispatch(PSETEX, new StatusOutput(codec), args); - } - - public Future setnx(K key, V value) { - return dispatch(SETNX, new BooleanOutput(codec), key, value); - } - - public Future setexnx(K key, V value, long millis) { - CommandArgs args = new CommandArgs(codec).addKey(key).addValue(value).add("px").add(millis).add("nx"); - return dispatch(SET, new StatusOutput(codec), args); - } - - public Future setrange(K key, long offset, V value) { - CommandArgs args = new CommandArgs(codec).addKey(key).add(offset).addValue(value); - return dispatch(SETRANGE, new IntegerOutput(codec), args); - } - - @Deprecated - public void shutdown() { - dispatch(SHUTDOWN, new StatusOutput(codec)); - } - - public void shutdown(boolean save) { - CommandArgs args = new CommandArgs(codec); - dispatch(SHUTDOWN, new StatusOutput(codec), save ? args.add(SAVE) : args.add(NOSAVE)); - } - - public Future> sinter(K... keys) { - CommandArgs args = new CommandArgs(codec).addKeys(keys); - return dispatch(SINTER, new ValueSetOutput(codec), args); - } - - public Future sinterstore(K destination, K... keys) { - CommandArgs args = new CommandArgs(codec).addKey(destination).addKeys(keys); - return dispatch(SINTERSTORE, new IntegerOutput(codec), args); - } - - public Future sismember(K key, V member) { - CommandArgs args = new CommandArgs(codec).addKey(key).addMapValue(member); - return dispatch(SISMEMBER, new BooleanOutput(codec), args); - } - - public Future smove(K source, K destination, V member) { - CommandArgs args = new CommandArgs(codec).addKey(source).addKey(destination).addValue(member); - return dispatch(SMOVE, new BooleanOutput(codec), args); - } - - public Future slaveof(String host, int port) { - CommandArgs args = new CommandArgs(codec).add(host).add(port); - return dispatch(SLAVEOF, new StatusOutput(codec), args); - } - - public Future slaveofNoOne() { - CommandArgs args = new CommandArgs(codec).add(NO).add(ONE); - return dispatch(SLAVEOF, new StatusOutput(codec), args); - } - - public Future> slowlogGet() { - CommandArgs args = new CommandArgs(codec).add(GET); - return dispatch(SLOWLOG, new NestedMultiOutput(codec), args); - } - - public Future> slowlogGet(int count) { - CommandArgs args = new CommandArgs(codec).add(GET).add(count); - return dispatch(SLOWLOG, new NestedMultiOutput(codec), args); - } - - public Future slowlogLen() { - CommandArgs args = new CommandArgs(codec).add(LEN); - return dispatch(SLOWLOG, new IntegerOutput(codec), args); - } - - public Future slowlogReset() { - CommandArgs args = new CommandArgs(codec).add(RESET); - return dispatch(SLOWLOG, new StatusOutput(codec), args); - } - - public Future> smembers(K key) { - return dispatch(SMEMBERS, new ValueSetOutput(codec), key); - } - - public Future> sort(K key) { - return dispatch(SORT, new ValueListOutput(codec), key); - } - - public Future> sort(K key, SortArgs sortArgs) { - CommandArgs args = new CommandArgs(codec).addKey(key); - sortArgs.build(args, null); - return dispatch(SORT, new ValueListOutput(codec), args); - } - - public Future sortStore(K key, SortArgs sortArgs, K destination) { - CommandArgs args = new CommandArgs(codec).addKey(key); - sortArgs.build(args, destination); - return dispatch(SORT, new IntegerOutput(codec), args); - } - - public Future spop(K key) { - return dispatch(SPOP, new ValueOutput(codec), key); - } - - public Future srandmember(K key) { - return dispatch(SRANDMEMBER, new ValueOutput(codec), key); - } - - public Future> srandmember(K key, long count) { - CommandArgs args = new CommandArgs(codec).addKey(key).add(count); - return dispatch(SRANDMEMBER, new ValueSetOutput(codec), args); - } - - public Future srem(K key, V... members) { - CommandArgs args = new CommandArgs(codec).addKey(key).addMapValues(members); - return dispatch(SREM, new IntegerOutput(codec), args); - } - - public Future> sunion(K... keys) { - CommandArgs args = new CommandArgs(codec).addKeys(keys); - return dispatch(SUNION, new ValueSetOutput(codec), args); - } - - public Future sunionstore(K destination, K... keys) { - CommandArgs args = new CommandArgs(codec).addKey(destination).addKeys(keys); - return dispatch(SUNIONSTORE, new IntegerOutput(codec), args); - } - - public Future sync() { - return dispatch(SYNC, new StatusOutput(codec)); - } - - public Future strlen(K key) { - return dispatch(STRLEN, new IntegerOutput(codec), key); - } - - public Future ttl(K key) { - return dispatch(TTL, new IntegerOutput(codec), key); - } - - public Future type(K key) { - return dispatch(TYPE, new StatusOutput(codec), key); - } - - public Future watch(K... keys) { - CommandArgs args = new CommandArgs(codec).addKeys(keys); - return dispatch(WATCH, new StatusOutput(codec), args); - } - - public Future unwatch() { - return dispatch(UNWATCH, new StatusOutput(codec)); - } - - public Future zadd(K key, double score, V member) { - CommandArgs args = new CommandArgs(codec).addKey(key).add(score).addValue(member); - return dispatch(ZADD, new IntegerOutput(codec), args); - } - - @SuppressWarnings("unchecked") - public Future zadd(K key, Object... scoresAndValues) { - CommandArgs args = new CommandArgs(codec).addKey(key); - for (int i = 0; i < scoresAndValues.length; i += 2) { - args.add((Double) scoresAndValues[i]); - args.addValue((V) scoresAndValues[i + 1]); - } - return dispatch(ZADD, new IntegerOutput(codec), args); - } - - public Future zcard(K key) { - return dispatch(ZCARD, new IntegerOutput(codec), key); - } - - public Future zcount(K key, double min, double max) { - return zcount(key, string(min), string(max)); - } - - public Future zcount(K key, String min, String max) { - CommandArgs args = new CommandArgs(codec).addKey(key).add(min).add(max); - return dispatch(ZCOUNT, new IntegerOutput(codec), args); - } - - public Future zincrby(K key, double amount, K member) { - CommandArgs args = new CommandArgs(codec).addKey(key).add(amount).addKey(member); - return dispatch(ZINCRBY, new DoubleOutput(codec), args); - } - - public Future zinterstore(K destination, K... keys) { - return zinterstore(destination, new ZStoreArgs(), keys); - } - - public Future zinterstore(K destination, ZStoreArgs storeArgs, K... keys) { - CommandArgs args = new CommandArgs(codec).addKey(destination).add(keys.length).addKeys(keys); - storeArgs.build(args); - return dispatch(ZINTERSTORE, new IntegerOutput(codec), args); - } - - public Future> zrange(K key, long start, long stop) { - CommandArgs args = new CommandArgs(codec).addKey(key).add(start).add(stop); - return dispatch(ZRANGE, new ValueListOutput(codec), args); - } - - public Future>> zrangeWithScores(K key, long start, long stop) { - CommandArgs args = new CommandArgs(codec); - args.addKey(key).add(start).add(stop).add(WITHSCORES); - return dispatch(ZRANGE, new ScoredValueListOutput(codec), args); - } - - public Future> zrangebyscore(K key, double min, double max) { - return zrangebyscore(key, string(min), string(max)); - } - - public Future> zrangebyscore(K key, String min, String max) { - CommandArgs args = new CommandArgs(codec).addKey(key).add(min).add(max); - return dispatch(ZRANGEBYSCORE, new ValueListOutput(codec), args); - } - - public Future> zrangebyscore(K key, double min, double max, long offset, long count) { - return zrangebyscore(key, string(min), string(max), offset, count); - } - - public Future> zrangebyscore(K key, String min, String max, long offset, long count) { - CommandArgs args = new CommandArgs(codec); - args.addKey(key).add(min).add(max).add(LIMIT).add(offset).add(count); - return dispatch(ZRANGEBYSCORE, new ValueListOutput(codec), args); - } - - public Future>> zrangebyscoreWithScores(K key, double min, double max) { - return zrangebyscoreWithScores(key, string(min), string(max)); - } - - public Future>> zrangebyscoreWithScores(K key, String min, String max) { - CommandArgs args = new CommandArgs(codec); - args.addKey(key).add(min).add(max).add(WITHSCORES); - return dispatch(ZRANGEBYSCORE, new ScoredValueListOutput(codec), args); - } - - public Future>> zrangebyscoreWithScores(K key, double min, double max, long offset, long count) { - return zrangebyscoreWithScores(key, string(min), string(max), offset, count); - } - - public Future>> zrangebyscoreWithScores(K key, String min, String max, long offset, long count) { - CommandArgs args = new CommandArgs(codec); - args.addKey(key).add(min).add(max).add(WITHSCORES).add(LIMIT).add(offset).add(count); - return dispatch(ZRANGEBYSCORE, new ScoredValueListOutput(codec), args); - } - - public Future zrank(K key, V member) { - return dispatch(ZRANK, new IntegerOutput(codec), key, member); - } - - public Future zrem(K key, V... members) { - return dispatch(ZREM, new IntegerOutput(codec), key, members); - } - - public Future zremrangebyrank(K key, long start, long stop) { - CommandArgs args = new CommandArgs(codec).addKey(key).add(start).add(stop); - return dispatch(ZREMRANGEBYRANK, new IntegerOutput(codec), args); - } - - public Future zremrangebyscore(K key, double min, double max) { - return zremrangebyscore(key, string(min), string(max)); - } - - public Future zremrangebyscore(K key, String min, String max) { - CommandArgs args = new CommandArgs(codec).addKey(key).add(min).add(max); - return dispatch(ZREMRANGEBYSCORE, new IntegerOutput(codec), args); - } - - public Future> zrevrange(K key, long start, long stop) { - CommandArgs args = new CommandArgs(codec).addKey(key).add(start).add(stop); - return dispatch(ZREVRANGE, new ValueListOutput(codec), args); - } - - public Future>> zrevrangeWithScores(K key, long start, long stop) { - CommandArgs args = new CommandArgs(codec); - args.addKey(key).add(start).add(stop).add(WITHSCORES); - return dispatch(ZREVRANGE, new ScoredValueListOutput(codec), args); - } - - public Future> zrevrangebyscore(K key, double max, double min) { - return zrevrangebyscore(key, string(max), string(min)); - } - - public Future> time() { - return dispatch(TIME, new StringListOutput(codec)); - } - - public Future> zrevrangebyscore(K key, String max, String min) { - CommandArgs args = new CommandArgs(codec).addKey(key).add(max).add(min); - return dispatch(ZREVRANGEBYSCORE, new ValueListOutput(codec), args); - } - - public Future> zrevrangebyscore(K key, double max, double min, long offset, long count) { - return zrevrangebyscore(key, string(max), string(min), offset, count); - } - - public Future> zrevrangebyscore(K key, String max, String min, long offset, long count) { - CommandArgs args = new CommandArgs(codec); - args.addKey(key).add(max).add(min).add(LIMIT).add(offset).add(count); - return dispatch(ZREVRANGEBYSCORE, new ValueListOutput(codec), args); - } - - public Future>> zrevrangebyscoreWithScores(K key, double max, double min) { - return zrevrangebyscoreWithScores(key, string(max), string(min)); - } - - public Future>> zrevrangebyscoreWithScores(K key, String max, String min) { - CommandArgs args = new CommandArgs(codec); - args.addKey(key).add(max).add(min).add(WITHSCORES); - return dispatch(ZREVRANGEBYSCORE, new ScoredValueListOutput(codec), args); - } - - public Future>> zrevrangebyscoreWithScores(K key, double max, double min, long offset, long count) { - return zrevrangebyscoreWithScores(key, string(max), string(min), offset, count); - } - - public Future>> zrevrangebyscoreWithScores(K key, String max, String min, long offset, long count) { - CommandArgs args = new CommandArgs(codec); - args.addKey(key).add(max).add(min).add(WITHSCORES).add(LIMIT).add(offset).add(count); - return dispatch(ZREVRANGEBYSCORE, new ScoredValueListOutput(codec), args); - } - - public Future zrevrank(K key, V member) { - return dispatch(ZREVRANK, new IntegerOutput(codec), key, member); - } - - public Future zscore(K key, V member) { - return dispatch(ZSCORE, new DoubleOutput(codec), key, member); - } - - public Future zunionstore(K destination, K... keys) { - return zunionstore(destination, new ZStoreArgs(), keys); - } - - public Future zunionstore(K destination, ZStoreArgs storeArgs, K... keys) { - CommandArgs args = new CommandArgs(codec); - args.addKey(destination).add(keys.length).addKeys(keys); - storeArgs.build(args); - return dispatch(ZUNIONSTORE, new IntegerOutput(codec), args); - } - - public Future pfadd(K key, V... values) { - CommandArgs args = new CommandArgs(codec).addKey(key).addValues(values); - return dispatch(PFADD, new IntegerOutput(codec), args); - } - - public Future pfcount(K key, K... keys) { - CommandArgs args = new CommandArgs(codec).addKey(key).addKeys(keys); - return dispatch(PFCOUNT, new IntegerOutput(codec), args); - } - - public Future pfmerge(K destkey, K... sourceKeys) { - CommandArgs args = new CommandArgs(codec).addKeys(destkey).addKeys(sourceKeys); - return dispatch(PFADD, new IntegerOutput(codec), args); - } - - public Future> getMasterAddrByKey(K name) { - CommandArgs args = new CommandArgs(codec).add("get-master-addr-by-name").addKey(name); - return dispatch(SENTINEL, new ValueListOutput(codec), args); - } - - public Future>> slaves(K key) { - CommandArgs args = new CommandArgs(codec).add("slaves").addKey(key); - return dispatch(SENTINEL, new ListMapOutput(codec), args); - } - - public Future> sscan(K key, long startValue) { - CommandArgs args = new CommandArgs(codec).addKey(key).add(startValue); - return dispatch(SSCAN, new ValueSetScanOutput(codec), args); - } - - public Future> zscan(K key, long startValue) { - CommandArgs args = new CommandArgs(codec).addKey(key).add(startValue); - return dispatch(ZSCAN, new ListScanOutput(codec), args); - } - - public Future clusterNodes() { - CommandArgs args = new CommandArgs(codec).add(CommandKeyword.NODES); - return dispatch(CLUSTER, new StatusOutput(codec), args); - } - - /** - * Wait until commands are complete or the connection timeout is reached. - * - * @param futures Futures to wait for. - * - * @return True if all futures complete in time. - */ - public boolean awaitAll(Future... futures) { - return awaitAll(timeout, unit, futures); - } - - /** - * Wait until futures are complete or the supplied timeout is reached. - * - * @param timeout Maximum time to wait for futures to complete. - * @param unit Unit of time for the timeout. - * @param futures Futures to wait for. - * - * @return True if all futures complete in time. - */ - public boolean awaitAll(long timeout, TimeUnit unit, Future... futures) { - boolean complete; - - try { - long nanos = unit.toNanos(timeout); - long time = System.nanoTime(); - - for (Future f : futures) { - if (nanos < 0) return false; - f.get(nanos, TimeUnit.NANOSECONDS); - long now = System.nanoTime(); - nanos -= now - time; - time = now; - } - - complete = true; - } catch (TimeoutException e) { - complete = false; - } catch (Exception e) { - throw new RedisCommandInterruptedException(e); - } - - return complete; - } - - /** - * Close the connection. - */ - public synchronized void close() { - setReconnect(false); - if (!closed && channel != null) { - closed = true; - channel.close(); - } - } - - public String digest(V script) { - try { - MessageDigest md = MessageDigest.getInstance("SHA1"); - md.update(codec.encodeValue(script)); - return new String(Base16.encode(md.digest(), false)); - } catch (NoSuchAlgorithmException e) { - throw new RedisException("JVM does not support SHA1"); - } - } - - @Override - public synchronized void channelActive(ChannelHandlerContext ctx) throws Exception { - channel = ctx.channel(); - - List> tmp = new ArrayList>(queue.size() + 2); - - if (password != null) { - CommandArgs args = new CommandArgs(codec).add(password); - tmp.add(new Command(AUTH, new StatusOutput(codec), args, false, ctx.executor().newPromise())); - } - - if (db != 0) { - CommandArgs args = new CommandArgs(codec).add(db); - tmp.add(new Command(SELECT, new StatusOutput(codec), args, false, ctx.executor().newPromise())); - } - - tmp.addAll(queue); - queue.clear(); - - for (Command cmd : tmp) { - if (!cmd.getPromise().isCancelled()) { - queue.add(cmd); - channel.writeAndFlush(cmd); - } - } - - tmp.clear(); - } - - @Override - public synchronized void channelInactive(ChannelHandlerContext ctx) throws Exception { - if (closed) { - for (Command cmd : queue) { - if (cmd.getOutput() != null) { - cmd.getOutput().setError("Connection closed"); - } - cmd.complete(); - } - queue.clear(); - queue = null; - channel = null; - } - } - - public Future dispatch(CommandType type, CommandOutput output) { - return dispatch(type, output, (CommandArgs) null); - } - - public Future dispatch(CommandType type, CommandOutput output, K key) { - CommandArgs args = new CommandArgs(codec).addKey(key); - return dispatch(type, output, args); - } - - public Future dispatch(CommandType type, CommandOutput output, K key, V value) { - CommandArgs args = new CommandArgs(codec).addKey(key).addValue(value); - return dispatch(type, output, args); - } - - public Future dispatch(CommandType type, CommandOutput output, K key, V[] values) { - CommandArgs args = new CommandArgs(codec).addKey(key).addValues(values); - return dispatch(type, output, args); - } - - public synchronized Promise dispatch(CommandType type, CommandOutput output, CommandArgs args) { - if (queue == null) { - throw new RedisConnectionClosedException("Connection is closed"); - } - - Promise promise = eventLoopGroup.next().newPromise(); - Command cmd = new Command(type, output, args, multi != null, promise); - - try { - if (multi != null) { - multi.add(cmd); - } - - queue.put(cmd); - - if (channel != null) { - channel.writeAndFlush(cmd); - } - } catch (InterruptedException e) { - throw new RedisCommandInterruptedException(e); - } - - if (multi != null && type != MULTI) { - Promise p = eventLoopGroup.next().newPromise(); - p.setSuccess(null); - return p; - } - return promise; - } - - public T await(Future cmd, long timeout, TimeUnit unit) { - if (!cmd.awaitUninterruptibly(timeout, unit)) { - Promise promise = (Promise)cmd; - RedisTimeoutException ex = new RedisTimeoutException(); - promise.setFailure(ex); - throw ex; - } - if (!cmd.isSuccess()) { - throw (RedisException) cmd.cause(); - } - return cmd.getNow(); - } - - public T awaitInterruptibly(Future cmd, long timeout, TimeUnit unit) throws InterruptedException { - if (!cmd.await(timeout, unit)) { - Promise promise = (Promise)cmd; - RedisTimeoutException ex = new RedisTimeoutException(); - promise.setFailure(ex); - throw ex; - } - if (!cmd.isSuccess()) { - throw (RedisException) cmd.cause(); - } - return cmd.getNow(); - } - - public RedisClient getRedisClient() { - return redisClient; - } - - @SuppressWarnings("unchecked") - protected CommandOutput newScriptOutput(RedisCodec codec, ScriptOutputType type) { - switch (type) { - case BOOLEAN: return (CommandOutput) new BooleanOutput(codec); - case INTEGER: return (CommandOutput) new IntegerOutput(codec); - case STATUS: return (CommandOutput) new StatusOutput(codec); - case MULTI: return (CommandOutput) new NestedMultiOutput(codec); - case VALUE: return (CommandOutput) new ValueOutput(codec); - case MAPVALUE: return (CommandOutput) new MapValueOutput(codec); - case MAPVALUELIST: return (CommandOutput) new MapValueListOutput(codec); - default: throw new RedisException("Unsupported script output type"); - } - } - - public String string(double n) { - if (Double.isInfinite(n)) { - return (n > 0) ? "+inf" : "-inf"; - } - return Double.toString(n); - } -} diff --git a/src/main/java/com/lambdaworks/redis/RedisClient.java b/src/main/java/com/lambdaworks/redis/RedisClient.java deleted file mode 100644 index 093669888..000000000 --- a/src/main/java/com/lambdaworks/redis/RedisClient.java +++ /dev/null @@ -1,223 +0,0 @@ -// Copyright (C) 2011 - Will Glozer. All rights reserved. - -package com.lambdaworks.redis; - -import io.netty.bootstrap.Bootstrap; -import io.netty.channel.Channel; -import io.netty.channel.ChannelFuture; -import io.netty.channel.ChannelInitializer; -import io.netty.channel.ChannelOption; -import io.netty.channel.ChannelPipeline; -import io.netty.channel.EventLoopGroup; -import io.netty.channel.group.ChannelGroup; -import io.netty.channel.group.ChannelGroupFuture; -import io.netty.channel.group.DefaultChannelGroup; -import io.netty.channel.socket.SocketChannel; -import io.netty.channel.socket.nio.NioSocketChannel; -import io.netty.util.concurrent.GlobalEventExecutor; - -import java.net.InetSocketAddress; -import java.util.concurrent.BlockingQueue; -import java.util.concurrent.LinkedBlockingQueue; -import java.util.concurrent.TimeUnit; - -import com.lambdaworks.redis.codec.RedisCodec; -import com.lambdaworks.redis.codec.Utf8StringCodec; -import com.lambdaworks.redis.protocol.Command; -import com.lambdaworks.redis.protocol.CommandHandler; -import com.lambdaworks.redis.protocol.ConnectionWatchdog; -import com.lambdaworks.redis.pubsub.PubSubCommandHandler; -import com.lambdaworks.redis.pubsub.RedisPubSubConnection; - -/** - * A scalable thread-safe Redis client. Multiple threads - * may share one connection provided they avoid blocking and transactional operations - * such as BLPOP and MULTI/EXEC. - * - * @author Will Glozer - */ -public class RedisClient { - - private Bootstrap bootstrap; - private ChannelGroup channels; - private long timeout; - private TimeUnit unit; - private InetSocketAddress addr; - - /** - * Create a new client that connects to the supplied host on the default port. - * - * @param host Server hostname. - */ - public RedisClient(EventLoopGroup group, String host) { - this(group, host, 6379, 60000); - } - - /** - * Create a new client that connects to the supplied host and port. Connection - * attempts and non-blocking commands will {@link #setDefaultTimeout timeout} - * after 60 seconds. - * - * @param host Server hostname. - * @param port Server port. - */ - public RedisClient(EventLoopGroup group, String host, int port, int timeout) { - this(group, NioSocketChannel.class, host, port, timeout); - } - - public RedisClient(EventLoopGroup group, Class socketChannelClass, String host, - int port, int timeout) { - addr = new InetSocketAddress(host, port); - - bootstrap = new Bootstrap().channel(socketChannelClass).group(group).remoteAddress(addr); - - setDefaultTimeout(timeout, TimeUnit.MILLISECONDS); - - channels = new DefaultChannelGroup(GlobalEventExecutor.INSTANCE); - } - - /** - * Set the default timeout for {@link RedisConnection connections} created by - * this client. The timeout applies to connection attempts and non-blocking - * commands. - * - * @param timeout Default connection timeout. - * @param unit Unit of time for the timeout. - */ - public void setDefaultTimeout(long timeout, TimeUnit unit) { - this.timeout = timeout; - this.unit = unit; - bootstrap.option(ChannelOption.CONNECT_TIMEOUT_MILLIS, (int) unit.toMillis(timeout)); - } - - /** - * Open a new synchronous connection to the redis server that treats - * keys and values as UTF-8 strings. - * - * @return A new connection. - */ - public RedisConnection connect() { - return connect(new Utf8StringCodec()); - } - - /** - * Open a new asynchronous connection to the redis server that treats - * keys and values as UTF-8 strings. - * - * @return A new connection. - */ - public RedisAsyncConnection connectAsync() { - return connectAsync(new Utf8StringCodec()); - } - - /** - * Open a new pub/sub connection to the redis server that treats - * keys and values as UTF-8 strings. - * - * @return A new connection. - */ - public RedisPubSubConnection connectPubSub() { - return connectPubSub(new Utf8StringCodec()); - } - - /** - * Open a new synchronous connection to the redis server. Use the supplied - * {@link RedisCodec codec} to encode/decode keys and values. - * - * @param codec Use this codec to encode/decode keys and values. - * - * @return A new connection. - */ - public RedisConnection connect(RedisCodec codec) { - return new RedisConnection(connectAsync(codec)); - } - - /** - * Open a new asynchronous connection to the redis server. Use the supplied - * {@link RedisCodec codec} to encode/decode keys and values. - * - * @param codec Use this codec to encode/decode keys and values. - * - * @return A new connection. - */ - public RedisAsyncConnection connectAsync(RedisCodec codec) { - BlockingQueue> queue = new LinkedBlockingQueue>(); - - CommandHandler handler = new CommandHandler(queue); - RedisAsyncConnection connection = new RedisAsyncConnection(this, queue, codec, timeout, unit, bootstrap.group()); - - return connect(handler, connection); - } - - /** - * Open a new pub/sub connection to the redis server. Use the supplied - * {@link RedisCodec codec} to encode/decode keys and values. - * - * @param codec Use this codec to encode/decode keys and values. - * - * @return A new pub/sub connection. - */ - public RedisPubSubConnection connectPubSub(RedisCodec codec) { - BlockingQueue> queue = new LinkedBlockingQueue>(); - - PubSubCommandHandler handler = new PubSubCommandHandler(queue, codec); - RedisPubSubConnection connection = new RedisPubSubConnection(this, queue, codec, timeout, unit, bootstrap.group()); - - return connect(handler, connection); - } - - private > T connect(final CommandHandler handler, final T connection) { - try { - final ConnectionWatchdog watchdog = new ConnectionWatchdog(bootstrap, channels); - - ChannelFuture connect = null; - // TODO use better concurrent workaround - synchronized (bootstrap) { - connect = bootstrap.handler(new ChannelInitializer() { - @Override - protected void initChannel(Channel ch) throws Exception { - ch.pipeline().addLast(watchdog, handler, connection); - } - }).connect(); - } - connect.sync(); - - connection.setReconnect(true); - - return connection; - } catch (Throwable e) { - throw new RedisConnectionException("Unable to connect " + addr, e); - } - } - - /** - * Shutdown this client and close all open connections. The client should be - * discarded after calling shutdown. - */ - public void shutdown() { - ChannelGroupFuture future = shutdownAsync(); - future.awaitUninterruptibly(); - } - - public ChannelGroupFuture shutdownAsync() { - bootstrap.attr(ConnectionWatchdog.SHUTDOWN_KEY, true); - - for (Channel c : channels) { - ChannelPipeline pipeline = c.pipeline(); - RedisAsyncConnection connection = pipeline.get(RedisAsyncConnection.class); - connection.close(); - } - return channels.close(); - } - - public InetSocketAddress getAddr() { - return addr; - } - - @Override - public String toString() { - return "RedisClient [addr=" + addr + "]"; - } - -} - diff --git a/src/main/java/com/lambdaworks/redis/RedisCommandInterruptedException.java b/src/main/java/com/lambdaworks/redis/RedisCommandInterruptedException.java deleted file mode 100644 index 98b28c4a0..000000000 --- a/src/main/java/com/lambdaworks/redis/RedisCommandInterruptedException.java +++ /dev/null @@ -1,16 +0,0 @@ -// Copyright (C) 2011 - Will Glozer. All rights reserved. - -package com.lambdaworks.redis; - -/** - * Exception thrown when the thread executing a redis command is - * interrupted. - * - * @author Will Glozer - */ -@SuppressWarnings("serial") -public class RedisCommandInterruptedException extends RedisException { - public RedisCommandInterruptedException(Throwable e) { - super("Command interrupted", e); - } -} diff --git a/src/main/java/com/lambdaworks/redis/RedisConnection.java b/src/main/java/com/lambdaworks/redis/RedisConnection.java deleted file mode 100644 index 3ee1927c8..000000000 --- a/src/main/java/com/lambdaworks/redis/RedisConnection.java +++ /dev/null @@ -1,871 +0,0 @@ -// Copyright (C) 2011 - Will Glozer. All rights reserved. - -package com.lambdaworks.redis; - -import static java.lang.Math.max; -import static java.util.concurrent.TimeUnit.SECONDS; -import io.netty.util.concurrent.Future; - -import java.util.Date; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.concurrent.TimeUnit; - -import com.lambdaworks.redis.output.ListScanResult; -import com.lambdaworks.redis.protocol.ConnectionWatchdog; - -/** - * A synchronous thread-safe connection to a redis server. Multiple threads may - * share one {@link RedisConnection} provided they avoid blocking and transactional - * operations such as {@link #blpop} and {@link #multi()}/{@link #exec}. - * - * A {@link ConnectionWatchdog} monitors each connection and reconnects - * automatically until {@link #close} is called. All pending commands will be - * (re)sent after successful reconnection. - * - * @author Will Glozer - */ -public class RedisConnection { - protected RedisAsyncConnection c; - protected long timeout; - protected TimeUnit unit; - - public RedisClient getRedisClient() { - return c.getRedisClient(); - } - - /** - * Initialize a new connection. - * - * @param c Underlying async connection. - */ - public RedisConnection(RedisAsyncConnection c) { - this.c = c; - this.timeout = c.timeout; - this.unit = c.unit; - } - - /** - * Set the command timeout for this connection. - * - * @param timeout Command timeout. - * @param unit Unit of time for the timeout. - */ - public void setTimeout(long timeout, TimeUnit unit) { - this.timeout = timeout; - this.unit = unit; - c.setTimeout(timeout, unit); - } - - public Long append(K key, V value) { - return await(c.append(key, value)); - } - - public String auth(String password) { - return c.auth(password); - } - - public String bgrewriteaof() { - return await(c.bgrewriteaof()); - } - - public String bgsave() { - return await(c.bgsave()); - } - - public Long bitcount(K key) { - return await(c.bitcount(key)); - } - - public Long bitcount(K key, long start, long end) { - return await(c.bitcount(key, start, end)); - } - - public Long bitopAnd(K destination, K... keys) { - return await(c.bitopAnd(destination, keys)); - } - - public Long bitopNot(K destination, K source) { - return await(c.bitopNot(destination, source)); - } - - public Long bitopOr(K destination, K... keys) { - return await(c.bitopOr(destination, keys)); - } - public Long bitopXor(K destination, K... keys) { - return await(c.bitopXor(destination, keys)); - } - - public KeyValue blpop(long timeout, K... keys) throws InterruptedException { - long timeout2 = (timeout == 0 ? Long.MAX_VALUE : max(timeout, unit.toSeconds(this.timeout))); - return awaitInterruptibly(c.blpop(timeout, keys), timeout2, SECONDS); - } - - public KeyValue brpop(long timeout, K... keys) { - long timeout2 = (timeout == 0 ? Long.MAX_VALUE : max(timeout, unit.toSeconds(this.timeout))); - return await(c.brpop(timeout, keys), timeout2, SECONDS); - } - - public V brpoplpush(long timeout, K source, K destination) throws InterruptedException { - long timeout2 = (timeout == 0 ? Long.MAX_VALUE : max(timeout, unit.toSeconds(this.timeout))); - return awaitInterruptibly(c.brpoplpush(timeout, source, destination), timeout2, SECONDS); - } - - public K clientGetname() { - return await(c.clientGetname()); - } - - public String clientSetname(K name) { - return await(c.clientSetname(name)); - } - - public String clientKill(String addr) { - return await(c.clientKill(addr)); - } - - public String clientList() { - return await(c.clientList()); - } - - public List configGet(String parameter) { - return await(c.configGet(parameter)); - } - - public String configResetstat() { - return await(c.configResetstat()); - } - - public String configSet(String parameter, String value) { - return await(c.configSet(parameter, value)); - } - - public Long dbsize() { - return await(c.dbsize()); - } - - public String debugObject(K key) { - return await(c.debugObject(key)); - } - - public Long decr(K key) { - return await(c.decr(key)); - } - - public Long decrby(K key, long amount) { - return await(c.decrby(key, amount)); - } - - public Long del(K... keys) { - return await(c.del(keys)); - } - - public String discard() { - return await(c.discard()); - } - - public byte[] dump(K key) { - return await(c.dump(key)); - } - - public V echo(V msg) { - return await(c.echo(msg)); - } - - /** - * Eval the supplied script, which must result in the requested - * {@link ScriptOutputType type}. - * - * @param script Lua script to evaluate. - * @param type Script output type. - * @param keys Redis keys to pass to script. - * - * @param Expected return type. - * - * @return The result of evaluating the script. - */ - @SuppressWarnings("unchecked") - public T eval(V script, ScriptOutputType type, K... keys) { - return (T) await(c.eval(script, type, keys, (V[]) new Object[0])); - } - - @SuppressWarnings("unchecked") - public T eval(V script, ScriptOutputType type, K[] keys, V... values) { - return (T) await(c.eval(script, type, keys, values)); - } - - /** - * Eval a pre-loaded script identified by its SHA-1 digest, which must result - * in the requested {@link ScriptOutputType type}. - * - * @param digest Lowercase hex string of script's SHA-1 digest. - * @param type Script output type. - * @param keys Redis keys to pass to script. - * - * @param Expected return type. - * - * @return The result of evaluating the script. - */ - @SuppressWarnings("unchecked") - public T evalsha(String digest, ScriptOutputType type, K... keys) { - return (T) await(c.evalsha(digest, type, keys, (V[]) new Object[0])); - } - - @SuppressWarnings("unchecked") - public T evalsha(String digest, ScriptOutputType type, K[] keys, V... values) { - return (T) await(c.evalsha(digest, type, keys, values)); - } - - public Long pfadd(K key, V... values) { - return await(c.pfadd(key, values)); - } - - public Long pfcount(K key, K... keys) { - return await(c.pfcount(key, keys)); - } - - public Long pfmerge(K destkey, K... sourceKeys) { - return await(c.pfmerge(destkey, sourceKeys)); - } - - public Boolean exists(K key) { - return await(c.exists(key)); - } - - public Boolean expire(K key, long seconds) { - return await(c.expire(key, seconds)); - } - - public Boolean expireat(K key, Date timestamp) { - return await(c.expireat(key, timestamp)); - } - - public Boolean expireat(K key, long timestamp) { - return await(c.expireat(key, timestamp)); - } - - public List exec() { - return await(c.exec()); - } - - public String flushall() { - return await(c.flushall()); - } - - public String flushdb() { - return await(c.flushdb()); - } - - public V get(K key) { - return await(c.get(key)); - } - - public Long getbit(K key, long offset) { - return await(c.getbit(key, offset)); - } - - public V getrange(K key, long start, long end) { - return await(c.getrange(key, start, end)); - } - - public V getset(K key, V value) { - return await(c.getset(key, value)); - } - - public Long hdel(K key, K... fields) { - return await(c.hdel(key, fields)); - } - - public Boolean hexists(K key, K field) { - return await(c.hexists(key, field)); - } - - public V hget(K key, K field) { - return await(c.hget(key, field)); - } - - public Long hincrby(K key, K field, long amount) { - return await(c.hincrby(key, field, amount)); - } - - public String hincrbyfloat(K key, K field, String amount) { - return await(c.hincrbyfloat(key, field, amount)); - } - - public Map hgetall(K key) { - return await(c.hgetall(key)); - } - - public Set hkeys(K key) { - return await(c.hkeys(key)); - } - - public Long hlen(K key) { - return await(c.hlen(key)); - } - - public List hmget(K key, K... fields) { - return await(c.hmget(key, fields)); - } - - public String hmset(K key, Map map) { - return await(c.hmset(key, map)); - } - - public Boolean hset(K key, K field, V value) { - return await(c.hset(key, field, value)); - } - - public Boolean hsetnx(K key, K field, V value) { - return await(c.hsetnx(key, field, value)); - } - - public List hvals(K key) { - return await(c.hvals(key)); - } - - public Long incr(K key) { - return await(c.incr(key)); - } - - public Long incrby(K key, long amount) { - return await(c.incrby(key, amount)); - } - - public String incrbyfloat(K key, String amount) { - return await(c.incrbyfloat(key, amount)); - } - - public String info() { - return await(c.info()); - } - - public String info(String section) { - return await(c.info(section)); - } - - public List keys(K pattern) { - return await(c.keys(pattern)); - } - - public Date lastsave() { - return await(c.lastsave()); - } - - public V lindex(K key, long index) { - return await(c.lindex(key, index)); - } - - public Long linsert(K key, boolean before, V pivot, V value) { - return await(c.linsert(key, before, pivot, value)); - } - - public Long llen(K key) { - return await(c.llen(key)); - } - - public V lpop(K key) { - return await(c.lpop(key)); - } - - public Long lpush(K key, V... values) { - return await(c.lpush(key, values)); - } - - public Long lpushx(K key, V value) { - return await(c.lpushx(key, value)); - } - - public List lrange(K key, long start, long stop) { - return await(c.lrange(key, start, stop)); - } - - public Long lrem(K key, long count, V value) { - return await(c.lrem(key, count, value)); - } - - public String lset(K key, long index, V value) { - return await(c.lset(key, index, value)); - } - - public String ltrim(K key, long start, long stop) { - return await(c.ltrim(key, start, stop)); - } - - public String migrate(String host, int port, K key, int db, long timeout) { - return await(c.migrate(host, port, key, db, timeout)); - } - - public List mget(K... keys) { - return await(c.mget(keys)); - } - - public Boolean move(K key, int db) { - return await(c.move(key, db)); - } - - public String multi() { - return await(c.multi()); - } - - public String mset(Map map) { - return await(c.mset(map)); - } - - public Boolean msetnx(Map map) { - return await(c.msetnx(map)); - } - - public String objectEncoding(K key) { - return await(c.objectEncoding(key)); - } - - public Long objectIdletime(K key) { - return await(c.objectIdletime(key)); - } - - public Long objectRefcount(K key) { - return await(c.objectRefcount(key)); - } - - public Boolean persist(K key) { - return await(c.persist(key)); - } - - public Boolean pexpire(K key, long milliseconds) { - return await(c.pexpire(key, milliseconds)); - } - - public Boolean pexpireat(K key, Date timestamp) { - return await(c.pexpireat(key, timestamp)); - } - - public Boolean pexpireat(K key, long timestamp) { - return await(c.pexpireat(key, timestamp)); - } - - - public String ping() { - return await(c.ping()); - } - - public Long pttl(K key) { - return await(c.pttl(key)); - } - - public Long publish(K channel, V message) { - return await(c.publish(channel, message)); - } - - public String quit() { - return await(c.quit()); - } - - public V randomkey() { - return await(c.randomkey()); - } - - public String rename(K key, K newKey) { - return await(c.rename(key, newKey)); - } - - public Boolean renamenx(K key, K newKey) { - return await(c.renamenx(key, newKey)); - } - - public String restore(K key, long ttl, byte[] value) { - return await(c.restore(key, ttl, value)); - } - - public V rpop(K key) { - return await(c.rpop(key)); - } - - public V rpoplpush(K source, K destination) { - return await(c.rpoplpush(source, destination)); - } - - public Long rpush(K key, V... values) { - return await(c.rpush(key, values)); - } - - public Long rpushx(K key, V value) { - return await(c.rpushx(key, value)); - } - - public Long sadd(K key, V... members) { - return await(c.sadd(key, members)); - } - - public String save() { - return await(c.save()); - } - - public Long scard(K key) { - return await(c.scard(key)); - } - - public List scriptExists(String... digests) { - return await(c.scriptExists(digests)); - } - - public String scriptFlush() { - return await(c.scriptFlush()); - } - - public String scriptKill() { - return await(c.scriptKill()); - } - - public String scriptLoad(V script) { - return await(c.scriptLoad(script)); - } - - public Set sdiff(K... keys) { - return await(c.sdiff(keys)); - } - - public Long sdiffstore(K destination, K... keys) { - return await(c.sdiffstore(destination, keys)); - } - - public String select(int db) { - return c.select(db); - } - - public String set(K key, V value) { - return await(c.set(key, value)); - } - - public Long setbit(K key, long offset, int value) { - return await(c.setbit(key, offset, value)); - } - - public String setex(K key, long seconds, V value) { - return await(c.setex(key, seconds, value)); - } - - public String psetex(K key, long millis, V value) { - return await(c.psetex(key, millis, value)); - } - - public Boolean setnx(K key, V value) { - return await(c.setnx(key, value)); - } - - public String setexnx(K key, V value, long millis) { - return await(c.setexnx(key, value, millis)); - } - - public Long setrange(K key, long offset, V value) { - return await(c.setrange(key, offset, value)); - } - - @Deprecated - public void shutdown() { - c.shutdown(); - } - - public void shutdown(boolean save) { - c.shutdown(save); - } - - public Set sinter(K... keys) { - return await(c.sinter(keys)); - } - - public Long sinterstore(K destination, K... keys) { - return await(c.sinterstore(destination, keys)); - } - - public Boolean sismember(K key, V member) { - return await(c.sismember(key, member)); - } - - public Boolean smove(K source, K destination, V member) { - return await(c.smove(source, destination, member)); - } - - public String slaveof(String host, int port) { - return await(c.slaveof(host, port)); - } - - public String slaveofNoOne() { - return await(c.slaveofNoOne()); - } - - public List slowlogGet() { - return await(c.slowlogGet()); - } - - public List slowlogGet(int count) { - return await(c.slowlogGet(count)); - } - - public Long slowlogLen() { - return await(c.slowlogLen()); - } - - public String slowlogReset() { - return await(c.slowlogReset()); - } - - public Set smembers(K key) { - return await(c.smembers(key)); - } - - public List sort(K key) { - return await(c.sort(key)); - } - - public List sort(K key, SortArgs sortArgs) { - return await(c.sort(key, sortArgs)); - } - - public Long sortStore(K key, SortArgs sortArgs, K destination) { - return await(c.sortStore(key, sortArgs, destination)); - } - - public V spop(K key) { - return await(c.spop(key)); - } - - public V srandmember(K key) { - return await(c.srandmember(key)); - } - - public Set srandmember(K key, long count) { - return await(c.srandmember(key, count)); - } - - public Long srem(K key, V... members) { - return await(c.srem(key, members)); - } - - public Set sunion(K... keys) { - return await(c.sunion(keys)); - } - - public Long sunionstore(K destination, K... keys) { - return await(c.sunionstore(destination, keys)); - } - - public String sync() { - return await(c.sync()); - } - - public Long strlen(K key) { - return await(c.strlen(key)); - } - - public Long ttl(K key) { - return await(c.ttl(key)); - } - - public String type(K key) { - return await(c.type(key)); - } - - public String watch(K... keys) { - return await(c.watch(keys)); - } - - public String unwatch() { - return await(c.unwatch()); - } - - public Long zadd(K key, double score, V member) { - return await(c.zadd(key, score, member)); - } - - public Long zadd(K key, Object... scoresAndValues) { - return await(c.zadd(key, scoresAndValues)); - } - - public Long zcard(K key) { - return await(c.zcard(key)); - } - - public Long zcount(K key, double min, double max) { - return await(c.zcount(key, min, max)); - } - - public Long zcount(K key, String min, String max) { - return await(c.zcount(key, min, max)); - } - - public Double zincrby(K key, double amount, K member) { - return await(c.zincrby(key, amount, member)); - } - - public Long zinterstore(K destination, K... keys) { - return await(c.zinterstore(destination, keys)); - } - - public Long zinterstore(K destination, ZStoreArgs storeArgs, K... keys) { - return await(c.zinterstore(destination, storeArgs, keys)); - } - - public List zrange(K key, long start, long stop) { - return await(c.zrange(key, start, stop)); - } - - public List> zrangeWithScores(K key, long start, long stop) { - return await(c.zrangeWithScores(key, start, stop)); - } - - public List zrangebyscore(K key, double min, double max) { - return await(c.zrangebyscore(key, min, max)); - } - - public List zrangebyscore(K key, String min, String max) { - return await(c.zrangebyscore(key, min, max)); - } - - public List zrangebyscore(K key, double min, double max, long offset, long count) { - return await(c.zrangebyscore(key, min, max, offset, count)); - } - - public List zrangebyscore(K key, String min, String max, long offset, long count) { - return await(c.zrangebyscore(key, min, max, offset, count)); - } - - public List> zrangebyscoreWithScores(K key, double min, double max) { - return await(c.zrangebyscoreWithScores(key, min, max)); - } - - public List> zrangebyscoreWithScores(K key, String min, String max) { - return await(c.zrangebyscoreWithScores(key, min, max)); - } - - public List> zrangebyscoreWithScores(K key, double min, double max, long offset, long count) { - return await(c.zrangebyscoreWithScores(key, min, max, offset, count)); - } - - public List> zrangebyscoreWithScores(K key, String min, String max, long offset, long count) { - return await(c.zrangebyscoreWithScores(key, min, max, offset, count)); - } - - public Long zrank(K key, V member) { - return await(c.zrank(key, member)); - } - - public Long zrem(K key, V... members) { - return await(c.zrem(key, members)); - } - - public Long zremrangebyrank(K key, long start, long stop) { - return await(c.zremrangebyrank(key, start, stop)); - } - - public Long zremrangebyscore(K key, double min, double max) { - return await(c.zremrangebyscore(key, min, max)); - } - - public Long zremrangebyscore(K key, String min, String max) { - return await(c.zremrangebyscore(key, min, max)); - } - - public List time() { - return await(c.time()); - } - - public List zrevrange(K key, long start, long stop) { - return await(c.zrevrange(key, start, stop)); - } - - public List> zrevrangeWithScores(K key, long start, long stop) { - return await(c.zrevrangeWithScores(key, start, stop)); - } - - public List zrevrangebyscore(K key, double max, double min) { - return await(c.zrevrangebyscore(key, max, min)); - } - - public List zrevrangebyscore(K key, String max, String min) { - return await(c.zrevrangebyscore(key, max, min)); - } - - public List zrevrangebyscore(K key, double max, double min, long offset, long count) { - return await(c.zrevrangebyscore(key, max, min, offset, count)); - } - - public List zrevrangebyscore(K key, String max, String min, long offset, long count) { - return await(c.zrevrangebyscore(key, max, min, offset, count)); - } - - public List> zrevrangebyscoreWithScores(K key, double max, double min) { - return await(c.zrevrangebyscoreWithScores(key, max, min)); - } - - public List> zrevrangebyscoreWithScores(K key, String max, String min) { - return await(c.zrevrangebyscoreWithScores(key, max, min)); - } - - public List> zrevrangebyscoreWithScores(K key, double max, double min, long offset, long count) { - return await(c.zrevrangebyscoreWithScores(key, max, min, offset, count)); - } - - public List> zrevrangebyscoreWithScores(K key, String max, String min, long offset, long count) { - return await(c.zrevrangebyscoreWithScores(key, max, min, offset, count)); - } - - public Long zrevrank(K key, V member) { - return await(c.zrevrank(key, member)); - } - - public Double zscore(K key, V member) { - return await(c.zscore(key, member)); - } - - public Long zunionstore(K destination, K... keys) { - return await(c.zunionstore(destination, keys)); - } - - public Long zunionstore(K destination, ZStoreArgs storeArgs, K... keys) { - return await(c.zunionstore(destination, storeArgs, keys)); - } - - public ListScanResult sscan(K key, long startValue) { - return await(c.sscan(key, startValue)); - } - - public ListScanResult zscan(K key, long startValue) { - return await(c.zscan(key, startValue)); - } - - public RedisAsyncConnection getAsync() { - return c; - } - - /** - * Close the connection. - */ - public void close() { - c.close(); - } - - /** - * Generate SHA-1 digest for the supplied script. - * - * @param script Lua script. - * - * @return Script digest as a lowercase hex string. - */ - public String digest(V script) { - return c.digest(script); - } - - private T await(Future future, long timeout, TimeUnit unit) { - return c.await(future, timeout, unit); - } - - private T awaitInterruptibly(Future future, long timeout, TimeUnit unit) throws InterruptedException { - return c.awaitInterruptibly(future, timeout, unit); - } - - - private T await(Future future) { - return c.await(future, timeout, unit); - } -} diff --git a/src/main/java/com/lambdaworks/redis/RedisConnectionClosedException.java b/src/main/java/com/lambdaworks/redis/RedisConnectionClosedException.java deleted file mode 100644 index 02b3b688e..000000000 --- a/src/main/java/com/lambdaworks/redis/RedisConnectionClosedException.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.lambdaworks.redis; - -public class RedisConnectionClosedException extends RedisException { - - private static final long serialVersionUID = 1895201562761894967L; - - public RedisConnectionClosedException(String msg) { - super(msg); - } - -} diff --git a/src/main/java/com/lambdaworks/redis/RedisConnectionException.java b/src/main/java/com/lambdaworks/redis/RedisConnectionException.java deleted file mode 100644 index baaafeae8..000000000 --- a/src/main/java/com/lambdaworks/redis/RedisConnectionException.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.lambdaworks.redis; - -public class RedisConnectionException extends RedisException { - - private static final long serialVersionUID = 4007817232147176510L; - - public RedisConnectionException(String msg) { - super(msg); - } - - public RedisConnectionException(String msg, Throwable e) { - super(msg, e); - } - -} diff --git a/src/main/java/com/lambdaworks/redis/RedisException.java b/src/main/java/com/lambdaworks/redis/RedisException.java deleted file mode 100644 index 6cd57a1d2..000000000 --- a/src/main/java/com/lambdaworks/redis/RedisException.java +++ /dev/null @@ -1,24 +0,0 @@ -// Copyright (C) 2011 - Will Glozer. All rights reserved. - -package com.lambdaworks.redis; - -/** - * Exception thrown when redis returns an error message, or when the client - * fails for any reason. - * - * @author Will Glozer - */ -@SuppressWarnings("serial") -public class RedisException extends RuntimeException { - - public RedisException() { - } - - public RedisException(String msg) { - super(msg); - } - - public RedisException(String msg, Throwable e) { - super(msg, e); - } -} diff --git a/src/main/java/com/lambdaworks/redis/RedisMovedException.java b/src/main/java/com/lambdaworks/redis/RedisMovedException.java deleted file mode 100644 index a30152a8d..000000000 --- a/src/main/java/com/lambdaworks/redis/RedisMovedException.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.lambdaworks.redis; - -public class RedisMovedException extends RedisException { - - private static final long serialVersionUID = -6969734163155547631L; - - private int slot; - - public RedisMovedException(int slot) { - this.slot = slot; - } - - public int getSlot() { - return slot; - } - -} diff --git a/src/main/java/com/lambdaworks/redis/RedisTimeoutException.java b/src/main/java/com/lambdaworks/redis/RedisTimeoutException.java deleted file mode 100644 index a6ab06bfe..000000000 --- a/src/main/java/com/lambdaworks/redis/RedisTimeoutException.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.lambdaworks.redis; - -public class RedisTimeoutException extends RedisException { - - private static final long serialVersionUID = -6969734163155547631L; - -} diff --git a/src/main/java/com/lambdaworks/redis/ScoredValue.java b/src/main/java/com/lambdaworks/redis/ScoredValue.java deleted file mode 100644 index 38fb06fcc..000000000 --- a/src/main/java/com/lambdaworks/redis/ScoredValue.java +++ /dev/null @@ -1,37 +0,0 @@ -// Copyright (C) 2011 - Will Glozer. All rights reserved. - -package com.lambdaworks.redis; - -/** - * A value and its associated score from a ZSET. - * - * @author Will Glozer - */ -public class ScoredValue { - public final double score; - public final V value; - - public ScoredValue(double score, V value) { - this.score = score; - this.value = value; - } - - @Override - public boolean equals(Object o) { - if (o == null || getClass() != o.getClass()) return false; - ScoredValue that = (ScoredValue) o; - return Double.compare(that.score, score) == 0 && value.equals(that.value); - } - - @Override - public int hashCode() { - long temp = score != +0.0d ? Double.doubleToLongBits(score) : 0L; - int result = (int) (temp ^ (temp >>> 32)); - return 31 * result + (value != null ? value.hashCode() : 0); - } - - @Override - public String toString() { - return String.format("(%f, %s)", score, value); - } -} diff --git a/src/main/java/com/lambdaworks/redis/ScriptOutputType.java b/src/main/java/com/lambdaworks/redis/ScriptOutputType.java deleted file mode 100644 index eebca27c1..000000000 --- a/src/main/java/com/lambdaworks/redis/ScriptOutputType.java +++ /dev/null @@ -1,22 +0,0 @@ -// Copyright (C) 2011 - Will Glozer. All rights reserved. - -package com.lambdaworks.redis; - -/** - * A Lua script returns one of the following types: - * - *
    - *
  • {@link #BOOLEAN} boolean
  • - *
  • {@link #INTEGER} 64-bit integer
  • - *
  • {@link #STATUS} status string
  • - *
  • {@link #VALUE} value
  • - *
  • {@link #MAPVALUE} typed value
  • - *
  • {@link #MULTI} of these types
  • . - *
- * - * @author Will Glozer - */ -public enum ScriptOutputType { - BOOLEAN, INTEGER, MULTI, STATUS, VALUE, MAPVALUE, MAPVALUELIST -} - diff --git a/src/main/java/com/lambdaworks/redis/SortArgs.java b/src/main/java/com/lambdaworks/redis/SortArgs.java deleted file mode 100644 index b163eb83c..000000000 --- a/src/main/java/com/lambdaworks/redis/SortArgs.java +++ /dev/null @@ -1,124 +0,0 @@ -// Copyright (C) 2011 - Will Glozer. All rights reserved. - -package com.lambdaworks.redis; - -import com.lambdaworks.redis.protocol.CommandArgs; -import com.lambdaworks.redis.protocol.CommandKeyword; - -import java.util.ArrayList; -import java.util.List; - -import static com.lambdaworks.redis.protocol.CommandKeyword.*; -import static com.lambdaworks.redis.protocol.CommandType.GET; - -/** - * Argument list builder for the redis SORT - * command. Static import the methods from {@link Builder} and chain the method calls: - * by("weight_*").desc().limit(0, 2). - * - * @author Will Glozer - */ -public class SortArgs { - private String by; - private Long offset, count; - private List get; - private CommandKeyword order; - private boolean alpha; - - /** - * Static builder methods. - */ - public static class Builder { - public static SortArgs by(String pattern) { - return new SortArgs().by(pattern); - } - - public static SortArgs limit(long offset, long count) { - return new SortArgs().limit(offset, count); - } - - public static SortArgs get(String pattern) { - return new SortArgs().get(pattern); - } - - public static SortArgs asc() { - return new SortArgs().asc(); - } - - public static SortArgs desc() { - return new SortArgs().desc(); - } - - public static SortArgs alpha() { - return new SortArgs().alpha(); - } - } - - public SortArgs by(String pattern) { - by = pattern; - return this; - } - - public SortArgs limit(long offset, long count) { - this.offset = offset; - this.count = count; - return this; - } - - public SortArgs get(String pattern) { - if (get == null) { - get = new ArrayList(); - } - get.add(pattern); - return this; - } - - public SortArgs asc() { - order = ASC; - return this; - } - - public SortArgs desc() { - order = DESC; - return this; - } - - public SortArgs alpha() { - alpha = true; - return this; - } - - void build(CommandArgs args, K store) { - - if (by != null) { - args.add(BY); - args.add(by); - } - - if (get != null) { - for (String pattern : get) { - args.add(GET); - args.add(pattern); - } - } - - if (offset != null) { - args.add(LIMIT); - args.add(offset); - args.add(count); - } - - if (order != null) { - args.add(order); - } - - if (alpha) { - args.add(ALPHA); - } - - if (store != null) { - args.add(STORE); - args.addKey(store); - } - } -} diff --git a/src/main/java/com/lambdaworks/redis/ZStoreArgs.java b/src/main/java/com/lambdaworks/redis/ZStoreArgs.java deleted file mode 100644 index 4f32c18f3..000000000 --- a/src/main/java/com/lambdaworks/redis/ZStoreArgs.java +++ /dev/null @@ -1,91 +0,0 @@ -// Copyright (C) 2011 - Will Glozer. All rights reserved. - -package com.lambdaworks.redis; - -import com.lambdaworks.redis.protocol.CommandArgs; - -import java.util.*; - -import static com.lambdaworks.redis.protocol.CommandKeyword.*; - -/** - * Argument list builder for the redis ZUNIONSTORE - * and ZINTERSTORE commands. Static import the - * methods from {@link Builder} and chain the method calls: weights(1, 2).max(). - * - * @author Will Glozer - */ -public class ZStoreArgs { - private static enum Aggregate { SUM, MIN, MAX } - - private List weights; - private Aggregate aggregate; - - /** - * Static builder methods. - */ - public static class Builder { - public static ZStoreArgs weights(long... weights) { - return new ZStoreArgs().weights(weights); - } - - public static ZStoreArgs sum() { - return new ZStoreArgs().sum(); - } - - public static ZStoreArgs min() { - return new ZStoreArgs().min(); - } - - public static ZStoreArgs max() { - return new ZStoreArgs().max(); - } - } - - public ZStoreArgs weights(long... weights) { - this.weights = new ArrayList(weights.length); - for (long weight : weights) { - this.weights.add(weight); - } - return this; - } - - public ZStoreArgs sum() { - aggregate = Aggregate.SUM; - return this; - } - - public ZStoreArgs min() { - aggregate = Aggregate.MIN; - return this; - } - - public ZStoreArgs max() { - aggregate = Aggregate.MAX; - return this; - } - - void build(CommandArgs args) { - if (weights != null) { - args.add(WEIGHTS); - for (long weight : weights) { - args.add(weight); - } - } - - if (aggregate != null) { - args.add(AGGREGATE); - switch (aggregate) { - case SUM: - args.add(SUM); - break; - case MIN: - args.add(MIN); - break; - case MAX: - args.add(MAX); - break; - } - } - } -} diff --git a/src/main/java/com/lambdaworks/redis/codec/RedisCodec.java b/src/main/java/com/lambdaworks/redis/codec/RedisCodec.java deleted file mode 100644 index 970128381..000000000 --- a/src/main/java/com/lambdaworks/redis/codec/RedisCodec.java +++ /dev/null @@ -1,66 +0,0 @@ -// Copyright (C) 2011 - Will Glozer. All rights reserved. - -package com.lambdaworks.redis.codec; - -import java.nio.ByteBuffer; - -/** - * A RedisCodec encodes keys and values sent to redis, and decodes keys - * and values in the command output. - * - * The encode methods will be called by multiple threads and must be thread-safe, - * however the decode methods will only be called by one thread. - * - * @param Key type. - * @param Value type. - * - * @author Will Glozer - */ -public abstract class RedisCodec { - /** - * Decode the key output by redis. - * - * @param bytes Raw bytes of the key. - * - * @return The decoded key. - */ - public abstract K decodeKey(ByteBuffer bytes); - - /** - * Decode the value output by redis. - * - * @param bytes Raw bytes of the value. - * - * @return The decoded value. - */ - public abstract V decodeValue(ByteBuffer bytes); - - /** - * Encode the key for output to redis. - * - * @param key Key. - * - * @return The encoded key. - */ - public abstract byte[] encodeKey(K key); - - /** - * Encode the value for output to redis. - * - * @param value Value. - * - * @return The encoded value. - */ - public abstract byte[] encodeValue(V value); - - - public abstract byte[] encodeMapValue(V value); - - public abstract byte[] encodeMapKey(K key); - - public abstract V decodeMapValue(ByteBuffer bytes); - - public abstract K decodeMapKey(ByteBuffer bytes); - - -} diff --git a/src/main/java/com/lambdaworks/redis/codec/Utf8StringCodec.java b/src/main/java/com/lambdaworks/redis/codec/Utf8StringCodec.java deleted file mode 100644 index 527f6a631..000000000 --- a/src/main/java/com/lambdaworks/redis/codec/Utf8StringCodec.java +++ /dev/null @@ -1,87 +0,0 @@ -// Copyright (C) 2011 - Will Glozer. All rights reserved. - -package com.lambdaworks.redis.codec; - -import java.nio.ByteBuffer; -import java.nio.CharBuffer; -import java.nio.charset.*; - -import static java.nio.charset.CoderResult.OVERFLOW; - -/** - * A {@link RedisCodec} that handles UTF-8 encoded keys and values. - * - * @author Will Glozer - */ -public class Utf8StringCodec extends RedisCodec { - private Charset charset; - private CharsetDecoder decoder; - private CharBuffer chars; - - /** - * Initialize a new instance that encodes and decodes strings using - * the UTF-8 charset; - */ - public Utf8StringCodec() { - charset = Charset.forName("UTF-8"); - decoder = charset.newDecoder(); - chars = CharBuffer.allocate(1024); - } - - @Override - public String decodeKey(ByteBuffer bytes) { - return decode(bytes); - } - - @Override - public String decodeValue(ByteBuffer bytes) { - return decode(bytes); - } - - @Override - public byte[] encodeKey(String key) { - return encode(key); - } - - @Override - public byte[] encodeValue(String value) { - return encode(value); - } - - private String decode(ByteBuffer bytes) { - chars.clear(); - bytes.mark(); - - decoder.reset(); - while (decoder.decode(bytes, chars, true) == OVERFLOW || decoder.flush(chars) == OVERFLOW) { - chars = CharBuffer.allocate(chars.capacity() * 2); - bytes.reset(); - } - - return chars.flip().toString(); - } - - private byte[] encode(String string) { - return string.getBytes(charset); - } - - @Override - public byte[] encodeMapValue(String value) { - return encodeValue(value); - } - - @Override - public byte[] encodeMapKey(String key) { - return encodeKey(key); - } - - @Override - public String decodeMapValue(ByteBuffer bytes) { - return decodeValue(bytes); - } - - @Override - public String decodeMapKey(ByteBuffer bytes) { - return decodeKey(bytes); - } -} diff --git a/src/main/java/com/lambdaworks/redis/output/BooleanListOutput.java b/src/main/java/com/lambdaworks/redis/output/BooleanListOutput.java deleted file mode 100644 index 577a2504e..000000000 --- a/src/main/java/com/lambdaworks/redis/output/BooleanListOutput.java +++ /dev/null @@ -1,25 +0,0 @@ -// Copyright (C) 2011 - Will Glozer. All rights reserved. - -package com.lambdaworks.redis.output; - -import com.lambdaworks.redis.codec.RedisCodec; -import com.lambdaworks.redis.protocol.CommandOutput; - -import java.util.ArrayList; -import java.util.List; - -/** - * {@link java.util.List} of boolean output. - * - * @author Will Glozer - */ -public class BooleanListOutput extends CommandOutput> { - public BooleanListOutput(RedisCodec codec) { - super(codec, new ArrayList()); - } - - @Override - public void set(long integer) { - output.add((integer == 1) ? Boolean.TRUE : Boolean.FALSE); - } -} diff --git a/src/main/java/com/lambdaworks/redis/output/BooleanOutput.java b/src/main/java/com/lambdaworks/redis/output/BooleanOutput.java deleted file mode 100644 index b476c04cf..000000000 --- a/src/main/java/com/lambdaworks/redis/output/BooleanOutput.java +++ /dev/null @@ -1,31 +0,0 @@ -// Copyright (C) 2011 - Will Glozer. All rights reserved. - -package com.lambdaworks.redis.output; - -import com.lambdaworks.redis.codec.RedisCodec; -import com.lambdaworks.redis.protocol.CommandOutput; - -import java.nio.ByteBuffer; - -/** - * Boolean output. The actual value is returned as an integer - * where 0 indicates false and 1 indicates true, or as a null - * bulk reply for script output. - * - * @author Will Glozer - */ -public class BooleanOutput extends CommandOutput { - public BooleanOutput(RedisCodec codec) { - super(codec, null); - } - - @Override - public void set(long integer) { - output = (integer == 1) ? Boolean.TRUE : Boolean.FALSE; - } - - @Override - public void set(ByteBuffer bytes) { - output = (bytes != null) ? Boolean.TRUE : Boolean.FALSE; - } -} diff --git a/src/main/java/com/lambdaworks/redis/output/ByteArrayOutput.java b/src/main/java/com/lambdaworks/redis/output/ByteArrayOutput.java deleted file mode 100644 index 7be98a768..000000000 --- a/src/main/java/com/lambdaworks/redis/output/ByteArrayOutput.java +++ /dev/null @@ -1,27 +0,0 @@ -// Copyright (C) 2012 - Will Glozer. All rights reserved. - -package com.lambdaworks.redis.output; - -import com.lambdaworks.redis.codec.RedisCodec; -import com.lambdaworks.redis.protocol.CommandOutput; - -import java.nio.ByteBuffer; - -/** - * Byte array output. - * - * @author Will Glozer - */ -public class ByteArrayOutput extends CommandOutput { - public ByteArrayOutput(RedisCodec codec) { - super(codec, null); - } - - @Override - public void set(ByteBuffer bytes) { - if (bytes != null) { - output = new byte[bytes.remaining()]; - bytes.get(output); - } - } -} diff --git a/src/main/java/com/lambdaworks/redis/output/DateOutput.java b/src/main/java/com/lambdaworks/redis/output/DateOutput.java deleted file mode 100644 index 605f6c61d..000000000 --- a/src/main/java/com/lambdaworks/redis/output/DateOutput.java +++ /dev/null @@ -1,24 +0,0 @@ -// Copyright (C) 2011 - Will Glozer. All rights reserved. - -package com.lambdaworks.redis.output; - -import com.lambdaworks.redis.codec.RedisCodec; -import com.lambdaworks.redis.protocol.CommandOutput; - -import java.util.Date; - -/** - * Date output with no milliseconds. - * - * @author Will Glozer - */ -public class DateOutput extends CommandOutput { - public DateOutput(RedisCodec codec) { - super(codec, null); - } - - @Override - public void set(long time) { - output = new Date(time * 1000); - } -} diff --git a/src/main/java/com/lambdaworks/redis/output/DoubleOutput.java b/src/main/java/com/lambdaworks/redis/output/DoubleOutput.java deleted file mode 100644 index 9ed3c0ce1..000000000 --- a/src/main/java/com/lambdaworks/redis/output/DoubleOutput.java +++ /dev/null @@ -1,26 +0,0 @@ -// Copyright (C) 2011 - Will Glozer. All rights reserved. - -package com.lambdaworks.redis.output; - -import com.lambdaworks.redis.codec.RedisCodec; -import com.lambdaworks.redis.protocol.CommandOutput; - -import java.nio.ByteBuffer; - -import static java.lang.Double.parseDouble; - -/** - * Double output, may be null. - * - * @author Will Glozer - */ -public class DoubleOutput extends CommandOutput { - public DoubleOutput(RedisCodec codec) { - super(codec, null); - } - - @Override - public void set(ByteBuffer bytes) { - output = (bytes == null) ? null : parseDouble(decodeAscii(bytes)); - } -} diff --git a/src/main/java/com/lambdaworks/redis/output/IntegerOutput.java b/src/main/java/com/lambdaworks/redis/output/IntegerOutput.java deleted file mode 100644 index 8b17f0f41..000000000 --- a/src/main/java/com/lambdaworks/redis/output/IntegerOutput.java +++ /dev/null @@ -1,31 +0,0 @@ -// Copyright (C) 2011 - Will Glozer. All rights reserved. - -package com.lambdaworks.redis.output; - -import com.lambdaworks.redis.codec.RedisCodec; -import com.lambdaworks.redis.protocol.CommandOutput; - -import java.io.UnsupportedEncodingException; -import java.nio.ByteBuffer; -import java.nio.charset.Charset; - -/** - * 64-bit integer output, may be null. - * - * @author Will Glozer - */ -public class IntegerOutput extends CommandOutput { - public IntegerOutput(RedisCodec codec) { - super(codec, null); - } - - @Override - public void set(long integer) { - output = integer; - } - - @Override - public void set(ByteBuffer bytes) { - output = bytes == null ? null : new Long(decodeAscii(bytes)); - } -} diff --git a/src/main/java/com/lambdaworks/redis/output/KeyListOutput.java b/src/main/java/com/lambdaworks/redis/output/KeyListOutput.java deleted file mode 100644 index 19feeb834..000000000 --- a/src/main/java/com/lambdaworks/redis/output/KeyListOutput.java +++ /dev/null @@ -1,28 +0,0 @@ -// Copyright (C) 2011 - Will Glozer. All rights reserved. - -package com.lambdaworks.redis.output; - -import com.lambdaworks.redis.codec.RedisCodec; -import com.lambdaworks.redis.protocol.CommandOutput; - -import java.nio.ByteBuffer; -import java.util.ArrayList; -import java.util.List; - -/** - * {@link List} of keys output. - * - * @param Key type. - * - * @author Will Glozer - */ -public class KeyListOutput extends CommandOutput> { - public KeyListOutput(RedisCodec codec) { - super(codec, new ArrayList()); - } - - @Override - public void set(ByteBuffer bytes) { - output.add(codec.decodeKey(bytes)); - } -} diff --git a/src/main/java/com/lambdaworks/redis/output/KeyOutput.java b/src/main/java/com/lambdaworks/redis/output/KeyOutput.java deleted file mode 100644 index cb5363629..000000000 --- a/src/main/java/com/lambdaworks/redis/output/KeyOutput.java +++ /dev/null @@ -1,26 +0,0 @@ -// Copyright (C) 2013 - Will Glozer. All rights reserved. - -package com.lambdaworks.redis.output; - -import com.lambdaworks.redis.codec.RedisCodec; -import com.lambdaworks.redis.protocol.CommandOutput; - -import java.nio.ByteBuffer; - -/** - * Key output. - * - * @param Key type. - * - * @author Will Glozer - */ -public class KeyOutput extends CommandOutput { - public KeyOutput(RedisCodec codec) { - super(codec, null); - } - - @Override - public void set(ByteBuffer bytes) { - output = (bytes == null) ? null : codec.decodeKey(bytes); - } -} diff --git a/src/main/java/com/lambdaworks/redis/output/KeyValueOutput.java b/src/main/java/com/lambdaworks/redis/output/KeyValueOutput.java deleted file mode 100644 index ba7bb205f..000000000 --- a/src/main/java/com/lambdaworks/redis/output/KeyValueOutput.java +++ /dev/null @@ -1,37 +0,0 @@ -// Copyright (C) 2011 - Will Glozer. All rights reserved. - -package com.lambdaworks.redis.output; - -import com.lambdaworks.redis.KeyValue; -import com.lambdaworks.redis.codec.RedisCodec; -import com.lambdaworks.redis.protocol.CommandOutput; - -import java.nio.ByteBuffer; - -/** - * Key-value pair output. - * - * @param Key type. - * @param Value type. - * - * @author Will Glozer - */ -public class KeyValueOutput extends CommandOutput> { - private K key; - - public KeyValueOutput(RedisCodec codec) { - super(codec, null); - } - - @Override - public void set(ByteBuffer bytes) { - if (bytes != null) { - if (key == null) { - key = codec.decodeKey(bytes); - } else { - V value = codec.decodeValue(bytes); - output = new KeyValue(key, value); - } - } - } -} diff --git a/src/main/java/com/lambdaworks/redis/output/ListMapOutput.java b/src/main/java/com/lambdaworks/redis/output/ListMapOutput.java deleted file mode 100644 index 9f34d2976..000000000 --- a/src/main/java/com/lambdaworks/redis/output/ListMapOutput.java +++ /dev/null @@ -1,46 +0,0 @@ -// Copyright (C) 2011 - Will Glozer. All rights reserved. - -package com.lambdaworks.redis.output; - -import java.nio.ByteBuffer; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import com.lambdaworks.redis.codec.RedisCodec; -import com.lambdaworks.redis.protocol.CommandOutput; - -public class ListMapOutput extends CommandOutput>> { - private K key; - private int index = 0; - - public ListMapOutput(RedisCodec codec) { - super(codec, new ArrayList>()); - } - - @Override - public void set(ByteBuffer bytes) { - if (key == null) { - key = codec.decodeMapKey(bytes); - return; - } - - V value = (bytes == null) ? null : codec.decodeMapValue(bytes); - if (output.isEmpty()) { - output.add(new HashMap()); - } - Map map = output.get(index); - if (map == null) { - map = new HashMap(); - output.add(map); - } - if (map.get(key) != null) { - index++; - map = new HashMap(); - output.add(map); - } - map.put(key, value); - key = null; - } -} diff --git a/src/main/java/com/lambdaworks/redis/output/ListScanOutput.java b/src/main/java/com/lambdaworks/redis/output/ListScanOutput.java deleted file mode 100644 index 07bc90ccb..000000000 --- a/src/main/java/com/lambdaworks/redis/output/ListScanOutput.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.lambdaworks.redis.output; - -import java.nio.ByteBuffer; - -import com.lambdaworks.redis.codec.RedisCodec; -import com.lambdaworks.redis.protocol.CommandOutput; - -public class ListScanOutput extends CommandOutput> { - - public ListScanOutput(RedisCodec codec) { - super(codec, new ListScanResult()); - } - - @Override - public void set(ByteBuffer bytes) { - if (output.getPos() == null) { - output.setPos(((Number) codec.decodeValue(bytes)).longValue()); - } else { - output.addValue(codec.decodeValue(bytes)); - } - } - -} diff --git a/src/main/java/com/lambdaworks/redis/output/ListScanResult.java b/src/main/java/com/lambdaworks/redis/output/ListScanResult.java deleted file mode 100644 index 08c1cd68f..000000000 --- a/src/main/java/com/lambdaworks/redis/output/ListScanResult.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.lambdaworks.redis.output; - -import java.util.ArrayList; -import java.util.List; - -public class ListScanResult { - - private Long pos; - private List values = new ArrayList(); - - public void setPos(Long pos) { - this.pos = pos; - } - public Long getPos() { - return pos; - } - - public void addValue(V value) { - values.add(value); - } - public List getValues() { - return values; - } - -} diff --git a/src/main/java/com/lambdaworks/redis/output/MapKeyListOutput.java b/src/main/java/com/lambdaworks/redis/output/MapKeyListOutput.java deleted file mode 100644 index 0f7ba1bcb..000000000 --- a/src/main/java/com/lambdaworks/redis/output/MapKeyListOutput.java +++ /dev/null @@ -1,29 +0,0 @@ -// Copyright (C) 2011 - Will Glozer. All rights reserved. - -package com.lambdaworks.redis.output; - -import java.nio.ByteBuffer; -import java.util.LinkedHashSet; -import java.util.List; -import java.util.Set; - -import com.lambdaworks.redis.codec.RedisCodec; -import com.lambdaworks.redis.protocol.CommandOutput; - -/** - * {@link List} of keys output. - * - * @param Key type. - * - * @author Will Glozer - */ -public class MapKeyListOutput extends CommandOutput> { - public MapKeyListOutput(RedisCodec codec) { - super(codec, new LinkedHashSet()); - } - - @Override - public void set(ByteBuffer bytes) { - output.add(codec.decodeMapKey(bytes)); - } -} diff --git a/src/main/java/com/lambdaworks/redis/output/MapOutput.java b/src/main/java/com/lambdaworks/redis/output/MapOutput.java deleted file mode 100644 index 91425a320..000000000 --- a/src/main/java/com/lambdaworks/redis/output/MapOutput.java +++ /dev/null @@ -1,38 +0,0 @@ -// Copyright (C) 2011 - Will Glozer. All rights reserved. - -package com.lambdaworks.redis.output; - -import com.lambdaworks.redis.codec.RedisCodec; -import com.lambdaworks.redis.protocol.CommandOutput; - -import java.nio.ByteBuffer; -import java.util.HashMap; -import java.util.Map; - -/** - * {@link Map} of keys and values output. - * - * @param Key type. - * @param Value type. - * - * @author Will Glozer - */ -public class MapOutput extends CommandOutput> { - private K key; - - public MapOutput(RedisCodec codec) { - super(codec, new HashMap()); - } - - @Override - public void set(ByteBuffer bytes) { - if (key == null) { - key = codec.decodeMapKey(bytes); - return; - } - - V value = (bytes == null) ? null : codec.decodeMapValue(bytes); - output.put(key, value); - key = null; - } -} diff --git a/src/main/java/com/lambdaworks/redis/output/MapValueListOutput.java b/src/main/java/com/lambdaworks/redis/output/MapValueListOutput.java deleted file mode 100644 index bbb8f26d3..000000000 --- a/src/main/java/com/lambdaworks/redis/output/MapValueListOutput.java +++ /dev/null @@ -1,28 +0,0 @@ -// Copyright (C) 2011 - Will Glozer. All rights reserved. - -package com.lambdaworks.redis.output; - -import com.lambdaworks.redis.codec.RedisCodec; -import com.lambdaworks.redis.protocol.CommandOutput; - -import java.nio.ByteBuffer; -import java.util.ArrayList; -import java.util.List; - -/** - * {@link List} of values output. - * - * @param Value type. - * - * @author Will Glozer - */ -public class MapValueListOutput extends CommandOutput> { - public MapValueListOutput(RedisCodec codec) { - super(codec, new ArrayList()); - } - - @Override - public void set(ByteBuffer bytes) { - output.add(bytes == null ? null : codec.decodeMapValue(bytes)); - } -} diff --git a/src/main/java/com/lambdaworks/redis/output/MapValueOutput.java b/src/main/java/com/lambdaworks/redis/output/MapValueOutput.java deleted file mode 100644 index 659a3b75c..000000000 --- a/src/main/java/com/lambdaworks/redis/output/MapValueOutput.java +++ /dev/null @@ -1,26 +0,0 @@ -// Copyright (C) 2011 - Will Glozer. All rights reserved. - -package com.lambdaworks.redis.output; - -import com.lambdaworks.redis.codec.RedisCodec; -import com.lambdaworks.redis.protocol.CommandOutput; - -import java.nio.ByteBuffer; - -/** - * Value output. - * - * @param Value type. - * - * @author Will Glozer - */ -public class MapValueOutput extends CommandOutput { - public MapValueOutput(RedisCodec codec) { - super(codec, null); - } - - @Override - public void set(ByteBuffer bytes) { - output = (bytes == null) ? null : codec.decodeMapValue(bytes); - } -} diff --git a/src/main/java/com/lambdaworks/redis/output/MultiOutput.java b/src/main/java/com/lambdaworks/redis/output/MultiOutput.java deleted file mode 100644 index b9dc2ef6a..000000000 --- a/src/main/java/com/lambdaworks/redis/output/MultiOutput.java +++ /dev/null @@ -1,65 +0,0 @@ -// Copyright (C) 2011 - Will Glozer. All rights reserved. - -package com.lambdaworks.redis.output; - -import com.lambdaworks.redis.RedisException; -import com.lambdaworks.redis.codec.RedisCodec; -import com.lambdaworks.redis.protocol.Command; -import com.lambdaworks.redis.protocol.CommandOutput; - -import java.nio.ByteBuffer; -import java.util.*; - -/** - * Output of all commands within a MULTI block. - * - * @author Will Glozer - */ -public class MultiOutput extends CommandOutput> { - private Queue> queue; - - public MultiOutput(RedisCodec codec) { - super(codec, new ArrayList()); - queue = new LinkedList>(); - } - - public void add(Command cmd) { - queue.add(cmd); - } - - public void cancel() { - for (Command c : queue) { - c.cancel(); - } - } - - @Override - public void set(long integer) { - queue.peek().getOutput().set(integer); - } - - @Override - public void set(ByteBuffer bytes) { - queue.peek().getOutput().set(bytes); - } - - @Override - public void setError(ByteBuffer error) { - CommandOutput output = queue.isEmpty() ? this : queue.peek().getOutput(); - output.setError(decodeAscii(error)); - } - - @Override - public void complete(int depth) { - if (depth == 1) { - Command cmd = queue.remove(); - CommandOutput o = cmd.getOutput(); - output.add(!o.hasError() ? o.get() : new RedisException(o.getError())); - cmd.complete(); - } else if (depth == 0 && !queue.isEmpty()) { - for (Command cmd : queue) { - cmd.complete(); - } - } - } -} diff --git a/src/main/java/com/lambdaworks/redis/output/NestedMultiOutput.java b/src/main/java/com/lambdaworks/redis/output/NestedMultiOutput.java deleted file mode 100644 index 6b3c70805..000000000 --- a/src/main/java/com/lambdaworks/redis/output/NestedMultiOutput.java +++ /dev/null @@ -1,55 +0,0 @@ -// Copyright (C) 2011 - Will Glozer. All rights reserved. - -package com.lambdaworks.redis.output; - -import com.lambdaworks.redis.RedisException; -import com.lambdaworks.redis.codec.RedisCodec; -import com.lambdaworks.redis.protocol.CommandOutput; - -import java.nio.ByteBuffer; -import java.util.*; - -/** - * {@link List} of command outputs, possibly deeply nested. - * - * @author Will Glozer - */ -public class NestedMultiOutput extends CommandOutput> { - private LinkedList> stack; - private int depth; - - public NestedMultiOutput(RedisCodec codec) { - super(codec, new ArrayList()); - stack = new LinkedList>(); - depth = 1; - } - - @Override - public void set(long integer) { - output.add(integer); - } - - @Override - public void set(ByteBuffer bytes) { - output.add(bytes == null ? null : codec.decodeKey(bytes)); - } - - @Override - public void setError(ByteBuffer error) { - output.add(new RedisException(decodeAscii(error))); - } - - @Override - public void complete(int depth) { - if (depth > this.depth) { - Object o = output.remove(output.size() - 1); - stack.push(output); - output = new ArrayList(); - output.add(o); - } else if (depth > 0 && depth < this.depth) { - stack.peek().add(output); - output = stack.pop(); - } - this.depth = depth; - } -} diff --git a/src/main/java/com/lambdaworks/redis/output/ScoredValueListOutput.java b/src/main/java/com/lambdaworks/redis/output/ScoredValueListOutput.java deleted file mode 100644 index 900689ecc..000000000 --- a/src/main/java/com/lambdaworks/redis/output/ScoredValueListOutput.java +++ /dev/null @@ -1,38 +0,0 @@ -// Copyright (C) 2011 - Will Glozer. All rights reserved. - -package com.lambdaworks.redis.output; - -import com.lambdaworks.redis.ScoredValue; -import com.lambdaworks.redis.codec.RedisCodec; -import com.lambdaworks.redis.protocol.CommandOutput; - -import java.nio.ByteBuffer; -import java.util.ArrayList; -import java.util.List; - -/** - * {@link List} of values and their associated scores. - * - * @param Value type. - * - * @author Will Glozer - */ -public class ScoredValueListOutput extends CommandOutput>> { - private V value; - - public ScoredValueListOutput(RedisCodec codec) { - super(codec, new ArrayList>()); - } - - @Override - public void set(ByteBuffer bytes) { - if (value == null) { - value = codec.decodeValue(bytes); - return; - } - - double score = Double.parseDouble(decodeAscii(bytes)); - output.add(new ScoredValue(score, value)); - value = null; - } -} diff --git a/src/main/java/com/lambdaworks/redis/output/StatusOutput.java b/src/main/java/com/lambdaworks/redis/output/StatusOutput.java deleted file mode 100644 index 773f15cb6..000000000 --- a/src/main/java/com/lambdaworks/redis/output/StatusOutput.java +++ /dev/null @@ -1,28 +0,0 @@ -// Copyright (C) 2011 - Will Glozer. All rights reserved. - -package com.lambdaworks.redis.output; - -import com.lambdaworks.redis.codec.RedisCodec; -import com.lambdaworks.redis.protocol.CommandOutput; - -import java.nio.ByteBuffer; - -import static com.lambdaworks.redis.protocol.Charsets.buffer; - -/** - * Status message output. - * - * @author Will Glozer - */ -public class StatusOutput extends CommandOutput { - private static final ByteBuffer OK = buffer("OK"); - - public StatusOutput(RedisCodec codec) { - super(codec, null); - } - - @Override - public void set(ByteBuffer bytes) { - output = OK.equals(bytes) ? "OK" : decodeAscii(bytes); - } -} diff --git a/src/main/java/com/lambdaworks/redis/output/StringListOutput.java b/src/main/java/com/lambdaworks/redis/output/StringListOutput.java deleted file mode 100644 index 0880b3925..000000000 --- a/src/main/java/com/lambdaworks/redis/output/StringListOutput.java +++ /dev/null @@ -1,26 +0,0 @@ -// Copyright (C) 2011 - Will Glozer. All rights reserved. - -package com.lambdaworks.redis.output; - -import com.lambdaworks.redis.codec.RedisCodec; -import com.lambdaworks.redis.protocol.CommandOutput; - -import java.nio.ByteBuffer; -import java.util.ArrayList; -import java.util.List; - -/** - * {@link List} of string output. - * - * @author Will Glozer - */ -public class StringListOutput extends CommandOutput> { - public StringListOutput(RedisCodec codec) { - super(codec, new ArrayList()); - } - - @Override - public void set(ByteBuffer bytes) { - output.add(bytes == null ? null : decodeAscii(bytes)); - } -} diff --git a/src/main/java/com/lambdaworks/redis/output/ValueListOutput.java b/src/main/java/com/lambdaworks/redis/output/ValueListOutput.java deleted file mode 100644 index 9d0c2ef20..000000000 --- a/src/main/java/com/lambdaworks/redis/output/ValueListOutput.java +++ /dev/null @@ -1,28 +0,0 @@ -// Copyright (C) 2011 - Will Glozer. All rights reserved. - -package com.lambdaworks.redis.output; - -import com.lambdaworks.redis.codec.RedisCodec; -import com.lambdaworks.redis.protocol.CommandOutput; - -import java.nio.ByteBuffer; -import java.util.ArrayList; -import java.util.List; - -/** - * {@link List} of values output. - * - * @param Value type. - * - * @author Will Glozer - */ -public class ValueListOutput extends CommandOutput> { - public ValueListOutput(RedisCodec codec) { - super(codec, new ArrayList()); - } - - @Override - public void set(ByteBuffer bytes) { - output.add(bytes == null ? null : codec.decodeValue(bytes)); - } -} diff --git a/src/main/java/com/lambdaworks/redis/output/ValueOutput.java b/src/main/java/com/lambdaworks/redis/output/ValueOutput.java deleted file mode 100644 index 72de03e8d..000000000 --- a/src/main/java/com/lambdaworks/redis/output/ValueOutput.java +++ /dev/null @@ -1,26 +0,0 @@ -// Copyright (C) 2011 - Will Glozer. All rights reserved. - -package com.lambdaworks.redis.output; - -import com.lambdaworks.redis.codec.RedisCodec; -import com.lambdaworks.redis.protocol.CommandOutput; - -import java.nio.ByteBuffer; - -/** - * Value output. - * - * @param Value type. - * - * @author Will Glozer - */ -public class ValueOutput extends CommandOutput { - public ValueOutput(RedisCodec codec) { - super(codec, null); - } - - @Override - public void set(ByteBuffer bytes) { - output = (bytes == null) ? null : codec.decodeValue(bytes); - } -} diff --git a/src/main/java/com/lambdaworks/redis/output/ValueSetOutput.java b/src/main/java/com/lambdaworks/redis/output/ValueSetOutput.java deleted file mode 100644 index d7701dc5a..000000000 --- a/src/main/java/com/lambdaworks/redis/output/ValueSetOutput.java +++ /dev/null @@ -1,28 +0,0 @@ -// Copyright (C) 2011 - Will Glozer. All rights reserved. - -package com.lambdaworks.redis.output; - -import com.lambdaworks.redis.codec.RedisCodec; -import com.lambdaworks.redis.protocol.CommandOutput; - -import java.nio.ByteBuffer; -import java.util.HashSet; -import java.util.Set; - -/** - * {@link Set} of value output. - * - * @param Value type. - * - * @author Will Glozer - */ -public class ValueSetOutput extends CommandOutput> { - public ValueSetOutput(RedisCodec codec) { - super(codec, new HashSet()); - } - - @Override - public void set(ByteBuffer bytes) { - output.add(bytes == null ? null : codec.decodeMapValue(bytes)); - } -} diff --git a/src/main/java/com/lambdaworks/redis/output/ValueSetScanOutput.java b/src/main/java/com/lambdaworks/redis/output/ValueSetScanOutput.java deleted file mode 100644 index 65f1bb034..000000000 --- a/src/main/java/com/lambdaworks/redis/output/ValueSetScanOutput.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.lambdaworks.redis.output; - -import java.nio.ByteBuffer; - -import com.lambdaworks.redis.codec.RedisCodec; -import com.lambdaworks.redis.protocol.CommandOutput; - -public class ValueSetScanOutput extends CommandOutput> { - - public ValueSetScanOutput(RedisCodec codec) { - super(codec, new ListScanResult()); - } - - @Override - public void set(ByteBuffer bytes) { - if (output.getPos() == null) { - output.setPos(toLong(bytes)); - } else { - output.addValue(codec.decodeMapValue(bytes)); - } - } - - private Long toLong(ByteBuffer bytes) { - return bytes == null ? null : new Long(new String(bytes.array(), bytes.arrayOffset() + bytes.position(), bytes.limit())); - } - -} diff --git a/src/main/java/com/lambdaworks/redis/protocol/Charsets.java b/src/main/java/com/lambdaworks/redis/protocol/Charsets.java deleted file mode 100644 index 5945e0ce2..000000000 --- a/src/main/java/com/lambdaworks/redis/protocol/Charsets.java +++ /dev/null @@ -1,19 +0,0 @@ -// Copyright (C) 2011 - Will Glozer. All rights reserved. - -package com.lambdaworks.redis.protocol; - -import java.nio.ByteBuffer; -import java.nio.charset.Charset; - -/** - * {@link Charset}-related utilities. - * - * @author Will Glozer - */ -public class Charsets { - public static final Charset ASCII = Charset.forName("US-ASCII"); - - public static ByteBuffer buffer(String s) { - return ByteBuffer.wrap(s.getBytes(ASCII)); - } -} diff --git a/src/main/java/com/lambdaworks/redis/protocol/Command.java b/src/main/java/com/lambdaworks/redis/protocol/Command.java deleted file mode 100644 index 0290f9875..000000000 --- a/src/main/java/com/lambdaworks/redis/protocol/Command.java +++ /dev/null @@ -1,133 +0,0 @@ -// Copyright (C) 2011 - Will Glozer. All rights reserved. - -package com.lambdaworks.redis.protocol; - -import com.lambdaworks.redis.RedisException; -import com.lambdaworks.redis.RedisMovedException; - -import io.netty.buffer.ByteBuf; -import io.netty.util.concurrent.Promise; - -/** - * A redis command and its result. All successfully executed commands will - * eventually return a {@link CommandOutput} object. - * - * @param Command output type. - * - * @author Will Glozer - */ -public class Command { - private static final byte[] CRLF = "\r\n".getBytes(Charsets.ASCII); - - private final Promise promise; - public final CommandType type; - protected CommandArgs args; - protected final CommandOutput output; - protected int completeAmount; - - /** - * Create a new command with the supplied type and args. - * - * @param type Command type. - * @param output Command output. - * @param args Command args, if any. - * @param multi Flag indicating if MULTI active. - */ - public Command(CommandType type, CommandOutput output, CommandArgs args, boolean multi, Promise proimse) { - this.type = type; - this.output = output; - this.args = args; - this.completeAmount = multi ? 2 : 1; - this.promise = proimse; - } - - public Promise getPromise() { - return promise; - } - - /** - * Get the object that holds this command's output. - * - * @return The command output object. - */ - public CommandOutput getOutput() { - return output; - } - - public void cancel() { - promise.cancel(true); - } - - public void complete() { - completeAmount--; - if (completeAmount == 0) { - Object res = output.get(); - if (promise.isCancelled()) { - return; - } - if (res instanceof RedisException) { - promise.setFailure((Exception)res); - } else if (output.hasError()) { - if (output.getError().startsWith("MOVED")) { - String[] parts = output.getError().split(" "); - int slot = Integer.valueOf(parts[1]); - promise.setFailure(new RedisMovedException(slot)); - } else if (output.getError().startsWith("(error) ASK")) { - String[] parts = output.getError().split(" "); - int slot = Integer.valueOf(parts[2]); - promise.setFailure(new RedisMovedException(slot)); - } else { - promise.setFailure(new RedisException(output.getError())); - } - } else if (output.hasException()) { - promise.setFailure(output.getException()); - } else { - promise.setSuccess((T)res); - } - } - } - - /** - * Encode and write this command to the supplied buffer using the new - * Unified Request Protocol. - * - * @param buf Buffer to write to. - */ - void encode(ByteBuf buf) { - buf.writeByte('*'); - writeInt(buf, 1 + (args != null ? args.count() : 0)); - buf.writeBytes(CRLF); - buf.writeByte('$'); - writeInt(buf, type.bytes.length); - buf.writeBytes(CRLF); - buf.writeBytes(type.bytes); - buf.writeBytes(CRLF); - if (args != null) { - buf.writeBytes(args.buffer()); - } - } - - /** - * Write the textual value of a positive integer to the supplied buffer. - * - * @param buf Buffer to write to. - * @param value Value to write. - */ - protected static void writeInt(ByteBuf buf, int value) { - if (value < 10) { - buf.writeByte('0' + value); - return; - } - - StringBuilder sb = new StringBuilder(8); - while (value > 0) { - int digit = value % 10; - sb.append((char) ('0' + digit)); - value /= 10; - } - - for (int i = sb.length() - 1; i >= 0; i--) { - buf.writeByte(sb.charAt(i)); - } - } -} diff --git a/src/main/java/com/lambdaworks/redis/protocol/CommandArgs.java b/src/main/java/com/lambdaworks/redis/protocol/CommandArgs.java deleted file mode 100644 index b7fd47985..000000000 --- a/src/main/java/com/lambdaworks/redis/protocol/CommandArgs.java +++ /dev/null @@ -1,209 +0,0 @@ -// Copyright (C) 2011 - Will Glozer. All rights reserved. - -package com.lambdaworks.redis.protocol; - -import com.lambdaworks.redis.codec.RedisCodec; - -import java.nio.BufferOverflowException; -import java.nio.ByteBuffer; -import java.util.List; -import java.util.Map; - -import static java.lang.Math.max; - -/** - * Redis command argument encoder. - * - * @author Will Glozer - */ -public class CommandArgs { - private static final byte[] CRLF = "\r\n".getBytes(Charsets.ASCII); - - private RedisCodec codec; - private ByteBuffer buffer; - private int count; - - public CommandArgs(RedisCodec codec) { - this.codec = codec; - this.buffer = ByteBuffer.allocate(32); - } - - public ByteBuffer buffer() { - buffer.flip(); - return buffer; - } - - public int count() { - return count; - } - - public CommandArgs addMapKeys(K... keys) { - for (K key : keys) { - addMapKey(key); - } - return this; - } - - public CommandArgs addMapKey(K key) { - return write(codec.encodeMapKey(key)); - } - - public CommandArgs addKey(K key) { - return write(codec.encodeKey(key)); - } - - public CommandArgs addKeys(List keys) { - for (K key : keys) { - addKey(key); - } - return this; - } - - public CommandArgs addKeys(K... keys) { - for (K key : keys) { - addKey(key); - } - return this; - } - - public CommandArgs addMapValue(V value) { - return write(codec.encodeMapValue(value)); - } - - public CommandArgs addValue(V value) { - return write(codec.encodeValue(value)); - } - - public CommandArgs addMapValues(V... values) { - for (V value : values) { - addMapValue(value); - } - return this; - } - - public CommandArgs addValues(V... values) { - for (V value : values) { - addValue(value); - } - return this; - } - - public CommandArgs add(Map map) { - if (map.size() > 2) { - realloc(buffer.capacity() + 16 * map.size()); - } - - for (Map.Entry entry : map.entrySet()) { - write(codec.encodeMapKey(entry.getKey())); - write(codec.encodeMapValue(entry.getValue())); - } - - return this; - } - - public CommandArgs add(String s) { - return write(s); - } - - public CommandArgs add(long n) { - return write(Long.toString(n)); - } - - public CommandArgs add(double n) { - return write(Double.toString(n)); - } - - public CommandArgs add(byte[] value) { - return write(value); - } - - public CommandArgs add(CommandKeyword keyword) { - return write(keyword.bytes); - } - - public CommandArgs add(CommandType type) { - return write(type.bytes); - } - - private CommandArgs write(byte[] arg) { - buffer.mark(); - - if (buffer.remaining() < arg.length) { - int estimate = buffer.remaining() + arg.length + 10; - realloc(max(buffer.capacity() * 2, estimate)); - } - - while (true) { - try { - buffer.put((byte) '$'); - write(arg.length); - buffer.put(CRLF); - buffer.put(arg); - buffer.put(CRLF); - break; - } catch (BufferOverflowException e) { - buffer.reset(); - realloc(buffer.capacity() * 2); - } - } - - count++; - return this; - } - - private CommandArgs write(String arg) { - int length = arg.length(); - - buffer.mark(); - - if (buffer.remaining() < length) { - int estimate = buffer.remaining() + length + 10; - realloc(max(buffer.capacity() * 2, estimate)); - } - - while (true) { - try { - buffer.put((byte) '$'); - write(length); - buffer.put(CRLF); - for (int i = 0; i < length; i++) { - buffer.put((byte) arg.charAt(i)); - } - buffer.put(CRLF); - break; - } catch (BufferOverflowException e) { - buffer.reset(); - realloc(buffer.capacity() * 2); - } - } - - count++; - return this; - } - - private void write(long value) { - if (value < 10) { - buffer.put((byte) ('0' + value)); - return; - } - - StringBuilder sb = new StringBuilder(8); - while (value > 0) { - long digit = value % 10; - sb.append((char) ('0' + digit)); - value /= 10; - } - - for (int i = sb.length() - 1; i >= 0; i--) { - buffer.put((byte) sb.charAt(i)); - } - } - - private void realloc(int size) { - ByteBuffer buffer = ByteBuffer.allocate(size); - this.buffer.flip(); - buffer.put(this.buffer); - buffer.mark(); - this.buffer = buffer; - } -} diff --git a/src/main/java/com/lambdaworks/redis/protocol/CommandHandler.java b/src/main/java/com/lambdaworks/redis/protocol/CommandHandler.java deleted file mode 100644 index f7598e0fa..000000000 --- a/src/main/java/com/lambdaworks/redis/protocol/CommandHandler.java +++ /dev/null @@ -1,101 +0,0 @@ -// Copyright (C) 2011 - Will Glozer. All rights reserved. - -package com.lambdaworks.redis.protocol; - -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufProcessor; -import io.netty.channel.*; -import io.netty.util.CharsetUtil; -import io.netty.util.internal.StringUtil; - -import java.util.concurrent.BlockingQueue; - -/** - * A netty {@link ChannelHandler} responsible for writing redis commands and - * reading responses from the server. - * - * @author Will Glozer - */ -@ChannelHandler.Sharable -public class CommandHandler extends ChannelDuplexHandler { - protected BlockingQueue> queue; - protected ByteBuf buffer; - protected RedisStateMachine rsm; - - /** - * Initialize a new instance that handles commands from the supplied queue. - * - * @param queue The command queue. - */ - public CommandHandler(BlockingQueue> queue) { - this.queue = queue; - } - - @Override - public void channelRegistered(ChannelHandlerContext ctx) throws Exception { - buffer = ctx.alloc().heapBuffer(); - rsm = new RedisStateMachine(); - } - - @Override - public void channelUnregistered(ChannelHandlerContext ctx) throws Exception { - buffer.release(); - } - - @Override - public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { - ByteBuf input = (ByteBuf) msg; - try { - if (!input.isReadable()) return; - -// System.out.println("in: " + toHexString(input)); - - buffer.discardReadBytes(); - buffer.writeBytes(input); - - decode(ctx, buffer); - } finally { - input.release(); - } - } - - @Override - public void write(ChannelHandlerContext ctx, Object msg, ChannelPromise promise) throws Exception { - Command cmd = (Command) msg; - ByteBuf buf = ctx.alloc().heapBuffer(); - cmd.encode(buf); -// System.out.println("out: " + toHexString(buf)); - - ctx.write(buf, promise); - } - - private String toHexString(ByteBuf buf) { - final StringBuilder builder = new StringBuilder(buf.readableBytes() * 2); - buf.forEachByte(new ByteBufProcessor() { - @Override - public boolean process(byte value) throws Exception { - char b = (char) value; - if ((b < ' ' && b != '\n' && b != '\r') || b > '~') { - builder.append("\\x").append(StringUtil.byteToHexStringPadded(value)); - } else { - builder.append(b); - } - return true; - } - }); - return builder.toString(); - } - - protected void decode(ChannelHandlerContext ctx, ByteBuf buffer) throws InterruptedException { - while (true) { - Command cmd = queue.peek(); - if (cmd == null - || !rsm.decode(buffer, cmd.getOutput())) { - break; - } - - cmd = queue.take(); - cmd.complete(); - } - } -} diff --git a/src/main/java/com/lambdaworks/redis/protocol/CommandKeyword.java b/src/main/java/com/lambdaworks/redis/protocol/CommandKeyword.java deleted file mode 100644 index 9471a12d8..000000000 --- a/src/main/java/com/lambdaworks/redis/protocol/CommandKeyword.java +++ /dev/null @@ -1,21 +0,0 @@ -// Copyright (C) 2011 - Will Glozer. All rights reserved. - -package com.lambdaworks.redis.protocol; - -/** - * Keyword modifiers for redis commands. - * - * @author Will Glozer - */ -public enum CommandKeyword { - AFTER, AGGREGATE, ALPHA, AND, ASC, BEFORE, BY, COUNT, DESC, ENCODING, FLUSH, - GETNAME, IDLETIME, KILL, LEN, LIMIT, LIST, LOAD, MAX, MIN, NO, NOSAVE, NOT, - ONE, OR, REFCOUNT, RESET, RESETSTAT, SETNAME, STORE, SUM, WEIGHTS, - WITHSCORES, XOR, NODES; - - public byte[] bytes; - - private CommandKeyword() { - bytes = name().getBytes(Charsets.ASCII); - } -} diff --git a/src/main/java/com/lambdaworks/redis/protocol/CommandOutput.java b/src/main/java/com/lambdaworks/redis/protocol/CommandOutput.java deleted file mode 100644 index 0559d1e64..000000000 --- a/src/main/java/com/lambdaworks/redis/protocol/CommandOutput.java +++ /dev/null @@ -1,147 +0,0 @@ -// Copyright (C) 2011 - Will Glozer. All rights reserved. - -package com.lambdaworks.redis.protocol; - -import com.lambdaworks.redis.codec.RedisCodec; - -import java.nio.ByteBuffer; - -/** - * Abstract representation of the output of a redis command. - * - * @param Output type. - * - * @author Will Glozer - */ -public abstract class CommandOutput { - protected RedisCodec codec; - protected T output; - protected String error; - protected Throwable exception; - - /** - * 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. - * @param output Initial value of output. - */ - public CommandOutput(RedisCodec codec, T output) { - 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; - } - - /** - * Set exception that was caught while processing result in command output. - * - * @param exception Exception caught while processing command result. - */ - public void setException(Throwable exception) { - this.exception = exception; - } - - /** - * Check if the processing command result resulted in an exception. - * - * @return true if processing of command result resulted in an exception. - */ - public boolean hasException() { - return this.exception != null; - } - - /** - * Get the exception that occurred while processing command result. - * - * @return The exception. - */ - public Throwable getException () { - return exception; - } - - /** - * 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); - } -} diff --git a/src/main/java/com/lambdaworks/redis/protocol/CommandType.java b/src/main/java/com/lambdaworks/redis/protocol/CommandType.java deleted file mode 100644 index cc67c8202..000000000 --- a/src/main/java/com/lambdaworks/redis/protocol/CommandType.java +++ /dev/null @@ -1,89 +0,0 @@ -// Copyright (C) 2011 - Will Glozer. All rights reserved. - -package com.lambdaworks.redis.protocol; - -/** - * Redis commands. - * - * @author Will Glozer - */ -public enum CommandType { - // Connection - - AUTH, ECHO, PING, QUIT, SELECT, - - // Server - - BGREWRITEAOF, BGSAVE, CLIENT, CONFIG, DBSIZE, DEBUG, FLUSHALL, - FLUSHDB, INFO, LASTSAVE, MONITOR, SAVE, SHUTDOWN, SLAVEOF, - SLOWLOG, SYNC, - - // Keys - - DEL, DUMP, EXISTS, EXPIRE, EXPIREAT, KEYS, MIGRATE, MOVE, OBJECT, PERSIST, - PEXPIRE, PEXPIREAT, PTTL, RANDOMKEY, RENAME, RENAMENX, RESTORE, TTL, TYPE, - - // String - - APPEND, GET, GETRANGE, GETSET, MGET, MSET, MSETNX, SET, SETEX, SETNX, - SETRANGE, STRLEN, PSETEX, - - // Numeric - - DECR, DECRBY, INCR, INCRBY, INCRBYFLOAT, - - // List - - BLPOP, BRPOP, BRPOPLPUSH, - LINDEX, LINSERT, LLEN, LPOP, LPUSH, LPUSHX, LRANGE, LREM, LSET, LTRIM, - RPOP, RPOPLPUSH, RPUSH, RPUSHX, SORT, - - // Hash - - HDEL, HEXISTS, HGET, HGETALL, HINCRBY, HINCRBYFLOAT, HKEYS, HLEN, - HMGET, HMSET, HSET, HSETNX, HVALS, - - // Transaction - - DISCARD, EXEC, MULTI, UNWATCH, WATCH, - - // Pub/Sub - - PSUBSCRIBE, PUBLISH, PUNSUBSCRIBE, SUBSCRIBE, UNSUBSCRIBE, - - // Sets - - SADD, SCARD, SDIFF, SDIFFSTORE, SINTER, SINTERSTORE, SISMEMBER, - SMEMBERS, SMOVE, SPOP, SRANDMEMBER, SREM, SUNION, SUNIONSTORE, - - // Sorted Set - - ZADD, ZCARD, ZCOUNT, ZINCRBY, ZINTERSTORE, ZRANGE, ZRANGEBYSCORE, - ZRANK, ZREM, ZREMRANGEBYRANK, ZREMRANGEBYSCORE, ZREVRANGE, - ZREVRANGEBYSCORE, ZREVRANK, ZSCORE, ZUNIONSTORE, - - TIME, - - // Scripting - - EVAL, EVALSHA, SCRIPT, - - // Bits - - BITCOUNT, BITOP, GETBIT, SETBIT, - - // HyperLogLog - PFADD, PFCOUNT, PFMERGE, - - SENTINEL, - - SSCAN, ZSCAN, HSCAN, - - ASKING, CLUSTER; - - public byte[] bytes; - - private CommandType() { - bytes = name().getBytes(Charsets.ASCII); - } -} diff --git a/src/main/java/com/lambdaworks/redis/protocol/ConnectionWatchdog.java b/src/main/java/com/lambdaworks/redis/protocol/ConnectionWatchdog.java deleted file mode 100644 index a66d41bc5..000000000 --- a/src/main/java/com/lambdaworks/redis/protocol/ConnectionWatchdog.java +++ /dev/null @@ -1,145 +0,0 @@ -// Copyright (C) 2011 - Will Glozer. All rights reserved. - -package com.lambdaworks.redis.protocol; - -import io.netty.bootstrap.Bootstrap; -import io.netty.channel.Channel; -import io.netty.channel.ChannelFuture; -import io.netty.channel.ChannelHandler; -import io.netty.channel.ChannelHandlerContext; -import io.netty.channel.ChannelInboundHandlerAdapter; -import io.netty.channel.ChannelInitializer; -import io.netty.channel.ChannelPipeline; -import io.netty.channel.EventLoop; -import io.netty.channel.group.ChannelGroup; -import io.netty.util.AttributeKey; -import io.netty.util.concurrent.GenericFutureListener; - -import java.util.concurrent.TimeUnit; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import com.lambdaworks.redis.RedisAsyncConnection; - -/** - * A netty {@link ChannelHandler} responsible for monitoring the channel and - * reconnecting when the connection is lost. - * - * @author Will Glozer - */ -@ChannelHandler.Sharable -public class ConnectionWatchdog extends ChannelInboundHandlerAdapter{ - - public static final AttributeKey SHUTDOWN_KEY = AttributeKey.valueOf("shutdown"); - - private final Logger log = LoggerFactory.getLogger(getClass()); - - private Bootstrap bootstrap; - private Channel channel; - private ChannelGroup channels; - private static final int BACKOFF_CAP = 12; - - /** - * Create a new watchdog that adds to new connections to the supplied {@link ChannelGroup} - * and establishes a new {@link Channel} when disconnected, while reconnect is true. - * - * @param bootstrap Configuration for new channels. - */ - public ConnectionWatchdog(Bootstrap bootstrap, ChannelGroup channels) { - this.bootstrap = bootstrap; - this.channels = channels; - } - - @Override - public void channelActive(ChannelHandlerContext ctx) throws Exception { - channel = ctx.channel(); - channels.add(channel); - ctx.fireChannelActive(); - } - - @Override - public void channelInactive(ChannelHandlerContext ctx) throws Exception { - ChannelPipeline pipeLine = channel.pipeline(); - CommandHandler handler = pipeLine.get(CommandHandler.class); - RedisAsyncConnection connection = pipeLine.get(RedisAsyncConnection.class); - if (connection.isReconnect()) { - EventLoop loop = ctx.channel().eventLoop(); - reconnect(loop, handler, connection); - } - ctx.fireChannelInactive(); - } - - /** - * Reconnect to the remote address that the closed channel was connected to. - * This creates a new {@link ChannelPipeline} with the same handler instances - * contained in the old channel's pipeline. - * - * @param loop EventLoop - * @param handler Redis Command handle. - * @param connection RedisAsyncConnection - * - * @throws Exception when reconnection fails. - */ - private void reconnect(final EventLoop loop, final CommandHandler handler, final RedisAsyncConnection connection){ - loop.schedule(new Runnable() { - @Override - public void run() { - doReConnect(loop, handler, connection, 1); - } - }, 100, TimeUnit.MILLISECONDS); - } - - private void doReConnect(final EventLoop loop, final CommandHandler handler, final RedisAsyncConnection connection, final int attempts) { - if (!connection.isReconnect()) { - return; - } - - log.debug("trying to reconnect {}", connection.getRedisClient().getAddr()); - - ChannelFuture connect; - synchronized (bootstrap) { - connect = bootstrap.handler(new ChannelInitializer() { - @Override - protected void initChannel(Channel ch) throws Exception { - ch.pipeline().addLast(ConnectionWatchdog.this, handler, connection); - } - }).connect(); - } - - connect.addListener(new GenericFutureListener() { - @Override - public void operationComplete(ChannelFuture future) throws Exception { - if (future.channel().attr(SHUTDOWN_KEY).get() != null) { - future.channel().pipeline().remove(ConnectionWatchdog.this); - return; - } - - if (!future.isSuccess()) { - if (!connection.isReconnect()) { - return; - } - - int timeout = 2 << attempts; - loop.schedule(new Runnable() { - @Override - public void run() { - doReConnect(loop, handler, connection, Math.min(BACKOFF_CAP, attempts + 1)); - } - }, timeout, TimeUnit.MILLISECONDS); - } - } - }); - } - - @Override - public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { - ctx.channel().close(); - } - - @Override - public String toString() { - return super.toString() + " - bootstrap: " + bootstrap; - } - -} diff --git a/src/main/java/com/lambdaworks/redis/protocol/RedisStateMachine.java b/src/main/java/com/lambdaworks/redis/protocol/RedisStateMachine.java deleted file mode 100644 index 82a5633e9..000000000 --- a/src/main/java/com/lambdaworks/redis/protocol/RedisStateMachine.java +++ /dev/null @@ -1,198 +0,0 @@ -// Copyright (C) 2011 - Will Glozer. All rights reserved. - -package com.lambdaworks.redis.protocol; - -import com.lambdaworks.redis.RedisException; -import io.netty.buffer.ByteBuf; - -import java.nio.ByteBuffer; -import java.util.LinkedList; - -import static com.lambdaworks.redis.protocol.Charsets.buffer; -import static com.lambdaworks.redis.protocol.RedisStateMachine.State.Type.*; - -/** - * State machine that decodes redis server responses encoded according to the - * Unified Request Protocol. - * - * @author Will Glozer - */ -public class RedisStateMachine { - private static final ByteBuffer QUEUED = buffer("QUEUED"); - - static class State { - enum Type { SINGLE, ERROR, INTEGER, BULK, MULTI, BYTES } - Type type = null; - int count = -1; - } - - private LinkedList stack; - - /** - * Initialize a new instance. - */ - public RedisStateMachine() { - stack = new LinkedList(); - } - - /** - * Attempt to decode a redis response and return a flag indicating whether a complete - * response was read. - * - * @param buffer Buffer containing data from the server. - * @param output Current command output. - * - * @return true if a complete response was read. - */ - public boolean decode(ByteBuf buffer, CommandOutput output) { - int length, end; - ByteBuffer bytes; - - if (stack.isEmpty()) { - stack.add(new State()); - } - - if (output == null) { - return stack.isEmpty(); - } - - loop: - - while (!stack.isEmpty()) { - State state = stack.peek(); - - if (state.type == null) { - if (!buffer.isReadable()) break; - state.type = readReplyType(buffer); - buffer.markReaderIndex(); - } - - switch (state.type) { - case SINGLE: - if ((bytes = readLine(buffer)) == null) break loop; - if (!QUEUED.equals(bytes)) { - setCommandOutputSafely(output, bytes); - } - break; - case ERROR: - if ((bytes = readLine(buffer)) == null) break loop; - output.setError(bytes); - break; - case INTEGER: - if ((end = findLineEnd(buffer)) == -1) break loop; - setCommandOutputSafely(output, readLong(buffer, buffer.readerIndex(), end)); - break; - case BULK: - if ((end = findLineEnd(buffer)) == -1) break loop; - length = (int) readLong(buffer, buffer.readerIndex(), end); - if (length == -1) { - setCommandOutputSafely(output, null); - } else { - state.type = BYTES; - state.count = length + 2; - buffer.markReaderIndex(); - continue loop; - } - break; - case MULTI: - if (state.count == -1) { - if ((end = findLineEnd(buffer)) == -1) break loop; - length = (int) readLong(buffer, buffer.readerIndex(), end); - state.count = length; - buffer.markReaderIndex(); - } - - if (state.count <= 0) break; - - state.count--; - stack.addFirst(new State()); - continue loop; - case BYTES: - if ((bytes = readBytes(buffer, state.count)) == null) break loop; - setCommandOutputSafely(output, bytes); - } - - buffer.markReaderIndex(); - stack.remove(); - output.complete(stack.size()); - } - - return stack.isEmpty(); - } - - private int findLineEnd(ByteBuf buffer) { - int start = buffer.readerIndex(); - int index = buffer.indexOf(start, buffer.writerIndex(), (byte) '\n'); - return (index > 0 && buffer.getByte(index - 1) == '\r') ? index : -1; - } - - private State.Type readReplyType(ByteBuf buffer) { - switch (buffer.readByte()) { - case '+': return SINGLE; - case '-': return ERROR; - case ':': return INTEGER; - case '$': return BULK; - case '*': return MULTI; - default: throw new RedisException("Invalid first byte"); - } - } - - private long readLong(ByteBuf buffer, int start, int end) { - long value = 0; - - boolean negative = buffer.getByte(start) == '-'; - int offset = negative ? start + 1 : start; - while (offset < end - 1) { - int digit = buffer.getByte(offset++) - '0'; - value = value * 10 - digit; - } - if (!negative) value = -value; - buffer.readerIndex(end + 1); - - return value; - } - - private ByteBuffer readLine(ByteBuf buffer) { - ByteBuffer bytes = null; - int end = findLineEnd(buffer); - if (end > -1) { - int start = buffer.readerIndex(); - bytes = buffer.nioBuffer(start, end - start - 1); - buffer.readerIndex(end + 1); - } - return bytes; - } - - private ByteBuffer readBytes(ByteBuf buffer, int count) { - ByteBuffer bytes = null; - if (buffer.readableBytes() >= count) { - bytes = buffer.nioBuffer(buffer.readerIndex(), count - 2); - buffer.readerIndex(buffer.readerIndex() + count); - } - return bytes; - } - - - private boolean setCommandOutputSafely(CommandOutput output, ByteBuffer bytes) { - boolean success = false; - try { - output.set(bytes); - success = true; - } catch (Throwable t) { - output.setException(t); - } - return success; - } - - private boolean setCommandOutputSafely(CommandOutput output, long value) { - boolean success = false; - try { - output.set(value); - success = true; - } catch (Throwable t) { - output.setException(t); - } - return success; - } - -} diff --git a/src/main/java/com/lambdaworks/redis/pubsub/PubSubCommandHandler.java b/src/main/java/com/lambdaworks/redis/pubsub/PubSubCommandHandler.java deleted file mode 100644 index 318f92eb8..000000000 --- a/src/main/java/com/lambdaworks/redis/pubsub/PubSubCommandHandler.java +++ /dev/null @@ -1,56 +0,0 @@ -// Copyright (C) 2011 - Will Glozer. All rights reserved. - -package com.lambdaworks.redis.pubsub; - -import com.lambdaworks.redis.codec.RedisCodec; -import com.lambdaworks.redis.protocol.*; -import io.netty.buffer.ByteBuf; -import io.netty.channel.*; - -import java.util.concurrent.BlockingQueue; - -/** - * A netty {@link ChannelHandler} responsible for writing redis pub/sub commands - * and reading the response stream from the server. - * - * @param Key type. - * @param Value type. - * - * @author Will Glozer - */ -public class PubSubCommandHandler extends CommandHandler { - private RedisCodec codec; - private PubSubOutput output; - - /** - * Initialize a new instance. - * - * @param queue Command queue. - * @param codec Codec. - */ - public PubSubCommandHandler(BlockingQueue> queue, RedisCodec codec) { - super(queue); - this.codec = codec; - this.output = new PubSubOutput(codec); - } - - @Override - protected void decode(ChannelHandlerContext ctx, ByteBuf buffer) throws InterruptedException { - while (output.type() == null && !queue.isEmpty()) { - CommandOutput output = queue.peek().getOutput(); - if (!rsm.decode(buffer, output)) { - return; - } - queue.take().complete(); - if (output instanceof PubSubOutput && ((PubSubOutput) output).type() != null) { - ctx.fireChannelRead(output); - } - } - - while (rsm.decode(buffer, output)) { - ctx.fireChannelRead(output); - output = new PubSubOutput(codec); - } - } - -} diff --git a/src/main/java/com/lambdaworks/redis/pubsub/PubSubOutput.java b/src/main/java/com/lambdaworks/redis/pubsub/PubSubOutput.java deleted file mode 100644 index 5803ea1e2..000000000 --- a/src/main/java/com/lambdaworks/redis/pubsub/PubSubOutput.java +++ /dev/null @@ -1,87 +0,0 @@ -// Copyright (C) 2011 - Will Glozer. All rights reserved. - -package com.lambdaworks.redis.pubsub; - -import com.lambdaworks.redis.codec.RedisCodec; -import com.lambdaworks.redis.protocol.CommandOutput; - -import java.nio.ByteBuffer; - -/** - * One element of the redis pub/sub stream. May be a message or notification - * of subscription details. - * - * @param Value type. - * - * @author Will Glozer - */ -public class PubSubOutput extends CommandOutput { - enum Type { message, pmessage, psubscribe, punsubscribe, subscribe, unsubscribe } - - private Type type; - private String channel; - private String pattern; - private long count; - - public PubSubOutput(RedisCodec codec) { - super(codec, null); - } - - public Type type() { - return type; - } - - public String channel() { - return channel; - } - - public String pattern() { - return pattern; - } - - public long count() { - return count; - } - - @Override - @SuppressWarnings("fallthrough") - public void set(ByteBuffer bytes) { - if (type == null) { - type = Type.valueOf(decodeAscii(bytes)); - return; - } - - switch (type) { - case pmessage: - if (pattern == null) { - pattern = decodeAscii(bytes); - break; - } - case message: - if (channel == null) { - channel = decodeAscii(bytes); - break; - } - if (channel.startsWith("__keyspace@") - || channel.startsWith("__keyevent@")) { - output = (V)decodeAscii(bytes); - } else { - output = codec.decodeValue(bytes); - } - break; - case psubscribe: - case punsubscribe: - pattern = decodeAscii(bytes); - break; - case subscribe: - case unsubscribe: - channel = decodeAscii(bytes); - break; - } - } - - @Override - public void set(long integer) { - count = integer; - } -} diff --git a/src/main/java/com/lambdaworks/redis/pubsub/RedisPubSubAdapter.java b/src/main/java/com/lambdaworks/redis/pubsub/RedisPubSubAdapter.java deleted file mode 100644 index 7449c8a79..000000000 --- a/src/main/java/com/lambdaworks/redis/pubsub/RedisPubSubAdapter.java +++ /dev/null @@ -1,37 +0,0 @@ -// Copyright (C) 2011 - Will Glozer. All rights reserved. - -package com.lambdaworks.redis.pubsub; - -/** - * Convenience adapter with an empty implementation of all - * {@link RedisPubSubListener} callback methods. - * - * @param Value type. - * - * @author Will Glozer - */ -public class RedisPubSubAdapter implements RedisPubSubListener { - @Override - public void message(String channel, V message) { - } - - @Override - public void message(String pattern, String channel, V message) { - } - - @Override - public void subscribed(String channel, long count) { - } - - @Override - public void psubscribed(String pattern, long count) { - } - - @Override - public void unsubscribed(String channel, long count) { - } - - @Override - public void punsubscribed(String pattern, long count) { - } -} diff --git a/src/main/java/com/lambdaworks/redis/pubsub/RedisPubSubConnection.java b/src/main/java/com/lambdaworks/redis/pubsub/RedisPubSubConnection.java deleted file mode 100644 index 0963383b6..000000000 --- a/src/main/java/com/lambdaworks/redis/pubsub/RedisPubSubConnection.java +++ /dev/null @@ -1,174 +0,0 @@ -// Copyright (C) 2011 - Will Glozer. All rights reserved. - -package com.lambdaworks.redis.pubsub; - -import static com.lambdaworks.redis.protocol.CommandType.PSUBSCRIBE; -import static com.lambdaworks.redis.protocol.CommandType.PUNSUBSCRIBE; -import static com.lambdaworks.redis.protocol.CommandType.SUBSCRIBE; -import static com.lambdaworks.redis.protocol.CommandType.UNSUBSCRIBE; -import io.netty.channel.ChannelHandlerContext; -import io.netty.channel.EventLoopGroup; -import io.netty.util.concurrent.Future; - -import java.lang.reflect.Array; -import java.util.Collection; -import java.util.HashSet; -import java.util.Queue; -import java.util.Set; -import java.util.concurrent.BlockingQueue; -import java.util.concurrent.ConcurrentLinkedQueue; -import java.util.concurrent.TimeUnit; - -import com.lambdaworks.redis.RedisAsyncConnection; -import com.lambdaworks.redis.RedisClient; -import com.lambdaworks.redis.codec.RedisCodec; -import com.lambdaworks.redis.protocol.Command; -import com.lambdaworks.redis.protocol.CommandArgs; - -/** - * An asynchronous thread-safe pub/sub connection to a redis server. After one or - * more channels are subscribed to only pub/sub related commands or {@link #quit} - * may be called. - * - * Incoming messages and results of the {@link #subscribe}/{@link #unsubscribe} - * calls will be passed to all registered {@link RedisPubSubListener}s. - * - * A {@link com.lambdaworks.redis.protocol.ConnectionWatchdog} monitors each - * connection and reconnects automatically until {@link #close} is called. Channel - * and pattern subscriptions are renewed after reconnecting. - * - * @author Will Glozer - */ -public class RedisPubSubConnection extends RedisAsyncConnection { - private final Queue> listeners = new ConcurrentLinkedQueue>(); - private Set channels; - private Set patterns; - - /** - * Initialize a new connection. - * - * @param queue Command queue. - * @param codec Codec used to encode/decode keys and values. - * @param timeout Maximum time to wait for a responses. - * @param unit Unit of time for the timeout. - * @param eventLoopGroup - */ - public RedisPubSubConnection(RedisClient client, BlockingQueue> queue, RedisCodec codec, long timeout, TimeUnit unit, EventLoopGroup eventLoopGroup) { - super(client, queue, codec, timeout, unit, eventLoopGroup); - channels = new HashSet(); - patterns = new HashSet(); - } - - /** - * Add a new listener. - * - * @param listener Listener. - */ - public void addListener(RedisPubSubListener listener) { - listeners.add(listener); - } - - /** - * Remove an existing listener. - * - * @param listener Listener. - */ - public void removeListener(RedisPubSubListener listener) { - listeners.remove(listener); - } - - public void psubscribe(String... patterns) { - dispatch(PSUBSCRIBE, new PubSubOutput(codec), args(patterns)); - } - - public void subscribe(String... channels) { - dispatch(SUBSCRIBE, new PubSubOutput(codec), args(channels)); - } - - public Future unsubscribe(String... channels) { - return dispatch(UNSUBSCRIBE, new PubSubOutput(codec), args(channels)); - } - - public Future punsubscribe(String... patterns) { - return dispatch(PUNSUBSCRIBE, new PubSubOutput(codec), args(patterns)); - } - - - @Override - public synchronized void channelActive(ChannelHandlerContext ctx) throws Exception { - super.channelActive(ctx); - - if (channels.size() > 0) { - subscribe(channels.toArray(new String[channels.size()])); - channels.clear(); - } - - if (patterns.size() > 0) { - psubscribe(toArray(patterns)); - patterns.clear(); - } - } - - @Override - @SuppressWarnings("unchecked") - public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { - PubSubOutput output = (PubSubOutput) msg; - - // Update internal state - switch (output.type()) { - case psubscribe: - patterns.add(output.pattern()); - break; - case punsubscribe: - patterns.remove(output.pattern()); - break; - case subscribe: - channels.add(output.channel()); - break; - case unsubscribe: - channels.remove(output.channel()); - break; - default: - break; - } - - // notify watchers, if any - for (RedisPubSubListener listener : listeners) { - switch (output.type()) { - case message: - listener.message(output.channel(), output.get()); - break; - case pmessage: - listener.message(output.pattern(), output.channel(), output.get()); - break; - case psubscribe: - listener.psubscribed(output.pattern(), output.count()); - break; - case punsubscribe: - listener.punsubscribed(output.pattern(), output.count()); - break; - case subscribe: - listener.subscribed(output.channel(), output.count()); - break; - case unsubscribe: - listener.unsubscribed(output.channel(), output.count()); - break; - } - } - } - - private CommandArgs args(String... keys) { - CommandArgs args = new CommandArgs(codec); - for (String key : keys) { - args.add(key.toString()); - } - return args; - } - - @SuppressWarnings("unchecked") - private T[] toArray(Collection c) { - Class cls = (Class) c.iterator().next().getClass(); - T[] array = (T[]) Array.newInstance(cls, c.size()); - return c.toArray(array); - } -} diff --git a/src/main/java/com/lambdaworks/redis/pubsub/RedisPubSubListener.java b/src/main/java/com/lambdaworks/redis/pubsub/RedisPubSubListener.java deleted file mode 100644 index 223bc3749..000000000 --- a/src/main/java/com/lambdaworks/redis/pubsub/RedisPubSubListener.java +++ /dev/null @@ -1,61 +0,0 @@ -// Copyright (C) 2011 - Will Glozer. All rights reserved. - -package com.lambdaworks.redis.pubsub; - -/** - * Interface for redis pub/sub listeners. - * - * @param Value type. - * - * @author Will Glozer - */ -public interface RedisPubSubListener { - /** - * Message received from a channel subscription. - * - * @param channel Channel. - * @param message Message. - */ - void message(String channel, V message); - - /** - * Message received from a pattern subscription. - * - * @param pattern Pattern. - * @param channel Channel. - * @param message Message. - */ - void message(String pattern, String channel, V message); - - /** - * Subscribed to a channel. - * - * @param channel Channel - * @param count Subscription count. - */ - void subscribed(String channel, long count); - - /** - * Subscribed to a pattern. - * - * @param pattern Pattern. - * @param count Subscription count. - */ - void psubscribed(String pattern, long count); - - /** - * Unsubscribed from a channel. - * - * @param channel Channel - * @param count Subscription count. - */ - void unsubscribed(String channel, long count); - - /** - * Unsubscribed from a pattern. - * - * @param pattern Channel - * @param count Subscription count. - */ - void punsubscribed(String pattern, long count); -}