diff --git a/core/src/main/java/hudson/PluginManager.java b/core/src/main/java/hudson/PluginManager.java index b07123e55e53601878fbb8e65d9e17175558d93f..3a05b02d48ad23aa441a1fb34fbfb2a138f98501 100644 --- a/core/src/main/java/hudson/PluginManager.java +++ b/core/src/main/java/hudson/PluginManager.java @@ -1,8 +1,6 @@ package hudson; -import hudson.model.Hudson; -import hudson.model.UpdateCenter; -import hudson.model.AbstractModelObject; +import hudson.model.*; import hudson.util.Service; import java.util.Enumeration; @@ -22,6 +20,9 @@ import java.util.logging.Level; import java.util.logging.Logger; import org.apache.commons.logging.LogFactory; +import org.apache.commons.fileupload.servlet.ServletFileUpload; +import org.apache.commons.fileupload.disk.DiskFileItemFactory; +import org.apache.commons.fileupload.FileItem; import org.kohsuke.stapler.StaplerRequest; import org.kohsuke.stapler.StaplerResponse; import org.kohsuke.stapler.QueryParameter; @@ -60,6 +61,13 @@ public final class PluginManager extends AbstractModelObject { // and load plugin-contributed classes. public final ClassLoader uberClassLoader = new UberClassLoader(); + /** + * Once plugin is uploaded, this flag becomes true. + * This is used to report a message that Hudson needs to be restarted + * for new plugins to take effect. + */ + public transient volatile boolean pluginUploaded =false; + public PluginManager(ServletContext context) { this.context = context; rootDir = new File(Hudson.getInstance().getRootDir(),"plugins"); @@ -100,6 +108,13 @@ public final class PluginManager extends AbstractModelObject { } } + /** + * Retrurns true if any new plugin was added, which means a restart is required for the change to take effect. + */ + public boolean isPluginUploaded() { + return pluginUploaded; + } + public List getPlugins() { return plugins; } @@ -184,6 +199,35 @@ public final class PluginManager extends AbstractModelObject { else System.setProperty(key,value); } + /** + * Uploads a plugin. + */ + public void doUploadPlugin( StaplerRequest req, StaplerResponse rsp ) throws IOException, ServletException { + try { + Hudson.getInstance().checkPermission(Hudson.ADMINISTER); + + ServletFileUpload upload = new ServletFileUpload(new DiskFileItemFactory()); + + // Parse the request + FileItem fileItem = (FileItem) upload.parseRequest(req).get(0); + String fileName = Util.getFileName(fileItem.getName()); + if(!fileName.endsWith(".hpi")) { + sendError(hudson.model.Messages.Hudson_NotAPlugin(fileName),req,rsp); + return; + } + fileItem.write(new File(rootDir, fileName)); + fileItem.delete(); + + pluginUploaded=true; + + rsp.sendRedirect2("."); + } catch (IOException e) { + throw e; + } catch (Exception e) {// grrr. fileItem.write throws this + throw new ServletException(e); + } + } + private final class UberClassLoader extends ClassLoader { public UberClassLoader() { super(PluginManager.class.getClassLoader()); diff --git a/core/src/main/java/hudson/model/Hudson.java b/core/src/main/java/hudson/model/Hudson.java index 6e1756fdcb0139f390efdab23d415b329cb6ba2c..95b815ad6cadc7b1a77273fdc71625cc3fb0d3fa 100644 --- a/core/src/main/java/hudson/model/Hudson.java +++ b/core/src/main/java/hudson/model/Hudson.java @@ -272,13 +272,6 @@ public final class Hudson extends View implements ItemGroup, Node, */ private int slaveAgentPort =0; - /** - * Once plugin is uploaded, this flag becomes true. - * This is used to report a message that Hudson needs to be restarted - * for new plugins to take effect. - */ - private transient boolean pluginUploaded =false; - /** * All labels known to Hudson. This allows us to reuse the same label instances * as much as possible, even though that's not a strict requirement. @@ -1899,39 +1892,6 @@ public final class Hudson extends View implements ItemGroup, Node, }.start(); } - public boolean isPluginUploaded() { - return pluginUploaded; - } - - /** - * Uploads a plugin. - */ - public void doUploadPlugin( StaplerRequest req, StaplerResponse rsp ) throws IOException, ServletException { - try { - checkPermission(ADMINISTER); - - ServletFileUpload upload = new ServletFileUpload(new DiskFileItemFactory()); - - // Parse the request - FileItem fileItem = (FileItem) upload.parseRequest(req).get(0); - String fileName = Util.getFileName(fileItem.getName()); - if(!fileName.endsWith(".hpi")) { - sendError(Messages.Hudson_NotAPlugin(fileName),req,rsp); - return; - } - fileItem.write(new File(getPluginManager().rootDir, fileName)); - fileItem.delete(); - - pluginUploaded=true; - - rsp.sendRedirect2("managePlugins"); - } catch (IOException e) { - throw e; - } catch (Exception e) {// grrr. fileItem.write throws this - throw new ServletException(e); - } - } - /** * Do a finger-print check. */ diff --git a/core/src/main/java/hudson/model/UpdateCenter.java b/core/src/main/java/hudson/model/UpdateCenter.java index a26fad32ee9c43249a8feec1838665f3829962d2..3e5a27d5ba29fb4271c181aafa7d783a71e9909b 100644 --- a/core/src/main/java/hudson/model/UpdateCenter.java +++ b/core/src/main/java/hudson/model/UpdateCenter.java @@ -405,7 +405,8 @@ public class UpdateCenter implements ModelObject { byte[] buf = new byte[8192]; int len; - File baseDir = Hudson.getInstance().getPluginManager().rootDir; + PluginManager pm = Hudson.getInstance().getPluginManager(); + File baseDir = pm.rootDir; File target = new File(baseDir, plugin.name + ".tmp"); OutputStream out = new FileOutputStream(target); @@ -425,6 +426,7 @@ public class UpdateCenter implements ModelObject { } LOGGER.info("Installation successful: "+plugin.name); + pm.pluginUploaded = true; status = new Success(); } catch (IOException e) { LOGGER.log(Level.SEVERE, "Failed to install "+plugin.name,e); diff --git a/core/src/main/resources/hudson/PluginManager/installed.jelly b/core/src/main/resources/hudson/PluginManager/installed.jelly index a1d878cc4d71a995c3b12ebabb4d44f2a626e0c5..58b3bead90d43cb5e2f98f5090781480648c083f 100644 --- a/core/src/main/resources/hudson/PluginManager/installed.jelly +++ b/core/src/main/resources/hudson/PluginManager/installed.jelly @@ -57,7 +57,7 @@ - +
${%New plugins will take effect once you restart Hudson} diff --git a/core/src/main/resources/hudson/model/Hudson/managePlugins.jelly b/core/src/main/resources/hudson/model/Hudson/managePlugins.jelly index 15bd577ef6d19b01fd1d8e1aef5273d07166d3ba..b541d8c5ef804ba686b2614f60246238fe84bcd1 100644 --- a/core/src/main/resources/hudson/model/Hudson/managePlugins.jelly +++ b/core/src/main/resources/hudson/model/Hudson/managePlugins.jelly @@ -10,7 +10,7 @@

${%Installed Plugins}

- +
${%New plugins will take effect once you restart Hudson}