From 4197c6e86347aaabbde77875303308095a0fb7c3 Mon Sep 17 00:00:00 2001 From: gahissy Date: Tue, 2 May 2017 18:31:26 +0100 Subject: Read config from ENV --- src/org/traccar/Config.java | 51 ++++++++++++++++++++------------------------- 1 file changed, 23 insertions(+), 28 deletions(-) (limited to 'src/org/traccar/Config.java') diff --git a/src/org/traccar/Config.java b/src/org/traccar/Config.java index 1be86fce0..414ccb6d3 100644 --- a/src/org/traccar/Config.java +++ b/src/org/traccar/Config.java @@ -15,17 +15,19 @@ */ package org.traccar; +import org.apache.commons.lang3.StringUtils; + import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; +import java.util.Enumeration; import java.util.Properties; public class Config { private final Properties properties = new Properties(); - private Properties defaultProperties; - public void load(String file) throws IOException { + void load(String file) throws IOException { try (InputStream inputStream = new FileInputStream(file)) { properties.loadFromXML(inputStream); } @@ -33,30 +35,35 @@ public class Config { String defaultConfigFile = properties.getProperty("config.default"); if (defaultConfigFile != null) { try (InputStream inputStream = new FileInputStream(defaultConfigFile)) { - defaultProperties = new Properties(); + Properties defaultProperties = new Properties(); defaultProperties.loadFromXML(inputStream); + + Enumeration props = defaultProperties.propertyNames(); + while (props.hasMoreElements()) { + String key = (String) props.nextElement(); + if (!properties.containsKey(key)) { + properties.setProperty(key, defaultProperties.getProperty(key)); + } + } } } } public boolean hasKey(String key) { - return properties.containsKey(key) || defaultProperties != null && defaultProperties.containsKey(key); + return properties.containsKey(key); } public String getString(String key) { - if (properties.containsKey(key) || defaultProperties == null) { - return properties.getProperty(key); - } else { - return defaultProperties.getProperty(key); + String envName = key.toUpperCase().replaceAll("\\.", "_"); + String envValue = System.getenv(envName); + if (StringUtils.isNotBlank(envValue)) { + return envValue; } + return properties.getProperty(key); } public String getString(String key, String defaultValue) { - if (hasKey(key)) { - return getString(key); - } else { - return defaultValue; - } + return hasKey(key) ? getString(key) : defaultValue; } public boolean getBoolean(String key) { @@ -68,11 +75,7 @@ public class Config { } public int getInteger(String key, int defaultValue) { - if (hasKey(key)) { - return Integer.parseInt(getString(key)); - } else { - return defaultValue; - } + return hasKey(key) ? Integer.parseInt(getString(key)) : defaultValue; } public long getLong(String key) { @@ -80,11 +83,7 @@ public class Config { } public long getLong(String key, long defaultValue) { - if (hasKey(key)) { - return Long.parseLong(getString(key)); - } else { - return defaultValue; - } + return hasKey(key) ? Long.parseLong(getString(key)) : defaultValue; } public double getDouble(String key) { @@ -92,11 +91,7 @@ public class Config { } public double getDouble(String key, double defaultValue) { - if (hasKey(key)) { - return Double.parseDouble(getString(key)); - } else { - return defaultValue; - } + return hasKey(key) ? Double.parseDouble(getString(key)) : defaultValue; } } -- cgit v1.2.3 From aa6b11f88085a149b70b3f55fbae7928280c2b74 Mon Sep 17 00:00:00 2001 From: gahissy Date: Tue, 2 May 2017 23:34:32 +0100 Subject: Remove Apache Commons StringUtils reference --- src/org/traccar/Config.java | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) (limited to 'src/org/traccar/Config.java') diff --git a/src/org/traccar/Config.java b/src/org/traccar/Config.java index 414ccb6d3..e9b17a33b 100644 --- a/src/org/traccar/Config.java +++ b/src/org/traccar/Config.java @@ -15,8 +15,6 @@ */ package org.traccar; -import org.apache.commons.lang3.StringUtils; - import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; @@ -56,7 +54,7 @@ public class Config { public String getString(String key) { String envName = key.toUpperCase().replaceAll("\\.", "_"); String envValue = System.getenv(envName); - if (StringUtils.isNotBlank(envValue)) { + if (envValue != null && !envValue.isEmpty()) { return envValue; } return properties.getProperty(key); -- cgit v1.2.3 From fa6548a7b613b5bd3919cbf0269d58b2d8ebb999 Mon Sep 17 00:00:00 2001 From: gahissy Date: Wed, 3 May 2017 00:10:13 +0100 Subject: Unit Test for ENV_VAR interpolation. config.useEnv introduced --- src/org/traccar/Config.java | 48 ++++++++++++++++++++------------- test/org/traccar/config/EnvVarTest.java | 18 +++++++++++++ 2 files changed, 47 insertions(+), 19 deletions(-) create mode 100644 test/org/traccar/config/EnvVarTest.java (limited to 'src/org/traccar/Config.java') diff --git a/src/org/traccar/Config.java b/src/org/traccar/Config.java index e9b17a33b..c52c1bd81 100644 --- a/src/org/traccar/Config.java +++ b/src/org/traccar/Config.java @@ -18,44 +18,50 @@ package org.traccar; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; -import java.util.Enumeration; import java.util.Properties; public class Config { private final Properties properties = new Properties(); - void load(String file) throws IOException { - try (InputStream inputStream = new FileInputStream(file)) { - properties.loadFromXML(inputStream); - } + private boolean useEnvVars = false; + void load(String file) throws IOException { + // First we load default config (if any) String defaultConfigFile = properties.getProperty("config.default"); if (defaultConfigFile != null) { try (InputStream inputStream = new FileInputStream(defaultConfigFile)) { - Properties defaultProperties = new Properties(); - defaultProperties.loadFromXML(inputStream); - - Enumeration props = defaultProperties.propertyNames(); - while (props.hasMoreElements()) { - String key = (String) props.nextElement(); - if (!properties.containsKey(key)) { - properties.setProperty(key, defaultProperties.getProperty(key)); - } - } + properties.loadFromXML(inputStream); } } + // Then we override by loading file + try (InputStream inputStream = new FileInputStream(file)) { + Properties props = new Properties(); + props.loadFromXML(inputStream); + properties.putAll(props); + } + // Environment variables interpolation support + if ("true".equals(System.getenv("CONFIG_USE_ENV"))) { + useEnvVars = true; + } else { + useEnvVars = properties.getProperty("config.useEnv", "false").equalsIgnoreCase("true"); + } } + public boolean hasKey(String key) { + if (useEnvVars && System.getenv().containsKey(getEnvVarName(key))) { + return true; + } return properties.containsKey(key); } public String getString(String key) { - String envName = key.toUpperCase().replaceAll("\\.", "_"); - String envValue = System.getenv(envName); - if (envValue != null && !envValue.isEmpty()) { - return envValue; + if (useEnvVars) { + String envValue = System.getenv(getEnvVarName(key)); + if (envValue != null && !envValue.isEmpty()) { + return envValue; + } } return properties.getProperty(key); } @@ -92,4 +98,8 @@ public class Config { return hasKey(key) ? Double.parseDouble(getString(key)) : defaultValue; } + public static String getEnvVarName(String key) { + return key.replaceAll("\\.", "_").replaceAll("(.)(\\p{Lu})", "$1_$2").toUpperCase(); + } + } diff --git a/test/org/traccar/config/EnvVarTest.java b/test/org/traccar/config/EnvVarTest.java new file mode 100644 index 000000000..b90fd485c --- /dev/null +++ b/test/org/traccar/config/EnvVarTest.java @@ -0,0 +1,18 @@ +package org.traccar.config; + +import org.junit.Test; +import static org.junit.Assert.assertEquals; +import org.traccar.Config; + +public class EnvVarTest { + + @Test + public void testFormat() { + assertEquals("DATABASE_URL", Config.getEnvVarName("database.url")); + assertEquals("DATABASE_CHECK_CONNECTION", Config.getEnvVarName("database.checkConnection")); + assertEquals("DATABASE_MAX_POOL_SIZE", Config.getEnvVarName("database.maxPoolSize")); + assertEquals("DEVICE_MANAGER_LOOKUP_GROUPS_ATTRIBUTE", Config.getEnvVarName("deviceManager.lookupGroupsAttribute")); + assertEquals("COMMAND_FALLBACK_TO_SMS", Config.getEnvVarName("command.fallbackToSms")); + assertEquals("STATUS_TIMEOUT", Config.getEnvVarName("status.timeout")); + } +} -- cgit v1.2.3