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(" <a
href=\""+pi.getPluginClassName()+"/\">[VISIT]</a> ");
out.append(" <a
href=\"?remove="+pi.getThreadName()+"\">[UNLOAD]</a> ");
+ out.append(" <a
href=\"?reload="+pi.getThreadName()+"\">[RELOAD]</a> ");
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;