Author: cyberdo
Date: 2006-03-05 00:37:31 +0000 (Sun, 05 Mar 2006)
New Revision: 8165
Added:
trunk/freenet/src/freenet/config/StringArrCallback.java
trunk/freenet/src/freenet/config/StringArrOption.java
Modified:
trunk/freenet/src/freenet/config/SubConfig.java
trunk/freenet/src/freenet/node/Version.java
trunk/freenet/src/freenet/pluginmanager/PluginHandler.java
trunk/freenet/src/freenet/pluginmanager/PluginInfoWrapper.java
trunk/freenet/src/freenet/pluginmanager/PluginManager.java
Log:
497: PluginManager now saves loaded plugins to config to re-load them on
restart.
Pluginmanager also now uses the logfle instead of the screen for most messages.
Added: trunk/freenet/src/freenet/config/StringArrCallback.java
===================================================================
--- trunk/freenet/src/freenet/config/StringArrCallback.java 2006-03-04
23:47:05 UTC (rev 8164)
+++ trunk/freenet/src/freenet/config/StringArrCallback.java 2006-03-05
00:37:31 UTC (rev 8165)
@@ -0,0 +1,19 @@
+package freenet.config;
+
+/** Callback (getter/setter) for a string config variable */
+public interface StringArrCallback {
+
+ /**
+ * Get the current, used value of the config variable.
+ */
+ String get();
+
+ /**
+ * Set the config variable to a new value.
+ * @param val The new value.
+ * @throws InvalidConfigOptionException If the new value is invalid for
+ * this particular option.
+ */
+ void set(String val) throws InvalidConfigValueException;
+
+}
Added: trunk/freenet/src/freenet/config/StringArrOption.java
===================================================================
--- trunk/freenet/src/freenet/config/StringArrOption.java 2006-03-04
23:47:05 UTC (rev 8164)
+++ trunk/freenet/src/freenet/config/StringArrOption.java 2006-03-05
00:37:31 UTC (rev 8165)
@@ -0,0 +1,71 @@
+package freenet.config;
+
+import freenet.support.URLDecoder;
+import freenet.support.URLEncodedFormatException;
+import freenet.support.URLEncoder;
+
+public class StringArrOption extends Option {
+
+ final String defaultValue;
+ final StringArrCallback cb;
+ private String currentValue;
+
+ public static String delimiter = ";";
+
+ public StringArrOption(SubConfig conf, String optionName, String
defaultValue, int sortOrder,
+ boolean expert, String shortDesc, String longDesc,
StringArrCallback cb) {
+ super(conf, optionName, sortOrder, expert, shortDesc, longDesc);
+ this.defaultValue = (defaultValue==null)?"":defaultValue;
+ this.cb = cb;
+ this.currentValue = (defaultValue==null)?"":defaultValue;
+ }
+
+ public StringArrOption(SubConfig conf, String optionName, String
defaultValue[], int sortOrder,
+ boolean expert, String shortDesc, String longDesc,
StringArrCallback cb) {
+ this(conf, optionName, arrayToString(defaultValue), sortOrder,
expert, shortDesc, longDesc, cb);
+ }
+
+ /** Get the current value. This is the value in use if we have finished
+ * initialization, otherwise it is the value set at startup (possibly
the default). */
+ public String[] getValue() {
+ return getValueString().split(delimiter);
+ }
+
+ public void setValue(String val) throws InvalidConfigValueException {
+ setInitialValue(val);
+ cb.set(this.currentValue);
+ }
+
+ public String getValueString() {
+ if(config.hasFinishedInitialization())
+ currentValue = cb.get();
+ return currentValue;
+ }
+
+ public void setInitialValue(String val) throws
InvalidConfigValueException {
+ this.currentValue = val;
+ }
+
+
+ public static String arrayToString(String[] arr) {
+ if (arr == null)
+ return null;
+ StringBuffer sb = new StringBuffer();
+ for (int i = 0 ; i < arr.length ; i++)
+ sb.append(arr[i] + delimiter);
+ return sb.toString();
+ }
+
+ public static String encode(String s) {
+ return URLEncoder.encode(s);
+ }
+
+ public static String decode(String s) {
+ try {
+ return URLDecoder.decode(s);
+ } catch (URLEncodedFormatException e) {
+ return null;
+ }
+ }
+
+}
Modified: trunk/freenet/src/freenet/config/SubConfig.java
===================================================================
--- trunk/freenet/src/freenet/config/SubConfig.java 2006-03-04 23:47:05 UTC
(rev 8164)
+++ trunk/freenet/src/freenet/config/SubConfig.java 2006-03-05 00:37:31 UTC
(rev 8165)
@@ -72,6 +72,11 @@
register(new ShortOption(this, optionName, defaultValue,
sortOrder, expert, shortDesc, longDesc, cb));
}
+ public void register(String optionName, String[] defaultValue, int
sortOrder,
+ boolean expert, String shortDesc, String longDesc,
StringArrCallback cb) {
+ register(new StringArrOption(this, optionName, defaultValue,
sortOrder, expert, shortDesc, longDesc, cb));
+ }
+
public int getInt(String optionName) {
IntOption o;
synchronized(this) {
@@ -103,6 +108,14 @@
}
return o.getValue();
}
+
+ public String[] getStringArr(String optionName) {
+ StringArrOption o;
+ synchronized(this) {
+ o = (StringArrOption) map.get(optionName);
+ }
+ return o.getValue();
+ }
public short getShort(String optionName) {
ShortOption o;
Modified: trunk/freenet/src/freenet/node/Version.java
===================================================================
--- trunk/freenet/src/freenet/node/Version.java 2006-03-04 23:47:05 UTC (rev
8164)
+++ trunk/freenet/src/freenet/node/Version.java 2006-03-05 00:37:31 UTC (rev
8165)
@@ -20,7 +20,7 @@
public static final String protocolVersion = "1.0";
/** The build number of the current revision */
- private static final int buildNumber = 496;
+ private static final int buildNumber = 497;
/** Oldest build of Fred we will talk to */
private static final int lastGoodBuild = 475;
Modified: trunk/freenet/src/freenet/pluginmanager/PluginHandler.java
===================================================================
--- trunk/freenet/src/freenet/pluginmanager/PluginHandler.java 2006-03-04
23:47:05 UTC (rev 8164)
+++ trunk/freenet/src/freenet/pluginmanager/PluginHandler.java 2006-03-05
00:37:31 UTC (rev 8165)
@@ -16,10 +16,9 @@
*
* @param plug
*/
- public static PluginInfoWrapper startPlugin(PluginManager pm,
FredPlugin plug, PluginRespirator pr) {
+ public static PluginInfoWrapper startPlugin(PluginManager pm, String
filename, FredPlugin plug, PluginRespirator pr) {
PluginStarter ps = new PluginStarter(pr);
- PluginInfoWrapper pi = new PluginInfoWrapper();
- pi.putPluginThread(plug, ps);
+ PluginInfoWrapper pi = new PluginInfoWrapper(plug, ps,
filename);
ps.setPlugin(pm, plug);
ps.start();
return pi;
Modified: trunk/freenet/src/freenet/pluginmanager/PluginInfoWrapper.java
===================================================================
--- trunk/freenet/src/freenet/pluginmanager/PluginInfoWrapper.java
2006-03-04 23:47:05 UTC (rev 8164)
+++ trunk/freenet/src/freenet/pluginmanager/PluginInfoWrapper.java
2006-03-05 00:37:31 UTC (rev 8165)
@@ -12,13 +12,15 @@
private String threadName;
private FredPlugin plug;
private boolean isPproxyPlugin;
+ private String filename;
//public String
- public void putPluginThread(FredPlugin plug, Thread ps) {
+ public PluginInfoWrapper(FredPlugin plug, Thread ps, String filename) {
if (fedPluginThread) return;
className = plug.getClass().toString();
thread = ps;
this.plug = plug;
+ this.filename = filename;
threadName = "p" + className.replaceAll("^class ", "") + "_" +
ps.hashCode();
start = System.currentTimeMillis();
ps.setName(threadName);
@@ -54,5 +56,9 @@
public boolean isPproxyPlugin() {
return isPproxyPlugin;
}
+
+ public String getFilename() {
+ return filename;
+ }
}
Modified: trunk/freenet/src/freenet/pluginmanager/PluginManager.java
===================================================================
--- trunk/freenet/src/freenet/pluginmanager/PluginManager.java 2006-03-04
23:47:05 UTC (rev 8164)
+++ trunk/freenet/src/freenet/pluginmanager/PluginManager.java 2006-03-05
00:37:31 UTC (rev 8165)
@@ -16,6 +16,7 @@
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
+import java.util.Stack;
import java.util.jar.Attributes;
import java.util.jar.JarFile;
import java.util.jar.Manifest;
@@ -24,6 +25,8 @@
import freenet.client.HighLevelSimpleClient;
import freenet.config.InvalidConfigValueException;
+import freenet.config.StringArrCallback;
+import freenet.config.StringArrOption;
import freenet.config.StringCallback;
import freenet.config.SubConfig;
import freenet.node.Node;
@@ -52,37 +55,64 @@
private PluginManager pluginManager = null;
private PluginRespirator pluginRespirator = null;
private Node node;
+ SubConfig pmconfig;
+
public PluginManager(Node node) {
pluginInfo = new HashMap();
toadletList = new HashMap();
-
+ this.node = node;
pluginRespirator = new PluginRespirator(node, this);
- /*
- SubConfig plugConfig = new SubConfig("pluginmanager",
node.config);
+ pmconfig = new SubConfig("pluginmanager", node.config);
// Start plugins in the config
- plugConfig.register("loadplugin", null, 9, true, "Plugins load
on startup ", "Classpath, name and location for plugins to load when node
starts up",
- new StringCallback() {
+ pmconfig.register("loadplugin", null, 9, true, "Plugins to load
on startup ", "Classpath, name and location for plugins to load when node
starts up",
+ new StringArrCallback() {
public String get() {
- return storeDir.getPath();
+ StringBuffer out = new
StringBuffer();
+ Iterator it =
getPlugins().iterator();
+ if (it.hasNext())
+
out.append(StringArrOption.encode(((PluginInfoWrapper)it.next()).getFilename()));
+ while (it.hasNext())
+
out.append(StringArrOption.delimiter +
StringArrOption.encode(((PluginInfoWrapper)it.next()).getFilename()));
+ System.err.println("asdasd : "+
out.toString());
+ return out.toString();
}
public void set(String val) throws
InvalidConfigValueException {
- if(storeDir.equals(new
File(val))) return;
+ //if(storeDir.equals(new
File(val))) return;
// FIXME
- throw new
InvalidConfigValueException("Moving datastore on the fly not supported at
present");
+ throw new
InvalidConfigValueException("Cannot set the plugins that's loaded.");
}
});
- */
+
+ String fns[] = pmconfig.getStringArr("loadplugin");
+ if (fns != null)
+ for (int i = 0 ; i < fns.length ; i++) {
+ //System.err.println("Load: " +
StringArrOption.decode(fns[i]));
+ startPlugin(StringArrOption.decode(fns[i]));
+ }
+ /*System.err.println("=================================");
+ pmconfig.finishedInitialization();
+ fns = pmconfig.getStringArr("loadplugin");
+ for (int i = 0 ; i < fns.length ; i++)
+ System.err.println("Load: " +
StringArrOption.decode(fns[i]));
+ System.err.println("=================================");
+ */
}
+ private void saveConfig() {
+ node.config.store();
+ }
public void startPlugin(String filename) {
+ if (filename.trim().length() == 0)
+ return;
+ Logger.normal(this, "Loading plugin: " + filename);
FredPlugin plug;
try {
plug = LoadPlugin(filename);
- PluginInfoWrapper pi = PluginHandler.startPlugin(this,
plug, pluginRespirator);
+ PluginInfoWrapper pi = PluginHandler.startPlugin(this,
filename, plug, pluginRespirator);
// handles fproxy? If so, register
if (pi.isPproxyPlugin())
@@ -91,9 +121,11 @@
synchronized (pluginInfo) {
pluginInfo.put(pi.getThreadName(), pi);
}
+ Logger.normal(this, "Plugin loaded: " + filename);
} catch (PluginNotFoundException e) {
- e.printStackTrace();
+ Logger.normal(this, "Loading plugin failed (" +
filename + ")", e);
}
+ saveConfig();
}
private void registerToadlet(FredPlugin pl){
@@ -127,6 +159,7 @@
if (removeKey != null)
pluginInfo.remove(removeKey);
}
+ saveConfig();
}
public String dumpPlugins() {
@@ -143,7 +176,6 @@
}
public Set getPlugins() {
-
HashSet out = new HashSet();
synchronized (pluginInfo) {
Iterator it = pluginInfo.keySet().iterator();