package net.varkhan.base.management.config;
import java.util.Map;
/**
* <b></b>.
* <p/>
*
* @author varkhan
* @date 11/10/13
* @time 3:06 PM
*/
public class OverrideConfiguration extends DelegateConfiguration implements SettableConfiguration {
protected final SettableConfiguration override;
/**
* Creates a new delegating configuration.
*
* @param override the highest priority configuration, that allows for overriding of other fallback configurations
* @param configs a variadic array of configurations, in order of increasing priorities
*/
public OverrideConfiguration(SettableConfiguration override, Configuration... configs) {
super(merge(override, configs));
this.override = override;
}
private static Configuration[] merge(SettableConfiguration override, Configuration[] configs) {
if(configs==null ||configs.length==0) return new Configuration[]{override};
Configuration[] confs = new Configuration[1+configs.length];
confs[0] = override;
System.arraycopy(configs,0,confs,1,configs.length);
return confs;
}
@Override
public SettableConfiguration.Context context(String ctx) {
Configuration.Context[] contexts = new Configuration.Context[configs.length];
for(int i=0;i<configs.length;i++) {
Configuration conf=configs[i];
if(conf!=null) contexts[i] = conf.context(ctx);
}
return new Context(ctx, override.context(ctx), contexts);
}
public void add(String key, Object val) { override.add(key, val); }
public void add(String ctx, String key, Object val) { override.add(ctx, key, val); }
public void add(Configuration.Entry ent) { override.add(ent); }
public void loadConfig(Configuration cfg) { override.loadConfig(cfg); }
public void loadConfig(String ctx, Map<String,?> props) { override.loadConfig(ctx, props); }
protected static class Context extends DelegateConfiguration.Context implements SettableConfiguration.Context {
protected final SettableConfiguration.Context override;
public Context(String ctx, SettableConfiguration.Context override, Configuration.Context... contexts) {
super(ctx, contexts);
this.override=override;
}
@Override
public boolean add(String key, Object val) {
return override.add(key, val);
}
@Override
public boolean add(Entry cfg) {
return override.add(cfg);
}
@Override
public boolean add(Map<String,?> cfgs) {
return override.add(cfgs);
}
@Override
public boolean del(String key) {
return override.del(key);
}
}
}