diff --git a/fine-jedis/src/main/java/com/fr/third/redis/clients/jedis/Protocol.java b/fine-jedis/src/main/java/com/fr/third/redis/clients/jedis/Protocol.java index e9dc5c1a4..347961433 100644 --- a/fine-jedis/src/main/java/com/fr/third/redis/clients/jedis/Protocol.java +++ b/fine-jedis/src/main/java/com/fr/third/redis/clients/jedis/Protocol.java @@ -1,10 +1,5 @@ package com.fr.third.redis.clients.jedis; -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; -import java.util.Locale; - import com.fr.third.redis.clients.jedis.commands.ProtocolCommand; import com.fr.third.redis.clients.jedis.exceptions.JedisAskDataException; import com.fr.third.redis.clients.jedis.exceptions.JedisBusyException; @@ -17,6 +12,13 @@ import com.fr.third.redis.clients.jedis.util.RedisInputStream; import com.fr.third.redis.clients.jedis.util.RedisOutputStream; import com.fr.third.redis.clients.jedis.util.SafeEncoder; +import java.io.IOException; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Locale; +import java.util.Map; + public final class Protocol { private static final String ASK_RESPONSE = "ASK"; @@ -79,13 +81,44 @@ public final class Protocol { public static final byte[] POSITIVE_INFINITY_BYTES = "+inf".getBytes(); public static final byte[] NEGATIVE_INFINITY_BYTES = "-inf".getBytes(); + public static Map commandMapping = new HashMap(); + + public static volatile int commandMappingSize = 0; + + public static synchronized void initCommandMapping(Map mapping) { + + commandMapping.clear(); + for (Map.Entry entry : mapping.entrySet()) { + ProtocolCommand defaultCommand = Command.fromName(entry.getKey()); + if (defaultCommand != null) { + commandMapping.put(defaultCommand, new ProtocolCommand() { + @Override + public byte[] getRaw() { + return SafeEncoder.encode(entry.getValue()); + } + }); + } + } + + commandMappingSize = commandMapping.size(); + } + private Protocol() { // this prevent the class from instantiation } public static void sendCommand(final RedisOutputStream os, final ProtocolCommand command, final byte[]... args) { - sendCommand(os, command.getRaw(), args); + ProtocolCommand realCommand = getRealCommand(command); + sendCommand(os, realCommand.getRaw(), args); + } + + private static ProtocolCommand getRealCommand(ProtocolCommand command) { + if (commandMappingSize > 0 && commandMapping.containsKey(command)) { + return commandMapping.get(command); + } + + return command; } private static void sendCommand(final RedisOutputStream os, final byte[] command, @@ -242,20 +275,20 @@ public final class Protocol { } public static enum Command implements ProtocolCommand { - PING, SET, GET, QUIT, EXISTS, DEL, UNLINK, TYPE, FLUSHDB, KEYS, RANDOMKEY, RENAME, RENAMENX, RENAMEX, - DBSIZE, EXPIRE, EXPIREAT, TTL, SELECT, MOVE, FLUSHALL, GETSET, MGET, SETNX, SETEX, MSET, MSETNX, - DECRBY, DECR, INCRBY, INCR, APPEND, SUBSTR, HSET, HGET, HSETNX, HMSET, HMGET, HINCRBY, HEXISTS, - HDEL, HLEN, HKEYS, HVALS, HGETALL, RPUSH, LPUSH, LLEN, LRANGE, LTRIM, LINDEX, LSET, LREM, LPOP, RPOP, - RPOPLPUSH, SADD, SMEMBERS, SREM, SPOP, SMOVE, SCARD, SISMEMBER, SINTER, SINTERSTORE, SUNION, - SUNIONSTORE, SDIFF, SDIFFSTORE, SRANDMEMBER, ZADD, ZRANGE, ZREM, ZINCRBY, ZRANK, ZREVRANK, - ZREVRANGE, ZCARD, ZSCORE, MULTI, DISCARD, EXEC, WATCH, UNWATCH, SORT, BLPOP, BRPOP, AUTH, - SUBSCRIBE, PUBLISH, UNSUBSCRIBE, PSUBSCRIBE, PUNSUBSCRIBE, PUBSUB, ZCOUNT, ZRANGEBYSCORE, - ZREVRANGEBYSCORE, ZREMRANGEBYRANK, ZREMRANGEBYSCORE, ZUNIONSTORE, ZINTERSTORE, ZLEXCOUNT, - ZRANGEBYLEX, ZREVRANGEBYLEX, ZREMRANGEBYLEX, SAVE, BGSAVE, BGREWRITEAOF, LASTSAVE, SHUTDOWN, - INFO, MONITOR, SLAVEOF, CONFIG, STRLEN, SYNC, LPUSHX, PERSIST, RPUSHX, ECHO, LINSERT, DEBUG, BRPOPLPUSH, - SETBIT, GETBIT, BITPOS, SETRANGE, GETRANGE, EVAL, EVALSHA, SCRIPT, SLOWLOG, OBJECT, BITCOUNT, BITOP, - SENTINEL, DUMP, RESTORE, PEXPIRE, PEXPIREAT, PTTL, INCRBYFLOAT, PSETEX, CLIENT, TIME, MIGRATE, HINCRBYFLOAT, - SCAN, HSCAN, SSCAN, ZSCAN, WAIT, CLUSTER, ASKING, PFADD, PFCOUNT, PFMERGE, READONLY, GEOADD, GEODIST, + PING, SET, GET, QUIT, EXISTS, DEL, UNLINK, TYPE, FLUSHDB, KEYS, RANDOMKEY, RENAME, RENAMENX, RENAMEX, + DBSIZE, EXPIRE, EXPIREAT, TTL, SELECT, MOVE, FLUSHALL, GETSET, MGET, SETNX, SETEX, MSET, MSETNX, + DECRBY, DECR, INCRBY, INCR, APPEND, SUBSTR, HSET, HGET, HSETNX, HMSET, HMGET, HINCRBY, HEXISTS, + HDEL, HLEN, HKEYS, HVALS, HGETALL, RPUSH, LPUSH, LLEN, LRANGE, LTRIM, LINDEX, LSET, LREM, LPOP, RPOP, + RPOPLPUSH, SADD, SMEMBERS, SREM, SPOP, SMOVE, SCARD, SISMEMBER, SINTER, SINTERSTORE, SUNION, + SUNIONSTORE, SDIFF, SDIFFSTORE, SRANDMEMBER, ZADD, ZRANGE, ZREM, ZINCRBY, ZRANK, ZREVRANK, + ZREVRANGE, ZCARD, ZSCORE, MULTI, DISCARD, EXEC, WATCH, UNWATCH, SORT, BLPOP, BRPOP, AUTH, + SUBSCRIBE, PUBLISH, UNSUBSCRIBE, PSUBSCRIBE, PUNSUBSCRIBE, PUBSUB, ZCOUNT, ZRANGEBYSCORE, + ZREVRANGEBYSCORE, ZREMRANGEBYRANK, ZREMRANGEBYSCORE, ZUNIONSTORE, ZINTERSTORE, ZLEXCOUNT, + ZRANGEBYLEX, ZREVRANGEBYLEX, ZREMRANGEBYLEX, SAVE, BGSAVE, BGREWRITEAOF, LASTSAVE, SHUTDOWN, + INFO, MONITOR, SLAVEOF, CONFIG, STRLEN, SYNC, LPUSHX, PERSIST, RPUSHX, ECHO, LINSERT, DEBUG, BRPOPLPUSH, + SETBIT, GETBIT, BITPOS, SETRANGE, GETRANGE, EVAL, EVALSHA, SCRIPT, SLOWLOG, OBJECT, BITCOUNT, BITOP, + SENTINEL, DUMP, RESTORE, PEXPIRE, PEXPIREAT, PTTL, INCRBYFLOAT, PSETEX, CLIENT, TIME, MIGRATE, HINCRBYFLOAT, + SCAN, HSCAN, SSCAN, ZSCAN, WAIT, CLUSTER, ASKING, PFADD, PFCOUNT, PFMERGE, READONLY, GEOADD, GEODIST, GEOHASH, GEOPOS, GEORADIUS, GEORADIUSBYMEMBER, MODULE, BITFIELD, HSTRLEN, TOUCH, SWAPDB; private final byte[] raw; @@ -268,6 +301,17 @@ public final class Protocol { public byte[] getRaw() { return raw; } + + public static ProtocolCommand fromName(String commandName) { + Command[] commands = values(); + for (Command command : commands) { + if (command.name().equals(commandName)) { + return command; + } + } + + return null; + } } public static enum Keyword {