package freenet.config; import java.io.File; import java.io.IOException; import freenet.support.Logger; import freenet.support.SimpleFieldSet; import freenet.support.Ticker; public class FreenetFilePersistentConfig extends FilePersistentConfig { final protected static String DEFAULT_HEADER = "This file is overwritten whenever Freenet shuts down, so only edit it when the node is not running."; private volatile boolean isWritingConfig = false; private volatile boolean hasNodeStarted = false; private Ticker ticker; public final Runnable thread = new Runnable() { @Override public void run() { synchronized (this) { while(!hasNodeStarted){ try { wait(1000); } catch (InterruptedException e) {} } } try { innerStore(); } catch (IOException e) { String err = "Cannot store config: "+e; Logger.error(this, err, e); System.err.println(err); e.printStackTrace(); } synchronized (storeSync) { isWritingConfig = false; } } }; public FreenetFilePersistentConfig(SimpleFieldSet set, File filename, File tempFilename) throws IOException { super(set, filename, tempFilename, DEFAULT_HEADER); } public static FreenetFilePersistentConfig constructFreenetFilePersistentConfig(File f) throws IOException { File filename = f; File tempFilename = new File(f.getPath()+".tmp"); return new FreenetFilePersistentConfig(load(filename, tempFilename), filename, tempFilename); } @Override public void store() { // FIXME how to do this without duplicating code and making finishedInit visible? synchronized(this) { if(!finishedInit) { writeOnFinished = true; return; } } synchronized(storeSync) { if(isWritingConfig || ticker == null){ Logger.normal(this, "Already writing the config file to disk or the node object hasn't been set : refusing to proceed"); return; } isWritingConfig = true; ticker.queueTimedJob(thread, 0); } } public void finishedInit(Ticker ticker) { this.ticker = ticker; super.finishedInit(); } public void setHasNodeStarted() { synchronized (this) { if(hasNodeStarted) Logger.error(this, "It has already been called! that shouldn't happen!"); this.hasNodeStarted = true; notifyAll(); } } }