From 2993e49e0237efeffbb772b2bb283a771fc06a2f Mon Sep 17 00:00:00 2001 From: Andrii Abramov Date: Mon, 18 Feb 2019 22:11:31 +0200 Subject: [PATCH 1/4] Optionally set default value for ENV params --- .../org/redisson/config/ConfigSupport.java | 22 ++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/redisson/src/main/java/org/redisson/config/ConfigSupport.java b/redisson/src/main/java/org/redisson/config/ConfigSupport.java index 484fd38a5..f4188e5c6 100644 --- a/redisson/src/main/java/org/redisson/config/ConfigSupport.java +++ b/redisson/src/main/java/org/redisson/config/ConfigSupport.java @@ -61,7 +61,17 @@ import com.fasterxml.jackson.dataformat.yaml.YAMLFactory; * */ public class ConfigSupport { - + + private final EnvProvider env; + + public ConfigSupport() { + this(new SystemEnvProvider()); + } + + public ConfigSupport(EnvProvider env) { + this.env = env; + } + @JsonTypeInfo(use = JsonTypeInfo.Id.CLASS, property = "class") @JsonFilter("classFilter") public static class ClassMixIn { @@ -135,14 +145,16 @@ public class ConfigSupport { } } - private String resolveEnvParams(String content) { - Pattern pattern = Pattern.compile("\\$\\{(\\w+)\\}"); + public String resolveEnvParams(String content) { + Pattern pattern = Pattern.compile("\\$\\{(\\w+(:-.+)?)\\}"); Matcher m = pattern.matcher(content); while (m.find()) { - String s = m.group(1); - String v = System.getenv(s); + String[] parts = m.group(1).split(":-"); + String v = env.get(parts[0]); if (v != null) { content = content.replace(m.group(), v); + } else if (parts.length == 2) { + content = content.replace(m.group(), parts[1]); } } return content; From 14e7aa61a79011b1949c0a4714dbe71de876ce7a Mon Sep 17 00:00:00 2001 From: Andrii Abramov Date: Mon, 18 Feb 2019 22:36:56 +0200 Subject: [PATCH 2/4] #1922. Default values for environment variable for YAML. --- .../java/org/redisson/config/EnvProvider.java | 20 +++++++ .../redisson/config/SystemEnvProvider.java | 16 +++++ .../redisson/config/ConfigSupportTest.java | 59 +++++++++++++++++++ 3 files changed, 95 insertions(+) create mode 100644 redisson/src/main/java/org/redisson/config/EnvProvider.java create mode 100644 redisson/src/main/java/org/redisson/config/SystemEnvProvider.java create mode 100644 redisson/src/test/java/org/redisson/config/ConfigSupportTest.java diff --git a/redisson/src/main/java/org/redisson/config/EnvProvider.java b/redisson/src/main/java/org/redisson/config/EnvProvider.java new file mode 100644 index 000000000..493a7f030 --- /dev/null +++ b/redisson/src/main/java/org/redisson/config/EnvProvider.java @@ -0,0 +1,20 @@ +package org.redisson.config; + +/** + * Adaptor for key value storage, a.k.a. Environment. + */ +@FunctionalInterface +interface EnvProvider { + + /** + * Gets the value of the specified environment variable. An + * environment variable is a system-dependent external named + * value. + * + * @param name the name of the environment variable + * @return the string value of the variable, or null + * if the variable is not defined in the system environment + */ + String get(String name); + +} diff --git a/redisson/src/main/java/org/redisson/config/SystemEnvProvider.java b/redisson/src/main/java/org/redisson/config/SystemEnvProvider.java new file mode 100644 index 000000000..89364992a --- /dev/null +++ b/redisson/src/main/java/org/redisson/config/SystemEnvProvider.java @@ -0,0 +1,16 @@ +package org.redisson.config; + +/** + * Default implementation for environment values adaptor. + */ +public class SystemEnvProvider implements EnvProvider { + + /** + * @see System#getenv() + */ + @Override + public String get(String name) { + return System.getenv(name); + } + +} diff --git a/redisson/src/test/java/org/redisson/config/ConfigSupportTest.java b/redisson/src/test/java/org/redisson/config/ConfigSupportTest.java new file mode 100644 index 000000000..525e2b4b6 --- /dev/null +++ b/redisson/src/test/java/org/redisson/config/ConfigSupportTest.java @@ -0,0 +1,59 @@ +package org.redisson.config; + +import com.fasterxml.jackson.databind.exc.InvalidFormatException; +import org.junit.Test; + +import java.io.IOException; +import java.net.URI; +import java.util.HashMap; +import java.util.Map; + +import static org.junit.Assert.*; + +public class ConfigSupportTest { + + @Test + public void testParsingLiteral() throws IOException { + SingleServerConfig config = mkConfig("127.0.0.1", new HashMap() {{ + put("REDIS_URI", "1.1.1.1"); + }}); + + assertEquals(URI.create("redis://127.0.0.1"), config.getAddress()); + } + + @Test + public void testParsingEnv() throws IOException { + SingleServerConfig config = mkConfig("${REDIS_URI}", new HashMap() {{ + put("REDIS_URI", "1.1.1.1"); + }}); + + assertEquals(URI.create("redis://1.1.1.1"), config.getAddress()); + } + + @Test(expected = InvalidFormatException.class) + public void testParsingEnv_envMissing() throws IOException { + mkConfig("${REDIS_URI}", new HashMap<>()); + } + + @Test + public void testParsingDefault_envPresent() throws IOException { + SingleServerConfig config = mkConfig("${REDIS_URI:-10.0.0.1}", new HashMap() {{ + put("REDIS_URI", "11.0.0.1"); + }}); + + assertEquals(URI.create("redis://11.0.0.1"), config.getAddress()); + } + + @Test + public void testParsingDefault_envMissing() throws IOException { + SingleServerConfig config = mkConfig("${REDIS_URI:-10.0.0.1}", new HashMap<>()); + + assertEquals(URI.create("redis://10.0.0.1"), config.getAddress()); + } + + private SingleServerConfig mkConfig(String authorityValue, Map env) throws IOException { + String config = "singleServerConfig:\n address: redis://" + authorityValue; + return new ConfigSupport(env::get).fromYAML(config, Config.class).getSingleServerConfig(); + } + +} From c08d66de71e382e2859c5afac53e8f05ff50afbc Mon Sep 17 00:00:00 2001 From: Andrii Abramov Date: Mon, 18 Feb 2019 22:40:54 +0200 Subject: [PATCH 3/4] Revert method visibility --- redisson/src/main/java/org/redisson/config/ConfigSupport.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/redisson/src/main/java/org/redisson/config/ConfigSupport.java b/redisson/src/main/java/org/redisson/config/ConfigSupport.java index f4188e5c6..051531266 100644 --- a/redisson/src/main/java/org/redisson/config/ConfigSupport.java +++ b/redisson/src/main/java/org/redisson/config/ConfigSupport.java @@ -145,7 +145,7 @@ public class ConfigSupport { } } - public String resolveEnvParams(String content) { + private String resolveEnvParams(String content) { Pattern pattern = Pattern.compile("\\$\\{(\\w+(:-.+)?)\\}"); Matcher m = pattern.matcher(content); while (m.find()) { From c5a0a1985b63f74bb364245aa8d3c0b3798d7967 Mon Sep 17 00:00:00 2001 From: Andrii Abramov Date: Wed, 20 Feb 2019 17:54:22 +0200 Subject: [PATCH 4/4] Rework tests with JMockit. Remove EnvProvider adaptor --- .../org/redisson/config/ConfigSupport.java | 12 +----- .../java/org/redisson/config/EnvProvider.java | 20 ---------- .../redisson/config/SystemEnvProvider.java | 16 -------- .../redisson/config/ConfigSupportTest.java | 38 +++++++++++-------- 4 files changed, 24 insertions(+), 62 deletions(-) delete mode 100644 redisson/src/main/java/org/redisson/config/EnvProvider.java delete mode 100644 redisson/src/main/java/org/redisson/config/SystemEnvProvider.java diff --git a/redisson/src/main/java/org/redisson/config/ConfigSupport.java b/redisson/src/main/java/org/redisson/config/ConfigSupport.java index 051531266..b1304e551 100644 --- a/redisson/src/main/java/org/redisson/config/ConfigSupport.java +++ b/redisson/src/main/java/org/redisson/config/ConfigSupport.java @@ -62,16 +62,6 @@ import com.fasterxml.jackson.dataformat.yaml.YAMLFactory; */ public class ConfigSupport { - private final EnvProvider env; - - public ConfigSupport() { - this(new SystemEnvProvider()); - } - - public ConfigSupport(EnvProvider env) { - this.env = env; - } - @JsonTypeInfo(use = JsonTypeInfo.Id.CLASS, property = "class") @JsonFilter("classFilter") public static class ClassMixIn { @@ -150,7 +140,7 @@ public class ConfigSupport { Matcher m = pattern.matcher(content); while (m.find()) { String[] parts = m.group(1).split(":-"); - String v = env.get(parts[0]); + String v = System.getenv(parts[0]); if (v != null) { content = content.replace(m.group(), v); } else if (parts.length == 2) { diff --git a/redisson/src/main/java/org/redisson/config/EnvProvider.java b/redisson/src/main/java/org/redisson/config/EnvProvider.java deleted file mode 100644 index 493a7f030..000000000 --- a/redisson/src/main/java/org/redisson/config/EnvProvider.java +++ /dev/null @@ -1,20 +0,0 @@ -package org.redisson.config; - -/** - * Adaptor for key value storage, a.k.a. Environment. - */ -@FunctionalInterface -interface EnvProvider { - - /** - * Gets the value of the specified environment variable. An - * environment variable is a system-dependent external named - * value. - * - * @param name the name of the environment variable - * @return the string value of the variable, or null - * if the variable is not defined in the system environment - */ - String get(String name); - -} diff --git a/redisson/src/main/java/org/redisson/config/SystemEnvProvider.java b/redisson/src/main/java/org/redisson/config/SystemEnvProvider.java deleted file mode 100644 index 89364992a..000000000 --- a/redisson/src/main/java/org/redisson/config/SystemEnvProvider.java +++ /dev/null @@ -1,16 +0,0 @@ -package org.redisson.config; - -/** - * Default implementation for environment values adaptor. - */ -public class SystemEnvProvider implements EnvProvider { - - /** - * @see System#getenv() - */ - @Override - public String get(String name) { - return System.getenv(name); - } - -} diff --git a/redisson/src/test/java/org/redisson/config/ConfigSupportTest.java b/redisson/src/test/java/org/redisson/config/ConfigSupportTest.java index 525e2b4b6..1a2aa8ac9 100644 --- a/redisson/src/test/java/org/redisson/config/ConfigSupportTest.java +++ b/redisson/src/test/java/org/redisson/config/ConfigSupportTest.java @@ -1,12 +1,12 @@ package org.redisson.config; import com.fasterxml.jackson.databind.exc.InvalidFormatException; +import mockit.Mock; +import mockit.MockUp; import org.junit.Test; import java.io.IOException; import java.net.URI; -import java.util.HashMap; -import java.util.Map; import static org.junit.Assert.*; @@ -14,46 +14,54 @@ public class ConfigSupportTest { @Test public void testParsingLiteral() throws IOException { - SingleServerConfig config = mkConfig("127.0.0.1", new HashMap() {{ - put("REDIS_URI", "1.1.1.1"); - }}); + mockHostEnv("1.1.1.1"); + SingleServerConfig config = mkConfig("127.0.0.1"); assertEquals(URI.create("redis://127.0.0.1"), config.getAddress()); } @Test public void testParsingEnv() throws IOException { - SingleServerConfig config = mkConfig("${REDIS_URI}", new HashMap() {{ - put("REDIS_URI", "1.1.1.1"); - }}); + mockHostEnv("1.1.1.1"); + SingleServerConfig config = mkConfig("${REDIS_URI}"); assertEquals(URI.create("redis://1.1.1.1"), config.getAddress()); } @Test(expected = InvalidFormatException.class) public void testParsingEnv_envMissing() throws IOException { - mkConfig("${REDIS_URI}", new HashMap<>()); + mockHostEnv(null); + mkConfig("${REDIS_URI}"); } @Test public void testParsingDefault_envPresent() throws IOException { - SingleServerConfig config = mkConfig("${REDIS_URI:-10.0.0.1}", new HashMap() {{ - put("REDIS_URI", "11.0.0.1"); - }}); + mockHostEnv("11.0.0.1"); + SingleServerConfig config = mkConfig("${REDIS_URI:-10.0.0.1}"); assertEquals(URI.create("redis://11.0.0.1"), config.getAddress()); } @Test public void testParsingDefault_envMissing() throws IOException { - SingleServerConfig config = mkConfig("${REDIS_URI:-10.0.0.1}", new HashMap<>()); + mockHostEnv(null); + SingleServerConfig config = mkConfig("${REDIS_URI:-10.0.0.1}"); assertEquals(URI.create("redis://10.0.0.1"), config.getAddress()); } - private SingleServerConfig mkConfig(String authorityValue, Map env) throws IOException { + private SingleServerConfig mkConfig(String authorityValue) throws IOException { String config = "singleServerConfig:\n address: redis://" + authorityValue; - return new ConfigSupport(env::get).fromYAML(config, Config.class).getSingleServerConfig(); + return new ConfigSupport().fromYAML(config, Config.class).getSingleServerConfig(); + } + + private void mockHostEnv(String value) { + new MockUp() { + @Mock + String getenv(String name) { + return value; + } + }; } }