From f498682abb4719ac8f1d2d26b171e1d1a612ce3c Mon Sep 17 00:00:00 2001 From: kohsuke Date: Mon, 6 Apr 2009 21:49:16 +0000 Subject: [PATCH] $HUDSON_HOME/userContent/ is now exposed under http://server/hudson/userContent/. (report) git-svn-id: https://hudson.dev.java.net/svn/hudson/trunk/hudson/main@16878 71c3de6d-444a-0410-be80-ed276b4c234a --- .cvsignore | 3 +- .../hudson/model/DirectoryBrowserSupport.java | 40 +++++++++++++++++-- core/src/main/java/hudson/model/Hudson.java | 15 +++++++ core/src/main/java/hudson/model/Run.java | 5 +-- .../java/hudson/tasks/JavadocArchiver.java | 10 ++--- .../hudson/model/Messages.properties | 1 + .../maven/reporters/MavenSiteArchiver.java | 11 +++-- 7 files changed, 67 insertions(+), 18 deletions(-) diff --git a/.cvsignore b/.cvsignore index bf18d64869..2a6c0b532f 100644 --- a/.cvsignore +++ b/.cvsignore @@ -1,5 +1,6 @@ target +.hudson .svn +pom.iml pom.ipr -pom.iml pom.iws diff --git a/core/src/main/java/hudson/model/DirectoryBrowserSupport.java b/core/src/main/java/hudson/model/DirectoryBrowserSupport.java index cb2d955b04..cf5ee04a78 100644 --- a/core/src/main/java/hudson/model/DirectoryBrowserSupport.java +++ b/core/src/main/java/hudson/model/DirectoryBrowserSupport.java @@ -25,10 +25,12 @@ package hudson.model; import hudson.FilePath; import hudson.Util; +import hudson.util.IOException2; import hudson.FilePath.FileCallable; import hudson.remoting.VirtualChannel; import org.kohsuke.stapler.StaplerRequest; import org.kohsuke.stapler.StaplerResponse; +import org.kohsuke.stapler.HttpResponse; import org.apache.tools.ant.types.FileSet; import org.apache.tools.ant.DirectoryScanner; @@ -46,7 +48,6 @@ import java.util.Collections; import java.util.Comparator; import java.util.List; import java.util.StringTokenizer; -import java.util.regex.Pattern; import java.util.logging.Logger; import java.util.logging.Level; @@ -59,12 +60,16 @@ import java.util.logging.Level; * * @author Kohsuke Kawaguchi */ -public final class DirectoryBrowserSupport { +public final class DirectoryBrowserSupport implements HttpResponse { public final ModelObject owner; public final String title; + private final FilePath base; + private final String icon; + private final boolean serveDirIndex; + /** * @deprecated * Use {@link #DirectoryBrowserSupport(ModelObject, String)} @@ -73,15 +78,41 @@ public final class DirectoryBrowserSupport { this(owner,owner.getDisplayName()); } + /** + * @deprecated as of 1.297 + * Use {@link #DirectoryBrowserSupport(ModelObject, FilePath, String, String, boolean)} + */ + public DirectoryBrowserSupport(ModelObject owner, String title) { + this(owner,null,title,null,false); + } + /** * @param owner * The parent model object under which the directory browsing is added. + * @param base + * The root of the directory that's bound to URL. * @param title * Used in the HTML caption. + * @param icon + * The icon file name, like "folder.gif" + * @param serveDirIndex + * True to generate the directory index. + * False to serve "index.html" */ - public DirectoryBrowserSupport(ModelObject owner, String title) { + public DirectoryBrowserSupport(ModelObject owner, FilePath base, String title, String icon, boolean serveDirIndex) { this.owner = owner; + this.base = base; this.title = title; + this.icon = icon; + this.serveDirIndex = serveDirIndex; + } + + public void generateResponse(StaplerRequest req, StaplerResponse rsp, Object node) throws IOException, ServletException { + try { + serveFile(req,rsp,base,icon,serveDirIndex); + } catch (InterruptedException e) { + throw new IOException2("interrupted",e); + } } /** @@ -92,6 +123,9 @@ public final class DirectoryBrowserSupport { * @param serveDirIndex * True to generate the directory index. * False to serve "index.html" + * @deprecated as of 1.297 + * Instead of calling this method explicitly, just return the {@link DirectoryBrowserSupport} object + * from the {@code doXYZ} method and let Stapler generate a response for you. */ public final void serveFile(StaplerRequest req, StaplerResponse rsp, FilePath root, String icon, boolean serveDirIndex) throws IOException, ServletException, InterruptedException { // handle form submission diff --git a/core/src/main/java/hudson/model/Hudson.java b/core/src/main/java/hudson/model/Hudson.java index 8425681a82..14f1a59bdb 100644 --- a/core/src/main/java/hudson/model/Hudson.java +++ b/core/src/main/java/hudson/model/Hudson.java @@ -114,6 +114,8 @@ import static org.acegisecurity.ui.rememberme.TokenBasedRememberMeServices.ACEGI import org.apache.commons.logging.LogFactory; import org.apache.commons.jelly.Script; import org.apache.commons.jelly.JellyException; +import org.apache.commons.io.IOUtils; +import org.apache.commons.io.FileUtils; import org.kohsuke.stapler.MetaClass; import org.kohsuke.stapler.Stapler; import org.kohsuke.stapler.StaplerProxy; @@ -559,6 +561,12 @@ public final class Hudson extends Node implements ItemGroup, Stapl } } + File userContentDir = new File(getRootDir(), "userContent"); + if(!userContentDir.exists()) { + userContentDir.mkdirs(); + FileUtils.writeStringToFile(new File(userContentDir,"readme.txt"),Messages.Hudson_USER_CONTENT_README()); + } + Trigger.init(); // start running trigger } @@ -2576,6 +2584,13 @@ public final class Hudson extends Node implements ItemGroup, Stapl rsp.getWriter().println("GCed"); } + /** + * Binds /userContent/... to $HUDSON_HOME/userContent. + */ + public DirectoryBrowserSupport doUserContent() { + return new DirectoryBrowserSupport(this,getRootPath().child("userContent"),"User content","folder.gif",true); + } + /** * Perform a restart of Hudson, if we can. */ diff --git a/core/src/main/java/hudson/model/Run.java b/core/src/main/java/hudson/model/Run.java index 4a7d4eff47..14872e1a2c 100644 --- a/core/src/main/java/hudson/model/Run.java +++ b/core/src/main/java/hudson/model/Run.java @@ -1143,9 +1143,8 @@ public abstract class Run ,RunT extends Run