@Override public Config getConfig(String path) { final Map<String, Object> current = read(path, o->(Map<String,Object>)o); if ( current == null ) return null; return new MergeableConfig(current, rootPath + path + "."); }
public MergeableConfig load(InputStream inputStream){ Map<String, Object> newConf = (Map<String, Object>) yaml.load(inputStream); deepMerge( conf, newConf ); return this; }
public Class<?> getClass( String path, Class<?> defaultClass ) { final String clazzName = getString(path); if ( clazzName == null ) return defaultClass; return instantiate( clazzName ); }
private Config getConfigForEndpoint( final String alias ) { Config config = this.config.getConfig("server.uworkers." + alias); if ( config == null ) config = MergeableConfig.create(); return config; } }
private static boolean shouldMergeAnyWay(Map original, Object currentKey, Object currentValue ){ if (original.containsKey(currentKey)) { Object originalValue = original.get(currentKey); if (originalValue instanceof Collection) { checkArgument(currentValue instanceof Collection, "A non-collection collided with a collection: %s\t%s",currentValue, originalValue); ((Collection) originalValue).addAll((Collection) currentValue); return false; } if (originalValue instanceof Map) { checkArgument(currentValue instanceof Map, "A non-map collided with a map: %s\t%s", currentValue, originalValue); deepMerge((Map) originalValue, (Map) currentValue); return false; } } return true; }
@Override public List<String> getStringList( String path, List<String> defaultValues ) { final List<String> current = read(path, o -> (List<String>) o); if ( current == null ) return defaultValues; return current; }
public MergeableConfig load(File file ) throws IOException { try (final FileInputStream inputStream = new FileInputStream(file) ) { return load( inputStream ); } }
@Override public String getString(String path, String defaultValue) { final String value = getString(path); return value != null ? value : defaultValue; }
public static MergeableConfig create(){ return new MergeableConfig(); }
public static MergeableConfig loadDefaults() { try { log.debug( "Loading configuration files..." ); final MergeableConfig config = MergeableConfig.create(); final ClassLoader loader = Thread.currentThread().getContextClassLoader(); loadFiles(config, loader.getResources("META-INF/defaults.yml")); loadFiles(config, loader.getResources("conf/application.yml")); loadFiles(config, loader.getResources("conf/application-test.yml")); return config; } catch ( IOException cause ) { throw new IllegalStateException(cause); } }
@Override public Object getObject(String path) { return read( path, o->o ); }
private static void loadFiles( MergeableConfig config, Enumeration<URL> resources ) throws IOException { while( resources.hasMoreElements() ){ final URL url = resources.nextElement(); try (final InputStream stream = url.openStream() ) { log.info( "Loading configurations from: " + url.getPath() ); config.load(stream); } } } }
@Override public byte[] getBytes(String path, String defaultValue ){ String value = getString(path); if ( value == null ) value = defaultValue; if ( value == null ) return EMPTY_BYTES; return value.getBytes( encoding ); }
@Override public List<Config> getConfigList(String path){ final List<Map<String, Object>> current = read(path, o->(List<Map<String,Object>>)o); if ( current == null ) return Collections.emptyList(); return current.stream().map( m -> new MergeableConfig(m, rootPath + path + ".") ).collect(Collectors.toList()); }
@Override public String getString(String path) { final String propertyValue = System.getProperty(rootPath + path); if ( propertyValue != null ) return propertyValue; return read( path, o->(String)o ); }