diff --git a/core/java/src/net/i2p/I2PAppContext.java b/core/java/src/net/i2p/I2PAppContext.java index b49779640..4b023034b 100644 --- a/core/java/src/net/i2p/I2PAppContext.java +++ b/core/java/src/net/i2p/I2PAppContext.java @@ -27,11 +27,13 @@ import net.i2p.util.Clock; import net.i2p.util.ConcurrentHashSet; import net.i2p.util.FileUtil; import net.i2p.util.FortunaRandomSource; +import net.i2p.util.I2PProperties; import net.i2p.util.KeyRing; import net.i2p.util.LogManager; //import net.i2p.util.PooledRandomSource; import net.i2p.util.RandomSource; import net.i2p.util.SecureDirectory; +import net.i2p.util.I2PProperties.I2PPropertyCallback; /** *
Provide a base scope for accessing singletons that I2P exposes. Rather than
@@ -62,7 +64,7 @@ public class I2PAppContext {
/** the context that components without explicit root are bound */
protected static I2PAppContext _globalAppContext;
- private Properties _overrideProps;
+ private I2PProperties _overrideProps;
private StatManager _statManager;
private SessionKeyManager _sessionKeyManager;
@@ -165,7 +167,7 @@ public class I2PAppContext {
_globalAppContext = this;
}
}
- _overrideProps = envProps;
+ _overrideProps = new I2PProperties(envProps);
_statManager = null;
_sessionKeyManager = null;
_namingService = null;
@@ -478,6 +480,27 @@ public class I2PAppContext {
return names;
}
+ /**
+ * Modify the configuration attributes of this context, changing
+ * one of the properties provided during the context construction.
+ * @param propName The name of the property.
+ * @param value The new value for the property.
+ */
+ public void setProperty(String propName, String value) {
+ if(_overrideProps != null) {
+ _overrideProps.setProperty(propName, value);
+ }
+ }
+
+ /**
+ * Add a callback, which will fire upon changes in the property
+ * given in the specific callback.
+ * @param callback The implementation of the callback.
+ */
+ public void addPropertyCallback(I2PPropertyCallback callback) {
+ _overrideProps.addCallBack(callback);
+ }
+
/**
* The statistics component with which we can track various events
* over time.
diff --git a/core/java/src/net/i2p/util/I2PProperties.java b/core/java/src/net/i2p/util/I2PProperties.java
new file mode 100644
index 000000000..b6dfca8a1
--- /dev/null
+++ b/core/java/src/net/i2p/util/I2PProperties.java
@@ -0,0 +1,57 @@
+package net.i2p.util;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Properties;
+import java.util.concurrent.CopyOnWriteArrayList;
+
+/**
+ * This class contains a number of properties ((key,value)-pairs).
+ * Additionally, it adds the possibility for callbacks,
+ * to allow immediate response to changing properties.
+ * @author Mathiasdm
+ *
+ */
+public class I2PProperties extends Properties {
+
+ /**
+ * Keep a list of callbacks to contact the interested parties
+ * that want to know about property changes.
+ * @todo Use a map of lists, so we don't need to loop over all the callbacks on every change.
+ */
+ private final List