package freenet.config; import java.util.Iterator; import freenet.support.Logger; import freenet.support.SimpleFieldSet; /** * Config but supports an initial SimpleFieldSet, from which options are drawn. */ public class PersistentConfig extends Config { protected SimpleFieldSet origConfigFileContents; protected volatile boolean finishedInit; public PersistentConfig(SimpleFieldSet initialContents) { this.origConfigFileContents = initialContents; } /** * Finished initialization. So any remaining options must be invalid. */ @Override public synchronized void finishedInit() { finishedInit = true; if(origConfigFileContents == null) return; Iterator<String> i = origConfigFileContents.keyIterator(); while(i.hasNext()) { String key = i.next(); Logger.error(this, "Unknown option: "+key+" (value="+origConfigFileContents.get(key)+ ')'); } origConfigFileContents = null; super.finishedInit(); } public SimpleFieldSet exportFieldSet() { return exportFieldSet(false); } public SimpleFieldSet exportFieldSet(boolean withDefaults) { return exportFieldSet(Config.RequestType.CURRENT_SETTINGS, withDefaults); } public SimpleFieldSet exportFieldSet(Config.RequestType configRequestType, boolean withDefaults) { SimpleFieldSet fs = new SimpleFieldSet(true); SubConfig[] configs; synchronized(this) { // FIXME maybe keep a cache of this? configs = configsByPrefix.values().toArray(new SubConfig[configsByPrefix.size()]); } for(SubConfig current: configs) { SimpleFieldSet scfs = current.exportFieldSet(configRequestType, withDefaults); fs.tput(current.prefix, scfs); } return fs; } @Override public void onRegister(SubConfig config, Option<?> o) { String val, name; synchronized(this) { if(finishedInit) throw new IllegalStateException("onRegister("+config+ ':' +o+") called after finishedInit() !!"); if(origConfigFileContents == null) return; name = config.prefix+SimpleFieldSet.MULTI_LEVEL_CHAR+o.name; val = origConfigFileContents.get(name); origConfigFileContents.removeValue(name); if(val == null) return; } try { o.setInitialValue(val.trim()); } catch (InvalidConfigValueException e) { Logger.error(this, "Could not parse config option "+name+": "+e, e); } } /** * Return a copy of the SFS as read by the config framework. * * @return a SFS or null if initialization is finished. */ public synchronized SimpleFieldSet getSimpleFieldSet() { return (origConfigFileContents == null ? null : new SimpleFieldSet(origConfigFileContents)); } }