提交 e551409a 编写于 作者: K kohsuke

defined a scheme to put image/script/stylesheet files side-by-side with view scripts.


git-svn-id: https://hudson.dev.java.net/svn/hudson/trunk/hudson/main@6410 71c3de6d-444a-0410-be80-ed276b4c234a
上级 3a3dfc82
......@@ -673,6 +673,22 @@ public class Functions {
return Hudson.RESOURCE_PATH;
}
public static String getViewResource(Object it, String path) {
Class clazz = it.getClass();
if(it instanceof Class)
clazz = (Class)it;
if(it instanceof Descriptor)
clazz = ((Descriptor)it).clazz;
StringBuilder buf = new StringBuilder();
buf.append(Hudson.VIEW_RESOURCE_PATH).append('/');
buf.append(clazz.getName().replace('.','/').replace('$','/'));
buf.append('/').append(path);
return buf.toString();
}
/**
* Can be used to check a checkbox by default.
* Used from views like {@code h.defaultToTrue(scm.useUpdate)}.
......
......@@ -157,12 +157,15 @@ public class WebAppMain implements ServletContextListener {
if(ver==null) ver="?";
Hudson.VERSION = ver;
context.setAttribute("version",ver);
String verHash = Util.getDigestOf(ver).substring(0, 8);
if(ver.equals("?"))
Hudson.RESOURCE_PATH = "";
else
Hudson.RESOURCE_PATH = "/static/"+Util.getDigestOf(ver).substring(0,8);
}
Hudson.RESOURCE_PATH = "/static/"+verHash;
Hudson.VIEW_RESOURCE_PATH = "/resources/"+ verHash;
}
/**
* Installs log handler to monitor all Hudson logs.
......
......@@ -66,6 +66,7 @@ import org.acegisecurity.ui.AbstractProcessingFilter;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.kohsuke.stapler.MetaClass;
import org.kohsuke.stapler.QueryParameter;
import org.kohsuke.stapler.Stapler;
import org.kohsuke.stapler.StaplerProxy;
......@@ -85,9 +86,9 @@ import java.io.FileFilter;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.net.URL;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.Arrays;
......@@ -1973,16 +1974,21 @@ public final class Hudson extends View implements ItemGroup<TopLevelItem>, Node,
* strategy here, though the current implementation is based on
* file extensions.
*/
public void doResources(StaplerRequest req, StaplerResponse rsp) throws IOException {
public void doResources(StaplerRequest req, StaplerResponse rsp) throws IOException, ServletException {
String path = req.getRestOfPath();
// cut off the "..." portion of /resources/.../path/to/file
// as this is only used to make path unique (which in turn
// allows us to set a long expiration date
path = path.substring(1);
path = path.substring(path.indexOf('/')+1);
int idx = path.lastIndexOf('.');
String extension = path.substring(idx+1);
if(ALLOWED_RESOURCE_EXTENSIONS.contains(extension)) {
InputStream in = pluginManager.uberClassLoader.getResourceAsStream(path);
if(in!=null) {
rsp.setContentType(servletContext.getMimeType("foo."+extension));
Util.copyStream(in,rsp.getOutputStream());
in.close();
URL url = pluginManager.uberClassLoader.getResource(path);
if(url!=null) {
long expires = MetaClass.NO_CACHE ? 0 : 365L * 24 * 60 * 60 * 1000; /*1 year*/
rsp.serveFile(req,url,expires);
return;
}
}
......@@ -1994,7 +2000,7 @@ public final class Hudson extends View implements ItemGroup<TopLevelItem>, Node,
* This set is mutable to allow plugins to add additional extensions.
*/
public static final Set<String> ALLOWED_RESOURCE_EXTENSIONS = new HashSet<String>(Arrays.asList(
"js|css|jpeg|jpg|png|gif|html|htm".split("|")
"js|css|jpeg|jpg|png|gif|html|htm".split("\\|")
));
......@@ -2173,6 +2179,13 @@ public final class Hudson extends View implements ItemGroup<TopLevelItem>, Node,
*/
public static String RESOURCE_PATH;
/**
* Prefix to resources alongside view scripts.
* Strings like "/resources/VERSION", which avoids Hudson to pick up
* stale cache when the user upgrades to a different version.
*/
public static String VIEW_RESOURCE_PATH;
public static boolean parallelLoad = Boolean.getBoolean(Hudson.class.getName()+".parallelLoad");
/**
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册