From 09e2d57e18aaa59af3308da61cba61df8846073f Mon Sep 17 00:00:00 2001 From: Brian Baldino Date: Tue, 22 Sep 2020 15:42:58 -0700 Subject: [PATCH] Split out a helper method for parsing only application overrides --- .../com/typesafe/config/ConfigFactory.java | 59 ++++++++++++++++++- .../config/DefaultConfigLoadingStrategy.java | 48 ++------------- config/src/main/main.iml | 11 ++++ config/src/test/test.iml | 13 ++++ 4 files changed, 87 insertions(+), 44 deletions(-) create mode 100644 config/src/main/main.iml create mode 100644 config/src/test/test.iml diff --git a/config/src/main/java/com/typesafe/config/ConfigFactory.java b/config/src/main/java/com/typesafe/config/ConfigFactory.java index 12f9aaec0..8236713cc 100644 --- a/config/src/main/java/com/typesafe/config/ConfigFactory.java +++ b/config/src/main/java/com/typesafe/config/ConfigFactory.java @@ -8,7 +8,7 @@ import java.io.File; import java.io.Reader; -import java.net.URL; +import java.net.*; import java.util.Map; import java.util.Properties; import java.util.concurrent.Callable; @@ -1090,6 +1090,63 @@ public static Config parseResourcesAnySyntax(String resourceBasename) { return parseResourcesAnySyntax(resourceBasename, ConfigParseOptions.defaults()); } + /** + * Parse only any application overrides (those specified by config.{resource,file,url}), returning + * an empty Config if no overrides were set. + * @param parseOptions parse options + * @return the parsed configuration + */ + public static Config parseApplicationOverride(ConfigParseOptions parseOptions) { + ClassLoader loader = parseOptions.getClassLoader(); + + if (loader == null) + throw new ConfigException.BugOrBroken( + "ClassLoader should have been set here; bug in ConfigFactory. " + + "(You can probably work around this bug by passing in a class loader or calling currentThread().setContextClassLoader() though.)"); + + int specified = 0; + + // override application.conf with config.file, config.resource, + // config.url if requested. + String resource = System.getProperty("config.resource"); + if (resource != null) + specified += 1; + String file = System.getProperty("config.file"); + if (file != null) + specified += 1; + String url = System.getProperty("config.url"); + if (url != null) + specified += 1; + + if (specified == 0) { + return ConfigImpl.emptyConfig("TODO: what to put here? Should something else be returned?"); + } else if (specified > 1) { + throw new ConfigException.Generic("You set more than one of config.file='" + file + + "', config.url='" + url + "', config.resource='" + resource + + "'; don't know which one to use!"); + } else { + // the override file/url/resource MUST be present or it's an error + ConfigParseOptions overrideOptions = parseOptions.setAllowMissing(false); + if (resource != null) { + if (resource.startsWith("/")) + resource = resource.substring(1); + // this deliberately does not parseResourcesAnySyntax; if + // people want that they can use an include statement. + return ConfigFactory.parseResources(loader, resource, overrideOptions); + } else if (file != null) { + return ConfigFactory.parseFile(new File(file), overrideOptions); + } else { + try { + return ConfigFactory.parseURL(new URL(url), overrideOptions); + } catch (MalformedURLException e) { + throw new ConfigException.Generic("Bad URL in config.url system property: '" + + url + "': " + e.getMessage(), e); + } + } + } + + } + /** * Parses a string (which should be valid HOCON or JSON by default, or * the syntax specified in the options otherwise). diff --git a/config/src/main/java/com/typesafe/config/DefaultConfigLoadingStrategy.java b/config/src/main/java/com/typesafe/config/DefaultConfigLoadingStrategy.java index 1063af09d..d655f5db7 100644 --- a/config/src/main/java/com/typesafe/config/DefaultConfigLoadingStrategy.java +++ b/config/src/main/java/com/typesafe/config/DefaultConfigLoadingStrategy.java @@ -1,5 +1,7 @@ package com.typesafe.config; +import com.typesafe.config.impl.*; + import java.io.File; import java.net.MalformedURLException; import java.net.URL; @@ -12,51 +14,11 @@ public class DefaultConfigLoadingStrategy implements ConfigLoadingStrategy { @Override public Config parseApplicationConfig(ConfigParseOptions parseOptions) { - ClassLoader loader = parseOptions.getClassLoader(); - if (loader == null) - throw new ConfigException.BugOrBroken( - "ClassLoader should have been set here; bug in ConfigFactory. " - + "(You can probably work around this bug by passing in a class loader or calling currentThread().setContextClassLoader() though.)"); - - int specified = 0; - - // override application.conf with config.file, config.resource, - // config.url if requested. - String resource = System.getProperty("config.resource"); - if (resource != null) - specified += 1; - String file = System.getProperty("config.file"); - if (file != null) - specified += 1; - String url = System.getProperty("config.url"); - if (url != null) - specified += 1; - - if (specified == 0) { + Config overrideConfig = ConfigFactory.parseApplicationOverride(parseOptions); + if (overrideConfig.isEmpty()) { return ConfigFactory.parseResourcesAnySyntax("application", parseOptions); - } else if (specified > 1) { - throw new ConfigException.Generic("You set more than one of config.file='" + file - + "', config.url='" + url + "', config.resource='" + resource - + "'; don't know which one to use!"); } else { - // the override file/url/resource MUST be present or it's an error - ConfigParseOptions overrideOptions = parseOptions.setAllowMissing(false); - if (resource != null) { - if (resource.startsWith("/")) - resource = resource.substring(1); - // this deliberately does not parseResourcesAnySyntax; if - // people want that they can use an include statement. - return ConfigFactory.parseResources(loader, resource, overrideOptions); - } else if (file != null) { - return ConfigFactory.parseFile(new File(file), overrideOptions); - } else { - try { - return ConfigFactory.parseURL(new URL(url), overrideOptions); - } catch (MalformedURLException e) { - throw new ConfigException.Generic("Bad URL in config.url system property: '" - + url + "': " + e.getMessage(), e); - } - } + return overrideConfig; } } } diff --git a/config/src/main/main.iml b/config/src/main/main.iml new file mode 100644 index 000000000..908ad4f52 --- /dev/null +++ b/config/src/main/main.iml @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/config/src/test/test.iml b/config/src/test/test.iml new file mode 100644 index 000000000..13a67212c --- /dev/null +++ b/config/src/test/test.iml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file