Author: cyberdo
Date: 2006-03-07 18:48:06 +0000 (Tue, 07 Mar 2006)
New Revision: 8181

Modified:
   trunk/freenet/src/freenet/node/Version.java
   trunk/freenet/src/freenet/pluginmanager/PluginManager.java
   trunk/freenet/src/freenet/pluginmanager/PproxyToadlet.java
Log:
504: Plugins are now reloadable via web interface.
Plugins are loaded up to 5 times if failing (to deal with bad mirrors)


Modified: trunk/freenet/src/freenet/node/Version.java
===================================================================
--- trunk/freenet/src/freenet/node/Version.java 2006-03-07 18:29:30 UTC (rev 
8180)
+++ trunk/freenet/src/freenet/node/Version.java 2006-03-07 18:48:06 UTC (rev 
8181)
@@ -20,7 +20,7 @@
        public static final String protocolVersion = "1.0";

        /** The build number of the current revision */
-       private static final int buildNumber = 503;
+       private static final int buildNumber = 504;

        /** Oldest build of Fred we will talk to */
        private static final int lastGoodBuild = 475;

Modified: trunk/freenet/src/freenet/pluginmanager/PluginManager.java
===================================================================
--- trunk/freenet/src/freenet/pluginmanager/PluginManager.java  2006-03-07 
18:29:30 UTC (rev 8180)
+++ trunk/freenet/src/freenet/pluginmanager/PluginManager.java  2006-03-07 
18:48:06 UTC (rev 8181)
@@ -247,71 +247,77 @@
         }

         if ((filename.indexOf("@") >= 0)) {
-            // Open from external file
-            try {
-               String realURL = null;
-               String realClass = null;
-               
-               // Load the jar-file
-               String[] parts = filename.split("@");
-               if (parts.length != 2) {
-                       throw new PluginNotFoundException("Could not split at 
\"@\".");
-               }
-               realClass = parts[0];
-               realURL = parts[1];
-               
-               if (filename.endsWith(".url")) {
-                               // Load the txt-file
-                               BufferedReader in;
-                               URL url = new URL(parts[1]);
-                        URLConnection uc = url.openConnection();
-                       in = new BufferedReader(
-                                       new 
InputStreamReader(uc.getInputStream()));
-                       
-                       realURL = in.readLine().trim();
-               }
-               
-               // Load the class inside file
-               URL[] serverURLs = new URL[]{new URL(realURL)};
-               ClassLoader cl = new URLClassLoader(serverURLs);
-               
-         
-               // Handle automatic fetching of pluginclassname
-               if (realClass.equals("*")) {
-                       if (realURL.startsWith("file:")) {
-                               URI liburi = new 
File(realURL.substring("file:".length())).toURI();
-                               realURL = liburi.toString();
-                       }
-                       
-                       URL url = new URL("jar:"+realURL+"!/");
-                       JarURLConnection jarConnection = 
(JarURLConnection)url.openConnection();
-                       JarFile jf = jarConnection.getJarFile();
-                       //URLJarFile jf = new URLJarFile(new File(liburi));
-                       //is = 
jf.getInputStream(jf.getJarEntry("META-INF/MANIFEST.MF"));
-                       
-                       //BufferedReader manifest = new BufferedReader(new 
InputStreamReader(cl.getResourceAsStream("/META-INF/MANIFEST.MF")));
-                       
-                       //URL url = new URL(parts[1]);
-                    //URLConnection uc = 
cl.getResource("/META-INF/MANIFEST.MF").openConnection();
-                       
-                       InputStream is = 
jf.getInputStream(jf.getJarEntry("META-INF/MANIFEST.MF"));
-                       BufferedReader in = new BufferedReader(new 
InputStreamReader(is));      
-                       String line;
-                       while ((line = in.readLine())!=null) {
-                               //      System.err.println(line + "\t\t\t" + 
realClass);
-                               if (line.startsWith("Plugin-Main-Class: ")) {
-                                       realClass = 
line.substring("Plugin-Main-Class: ".length()).trim();
-                               }
-                       }
-                       //System.err.println("Real classname: " + realClass);
-               }
-               
-               cls = cl.loadClass(realClass);
-               
-            } catch (Exception e) {
-               throw new PluginNotFoundException("Initialization error:"
-                               + filename, e);
-            }
+               // Open from external file
+               for (int tries = 0 ; tries <= 5 && cls == null ; tries++)
+                       try {
+                               String realURL = null;
+                               String realClass = null;
+                               
+                               // Load the jar-file
+                               String[] parts = filename.split("@");
+                               if (parts.length != 2) {
+                                       throw new 
PluginNotFoundException("Could not split at \"@\".");
+                               }
+                               realClass = parts[0];
+                               realURL = parts[1];
+                               
+                               if (filename.endsWith(".url")) {
+                                       // Load the txt-file
+                                       BufferedReader in;
+                                       URL url = new URL(parts[1]);
+                                       URLConnection uc = url.openConnection();
+                                       in = new BufferedReader(
+                                                       new 
InputStreamReader(uc.getInputStream()));
+                                       
+                                       realURL = in.readLine().trim();
+                               }
+                               
+                               // Load the class inside file
+                               URL[] serverURLs = new URL[]{new URL(realURL)};
+                               ClassLoader cl = new URLClassLoader(serverURLs);
+                               
+                               
+                               // Handle automatic fetching of pluginclassname
+                               if (realClass.equals("*")) {
+                                       if (realURL.startsWith("file:")) {
+                                               URI liburi = new 
File(realURL.substring("file:".length())).toURI();
+                                               realURL = liburi.toString();
+                                       }
+                                       
+                                       URL url = new URL("jar:"+realURL+"!/");
+                                       JarURLConnection jarConnection = 
(JarURLConnection)url.openConnection();
+                                       JarFile jf = jarConnection.getJarFile();
+                                       //URLJarFile jf = new URLJarFile(new 
File(liburi));
+                                       //is = 
jf.getInputStream(jf.getJarEntry("META-INF/MANIFEST.MF"));
+                                       
+                                       //BufferedReader manifest = new 
BufferedReader(new 
InputStreamReader(cl.getResourceAsStream("/META-INF/MANIFEST.MF")));
+                                       
+                                       //URL url = new URL(parts[1]);
+                                       //URLConnection uc = 
cl.getResource("/META-INF/MANIFEST.MF").openConnection();
+                                       
+                                       InputStream is = 
jf.getInputStream(jf.getJarEntry("META-INF/MANIFEST.MF"));
+                                       BufferedReader in = new 
BufferedReader(new InputStreamReader(is));      
+                                       String line;
+                                       while ((line = in.readLine())!=null) {
+                                               //      System.err.println(line 
+ "\t\t\t" + realClass);
+                                               if 
(line.startsWith("Plugin-Main-Class: ")) {
+                                                       realClass = 
line.substring("Plugin-Main-Class: ".length()).trim();
+                                               }
+                                       }
+                                       //System.err.println("Real classname: " 
+ realClass);
+                               }
+                               
+                               cls = cl.loadClass(realClass);
+                               
+                       } catch (Exception e) {
+                               if (tries >= 5)
+                                       throw new 
PluginNotFoundException("Initialization error:"
+                                                       + filename, e);
+                               
+                               try {
+                                       Thread.sleep(100);
+                               } catch (Exception ee) {}
+                       }
         } else {
                // Load class
                try {

Modified: trunk/freenet/src/freenet/pluginmanager/PproxyToadlet.java
===================================================================
--- trunk/freenet/src/freenet/pluginmanager/PproxyToadlet.java  2006-03-07 
18:29:30 UTC (rev 8180)
+++ trunk/freenet/src/freenet/pluginmanager/PproxyToadlet.java  2006-03-07 
18:48:06 UTC (rev 8181)
@@ -3,7 +3,6 @@
 import java.io.IOException;
 import java.io.PrintWriter;
 import java.io.StringWriter;
-import java.net.MalformedURLException;
 import java.net.URI;
 import java.util.Date;
 import java.util.Iterator;
@@ -80,6 +79,7 @@
                                        if (pi.isPproxyPlugin())
                                                out.append("&nbsp;<a 
href=\""+pi.getPluginClassName()+"/\">[VISIT]</a>&nbsp;");
                                        out.append("&nbsp;<a 
href=\"?remove="+pi.getThreadName()+"\">[UNLOAD]</a>&nbsp;");
+                                       out.append("&nbsp;<a 
href=\"?reload="+pi.getThreadName()+"\">[RELOAD]</a>&nbsp;");
                                        out.append("</td>\n");
                                        out.append("  </tr>\n");
                                }
@@ -120,6 +120,27 @@

                                headers.put("Location", ".");
                                ctx.sendReplyHeaders(302, "Found", headers, 
null, 0);
+                       } else if (ks.startsWith("?reload=")) {
+                               String fn = null;
+                               Iterator it = pm.getPlugins().iterator();
+                               while (it.hasNext()) {
+                                       PluginInfoWrapper pi = 
(PluginInfoWrapper) it.next();
+                                       if 
(pi.getThreadName().equals(ks.substring("?reload=".length()))) {
+                                               fn = pi.getFilename();
+                                               break;
+                                       }
+                               }
+                               
+                               if (fn == null) {
+                                       writeReply(ctx, 200, "text/html", "OK", 
mkForwardPage("Error", "Plugin not found...", ".", 5));
+                               } else {
+                                       
pm.killPlugin(ks.substring("?reload=".length()));
+                                       pm.startPlugin(fn);
+                                       
+                                       MultiValueTable headers = new 
MultiValueTable();
+                                       headers.put("Location", ".");
+                                       ctx.sendReplyHeaders(302, "Found", 
headers, null, 0);
+                               }
                        } else {
                                int to = ks.indexOf("/");
                                String plugin, data;


Reply via email to