mirror of
https://github.com/jenkinsci/jenkins.git
synced 2026-11-04 15:45:52 +00:00
https://www.dev.java.net/svn/hudson/branches/tool-autoinstallation ........ r17324 | jglick | 2009-04-20 18:24:32 -0700 (Mon, 20 Apr 2009) | 2 lines Defensive cloning and Javadoc corrections. (Though it seems no one is using the default impls of these methods yet anyway.) ........ r17325 | jglick | 2009-04-20 18:29:06 -0700 (Mon, 20 Apr 2009) | 1 line Deprecation of delegate method is intentional. ........ r17428 | jglick | 2009-04-23 08:07:14 -0700 (Thu, 23 Apr 2009) | 1 line Noting ToolLocationTranslator more prominently. ........ r17430 | jglick | 2009-04-23 09:16:40 -0700 (Thu, 23 Apr 2009) | 1 line Unused imports. ........ r17473 | jglick | 2009-04-23 19:21:11 -0700 (Thu, 23 Apr 2009) | 1 line Allow Plugin.configure to see the StaplerRequest, needed for some kinds of calls. ........ r17474 | jglick | 2009-04-23 19:25:54 -0700 (Thu, 23 Apr 2009) | 3 lines Initial sketch of plugin to manage tool installations across slaves. (Should really be under ../plugins/ but that was not branched, so putting here for the moment.) ........ r17475 | jglick | 2009-04-23 20:29:36 -0700 (Thu, 23 Apr 2009) | 1 line Typo in Javadoc. ........ r17481 | jglick | 2009-04-23 22:46:26 -0700 (Thu, 23 Apr 2009) | 1 line Unzip of an unbuffered stream is painfully slow. ........ r17482 | jglick | 2009-04-23 22:48:01 -0700 (Thu, 23 Apr 2009) | 1 line ZIP-based tool installer now functional. ........ r17555 | jglick | 2009-04-27 17:50:38 -0700 (Mon, 27 Apr 2009) | 1 line Build against newest trunk. ........ r17556 | jglick | 2009-04-27 18:38:28 -0700 (Mon, 27 Apr 2009) | 1 line Adding help. ........ r17557 | jglick | 2009-04-27 18:57:46 -0700 (Mon, 27 Apr 2009) | 1 line Moving toolName & label config GUI into generic files. ........ r17558 | jglick | 2009-04-27 19:37:30 -0700 (Mon, 27 Apr 2009) | 1 line Typo. ........ r17559 | jglick | 2009-04-27 20:07:47 -0700 (Mon, 27 Apr 2009) | 1 line Second tool installer type based on a freeform command. ........ r17560 | jglick | 2009-04-27 20:24:36 -0700 (Mon, 27 Apr 2009) | 1 line installIfNecessaryFrom will now just return false in case the target dir exists but the URL cannot be opened. ........ r17561 | jglick | 2009-04-27 20:25:22 -0700 (Mon, 27 Apr 2009) | 2 lines chmod only if something was actually installed. Use a+x, not o+x. ........ r17562 | jglick | 2009-04-27 20:26:46 -0700 (Mon, 27 Apr 2009) | 1 line Comment only. ........ r17563 | jglick | 2009-04-27 20:41:12 -0700 (Mon, 27 Apr 2009) | 1 line I18N. ........ r17571 | jglick | 2009-04-28 08:15:31 -0700 (Tue, 28 Apr 2009) | 2 lines Wiki link. ........ r17593 | jglick | 2009-04-28 15:38:33 -0700 (Tue, 28 Apr 2009) | 1 line Turn off echo mode, it's just noise. ........ r17594 | jglick | 2009-04-28 15:39:29 -0700 (Tue, 28 Apr 2009) | 2 lines Synchronizing access to installers for a given node/tool combo. Sending log messages to Hudson log in real time. ........ r17595 | jglick | 2009-04-28 15:46:29 -0700 (Tue, 28 Apr 2009) | 1 line Copyrights. ........ r17619 | jglick | 2009-04-29 06:25:23 -0700 (Wed, 29 Apr 2009) | 1 line Improved Javadoc. ........ r17620 | jglick | 2009-04-29 06:51:11 -0700 (Wed, 29 Apr 2009) | 1 line Demonstraing how to use DLJ to mechanically install official JDK releases on supported operating systems. ........ r17637 | kohsuke | 2009-04-30 16:15:24 -0700 (Thu, 30 Apr 2009) | 1 line fixed what appears to be a C&P mistake ........ r17638 | kohsuke | 2009-04-30 16:16:21 -0700 (Thu, 30 Apr 2009) | 1 line show YUI logger if YUI debugging mode is set. ........ r17639 | kohsuke | 2009-04-30 16:52:28 -0700 (Thu, 30 Apr 2009) | 7 lines Fixed a UI script problem when <hetero-list> nests inside <repeatable>. The cause of the problem was that the behavior for inner <hetero-list> kicks in first, altering HTML (by removing "prototypes"), before behavior for outer <repetable> kicks in and removes the master copy from DOM tree. So <repeatable> ends up computing a master copy after some elements are removed, and hence when we try to reinsert them later by clicking "Add", it'll get incorrect copy, and re-execution of the <hetero-list> behavior bombs out. I fixed this by skipping those HTML-altering behaviors if they show up in the part of DOM tree that's supposed to be snapshotted and removed. ........ r17640 | kohsuke | 2009-04-30 16:57:58 -0700 (Thu, 30 Apr 2009) | 7 lines Added ToolProperty to ToolInstallation (which acts like NodeProperty to Node --- basically decorates the base object with additional properties.) The original motivation is to implement ToolInstaller this way, if Jesse is OK. But decorating tools seem to have some other interesting use, such as a plugin for configuring $M2_HOME/conf/settings.xml, or a plugin to insert unlimited cryptography extension to JDK, or a plugin to add a few more jars into $ANT_HOME/lib. For this to work, ToolInstallations that want properties needs to be modified to use a new constructor. For a starter, I modified the JDK class to do this. I also took the opportunity to modernize JDK/config.jelly. ........ r17641 | kohsuke | 2009-04-30 17:02:04 -0700 (Thu, 30 Apr 2009) | 1 line this appears to be a left-over from early days when we didn't have a means to do form validation ........ r17642 | kohsuke | 2009-04-30 17:02:35 -0700 (Thu, 30 Apr 2009) | 1 line we don't need no.such.JDK but we need name. rebranching ........ r17643 | kohsuke | 2009-04-30 17:03:22 -0700 (Thu, 30 Apr 2009) | 1 line rebranched from Hudson's configure.properties ........ r17644 | kohsuke | 2009-04-30 17:05:31 -0700 (Thu, 30 Apr 2009) | 1 line removed unnecessary translations ........ r17656 | kohsuke | 2009-05-01 11:27:36 -0700 (Fri, 01 May 2009) | 1 line Less hack for improved type safety. Asking people to write more code is not necessarily bad as long as what they need to do is obvious to them. ........ r17657 | kohsuke | 2009-05-01 12:07:20 -0700 (Fri, 01 May 2009) | 5 lines The toolautoinst part of the change that corresponds to rev.17640. ToolInstallers are now hooked under ToolInstallation through InstallSourceProperty as a ToolProperty. This allows the relevant UIs to be shown in one place. Still pending Jesse's feedback. Making it a single commit to simplify a revert if necessary ........ r17663 | kohsuke | 2009-05-01 13:23:51 -0700 (Fri, 01 May 2009) | 1 line doc improvement ........ r17664 | kohsuke | 2009-05-01 13:24:10 -0700 (Fri, 01 May 2009) | 1 line needs this to allow Stapler to databind hetero-list automatically ........ r17665 | jglick | 2009-05-01 13:31:27 -0700 (Fri, 01 May 2009) | 1 line Warnings. ........ r17667 | kohsuke | 2009-05-01 14:20:53 -0700 (Fri, 01 May 2009) | 1 line added a method to do chmod ........ r17668 | kohsuke | 2009-05-01 14:30:35 -0700 (Fri, 01 May 2009) | 1 line prefer JDK6 version to avoid unnecessary JNA loading ........ r17669 | kohsuke | 2009-05-01 14:33:09 -0700 (Fri, 01 May 2009) | 1 line no, I must have confused this. ........ r17670 | kohsuke | 2009-05-01 15:57:11 -0700 (Fri, 01 May 2009) | 2 lines - Automated JDK installer and its test. - Minor update to the signature of ToolInstaller for supplying the expected default location. ........ r17730 | kohsuke | 2009-05-04 11:27:34 -0700 (Mon, 04 May 2009) | 1 line avoid NPE as reported in HUDSON-3608 ........ r17753 | jglick | 2009-05-04 19:34:08 -0700 (Mon, 04 May 2009) | 2 lines Moved toolautoinst functionality into core. ........ r17755 | jglick | 2009-05-04 20:28:34 -0700 (Mon, 04 May 2009) | 8 lines Added TaskListener parameter and IOException and InterruptedException to several methods: Run.getEnvironment NodeSpecific.forNode ToolLocationTranslator.getToolHome ToolLocationNodeProperty.getToolHome ToolInstallation.translateFor ProcessCache.Factory.getMavenInstallation ProcessCache.Factory.getJava ........ r17756 | jglick | 2009-05-04 20:36:56 -0700 (Mon, 04 May 2009) | 1 line expectedLocation was never strictly necessary, and will soon no longer be used even by JDKInstaller. ........ r17757 | jglick | 2009-05-04 20:40:41 -0700 (Mon, 04 May 2009) | 1 line Not sure yet what @since should be. ........ r17758 | jglick | 2009-05-04 20:41:51 -0700 (Mon, 04 May 2009) | 1 line getDefaultInstallers method added. Not yet in use. ........ r17763 | kohsuke | 2009-05-05 10:50:36 -0700 (Tue, 05 May 2009) | 1 line deprecated redundant getJavaHome method ........ r17764 | kohsuke | 2009-05-05 12:10:45 -0700 (Tue, 05 May 2009) | 1 line added general-purpose property defaulting mechanism, and added default tool installer for JDK ........ r17765 | jglick | 2009-05-05 12:35:56 -0700 (Tue, 05 May 2009) | 1 line capitalize("") -> "" ........ r17766 | jglick | 2009-05-05 12:49:52 -0700 (Tue, 05 May 2009) | 1 line Missing @since. ........ r17767 | jglick | 2009-05-05 13:01:41 -0700 (Tue, 05 May 2009) | 1 line Unchecked warning. ........ r17768 | jglick | 2009-05-05 13:19:49 -0700 (Tue, 05 May 2009) | 2 lines Two unsuccessful attempts at form validation. ........ r17770 | jglick | 2009-05-05 13:48:37 -0700 (Tue, 05 May 2009) | 1 line Better class names. ........ r17771 | kohsuke | 2009-05-05 14:12:21 -0700 (Tue, 05 May 2009) | 5 lines brought the form validation check back. The trick is to use the 'value' parameter. In the end we'd expect this check to go away anyway, as we change input field to drop-down list, but in the mean time, this is why it didn't work. Maybe we probably need more static code checkers? Like FindBugs rules? ........ r17901 | kohsuke | 2009-05-09 19:15:40 -0700 (Sat, 09 May 2009) | 1 line having two toolHome is odd. ........ r17906 | kohsuke | 2009-05-10 11:09:13 -0700 (Sun, 10 May 2009) | 1 line adding the generalization of UpdateCenter, but for compatibility reasons, we are leaving UpdateCenter as-is. ........ r17911 | kohsuke | 2009-05-10 17:02:53 -0700 (Sun, 10 May 2009) | 1 line integrated json-lib with a bit of bug fix ........ r17912 | kohsuke | 2009-05-10 17:13:05 -0700 (Sun, 10 May 2009) | 1 line JDK list is now fetched from hudson.dev.java.net ........ r17958 | kohsuke | 2009-05-11 13:44:25 -0700 (Mon, 11 May 2009) | 48 lines Handle AbortException better to avoid error like this: [INFO] ------------------------------------------------------------------------ [ERROR] BUILD ERROR [INFO] ------------------------------------------------------------------------ [INFO] Failed to delete directory: C:\files\hudson\workspace\hudson\hudson\main\remoting\target. Reason: Unable to delete file C:\files\hudson\workspace\hudson\hudson\main\remoting\target\remoting-1.304-SNAPSHOT.jar [INFO] ------------------------------------------------------------------------ [INFO] For more information, run Maven with the -e switch [INFO] ------------------------------------------------------------------------ [INFO] Total time: 31 seconds [INFO] Finished at: Sun May 10 18:15:33 PDT 2009 [INFO] Final Memory: 25M/48M [INFO] ------------------------------------------------------------------------ Recording fingerprints Archiving artifacts Recording test results ERROR: Failed to archive JUnit reports hudson.util.IOException2: remote file operation failed at hudson.FilePath.act(FilePath.java:596) at hudson.tasks.junit.JUnitResultArchiver.perform(JUnitResultArchiver.java:82) at hudson.model.AbstractBuild$AbstractRunner.performAllBuildStep(AbstractBuild.java:372) at hudson.model.AbstractBuild$AbstractRunner.performAllBuildStep(AbstractBuild.java:360) at hudson.model.Build$RunnerImpl.post2(Build.java:183) at hudson.model.AbstractBuild$AbstractRunner.post(AbstractBuild.java:345) at hudson.model.Run.run(Run.java:943) at hudson.model.Build.run(Build.java:112) at hudson.model.ResourceController.execute(ResourceController.java:93) at hudson.model.Executor.run(Executor.java:119) Caused by: hudson.AbortException: Test reports were found but none of them are new. Did tests run? For example, \files\hudson\workspace\hudson\hudson\main\core\target\surefire-reports\TEST-hudson.BulkChangeTest.xml is 2 days 23 hr old at hudson.tasks.junit.TestResult.parse(TestResult.java:134) at hudson.tasks.junit.TestResult.<init>(TestResult.java:95) at hudson.tasks.junit.JUnitResultArchiver$1.invoke(JUnitResultArchiver.java:95) at hudson.tasks.junit.JUnitResultArchiver$1.invoke(JUnitResultArchiver.java:82) at hudson.FilePath$FileCallableWrapper.call(FilePath.java:1583) at hudson.remoting.UserRequest.perform(UserRequest.java:92) at hudson.remoting.UserRequest.perform(UserRequest.java:46) at hudson.remoting.Request$2.run(Request.java:236) at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:441) at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303) at java.util.concurrent.FutureTask.run(FutureTask.java:138) at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) at java.lang.Thread.run(Thread.java:619) ........ r17961 | kohsuke | 2009-05-11 15:16:39 -0700 (Mon, 11 May 2009) | 1 line adding Windows JDK silent installation ........ r17962 | kohsuke | 2009-05-11 16:08:13 -0700 (Mon, 11 May 2009) | 1 line Fixing JDK offline installatino for Windows ........ r17970 | kohsuke | 2009-05-11 19:37:59 -0700 (Mon, 11 May 2009) | 1 line Fixing a problem that prevents the usage of this tag in <repeatable> block, which reinserts the same fragment over and over. So statically assigning IDs won't work ........ r17971 | kohsuke | 2009-05-11 22:17:09 -0700 (Mon, 11 May 2009) | 1 line continuing to remove static ID generation, which breaks the tag when used inside <repetable> tag. ........ r17972 | kohsuke | 2009-05-11 22:19:11 -0700 (Mon, 11 May 2009) | 1 line I don't know when this started, but even in the hudson-dev:run mode, the versionis no longer '?', so we need a different way to force reload ........ r17973 | kohsuke | 2009-05-11 22:26:34 -0700 (Mon, 11 May 2009) | 1 line adjusted the text a bit since multiple "add" and "delete"s were rather confusing ........ r17974 | kohsuke | 2009-05-11 22:31:58 -0700 (Mon, 11 May 2009) | 1 line added help screen ........ r17975 | kohsuke | 2009-05-11 22:41:39 -0700 (Mon, 11 May 2009) | 1 line form validation now works against the checkbox, too ........ r17976 | kohsuke | 2009-05-11 22:43:00 -0700 (Mon, 11 May 2009) | 1 line with auto installation, we expect users to specify a directory that doesn't exist yet, so don't report it as an error ........ r17977 | kohsuke | 2009-05-11 22:43:24 -0700 (Mon, 11 May 2009) | 1 line improving the text ........ git-svn-id: https://hudson.dev.java.net/svn/hudson/trunk/hudson/main@17985 71c3de6d-444a-0410-be80-ed276b4c234a
254 lines
8.6 KiB
Java
254 lines
8.6 KiB
Java
/*
|
|
* The MIT License
|
|
*
|
|
* Copyright (c) 2004-2009, Sun Microsystems, Inc., Kohsuke Kawaguchi
|
|
*
|
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
* of this software and associated documentation files (the "Software"), to deal
|
|
* in the Software without restriction, including without limitation the rights
|
|
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
* copies of the Software, and to permit persons to whom the Software is
|
|
* furnished to do so, subject to the following conditions:
|
|
*
|
|
* The above copyright notice and this permission notice shall be included in
|
|
* all copies or substantial portions of the Software.
|
|
*
|
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
* THE SOFTWARE.
|
|
*/
|
|
package hudson;
|
|
|
|
import hudson.model.Hudson;
|
|
import hudson.model.Descriptor;
|
|
import hudson.model.Saveable;
|
|
import hudson.model.listeners.ItemListener;
|
|
import hudson.model.Descriptor.FormException;
|
|
import org.kohsuke.stapler.StaplerRequest;
|
|
import org.kohsuke.stapler.StaplerResponse;
|
|
|
|
import javax.servlet.ServletContext;
|
|
import javax.servlet.ServletException;
|
|
import javax.servlet.http.HttpServletResponse;
|
|
import java.io.IOException;
|
|
import java.io.File;
|
|
import java.net.URL;
|
|
|
|
import net.sf.json.JSONObject;
|
|
import com.thoughtworks.xstream.XStream;
|
|
|
|
/**
|
|
* Base class of Hudson plugin.
|
|
*
|
|
* <p>
|
|
* A plugin needs to derive from this class.
|
|
*
|
|
* <p>
|
|
* One instance of a plugin is created by Hudson, and used as the entry point
|
|
* to plugin functionality.
|
|
*
|
|
* <p>
|
|
* A plugin is bound to URL space of Hudson as <tt>${rootURL}/plugin/foo/</tt>,
|
|
* where "foo" is taken from your plugin name "foo.hpi". All your web resources
|
|
* in src/main/webapp are visible from this URL, and you can also define Jelly
|
|
* views against your Plugin class, and those are visible in this URL, too.
|
|
*
|
|
* <p>
|
|
* {@link Plugin} can have an optional <tt>config.jelly</tt> page. If present,
|
|
* it will become a part of the system configuration page (http://server/hudson/configure).
|
|
* This is convenient for exposing/maintaining configuration that doesn't
|
|
* fit any {@link Descriptor}s.
|
|
*
|
|
* <p>
|
|
* Up until Hudson 1.150 or something, subclasses of {@link Plugin} required
|
|
* <tt>@plugin</tt> javadoc annotation, but that is no longer a requirement.
|
|
*
|
|
* @author Kohsuke Kawaguchi
|
|
* @since 1.42
|
|
*/
|
|
public abstract class Plugin implements Saveable {
|
|
|
|
/**
|
|
* Set by the {@link PluginManager}.
|
|
* This points to the {@link PluginWrapper} that wraps
|
|
* this {@link Plugin} object.
|
|
*/
|
|
/*package*/ transient PluginWrapper wrapper;
|
|
|
|
/**
|
|
* Called when a plugin is loaded to make the {@link ServletContext} object available to a plugin.
|
|
* This object allows plugins to talk to the surrounding environment.
|
|
*
|
|
* <p>
|
|
* The default implementation is no-op.
|
|
*
|
|
* @param context
|
|
* Always non-null.
|
|
*
|
|
* @since 1.42
|
|
*/
|
|
public void setServletContext(ServletContext context) {
|
|
}
|
|
|
|
/**
|
|
* Called to allow plugins to initialize themselves.
|
|
*
|
|
* <p>
|
|
* This method is called after {@link #setServletContext(ServletContext)} is invoked.
|
|
* You can also use {@link Hudson#getInstance()} to access the singleton hudson instance,
|
|
* although the plugin start up happens relatively early in the initialization
|
|
* stage and not all the data are loaded in Hudson.
|
|
*
|
|
* <p>
|
|
* If a plugin wants to run an initialization step after all plugins and extension points
|
|
* are registered, a good place to do that is {@link #postInitialize()}.
|
|
* If a plugin wants to run an initialization step after all the jobs are loaded,
|
|
* {@link ItemListener#onLoaded()} is a good place.
|
|
*
|
|
* @throws Exception
|
|
* any exception thrown by the plugin during the initialization will disable plugin.
|
|
*
|
|
* @since 1.42
|
|
* @see ExtensionPoint
|
|
* @see #postInitialize()
|
|
*/
|
|
public void start() throws Exception {
|
|
}
|
|
|
|
/**
|
|
* Called after {@link #start()} is called for all the plugins.
|
|
*
|
|
* @throws Exception
|
|
* any exception thrown by the plugin during the initialization will disable plugin.
|
|
*/
|
|
public void postInitialize() throws Exception {}
|
|
|
|
/**
|
|
* Called to orderly shut down Hudson.
|
|
*
|
|
* <p>
|
|
* This is a good opportunity to clean up resources that plugin started.
|
|
* This method will not be invoked if the {@link #start()} failed abnormally.
|
|
*
|
|
* @throws Exception
|
|
* if any exception is thrown, it is simply recorded and shut-down of other
|
|
* plugins continue. This is primarily just a convenience feature, so that
|
|
* each plugin author doesn't have to worry about catching an exception and
|
|
* recording it.
|
|
*
|
|
* @since 1.42
|
|
*/
|
|
public void stop() throws Exception {
|
|
}
|
|
|
|
/**
|
|
* @since 1.233
|
|
* @deprecated override {@link #configure(StaplerRequest,JSONObject)} instead
|
|
*/
|
|
public void configure(JSONObject formData) throws IOException, ServletException, FormException {
|
|
}
|
|
|
|
/**
|
|
* Handles the submission for the system configuration.
|
|
*
|
|
* <p>
|
|
* If this class defines <tt>config.jelly</tt> view, be sure to
|
|
* override this method and persists the submitted values accordingly.
|
|
*
|
|
* <p>
|
|
* The following is a sample <tt>config.jelly</tt> that you can start yours with:
|
|
* <pre><xmp>
|
|
* <j:jelly xmlns:j="jelly:core" xmlns:st="jelly:stapler" xmlns:d="jelly:define" xmlns:l="/lib/layout" xmlns:t="/lib/hudson" xmlns:f="/lib/form">
|
|
* <f:section title="Locale">
|
|
* <f:entry title="${%Default Language}" help="/plugin/locale/help/default-language.html">
|
|
* <f:textbox name="systemLocale" value="${it.systemLocale}" />
|
|
* </f:entry>
|
|
* </f:section>
|
|
* </j:jelly>
|
|
* </xmp></pre>
|
|
*
|
|
* <p>
|
|
* This allows you to access data as {@code formData.getString("systemLocale")}
|
|
*
|
|
* <p>
|
|
* If you are using this method, you'll likely be interested in
|
|
* using {@link #save()} and {@link #load()}.
|
|
* @since XXX
|
|
*/
|
|
public void configure(StaplerRequest req, JSONObject formData) throws IOException, ServletException, FormException {
|
|
configure(formData);
|
|
}
|
|
|
|
/**
|
|
* This method serves static resources in the plugin under <tt>hudson/plugin/SHORTNAME</tt>.
|
|
*/
|
|
public void doDynamic(StaplerRequest req, StaplerResponse rsp) throws IOException, ServletException {
|
|
String path = req.getRestOfPath();
|
|
|
|
if(path.length()==0)
|
|
path = "/";
|
|
|
|
if(path.indexOf("..")!=-1 || path.length()<1) {
|
|
// don't serve anything other than files in the sub directory.
|
|
rsp.sendError(HttpServletResponse.SC_BAD_REQUEST);
|
|
return;
|
|
}
|
|
|
|
// use serveLocalizedFile to support automatic locale selection
|
|
rsp.serveLocalizedFile(req, new URL(wrapper.baseResourceURL,'.'+path));
|
|
}
|
|
|
|
//
|
|
// Convenience methods for those plugins that persist configuration
|
|
//
|
|
/**
|
|
* Loads serializable fields of this instance from the persisted storage.
|
|
*
|
|
* <p>
|
|
* If there was no previously persisted state, this method is no-op.
|
|
*
|
|
* @since 1.245
|
|
*/
|
|
protected void load() throws IOException {
|
|
XmlFile xml = getConfigXml();
|
|
if(xml.exists())
|
|
xml.unmarshal(this);
|
|
}
|
|
|
|
/**
|
|
* Saves serializable fields of this instance to the persisted storage.
|
|
*
|
|
* @since 1.245
|
|
*/
|
|
public void save() throws IOException {
|
|
if(BulkChange.contains(this)) return;
|
|
getConfigXml().write(this);
|
|
}
|
|
|
|
/**
|
|
* Controls the file where {@link #load()} and {@link #save()}
|
|
* persists data.
|
|
*
|
|
* This method can be also overriden if the plugin wants to
|
|
* use a custom {@link XStream} instance to persist data.
|
|
*
|
|
* @since 1.245
|
|
*/
|
|
protected XmlFile getConfigXml() {
|
|
return new XmlFile(Hudson.XSTREAM,
|
|
new File(Hudson.getInstance().getRootDir(),wrapper.getShortName()+".xml"));
|
|
}
|
|
|
|
/**
|
|
* Dummy instance of {@link Plugin} to be used when a plugin didn't
|
|
* supply one on its own.
|
|
*
|
|
* @since 1.288
|
|
*/
|
|
public static final Plugin NONE = new Plugin() {};
|
|
}
|