diff --git a/src/main/java/org/springframework/data/redis/core/RedisCommand.java b/src/main/java/org/springframework/data/redis/core/RedisCommand.java
index dc52746c8..8351f3e29 100644
--- a/src/main/java/org/springframework/data/redis/core/RedisCommand.java
+++ b/src/main/java/org/springframework/data/redis/core/RedisCommand.java
@@ -25,203 +25,198 @@ import java.util.Set;
import org.springframework.util.StringUtils;
/**
+ * {@link Enum Enumeration} of {@literal Redis commands}.
+ *
* @author Christoph Strobl
* @author Thomas Darimont
* @author Ninad Divadkar
* @author Mark Paluch
* @author Oscar Cai
* @author Sébastien Volle
+ * @author John Blum
* @since 1.3
- * @link Redis
- * command list
+ * @link Redis command list
*/
public enum RedisCommand {
+
// -- A
- APPEND("rw", 2, 2), //
- AUTH("rw", 1, 1), //
+ APPEND("rw", 2, 2),
+ AUTH("rw", 1, 1),
// -- B
- BGREWRITEAOF("r", 0, 0, "bgwriteaof"), //
- BGSAVE("r", 0, 0), //
- BITCOUNT("r", 1, 3), //
- BITOP("rw", 3), //
- BITPOS("r", 2, 4), //
- BLPOP("rw", 2), //
- BRPOP("rw", 2), //
- BRPOPLPUSH("rw", 3), //
+ BGREWRITEAOF("r", 0, 0, "bgwriteaof"),
+ BGSAVE("r", 0, 0),
+ BITCOUNT("r", 1, 3),
+ BITOP("rw", 3),
+ BITPOS("r", 2, 4),
+ BLPOP("rw", 2),
+ BRPOP("rw", 2),
+ BRPOPLPUSH("rw", 3),
// -- C
- CLIENT_KILL("rw", 1, 1), //
- CLIENT_LIST("r", 0, 0), //
- CLIENT_GETNAME("r", 0, 0), //
- CLIENT_PAUSE("rw", 1, 1), //
- CLIENT_SETNAME("w", 1, 1), //
- CONFIG_GET("r", 1, 1, "getconfig"), //
- CONFIG_REWRITE("rw", 0, 0), //
- CONFIG_SET("w", 2, 2, "setconfig"), //
- CONFIG_RESETSTAT("w", 0, 0, "resetconfigstats"), //
+ CLIENT_KILL("rw", 1, 1),
+ CLIENT_LIST("r", 0, 0),
+ CLIENT_GETNAME("r", 0, 0),
+ CLIENT_PAUSE("rw", 1, 1),
+ CLIENT_SETNAME("w", 1, 1),
+ CONFIG_GET("r", 1, 1, "getconfig"),
+ CONFIG_REWRITE("rw", 0, 0),
+ CONFIG_SET("w", 2, 2, "setconfig"),
+ CONFIG_RESETSTAT("w", 0, 0, "resetconfigstats"),
// -- D
- DBSIZE("r", 0, 0), //
- DECR("w", 1, 1), //
- DECRBY("w", 2, 2), //
- DEL("rw", 1), //
- DISCARD("rw", 0, 0), //
- DUMP("r", 1, 1), //
+ DBSIZE("r", 0, 0),
+ DECR("w", 1, 1),
+ DECRBY("w", 2, 2),
+ DEL("rw", 1),
+ DISCARD("rw", 0, 0),
+ DUMP("r", 1, 1),
// -- E
- ECHO("r", 1, 1), //
- EVAL("rw", 2), //
- EVALSHA("rw", 2), //
- EXEC("rw", 0, 0), //
- EXISTS("r", 1, 1), //
- EXPIRE("rw", 2, 2), //
- EXPIREAT("rw", 2, 2), //
+ ECHO("r", 1, 1),
+ EVAL("rw", 2),
+ EVALSHA("rw", 2),
+ EXEC("rw", 0, 0),
+ EXISTS("r", 1, 1),
+ EXPIRE("rw", 2, 2),
+ EXPIREAT("rw", 2, 2),
// -- F
- FLUSHALL("w", 0, 0), //
- FLUSHDB("w", 0, 0), //
+ FLUSHALL("w", 0, 0),
+ FLUSHDB("w", 0, 0),
// -- G
- GET("r", 1, 1), //
- GETBIT("r", 2, 2), //
- GETRANGE("r", 3, 3), //
- GETSET("rw", 2, 2), //
- GEOADD("w", 3), //
- GEODIST("r", 2), //
- GEOHASH("r", 2), //
- GEOPOS("r", 2), //
- GEORADIUS("r", 4), //
+ GET("r", 1, 1),
+ GETBIT("r", 2, 2),
+ GETRANGE("r", 3, 3),
+ GETSET("rw", 2, 2),
+ GEOADD("w", 3),
+ GEODIST("r", 2),
+ GEOHASH("r", 2),
+ GEOPOS("r", 2),
+ GEORADIUS("r", 4),
GEORADIUSBYMEMBER("r", 3),
// -- H
- HDEL("rw", 2), //
- HEXISTS("r", 2, 2), //
- HGET("r", 2, 2), //
- HGETALL("r", 1, 1), //
- HINCRBY("rw", 3, 3), //
- HINCBYFLOAT("rw", 3, 3), //
- HKEYS("r", 1), //
- HLEN("r", 1), //
- HMGET("r", 2), //
- HMSET("w", 3), //
- HSET("w", 3, 3), //
- HSETNX("w", 3, 3), //
- HVALS("r", 1, 1), //
+ HDEL("rw", 2),
+ HEXISTS("r", 2, 2),
+ HGET("r", 2, 2),
+ HGETALL("r", 1, 1),
+ HINCRBY("rw", 3, 3),
+ HINCBYFLOAT("rw", 3, 3),
+ HKEYS("r", 1),
+ HLEN("r", 1),
+ HMGET("r", 2),
+ HMSET("w", 3),
+ HSET("w", 3, 3),
+ HSETNX("w", 3, 3),
+ HVALS("r", 1, 1),
// -- I
- INCR("rw", 1), //
- INCRBYFLOAT("rw", 2, 2), //
- INFO("r", 0), //
+ INCR("rw", 1),
+ INCRBYFLOAT("rw", 2, 2),
+ INFO("r", 0),
// -- K
- KEYS("r", 1), //
+ KEYS("r", 1),
// -- L
- LASTSAVE("r", 0), //
- LINDEX("r", 2, 2), //
- LINSERT("rw", 4, 4), //
- LLEN("r", 1, 1), //
- LPOP("rw", 1, 1), //
- LPUSH("rw", 2), //
- LPUSHX("rw", 2), //
- LRANGE("r", 3, 3), //
- LREM("rw", 3, 3), //
- LSET("w", 3, 3), //
- LTRIM("w", 3, 3), //
+ LASTSAVE("r", 0),
+ LINDEX("r", 2, 2),
+ LINSERT("rw", 4, 4),
+ LLEN("r", 1, 1),
+ LPOP("rw", 1, 1),
+ LPUSH("rw", 2),
+ LPUSHX("rw", 2),
+ LRANGE("r", 3, 3),
+ LREM("rw", 3, 3),
+ LSET("w", 3, 3),
+ LTRIM("w", 3, 3),
// -- M
- MGET("r", 1), //
- MIGRATE("rw", 0), //
- MONITOR("rw", 0, 0), //
- MOVE("rw", 2, 2), //
- MSET("w", 2), //
- MSETNX("w", 2), //
- MULTI("rw", 0, 0), //
+ MGET("r", 1),
+ MIGRATE("rw", 0),
+ MONITOR("rw", 0, 0),
+ MOVE("rw", 2, 2),
+ MSET("w", 2),
+ MSETNX("w", 2),
+ MULTI("rw", 0, 0),
// -- P
- PERSIST("rw", 1, 1), //
- PEXPIRE("rw", 2, 2), //
- PEXPIREAT("rw", 2, 2), //
- PING("r", 0, 0), //
- PSETEX("w", 3), //
- PSUBSCRIBE("r", 1), //
- PTTL("r", 1, 1), //
+ PERSIST("rw", 1, 1),
+ PEXPIRE("rw", 2, 2),
+ PEXPIREAT("rw", 2, 2),
+ PING("r", 0, 0),
+ PSETEX("w", 3),
+ PSUBSCRIBE("r", 1),
+ PTTL("r", 1, 1),
// -- Q
- QUIT("rw", 0, 0), //
+ QUIT("rw", 0, 0),
// -- R
- RANDOMKEY("r", 0, 0), //
+ RANDOMKEY("r", 0, 0),
- RENAME("w", 2, 2), //
- RENAMENX("w", 2, 2), //
- REPLICAOF("w", 2), //
- RESTORE("w", 3, 3), //
- RPOP("rw", 1, 1), //
- RPOPLPUSH("rw", 2, 2), //
- RPUSH("rw", 2), //
- RPUSHX("rw", 2, 2), //
+ RENAME("w", 2, 2),
+ RENAMENX("w", 2, 2),
+ REPLICAOF("w", 2),
+ RESTORE("w", 3, 3),
+ RPOP("rw", 1, 1),
+ RPOPLPUSH("rw", 2, 2),
+ RPUSH("rw", 2),
+ RPUSHX("rw", 2, 2),
// -- S
- SADD("rw", 2), //
- SAVE("rw", 0, 0), //
- SCARD("r", 1, 1), //
- SCRIPT_EXISTS("r", 1), //
- SCRIPT_FLUSH("rw", 0, 0), //
- SCRIPT_KILL("rw", 0, 0), //
- SCRIPT_LOAD("rw", 1, 1), //
- SDIFF("r", 1), //
- SDIFFSTORE("rw", 2), //
- SELECT("rw", 1, 1), //
- SET("w", 2), //
- SETBIT("rw", 3, 3), //
- SETEX("w", 3, 3), //
- SETNX("w", 2, 2), //
- SETRANGE("rw", 3, 3), //
- SHUTDOWN("rw", 0), //
- SINTER("r", 1), //
- SINTERSTORE("rw", 2), //
- SISMEMBER("r", 2), //
- SLAVEOF("w", 2), //
- SLOWLOG("rw", 1), //
- SMEMBERS("r", 1, 1), //
- SMOVE("rw", 3, 3), //
- SORT("rw", 1), //
- SPOP("rw", 1, 1), //
- SRANDMEMBER("r", 1, 1), //
- SREM("rw", 2), //
- STRLEN("r", 1, 1), //
- SUBSCRIBE("rw", 1), //
- SUNION("r", 1), //
- SUNIONSTORE("rw ", 2), //
- SYNC("rw", 0, 0), //
+ SADD("rw", 2),
+ SAVE("rw", 0, 0),
+ SCARD("r", 1, 1),
+ SCRIPT_EXISTS("r", 1),
+ SCRIPT_FLUSH("rw", 0, 0),
+ SCRIPT_KILL("rw", 0, 0),
+ SCRIPT_LOAD("rw", 1, 1),
+ SDIFF("r", 1),
+ SDIFFSTORE("rw", 2),
+ SELECT("rw", 1, 1),
+ SET("w", 2),
+ SETBIT("rw", 3, 3),
+ SETEX("w", 3, 3),
+ SETNX("w", 2, 2),
+ SETRANGE("rw", 3, 3),
+ SHUTDOWN("rw", 0),
+ SINTER("r", 1),
+ SINTERSTORE("rw", 2),
+ SISMEMBER("r", 2),
+ SLAVEOF("w", 2),
+ SLOWLOG("rw", 1),
+ SMEMBERS("r", 1, 1),
+ SMOVE("rw", 3, 3),
+ SORT("rw", 1),
+ SPOP("rw", 1, 1),
+ SRANDMEMBER("r", 1, 1),
+ SREM("rw", 2),
+ STRLEN("r", 1, 1),
+ SUBSCRIBE("rw", 1),
+ SUNION("r", 1),
+ SUNIONSTORE("rw ", 2),
+ SYNC("rw", 0, 0),
// -- T
- TIME("r", 0, 0), //
- TTL("r", 1, 1), //
- TYPE("r", 1, 1), //
+ TIME("r", 0, 0),
+ TTL("r", 1, 1),
+ TYPE("r", 1, 1),
// -- U
- UNSUBSCRIBE("rw", 0), //
- UNWATCH("rw", 0, 0), //
+ UNSUBSCRIBE("rw", 0),
+ UNWATCH("rw", 0, 0),
// -- W
- WATCH("rw", 1), //
+ WATCH("rw", 1),
// -- Z
- ZADD("rw", 3), //
- ZCARD("r", 1), //
- ZCOUNT("r", 3, 3), //
- ZINCRBY("rw", 3), //
- ZINTERSTORE("rw", 3), //
- ZRANGE("r", 3), //
- ZRANGEBYSCORE("r", 3), //
- ZRANK("r", 2, 2), //
- ZREM("rw", 2), //
- ZREMRANGEBYRANK("rw", 3, 3), //
- ZREMRANGEBYSCORE("rw", 3, 3), //
- ZREVRANGE("r", 3), //
- ZREVRANGEBYSCORE("r", 3), //
- ZREVRANK("r", 2, 2), //
- ZSCORE("r", 2, 2), //
- ZUNIONSTORE("rw", 3), //
- SCAN("r", 1), //
- SSCAN("r", 2), //
- HSCAN("r", 2), //
- ZSCAN("r", 2), //
+ ZADD("rw", 3),
+ ZCARD("r", 1),
+ ZCOUNT("r", 3, 3),
+ ZINCRBY("rw", 3),
+ ZINTERSTORE("rw", 3),
+ ZRANGE("r", 3),
+ ZRANGEBYSCORE("r", 3),
+ ZRANK("r", 2, 2),
+ ZREM("rw", 2),
+ ZREMRANGEBYRANK("rw", 3, 3),
+ ZREMRANGEBYSCORE("rw", 3, 3),
+ ZREVRANGE("r", 3),
+ ZREVRANGEBYSCORE("r", 3),
+ ZREVRANK("r", 2, 2),
+ ZSCORE("r", 2, 2),
+ ZUNIONSTORE("rw", 3),
+ SCAN("r", 1),
+ SSCAN("r", 2),
+ HSCAN("r", 2),
+ ZSCAN("r", 2),
// -- UNKNOWN / DEFAULT
UNKNOWN("rw", -1);
- private boolean read = true;
- private boolean write = true;
- private Set alias = new HashSet<>(1);
-
- private int minArgs = -1;
- private int maxArgs = -1;
-
private static final Map commandLookup;
static {
@@ -230,30 +225,51 @@ public enum RedisCommand {
private static Map buildCommandLookupTable() {
- RedisCommand[] cmds = RedisCommand.values();
- Map map = new HashMap<>(cmds.length, 1.0F);
+ RedisCommand[] commands = RedisCommand.values();
+ Map map = new HashMap<>(commands.length, 1.0f);
- for (RedisCommand cmd : cmds) {
+ for (RedisCommand command : commands) {
- map.put(cmd.name().toLowerCase(), cmd);
+ map.put(command.name().toLowerCase(), command);
- for (String alias : cmd.alias) {
- map.put(alias, cmd);
+ for (String alias : command.alias) {
+ map.put(alias, command);
}
}
return Collections.unmodifiableMap(map);
}
+ private boolean read = true;
+ private boolean write = true;
+
+ private final int minArgs;
+ private final int maxArgs;
+
+ private final Set alias = new HashSet<>(1);
+
+ /**
+ * Creates a new {@link RedisCommand}.
+ *
+ * @param mode {@link String} containing the {@literal read, write (rw)} mode of the Redis command.
+ * @param minArgs {@link Integer minimum number of arguments} accepted by the Redis command.
+ */
RedisCommand(String mode, int minArgs) {
this(mode, minArgs, -1);
}
+ /**
+ * Creates a new {@link RedisCommand}.
+ *
+ * @param mode {@link String} containing the {@literal read, write (rw)} mode of the Redis command.
+ * @param minArgs {@link Integer minimum number of arguments} accepted by the Redis command.
+ * @param maxArgs {@link Integer maximum number of arguments} accepted by the Redis command.
+ */
RedisCommand(String mode, int minArgs, int maxArgs) {
if (StringUtils.hasText(mode)) {
- this.read = mode.toLowerCase().indexOf('r') > -1;
- this.write = mode.toLowerCase().indexOf('w') > -1;
+ this.read = mode.toLowerCase().contains("r");
+ this.write = mode.toLowerCase().contains("w");
}
this.minArgs = minArgs;
@@ -263,10 +279,10 @@ public enum RedisCommand {
/**
* Creates a new {@link RedisCommand}.
*
- * @param mode
- * @param minArgs
- * @param maxArgs
- * @param alias
+ * @param mode {@link String} containing the {@literal read, write (rw)} mode of the Redis command.
+ * @param minArgs {@link Integer minimum number of arguments} accepted by the Redis command.
+ * @param maxArgs {@link Integer maximum number of arguments} accepted by the Redis command.
+ * @param alias array of {@link String alternate command names} used as {@literal aliases} for the Redis command.
*/
RedisCommand(String mode, int minArgs, int maxArgs, String... alias) {
@@ -291,6 +307,15 @@ public enum RedisCommand {
return maxArgs == 0 || minArgs == maxArgs;
}
+ /**
+ * Returns a {@link Set} of all {@link String aliases} for this {@link RedisCommand}.
+ *
+ * @return a {@link Set} of all {@link String aliases} for this {@link RedisCommand}.
+ */
+ Set getAliases() {
+ return Collections.unmodifiableSet(this.alias);
+ }
+
/**
* @return {@literal true} if the command triggers a read operation
*/
@@ -309,78 +334,64 @@ public enum RedisCommand {
* @return {@literal true} if values are read but not written
*/
public boolean isReadonly() {
- return read && !write;
+ return isRead() && !isWrite();
}
/**
- * {@link String#equalsIgnoreCase(String)} compare the given string representation of {@literal command} against the
- * {@link #toString()} representation of the command as well as its given {@link #alias}.
+ * {@link String#equalsIgnoreCase(String) Compares} the given {@link String} representing the {@literal Redis command}
+ * to the {@link #toString()} representation of {@link RedisCommand} as well as any {@link #alias}.
*
- * @param command
- * @return true if positive match.
+ * @param command {@link String} representation of the {@literal Redis command} to match.
+ * @return {@literal true} if a positive match.
*/
public boolean isRepresentedBy(String command) {
- if (!StringUtils.hasText(command)) {
- return false;
- }
-
- if (toString().equalsIgnoreCase(command)) {
- return true;
- }
-
- return alias.contains(command.toLowerCase());
+ return StringUtils.hasText(command)
+ && (toString().equalsIgnoreCase(command) || this.alias.contains(command.toLowerCase()));
}
/**
- * Validates given argument count against expected ones.
+ * Validates given {@link Integer argument count} against expected ones.
*
- * @param nrArguments
- * @exception IllegalArgumentException in case argument count does not match expected.
+ * @param argumentCount {@link Integer number of arguments} passed to the Redis command.
+ * @exception IllegalArgumentException if the given {@link Integer argument count} does not match expected.
*/
- public void validateArgumentCount(int nrArguments) {
+ public void validateArgumentCount(int argumentCount) {
if (requiresArguments()) {
if (requiresExactNumberOfArguments()) {
- if (nrArguments != maxArgs) {
- throw new IllegalArgumentException(
- String.format("%s command requires %s %s", this.name(), this.maxArgs, arguments(this.maxArgs)));
+ if (argumentCount != this.maxArgs) {
+ throw newIllegalArgumentException("%s command requires %d %s",
+ name(), this.maxArgs, arguments(this.maxArgs));
}
}
- if (nrArguments < minArgs) {
- throw new IllegalArgumentException(
- String.format("%s command requires at least %s %s", this.name(), this.minArgs, arguments(this.maxArgs)));
+ if (argumentCount < this.minArgs) {
+ throw newIllegalArgumentException("%s command requires at least %d %s",
+ name(), this.minArgs, arguments(this.maxArgs));
}
-
- if (maxArgs > 0 && nrArguments > maxArgs) {
- throw new IllegalArgumentException(
- String.format("%s command requires at most %s %s", this.name(), this.maxArgs, arguments(this.maxArgs)));
+ if (this.maxArgs > 0 && argumentCount > this.maxArgs) {
+ throw newIllegalArgumentException("%s command requires at most %s %s",
+ name(), this.maxArgs, arguments(this.maxArgs));
}
}
}
- private static String arguments(int count) {
+ private String arguments(int count) {
return count == 1 ? "argument" : "arguments";
}
+ private IllegalArgumentException newIllegalArgumentException(String message, Object... arguments) {
+ return new IllegalArgumentException(String.format(message, arguments));
+ }
+
/**
- * Returns the command represented by the given {@code key}. Returns {@link #UNKNOWN} if no matching command could be
- * found.
+ * Returns the command represented by the given {@code key}, otherwise returns {@link #UNKNOWN}
+ * if no matching command could be found.
*
- * @param key
- * @return
+ * @param key {@link String key} to the {@link RedisCommand} to lookup.
+ * @return a matching {@link RedisCommand} for the given {@code key}, otherwise {@link #UNKNOWN}.
*/
public static RedisCommand failsafeCommandLookup(String key) {
-
- if (!StringUtils.hasText(key)) {
- return RedisCommand.UNKNOWN;
- }
-
- RedisCommand cmd = commandLookup.get(key.toLowerCase());
- if (cmd != null) {
- return cmd;
- }
-
- return RedisCommand.UNKNOWN;
+ return StringUtils.hasText(key) ? commandLookup.getOrDefault(key.toLowerCase(), UNKNOWN) : UNKNOWN;
}
}
diff --git a/src/main/java/org/springframework/data/redis/core/StreamObjectMapper.java b/src/main/java/org/springframework/data/redis/core/StreamObjectMapper.java
index 3d62f1d1a..de8eccc70 100644
--- a/src/main/java/org/springframework/data/redis/core/StreamObjectMapper.java
+++ b/src/main/java/org/springframework/data/redis/core/StreamObjectMapper.java
@@ -41,6 +41,7 @@ import org.springframework.util.Assert;
* mapping strategies.
*
* @author Mark Paluch
+ * @author John Blum
* @since 2.2
* @see ObjectHashMapper
* @see #doGetHashMapper(ConversionService, Class)
@@ -54,9 +55,9 @@ class StreamObjectMapper {
private final @Nullable HashMapper