From 3d6e218552640a5ef127f3aa1fae0844536d97d9 Mon Sep 17 00:00:00 2001 From: Xavier Leong Date: Mon, 21 May 2018 12:00:07 +0800 Subject: [PATCH 1/2] 10-Enable Redis Ready Pattern to be set as part of Redis Exec Provider. --- .../redis/embedded/AbstractRedisInstance.java | 2 + .../redis/embedded/RedisExecProvider.java | 35 +++++++++++----- .../java/redis/embedded/RedisSentinel.java | 11 ++++- src/main/java/redis/embedded/RedisServer.java | 16 +++++--- .../redis/embedded/util/RedisExecutor.java | 40 +++++++++++++++++++ 5 files changed, 87 insertions(+), 17 deletions(-) create mode 100644 src/main/java/redis/embedded/util/RedisExecutor.java diff --git a/src/main/java/redis/embedded/AbstractRedisInstance.java b/src/main/java/redis/embedded/AbstractRedisInstance.java index 2671f636..c359e14b 100644 --- a/src/main/java/redis/embedded/AbstractRedisInstance.java +++ b/src/main/java/redis/embedded/AbstractRedisInstance.java @@ -127,6 +127,8 @@ private void cancelStartupTimeoutCheck(ScheduledExecutorService executor) { protected abstract Pattern redisReadyPattern(); + public abstract void setRedisReadyPat(Pattern redisReadyPat); + private ProcessBuilder createRedisProcessBuilder() { File executable = new File(args.get(0)); ProcessBuilder pb = new ProcessBuilder(args) diff --git a/src/main/java/redis/embedded/RedisExecProvider.java b/src/main/java/redis/embedded/RedisExecProvider.java index a306222f..02049598 100644 --- a/src/main/java/redis/embedded/RedisExecProvider.java +++ b/src/main/java/redis/embedded/RedisExecProvider.java @@ -2,18 +2,22 @@ import com.google.common.base.Preconditions; import com.google.common.collect.Maps; -import redis.embedded.util.Architecture; -import redis.embedded.util.JarUtil; -import redis.embedded.util.OS; -import redis.embedded.util.OsArchitecture; +import redis.embedded.util.*; import java.io.File; import java.io.IOException; import java.util.Map; +import java.util.regex.Pattern; public class RedisExecProvider { - private final Map executables = Maps.newHashMap(); + private final Map executables = Maps.newHashMap(); + public final static Pattern REDIS_READY_PATTERN = Pattern.compile( + "(?:The server is now ready to accept connections on port)" + // 3.2.1, 2.8.24 + "|(?:Ready to accept connections)" + // 4.0.2 + "|(?:Sentinel ID is)" + // 3.2.1, 4.0.2 + "|(?:Sentinel runid is)" // 2.8.24 + ); /** * @return a new RedisExecProvider instance @@ -33,10 +37,10 @@ private RedisExecProvider() { } private void initExecutables() { - executables.put(OsArchitecture.UNIX_x86_64, "redis-server-3.0.7"); + executables.put(OsArchitecture.UNIX_x86_64, new RedisExecutor("redis-server-3.0.7", REDIS_READY_PATTERN)); - executables.put(OsArchitecture.MAC_OS_X_x86, "redis-server-3.0.7-darwin"); - executables.put(OsArchitecture.MAC_OS_X_x86_64, "redis-server-3.0.7-darwin"); + executables.put(OsArchitecture.MAC_OS_X_x86, new RedisExecutor("redis-server-3.0.7-darwin", REDIS_READY_PATTERN)); + executables.put(OsArchitecture.MAC_OS_X_x86_64, new RedisExecutor("redis-server-3.0.7-darwin", REDIS_READY_PATTERN)); } public RedisExecProvider override(OS os, String executable) { @@ -49,19 +53,30 @@ public RedisExecProvider override(OS os, String executable) { public RedisExecProvider override(OS os, Architecture arch, String executable) { Preconditions.checkNotNull(executable); - executables.put(new OsArchitecture(os, arch), executable); + executables.put(new OsArchitecture(os, arch), new RedisExecutor(executable, REDIS_READY_PATTERN)); + return this; + } + + public RedisExecProvider override(OS os, Architecture arch, RedisExecutor redisExec) { + Preconditions.checkNotNull(redisExec); + executables.put(new OsArchitecture(os, arch), redisExec); return this; } public File get() throws IOException { OsArchitecture osArch = OsArchitecture.detect(); - String executablePath = executables.get(osArch); + String executablePath = executables.get(osArch).getExecutableName(); return fileExists(executablePath) ? new File(executablePath) : JarUtil.extractExecutableFromJar(executablePath); } + public Pattern getExecutableStartPattern() { + OsArchitecture osArch = OsArchitecture.detect(); + return executables.get(osArch).getStartPattern(); + } + public RedisExecProvider copy() { RedisExecProvider copy = new RedisExecProvider(); diff --git a/src/main/java/redis/embedded/RedisSentinel.java b/src/main/java/redis/embedded/RedisSentinel.java index 3ff42cf1..dfb0fe18 100644 --- a/src/main/java/redis/embedded/RedisSentinel.java +++ b/src/main/java/redis/embedded/RedisSentinel.java @@ -12,7 +12,7 @@ import java.util.regex.Pattern; public class RedisSentinel extends AbstractRedisInstance { - private static final Pattern REDIS_READY_PATTERN = Pattern.compile( + private Pattern redisReadyPat = Pattern.compile( "(?:Sentinel ID is)" + // 3.2.1, 4.0.2 "|(?:Sentinel runid is)" // 2.8.24 ); @@ -22,6 +22,12 @@ public RedisSentinel(List args, int port) { this.args = new ArrayList<>(args); } + @Override + public void setRedisReadyPat(Pattern redisReadyPat) { + Preconditions.checkNotNull(redisReadyPat); + this.redisReadyPat = redisReadyPat; + } + @Deprecated public static Builder builder() { return new Builder(); @@ -29,7 +35,7 @@ public static Builder builder() { @Override protected Pattern redisReadyPattern() { - return REDIS_READY_PATTERN; + return redisReadyPat; } @SuppressWarnings("unused") @@ -137,6 +143,7 @@ public RedisSentinel build() { RedisSentinel redisSentinel = new RedisSentinel(args, port); redisSentinel.setLogProcessOutput(logProcessOutput); redisSentinel.setStartupTimeoutMs(startupTimeoutMs); + redisSentinel.setRedisReadyPat(redisExecProvider.getExecutableStartPattern()); return redisSentinel; } diff --git a/src/main/java/redis/embedded/RedisServer.java b/src/main/java/redis/embedded/RedisServer.java index c19a3fe6..168060ad 100644 --- a/src/main/java/redis/embedded/RedisServer.java +++ b/src/main/java/redis/embedded/RedisServer.java @@ -1,5 +1,6 @@ package redis.embedded; +import com.google.common.base.Preconditions; import com.google.common.base.Strings; import com.google.common.io.Files; import redis.embedded.exceptions.RedisBuildingException; @@ -15,10 +16,7 @@ public class RedisServer extends AbstractRedisInstance { - private static final Pattern REDIS_READY_PATTERN = Pattern.compile( - "(?:The server is now ready to accept connections on port)" + // 3.2.1, 2.8.24 - "|(?:Ready to accept connections)" // 4.0.2 - ); + private Pattern redisReadyPat = RedisExecProvider.REDIS_READY_PATTERN; private static final int DEFAULT_REDIS_PORT = 6379; @@ -37,6 +35,7 @@ public RedisServer(int port) throws IOException { public RedisServer(RedisExecProvider redisExecProvider, int port) throws IOException { super(port); + this.redisReadyPat = redisExecProvider.getExecutableStartPattern(); this.args = Arrays.asList( redisExecProvider.get().getAbsolutePath(), "--port", Integer.toString(port) @@ -48,6 +47,12 @@ public RedisServer(RedisExecProvider redisExecProvider, int port) throws IOExcep this.args = new ArrayList<>(args); } + @Override + public void setRedisReadyPat(Pattern redisReadyPat) { + Preconditions.checkNotNull(redisReadyPat); + this.redisReadyPat = redisReadyPat; + } + /** * Prefer using {@code new RedisServer.Builder()} directly. * @@ -60,7 +65,7 @@ public static Builder builder() { @Override protected Pattern redisReadyPattern() { - return REDIS_READY_PATTERN; + return redisReadyPat; } @SuppressWarnings("unused") @@ -138,6 +143,7 @@ public RedisServer build() { RedisServer redisServer = new RedisServer(args, port); redisServer.setLogProcessOutput(logProcessOutput); redisServer.setStartupTimeoutMs(startupTimeoutMs); + redisServer.setRedisReadyPat(redisExecProvider.getExecutableStartPattern()); return redisServer; } diff --git a/src/main/java/redis/embedded/util/RedisExecutor.java b/src/main/java/redis/embedded/util/RedisExecutor.java new file mode 100644 index 00000000..d3f5827e --- /dev/null +++ b/src/main/java/redis/embedded/util/RedisExecutor.java @@ -0,0 +1,40 @@ +package redis.embedded.util; + +import java.util.regex.Pattern; + +public class RedisExecutor { + private String executableName; + private Pattern startPattern; + + public RedisExecutor(String exeName, Pattern startPattern) { + this.executableName = exeName; + this.startPattern = startPattern; + } + + public String getExecutableName() { + return executableName; + } + + public Pattern getStartPattern() { + return startPattern; + } + + public String getStartPatternAsString() { + return startPattern.pattern(); + } + + public RedisExecutor copy() { + return new RedisExecutor(executableName, startPattern); + } + + @Override + public boolean equals(Object obj) { + return obj instanceof RedisExecutor && ((RedisExecutor) obj).executableName.contentEquals(executableName) && + ((RedisExecutor)obj).startPattern.pattern().contentEquals(startPattern.pattern()); + } + + @Override + public int hashCode() { + return executableName.hashCode() + startPattern.pattern().hashCode(); + } +} From f6e2362b208b34b89696fa79abfe06b3b5d6e0aa Mon Sep 17 00:00:00 2001 From: Xavier Leong Date: Tue, 22 May 2018 11:21:37 +0800 Subject: [PATCH 2/2] 10-Change per reviewed. --- .../java/redis/embedded/AbstractRedisInstance.java | 2 -- .../java/redis/embedded/RedisExecProvider.java | 14 +++++++------- src/main/java/redis/embedded/RedisSentinel.java | 8 ++------ src/main/java/redis/embedded/RedisServer.java | 5 ++--- .../{RedisExecutor.java => RedisExecutable.java} | 12 ++++++------ 5 files changed, 17 insertions(+), 24 deletions(-) rename src/main/java/redis/embedded/util/{RedisExecutor.java => RedisExecutable.java} (61%) diff --git a/src/main/java/redis/embedded/AbstractRedisInstance.java b/src/main/java/redis/embedded/AbstractRedisInstance.java index c359e14b..2671f636 100644 --- a/src/main/java/redis/embedded/AbstractRedisInstance.java +++ b/src/main/java/redis/embedded/AbstractRedisInstance.java @@ -127,8 +127,6 @@ private void cancelStartupTimeoutCheck(ScheduledExecutorService executor) { protected abstract Pattern redisReadyPattern(); - public abstract void setRedisReadyPat(Pattern redisReadyPat); - private ProcessBuilder createRedisProcessBuilder() { File executable = new File(args.get(0)); ProcessBuilder pb = new ProcessBuilder(args) diff --git a/src/main/java/redis/embedded/RedisExecProvider.java b/src/main/java/redis/embedded/RedisExecProvider.java index 02049598..ba0265a1 100644 --- a/src/main/java/redis/embedded/RedisExecProvider.java +++ b/src/main/java/redis/embedded/RedisExecProvider.java @@ -11,8 +11,8 @@ public class RedisExecProvider { - private final Map executables = Maps.newHashMap(); - public final static Pattern REDIS_READY_PATTERN = Pattern.compile( + private final Map executables = Maps.newHashMap(); + public final static Pattern DEFAULT_REDIS_READY_PATTERN = Pattern.compile( "(?:The server is now ready to accept connections on port)" + // 3.2.1, 2.8.24 "|(?:Ready to accept connections)" + // 4.0.2 "|(?:Sentinel ID is)" + // 3.2.1, 4.0.2 @@ -37,10 +37,10 @@ private RedisExecProvider() { } private void initExecutables() { - executables.put(OsArchitecture.UNIX_x86_64, new RedisExecutor("redis-server-3.0.7", REDIS_READY_PATTERN)); + executables.put(OsArchitecture.UNIX_x86_64, new RedisExecutable("redis-server-3.0.7", DEFAULT_REDIS_READY_PATTERN)); - executables.put(OsArchitecture.MAC_OS_X_x86, new RedisExecutor("redis-server-3.0.7-darwin", REDIS_READY_PATTERN)); - executables.put(OsArchitecture.MAC_OS_X_x86_64, new RedisExecutor("redis-server-3.0.7-darwin", REDIS_READY_PATTERN)); + executables.put(OsArchitecture.MAC_OS_X_x86, new RedisExecutable("redis-server-3.0.7-darwin", DEFAULT_REDIS_READY_PATTERN)); + executables.put(OsArchitecture.MAC_OS_X_x86_64, new RedisExecutable("redis-server-3.0.7-darwin", DEFAULT_REDIS_READY_PATTERN)); } public RedisExecProvider override(OS os, String executable) { @@ -53,11 +53,11 @@ public RedisExecProvider override(OS os, String executable) { public RedisExecProvider override(OS os, Architecture arch, String executable) { Preconditions.checkNotNull(executable); - executables.put(new OsArchitecture(os, arch), new RedisExecutor(executable, REDIS_READY_PATTERN)); + executables.put(new OsArchitecture(os, arch), new RedisExecutable(executable, DEFAULT_REDIS_READY_PATTERN)); return this; } - public RedisExecProvider override(OS os, Architecture arch, RedisExecutor redisExec) { + public RedisExecProvider override(OS os, Architecture arch, RedisExecutable redisExec) { Preconditions.checkNotNull(redisExec); executables.put(new OsArchitecture(os, arch), redisExec); return this; diff --git a/src/main/java/redis/embedded/RedisSentinel.java b/src/main/java/redis/embedded/RedisSentinel.java index dfb0fe18..5961c870 100644 --- a/src/main/java/redis/embedded/RedisSentinel.java +++ b/src/main/java/redis/embedded/RedisSentinel.java @@ -12,18 +12,14 @@ import java.util.regex.Pattern; public class RedisSentinel extends AbstractRedisInstance { - private Pattern redisReadyPat = Pattern.compile( - "(?:Sentinel ID is)" + // 3.2.1, 4.0.2 - "|(?:Sentinel runid is)" // 2.8.24 - ); + private Pattern redisReadyPat = RedisExecProvider.DEFAULT_REDIS_READY_PATTERN; public RedisSentinel(List args, int port) { super(port); this.args = new ArrayList<>(args); } - @Override - public void setRedisReadyPat(Pattern redisReadyPat) { + void setRedisReadyPat(Pattern redisReadyPat) { Preconditions.checkNotNull(redisReadyPat); this.redisReadyPat = redisReadyPat; } diff --git a/src/main/java/redis/embedded/RedisServer.java b/src/main/java/redis/embedded/RedisServer.java index 168060ad..3f9ff17a 100644 --- a/src/main/java/redis/embedded/RedisServer.java +++ b/src/main/java/redis/embedded/RedisServer.java @@ -16,7 +16,7 @@ public class RedisServer extends AbstractRedisInstance { - private Pattern redisReadyPat = RedisExecProvider.REDIS_READY_PATTERN; + private Pattern redisReadyPat = RedisExecProvider.DEFAULT_REDIS_READY_PATTERN; private static final int DEFAULT_REDIS_PORT = 6379; @@ -47,8 +47,7 @@ public RedisServer(RedisExecProvider redisExecProvider, int port) throws IOExcep this.args = new ArrayList<>(args); } - @Override - public void setRedisReadyPat(Pattern redisReadyPat) { + void setRedisReadyPat(Pattern redisReadyPat) { Preconditions.checkNotNull(redisReadyPat); this.redisReadyPat = redisReadyPat; } diff --git a/src/main/java/redis/embedded/util/RedisExecutor.java b/src/main/java/redis/embedded/util/RedisExecutable.java similarity index 61% rename from src/main/java/redis/embedded/util/RedisExecutor.java rename to src/main/java/redis/embedded/util/RedisExecutable.java index d3f5827e..f5f4f6d0 100644 --- a/src/main/java/redis/embedded/util/RedisExecutor.java +++ b/src/main/java/redis/embedded/util/RedisExecutable.java @@ -2,11 +2,11 @@ import java.util.regex.Pattern; -public class RedisExecutor { +public class RedisExecutable { private String executableName; private Pattern startPattern; - public RedisExecutor(String exeName, Pattern startPattern) { + public RedisExecutable(String exeName, Pattern startPattern) { this.executableName = exeName; this.startPattern = startPattern; } @@ -23,14 +23,14 @@ public String getStartPatternAsString() { return startPattern.pattern(); } - public RedisExecutor copy() { - return new RedisExecutor(executableName, startPattern); + public RedisExecutable copy() { + return new RedisExecutable(executableName, startPattern); } @Override public boolean equals(Object obj) { - return obj instanceof RedisExecutor && ((RedisExecutor) obj).executableName.contentEquals(executableName) && - ((RedisExecutor)obj).startPattern.pattern().contentEquals(startPattern.pattern()); + return obj instanceof RedisExecutable && ((RedisExecutable) obj).executableName.contentEquals(executableName) && + ((RedisExecutable)obj).startPattern.pattern().contentEquals(startPattern.pattern()); } @Override