package freenet.node; import java.io.File; import java.io.IOException; import freenet.config.InvalidConfigValueException; import freenet.config.SubConfig; import freenet.l10n.NodeL10n; import freenet.support.Ticker; import freenet.support.api.StringCallback; public class ConfigurablePersister extends Persister { public ConfigurablePersister(Persistable t, SubConfig nodeConfig, String optionName, String defaultFilename, int sortOrder, boolean expert, boolean forceWrite, String shortDesc, String longDesc, Ticker ps, File baseDir) throws NodeInitException { super(t, ps); nodeConfig.register(optionName, new File(baseDir, defaultFilename).toString(), sortOrder, expert, forceWrite, shortDesc, longDesc, new StringCallback() { @Override public String get() { return persistTarget.toString(); } @Override public void set(String val) throws InvalidConfigValueException { setThrottles(val); } }); String throttleFile = nodeConfig.getString(optionName); try { setThrottles(throttleFile); } catch (InvalidConfigValueException e2) { throw new NodeInitException(NodeInitException.EXIT_THROTTLE_FILE_ERROR, e2.getMessage()); } } private void setThrottles(String val) throws InvalidConfigValueException { File f = new File(val); File tmp = new File(f.toString()+".tmp"); while(true) { if(f.exists()) { if(!(f.canRead() && f.canWrite())) throw new InvalidConfigValueException(l10n("existsCannotReadWrite")+" : "+tmp); break; } else { try { if(!f.createNewFile()) { if(f.exists()) continue; throw new InvalidConfigValueException(l10n("doesNotExistCannotCreate")+" : "+tmp); } } catch (IOException e) { throw new InvalidConfigValueException(l10n("doesNotExistCannotCreate")+" : "+tmp); } } } while(true) { if(tmp.exists()) { if(!(tmp.canRead() && tmp.canWrite())) throw new InvalidConfigValueException(l10n("existsCannotReadWrite")+" : "+tmp); break; } else { try { tmp.createNewFile(); } catch (IOException e) { throw new InvalidConfigValueException(l10n("doesNotExistCannotCreate")+" : "+tmp); } } } synchronized(this) { persistTarget = f; persistTemp = tmp; } } private String l10n(String key) { return NodeL10n.getBase().getString("ConfigurablePersister."+key); } }