[freenet-dev] [freenet-cvs] r15135 - in trunk/freenet/src/freenet: clients/http pluginmanager
Matthew Toseland
toad at amphibian.dyndns.org
Fri Sep 14 13:58:26 UTC 2007
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 : http://emu.freenetproject.org/pipermail/devl/attachments/20070914/9af0b5bd/attachment.pgp
More information about the Devl
mailing list