提交 f498682a 编写于 作者: K kohsuke

<tt>$HUDSON_HOME/userContent/</tt> is now exposed under...

    <tt>$HUDSON_HOME/userContent/</tt> is now exposed under <tt>http://server/hudson/userContent/</tt>.
    (<a href="http://www.nabble.com/Is-it-possible-to-add-a-custom-page-Hudson--td22794858.html">report</a>)


git-svn-id: https://hudson.dev.java.net/svn/hudson/trunk/hudson/main@16878 71c3de6d-444a-0410-be80-ed276b4c234a
上级 afddd51c
target
.hudson
.svn
pom.ipr
pom.iml
pom.ipr
pom.iws
......@@ -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
......
......@@ -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<TopLevelItem>, 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<TopLevelItem>, 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.
*/
......
......@@ -1143,9 +1143,8 @@ public abstract class Run <JobT extends Job<JobT,RunT>,RunT extends Run<JobT,Run
/**
* Serves the artifacts.
*/
public void doArtifact( StaplerRequest req, StaplerResponse rsp ) throws IOException, ServletException, InterruptedException {
new DirectoryBrowserSupport(this,project.getDisplayName()+' '+getDisplayName())
.serveFile(req, rsp, new FilePath(getArtifactsDir()), "package.gif", true);
public DirectoryBrowserSupport doArtifact() {
return new DirectoryBrowserSupport(this,new FilePath(getArtifactsDir()), project.getDisplayName()+' '+getDisplayName(), "package.gif", true);
}
/**
......
......@@ -31,8 +31,6 @@ import hudson.model.*;
import hudson.util.FormValidation;
import org.kohsuke.stapler.DataBoundConstructor;
import org.kohsuke.stapler.StaplerRequest;
import org.kohsuke.stapler.StaplerResponse;
import org.kohsuke.stapler.QueryParameter;
import org.kohsuke.stapler.AncestorInPath;
......@@ -137,9 +135,11 @@ public class JavadocArchiver extends Recorder {
return null;
}
public void doDynamic(StaplerRequest req, StaplerResponse rsp) throws IOException, ServletException, InterruptedException {
new DirectoryBrowserSupport(this, getTitle())
.serveFile(req, rsp, new FilePath(dir()), "help.gif", false);
/**
* Serves javadoc.
*/
public DirectoryBrowserSupport doDynamic() {
return new DirectoryBrowserSupport(this, new FilePath(dir()), getTitle(), "help.gif", false);
}
protected abstract String getTitle();
......
......@@ -81,6 +81,7 @@ Hudson.NotADirectory={0} is not a directory
Hudson.NotAPlugin={0} is not a Hudson plugin
Hudson.NotJDKDir={0} doesn''t look like a JDK directory
Hudson.Permissions.Title=Overall
Hudson.USER_CONTENT_README=Files in this directory will be served under your http://server/hudson/userContent/
Hudson.UnsafeChar=''{0}'' is an unsafe character
Hudson.ViewAlreadyExists=A view already exists with the name "{0}"
Hudson.ViewName=All
......
......@@ -40,10 +40,7 @@ import hudson.model.ProminentProjectAction;
import hudson.model.Result;
import org.apache.maven.project.MavenProject;
import org.codehaus.plexus.component.configurator.ComponentConfigurationException;
import org.kohsuke.stapler.StaplerRequest;
import org.kohsuke.stapler.StaplerResponse;
import javax.servlet.ServletException;
import java.io.File;
import java.io.IOException;
......@@ -122,9 +119,11 @@ public class MavenSiteArchiver extends MavenReporter {
return null;
}
public void doDynamic(StaplerRequest req, StaplerResponse rsp) throws IOException, ServletException, InterruptedException {
new DirectoryBrowserSupport(this,project.getDisplayName()+" site")
.serveFile(req, rsp, new FilePath(getSiteDir(project)), "help.gif", false);
/**
* Serves the site.
*/
public DirectoryBrowserSupport doDynamic() {
return new DirectoryBrowserSupport(this,new FilePath(getSiteDir(project)), project.getDisplayName()+" site", "help.gif", false);
}
}
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册