001package com.typesafe.config; 002 003import java.io.File; 004import java.net.MalformedURLException; 005import java.net.URL; 006 007/** 008 * Default config loading strategy. Able to load resource, file or URL. 009 * Behavior may be altered by defining one of VM properties 010 * {@code config.resource}, {@code config.file} or {@code config.url} 011 */ 012public class DefaultConfigLoadingStrategy implements ConfigLoadingStrategy { 013 @Override 014 public Config parseApplicationConfig(ConfigParseOptions parseOptions) { 015 ClassLoader loader = parseOptions.getClassLoader(); 016 if (loader == null) 017 throw new ConfigException.BugOrBroken( 018 "ClassLoader should have been set here; bug in ConfigFactory. " 019 + "(You can probably work around this bug by passing in a class loader or calling currentThread().setContextClassLoader() though.)"); 020 021 int specified = 0; 022 023 // override application.conf with config.file, config.resource, 024 // config.url if requested. 025 String resource = System.getProperty("config.resource"); 026 if (resource != null) 027 specified += 1; 028 String file = System.getProperty("config.file"); 029 if (file != null) 030 specified += 1; 031 String url = System.getProperty("config.url"); 032 if (url != null) 033 specified += 1; 034 035 if (specified == 0) { 036 return ConfigFactory.parseResourcesAnySyntax("application", parseOptions); 037 } else if (specified > 1) { 038 throw new ConfigException.Generic("You set more than one of config.file='" + file 039 + "', config.url='" + url + "', config.resource='" + resource 040 + "'; don't know which one to use!"); 041 } else { 042 // the override file/url/resource MUST be present or it's an error 043 ConfigParseOptions overrideOptions = parseOptions.setAllowMissing(false); 044 if (resource != null) { 045 if (resource.startsWith("/")) 046 resource = resource.substring(1); 047 // this deliberately does not parseResourcesAnySyntax; if 048 // people want that they can use an include statement. 049 return ConfigFactory.parseResources(loader, resource, overrideOptions); 050 } else if (file != null) { 051 return ConfigFactory.parseFile(new File(file), overrideOptions); 052 } else { 053 try { 054 return ConfigFactory.parseURL(new URL(url), overrideOptions); 055 } catch (MalformedURLException e) { 056 throw new ConfigException.Generic("Bad URL in config.url system property: '" 057 + url + "': " + e.getMessage(), e); 058 } 059 } 060 } 061 } 062}