package rabbitescape.engine.config; import java.util.SortedSet; import java.util.TreeSet; import rabbitescape.engine.err.RabbitEscapeException; import rabbitescape.engine.util.Util; /** * Holds and retrieves configuration information that is saved in some * underlying storage. * * Handles a schema of which keys are allowed, and automatically upgrades * old config from previous versions. */ public class Config { public static String CFG_VERSION = "config.version"; public static class UnknownKey extends RabbitEscapeException { private static final long serialVersionUID = 1L; public final String key; public UnknownKey( String key ) { this.key = key; } } // --- public final ConfigSchema schema; private final IConfigStorage storage; public Config( ConfigSchema schema, IConfigStorage storage, IConfigUpgrade... upgrades ) { this.schema = schema; this.storage = storage; for( int i = version(); i < upgrades.length; ++i ) { upgrades[i].run( storage ); Util.reAssert( version() == i + 1, "Config upgrade to version " + ( i + 1 ) + " did not update the version correctly - version is: " + version() ); storage.save( this ); } } public void set( String key, String value ) { schema.checkKeyExists( key ); // Check the key exists if ( ! get( key ).equals( value ) ) { storage.set( key, value ); } } public String get( String key ) { String ret = storage.get( key ); if ( ret == null ) { return schema.getDefault( key ); } else { return ret; } } public void save() { storage.save( this ); } public SortedSet<String> keys() { return new TreeSet<String>( schema.defaults.keySet() ); } public int version() { String ret = storage.get( Config.CFG_VERSION ); if ( ret == null ) { return 0; } else { return Integer.parseInt( ret ); } } }