IMHO this is ugly. It's basically a function of the plugin loader, not the
interface.
On Thursday 13 September 2007 12:24, you wrote:
> Author: nextgens
> Date: 2007-09-13 11:24:55 +0000 (Thu, 13 Sep 2007)
> New Revision: 15135
>
> Modified:
> trunk/freenet/src/freenet/clients/http/PproxyToadlet.java
> trunk/freenet/src/freenet/pluginmanager/PluginManager.java
> Log:
> plugins: Move some code around... sorry for the big diff
>
> Basically, checking for <plugname># should be done on the toadlet and not on
the plugin manager ... otherwise we end up storing the # version in the
configuration ... and we actually re-download everything on each startup :(
>
> nb: current loaded plugins using # will be "forgotten"
>
> Modified: trunk/freenet/src/freenet/clients/http/PproxyToadlet.java
> ===================================================================
> --- trunk/freenet/src/freenet/clients/http/PproxyToadlet.java 2007-09-13
09:08:18 UTC (rev 15134)
> +++ trunk/freenet/src/freenet/clients/http/PproxyToadlet.java 2007-09-13
11:24:55 UTC (rev 15135)
> @@ -1,7 +1,12 @@
> package freenet.clients.http;
>
> +import java.io.File;
> +import java.io.FileNotFoundException;
> import java.io.IOException;
> +import java.io.InputStream;
> +import java.net.MalformedURLException;
> import java.net.URI;
> +import java.net.URL;
> import java.util.Date;
> import java.util.Iterator;
>
> @@ -20,6 +25,7 @@
> import freenet.support.Logger;
> import freenet.support.MultiValueTable;
> import freenet.support.api.HTTPRequest;
> +import freenet.support.io.FileUtil;
>
> public class PproxyToadlet extends Toadlet {
> private static final int MAX_PLUGIN_NAME_LENGTH = 1024;
> @@ -39,7 +45,7 @@
> }
>
> public void handlePost(URI uri, HTTPRequest request, ToadletContext ctx)
> - throws ToadletContextClosedException, IOException {
> + throws ToadletContextClosedException, IOException {
>
> MultiValueTable headers = new MultiValueTable();
>
> @@ -55,7 +61,7 @@
> super.sendErrorPage(ctx, 403, "Unauthorized",
> l10n("unauthorized"));
> return;
> }
> -
> +
> String path=request.getPath();
>
> // remove leading / and plugins/ from path
> @@ -65,7 +71,7 @@
> if(Logger.shouldLog(Logger.MINOR, this)) Logger.minor(this,
> "Pproxy
received POST on "+path);
>
> PluginManager pm = node.pluginManager;
> -
> +
> if(path.length()>0)
> {
> try
> @@ -114,10 +120,85 @@
> {
>
> if (request.isPartSet("load")) {
> - if(Logger.shouldLog(Logger.MINOR, this))
Logger.minor(this, "Loading "+request.getPartAsString("load",
MAX_PLUGIN_NAME_LENGTH));
> - pm.startPlugin(request.getPartAsString("load",
> MAX_PLUGIN_NAME_LENGTH),
true);
> - //writeReply(ctx, 200, "text/html", "OK",
> mkForwardPage("Loading
plugin", "Loading plugin...", ".", 5));
> + String filename =
> request.getPartAsString("load",
MAX_PLUGIN_NAME_LENGTH);
> + final boolean logMINOR =
> Logger.shouldLog(Logger.MINOR, this);
> + boolean downloaded = false;
>
> + if(logMINOR) Logger.minor(this, "Loading
> "+filename);
> + if (filename.endsWith("#")) {
> + for (int tries = 0; (tries <= 5) &&
> (downloaded == false); tries++) {
> + if (filename.indexOf('@') > -1)
> {
> + Logger
> + .error(this,
> + "We don't allow
> downloads from anywhere else but our server");
> + return;
> + }
> + String pluginname =
> filename.substring(0,
> +
> filename.length() - 1);
> + filename = null;
> +
> + URL url;
> + InputStream is = null;
> +
> + try {
> + url = new URL(
> +
> "http://downloads.freenetproject.org/alpha/plugins/"
> + +
> pluginname + ".jar.url");
> + if (logMINOR)
> +
> Logger.minor(this, "Downloading " + url);
> + is = url.openStream();
> +
> + File pluginsDirectory =
> new File("plugins");
> + if
> (!pluginsDirectory.exists()) {
> + Logger
> + .normal(this,
> + "The plugin
> directory hasn't been found, let's create it");
> + if
> (!pluginsDirectory.mkdir())
> + return;
> + }
> +
> + File finalFile = new
> File("plugins/" + pluginname
> + +
> ".jar");
> + if
> (!FileUtil.writeTo(is, finalFile))
> +
> Logger.error(this,
> +
> "Failed to rename the temporary file into "
> +
> + finalFile);
> +
> + filename = "*@file://"
> + +
> FileUtil.getCanonicalFile(finalFile);
> + if (logMINOR)
> +
> Logger.minor(this, "Rewritten to " + filename);
> + downloaded = true;
> + } catch (MalformedURLException
> mue) {
> + Logger.error(this,
> +
> "MalformedURLException has occured : " + mue,
> + mue);
> + return;
> + } catch (FileNotFoundException
> e) {
> + Logger.error(this,
> +
> "FileNotFoundException has occured : " + e, e);
> + return;
> + } catch (IOException ioe) {
> +
> System.out.println("Caught :" + ioe.getMessage());
> + ioe.printStackTrace();
> + return;
> + } finally {
> + try {
> + if (is != null)
> +
> is.close();
> + } catch (IOException
> ioe) {
> + }
> + }
> + if (filename == null)
> + return;
> + else if(!downloaded) {
> + Logger.error(this,
> "Can't load the given plugin; giving up");
> + return;
> + }
> + }
> + }
> +
> + pm.startPlugin(filename, true);
> headers.put("Location", ".");
> ctx.sendReplyHeaders(302, "Found", headers,
> null, 0);
> return;
> @@ -192,7 +273,7 @@
> }
>
> public void handleGet(URI uri, HTTPRequest request, ToadletContext ctx)
> - throws ToadletContextClosedException, IOException {
> + throws ToadletContextClosedException, IOException {
>
> //String basepath = "/plugins/";
> String path = request.getPath();
> @@ -202,7 +283,7 @@
> if(path.startsWith("plugins/")) path =
path.substring("plugins/".length());
>
> PluginManager pm = node.pluginManager;
> -
> +
> if(Logger.shouldLog(Logger.MINOR, this))
> Logger.minor(this, "Pproxy fetching "+path);
> try {
> @@ -281,18 +362,18 @@
> if(pi.isStopping()) {
> actionCell.addChild("#",
> l10n("pluginStopping"));
> } else {
> - if (pi.isPproxyPlugin()) {
> - HTMLNode visitForm =
> actionCell.addChild("form", new String[]
{ "method", "action", "target" }, new String[] { "get",
pi.getPluginClassName(), "_new" });
> - visitForm.addChild("input", new
> String[] { "type", "name", "value" },
new String[] { "hidden", "formPassword", core.formPassword });
> - visitForm.addChild("input", new
> String[] { "type", "value" }, new
String[] { "submit", L10n.getString("PluginToadlet.visit") });
> + if (pi.isPproxyPlugin()) {
> + HTMLNode visitForm =
> actionCell.addChild("form", new String[]
{ "method", "action", "target" }, new String[] { "get",
pi.getPluginClassName(), "_new" });
> +
> visitForm.addChild("input", new String[]
{ "type", "name", "value" }, new String[] { "hidden", "formPassword",
core.formPassword });
> +
> visitForm.addChild("input", new String[] { "type", "value" }, new
String[] { "submit", L10n.getString("PluginToadlet.visit") });
> + }
> + HTMLNode unloadForm =
ctx.addFormChild(actionCell, ".", "unloadPluginForm");
> + unloadForm.addChild("input",
> new String[]
{ "type", "name", "value" }, new String[] { "hidden", "unload",
pi.getThreadName() });
> + unloadForm.addChild("input",
> new String[] { "type", "value" }, new
String[] { "submit", l10n("unload") });
> + HTMLNode reloadForm =
ctx.addFormChild(actionCell, ".", "reloadPluginForm");
> + reloadForm.addChild("input",
> new String[]
{ "type", "name", "value" }, new String[] { "hidden", "reload",
pi.getThreadName() });
> + reloadForm.addChild("input",
> new String[] { "type", "value" }, new
String[] { "submit", l10n("reload") });
> }
> - HTMLNode unloadForm =
ctx.addFormChild(actionCell, ".", "unloadPluginForm");
> - unloadForm.addChild("input", new
> String[] { "type", "name", "value" },
new String[] { "hidden", "unload", pi.getThreadName() });
> - unloadForm.addChild("input", new
> String[] { "type", "value" }, new
String[] { "submit", l10n("unload") });
> - HTMLNode reloadForm =
ctx.addFormChild(actionCell, ".", "reloadPluginForm");
> - reloadForm.addChild("input", new
> String[] { "type", "name", "value" },
new String[] { "hidden", "reload", pi.getThreadName() });
> - reloadForm.addChild("input", new
> String[] { "type", "value" }, new
String[] { "submit", l10n("reload") });
> - }
> }
> }
>
>
> Modified: trunk/freenet/src/freenet/pluginmanager/PluginManager.java
> ===================================================================
> --- trunk/freenet/src/freenet/pluginmanager/PluginManager.java
> 2007-09-13
09:08:18 UTC (rev 15134)
> +++ trunk/freenet/src/freenet/pluginmanager/PluginManager.java
> 2007-09-13
11:24:55 UTC (rev 15135)
> @@ -4,13 +4,10 @@
> package freenet.pluginmanager;
>
> import java.io.BufferedReader;
> -import java.io.File;
> -import java.io.FileNotFoundException;
> import java.io.IOException;
> import java.io.InputStream;
> import java.io.InputStreamReader;
> import java.net.JarURLConnection;
> -import java.net.MalformedURLException;
> import java.net.URI;
> import java.net.URL;
> import java.net.URLClassLoader;
> @@ -34,7 +31,6 @@
> import freenet.support.URIPreEncoder;
> import freenet.support.api.HTTPRequest;
> import freenet.support.api.StringArrCallback;
> -import freenet.support.io.FileUtil;
>
> public class PluginManager {
>
> @@ -68,15 +64,15 @@
> // Start plugins in the config
> pmconfig.register("loadplugin", null, 9, true,
false, "PluginManager.loadedOnStartup", "PluginManager.loadedOnStartupLong",
> new StringArrCallback() {
> - public String[] get() {
> - return getConfigLoadString();
> - }
> - public void set(String[] val) throws
> InvalidConfigValueException {
> - //if(storeDir.equals(new
> File(val))) return;
> - // FIXME
> - throw new
InvalidConfigValueException(L10n.getString("PluginManager.cannotSetOnceLoaded"));
> - }
> - });
> + public String[] get() {
> + return getConfigLoadString();
> + }
> + public void set(String[] val) throws
> InvalidConfigValueException {
> + //if(storeDir.equals(new File(val))) return;
> + // FIXME
> + throw new
InvalidConfigValueException(L10n.getString("PluginManager.cannotSetOnceLoaded"));
> + }
> + });
>
> String fns[] = pmconfig.getStringArr("loadplugin");
> if (fns != null) {
> @@ -93,7 +89,7 @@
> for (int i = 0 ; i < fns.length ; i++)
> System.err.println("Load: " + StringArrOption.decode(fns[i]));
> System.err.println("=================================");
> - */
> + */
> }
>
> private String[] getConfigLoadString() {
> @@ -135,9 +131,9 @@
> System.err.println("Plugin "+filename+" appears
> to require a later
JVM");
> Logger.error(this, "Plugin "+filename+" appears
> to require a later
JVM");
> core.alerts.register(new SimpleUserAlert(true,
> -
> l10n("pluginReqNewerJVMTitle", "name", filename),
> -
> l10n("pluginReqNewerJVM", "name", filename),
> - UserAlert.ERROR));
> + l10n("pluginReqNewerJVMTitle",
> "name", filename),
> + l10n("pluginReqNewerJVM",
> "name", filename),
> + UserAlert.ERROR));
> }
> }
> if(store) core.storeConfig();
> @@ -156,7 +152,7 @@
>
> node.ipDetector.registerPortForwardPlugin((FredPluginPortForward) plug);
> }
> }
> -
> +
> private String l10n(String key, String pattern, String value) {
> return L10n.getString("PluginManager."+key, pattern, value);
> }
> @@ -178,7 +174,7 @@
> }
> core.storeConfig();
> }
> -
> +
> public void unregisterPluginToadlet(PluginInfoWrapper pi) {
> synchronized (toadletList) {
> try {
> @@ -260,7 +256,7 @@
> }
> /*if (handler == null)
> return null;
> - */
> + */
>
> if (handler instanceof FredPluginHTTP)
> return ((FredPluginHTTP)handler).handleHTTPGet(request);
> @@ -275,7 +271,7 @@
> }
> /*if (handler == null)
> return null;
> - */
> + */
>
> if (handler instanceof FredPluginHTTP)
> return
> ((FredPluginHTTP)handler).handleHTTPPost(request);
> @@ -310,94 +306,19 @@
> * @throws PluginNotFoundException If anything goes wrong.
> */
> private FredPlugin LoadPlugin(String origFilename)
> - throws PluginNotFoundException {
> + throws PluginNotFoundException {
> logMINOR = Logger.shouldLog(Logger.MINOR, this);
> Class cls = null;
> for (int tries = 0; (tries <= 5) && (cls == null); tries++) {
> String filename = origFilename;
> + if (filename.endsWith("*")) {
> + filename =
> "*@http://downloads.freenetproject.org/alpha/plugins/"
> + +
> filename.substring(filename.lastIndexOf(".") + 1,
> +
> filename.length() - 1) + ".jar.url";
> + if (logMINOR)
> + Logger.minor(this, "Rewritten to " +
> filename);
> + }
> try {
> - if (filename.endsWith("*")) {
> - filename =
> "*@http://downloads.freenetproject.org/alpha/plugins/"
> - +
> filename.substring(filename.lastIndexOf(".") + 1,
> -
> filename.length() - 1) + ".jar.url";
> - // System.out.println(filename);
> - if (logMINOR)
> - Logger.minor(this, "Rewritten
> to " + filename);
> - }
> - if (filename.endsWith("#")) {
> - if (filename.indexOf('@') > -1) {
> - Logger
> - .error(this,
> -
> "We don't allow downloads from anywhere else but our server");
> - return null;
> - }
> - String pluginname =
> filename.substring(0,
> - filename.length() - 1);
> - filename = null;
> -
> - URL url;
> - InputStream is = null;
> -
> - try {
> - url = new URL(
> -
> "http://downloads.freenetproject.org/alpha/plugins/"
> -
> + pluginname + ".jar.url");
> - if (logMINOR)
> - Logger.minor(this,
> "Downloading " + url);
> - is = url.openStream();
> -
> - File pluginsDirectory = new
> File("plugins");
> - if (!pluginsDirectory.exists())
> {
> - Logger
> -
> .normal(this,
> -
> "The plugin directory hasn't been found, let's create it");
> - if
> (!pluginsDirectory.mkdir())
> - return null;
> - }
> -
> - File finalFile = new
> File("plugins/" + pluginname
> - + ".jar");
> - if (!FileUtil.writeTo(is,
> finalFile)) {
> - Logger.error(this,
> - "Failed
> to rename the temporary file into "
> -
> + finalFile);
> - throw new
> PluginNotFoundException(
> - "Cannot
> write plugin to "
> -
> + finalFile
> -
> + " from "
> -
> + url
> -
> + " - check for permissions problem and disk full!");
> - }
> -
> - filename = "*@file://"
> - +
> FileUtil.getCanonicalFile(finalFile);
> - if (logMINOR)
> - Logger.minor(this,
> "Rewritten to " + filename);
> -
> - } catch (MalformedURLException mue) {
> - Logger.error(this,
> -
> "MalformedURLException has occured : " + mue,
> - mue);
> - return null;
> - } catch (FileNotFoundException e) {
> - Logger.error(this,
> -
> "FileNotFoundException has occured : " + e, e);
> - return null;
> - } catch (IOException ioe) {
> - System.out.println("Caught :" +
> ioe.getMessage());
> - ioe.printStackTrace();
> - return null;
> - } finally {
> - try {
> - if (is != null)
> - is.close();
> - } catch (IOException ioe) {
> - }
> - }
> - if (filename == null)
> - return null;
> - }
> -
> BufferedReader in = null;
> InputStream is = null;
> if ((filename.indexOf("@") >= 0)) {
> @@ -411,7 +332,7 @@
> String[] parts =
> filename.split("@");
> if (parts.length != 2) {
> throw new
> PluginNotFoundException(
> - "Could
> not split at \"@\".");
> + "Could not split at
> \"@\".");
> }
> realClass = parts[0];
> realURL = parts[1];
> @@ -431,8 +352,8 @@
> if (realURL ==
> null)
> throw
> new PluginNotFoundException(
>
> "Initialization error: "
> -
> + url
> -
> + " isn't a plugin loading url!");
> +
> + url
> +
> + " isn't a plugin loading url!");
> realURL =
> realURL.trim();
> if (logMINOR)
>
> Logger.minor(this, "Loaded new URL: "
> @@ -458,7 +379,7 @@
>
> URL url = new
> URL("jar:" + realURL + "!/");
> JarURLConnection
> jarConnection = (JarURLConnection) url
> -
> .openConnection();
> + .openConnection();
> // Java seems to cache
> even file: urls...
>
> jarConnection.setUseCaches(false);
> JarFile jf =
> jarConnection.getJarFile();
> @@ -487,8 +408,8 @@
> if
> (logMINOR)
>
> Logger.minor(this,
>
> "Found plugin main class "
> -
> + realClass
> -
> + " from manifest");
> +
> + realClass
> +
> + " from manifest");
> }
> }
> //
> System.err.println("Real classname: " +
> @@ -517,7 +438,6 @@
>
> if (cls == null)
> throw new
> PluginNotFoundException("Unknown error");
> -
> } catch (Exception e) {
> Logger.normal(this, "Failed to load plugin " +
> filename + " : "
> + e, e);
> @@ -548,7 +468,7 @@
>
> return (FredPlugin) o;
> }
> -
> +
> Ticker getTicker() {
> return node.getTicker();
> }
>
> _______________________________________________
> cvs mailing list
> cvs at freenetproject.org
> http://emu.freenetproject.org/cgi-bin/mailman/listinfo/cvs
>
>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 189 bytes
Desc: not available
URL:
<https://emu.freenetproject.org/pipermail/devl/attachments/20070914/9af0b5bd/attachment.pgp>