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();


Reply via email to