Skip to content

Commit

Permalink
Split out a helper method for parsing only application overrides
Browse files Browse the repository at this point in the history
  • Loading branch information
bbaldino committed Sep 22, 2020
1 parent 001e6c3 commit 09e2d57
Show file tree
Hide file tree
Showing 4 changed files with 87 additions and 44 deletions.
59 changes: 58 additions & 1 deletion config/src/main/java/com/typesafe/config/ConfigFactory.java
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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).
Expand Down
Original file line number Diff line number Diff line change
@@ -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;
Expand All @@ -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;
}
}
}
11 changes: 11 additions & 0 deletions config/src/main/main.iml
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<module type="JAVA_MODULE" version="4">
<component name="NewModuleRootManager" inherit-compiler-output="true">
<exclude-output />
<content url="file://$MODULE_DIR$">
<sourceFolder url="file://$MODULE_DIR$/java" isTestSource="false" />
</content>
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
</component>
</module>
13 changes: 13 additions & 0 deletions config/src/test/test.iml
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
<?xml version="1.0" encoding="UTF-8"?>
<module type="JAVA_MODULE" version="4">
<component name="NewModuleRootManager" inherit-compiler-output="true">
<exclude-output />
<content url="file://$MODULE_DIR$">
<sourceFolder url="file://$MODULE_DIR$/java" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/scala" isTestSource="true" />
</content>
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
<orderEntry type="module" module-name="main" />
</component>
</module>

0 comments on commit 09e2d57

Please sign in to comment.