367680 jsp-file with load-on-startup not precompiled

This commit is contained in:
Jan Bartel 2014-05-06 21:20:41 +02:00
parent 7d662360f1
commit 7db7620c36
2 changed files with 98 additions and 12 deletions

View File

@ -846,7 +846,7 @@ public class ServletHandler extends ScopedHandler
{ {
try try
{ {
if (servlet.getClassName() == null && servlet.getForcedPath() != null) /* if (servlet.getClassName() == null && servlet.getForcedPath() != null)
{ {
ServletHolder forced_holder = _servletPathMap.match(servlet.getForcedPath()); ServletHolder forced_holder = _servletPathMap.match(servlet.getForcedPath());
if (forced_holder == null || forced_holder.getClassName() == null) if (forced_holder == null || forced_holder.getClassName() == null)
@ -854,8 +854,9 @@ public class ServletHandler extends ScopedHandler
mx.add(new IllegalStateException("No forced path servlet for " + servlet.getForcedPath())); mx.add(new IllegalStateException("No forced path servlet for " + servlet.getForcedPath()));
continue; continue;
} }
System.err.println("ServletHandler setting forced path classname to "+forced_holder.getClassName()+ " for "+servlet.getForcedPath());
servlet.setClassName(forced_holder.getClassName()); servlet.setClassName(forced_holder.getClassName());
} }*/
servlet.start(); servlet.start();
servlet.initialize(); servlet.initialize();

View File

@ -19,6 +19,7 @@
package org.eclipse.jetty.servlet; package org.eclipse.jetty.servlet;
import java.io.IOException; import java.io.IOException;
import java.lang.reflect.Method;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.Collection; import java.util.Collection;
@ -86,6 +87,8 @@ public class ServletHolder extends Holder<Servlet> implements UserIdentity.Scope
private transient long _unavailable; private transient long _unavailable;
private transient boolean _enabled = true; private transient boolean _enabled = true;
private transient UnavailableException _unavailableEx; private transient UnavailableException _unavailableEx;
public static final String JSP_GENERATED_PACKAGE_NAME = "org.eclipse.jetty.jspPackagePrefix";
public static final Map<String,String> NO_MAPPED_ROLES = Collections.emptyMap(); public static final Map<String,String> NO_MAPPED_ROLES = Collections.emptyMap();
/* ---------------------------------------------------------------- */ /* ---------------------------------------------------------------- */
@ -277,8 +280,6 @@ public class ServletHolder extends Holder<Servlet> implements UserIdentity.Scope
public void doStart() public void doStart()
throws Exception throws Exception
{ {
_unavailable=0; _unavailable=0;
if (!_enabled) if (!_enabled)
return; return;
@ -287,8 +288,8 @@ public class ServletHolder extends Holder<Servlet> implements UserIdentity.Scope
if (_forcedPath != null) if (_forcedPath != null)
{ {
// Look for a precompiled JSP Servlet // Look for a precompiled JSP Servlet
String precompiled="org.apache.jsp"+_forcedPath.replace('.','_').replace('/','.'); String precompiled=getClassNameForJsp(_forcedPath);
LOG.debug("Checking for precompiled servlet {} for jsp {}", precompiled, _forcedPath);
ServletHolder jsp=getServletHandler().getServlet(precompiled); ServletHolder jsp=getServletHandler().getServlet(precompiled);
if (jsp!=null) if (jsp!=null)
{ {
@ -297,13 +298,25 @@ public class ServletHolder extends Holder<Servlet> implements UserIdentity.Scope
setClassName(jsp.getClassName()); setClassName(jsp.getClassName());
} }
else else
{ {
// Look for normal JSP servlet if (getClassName() == null)
jsp=getServletHandler().getServlet("jsp");
if (jsp!=null)
{ {
LOG.debug("JSP file {} for {} mapped to Servlet {}",_forcedPath, getName(),jsp.getClassName()); // Look for normal JSP servlet
setClassName(jsp.getClassName()); jsp=getServletHandler().getServlet("jsp");
if (jsp!=null)
{
LOG.debug("JSP file {} for {} mapped to Servlet {}",_forcedPath, getName(),jsp.getClassName());
setClassName(jsp.getClassName());
//copy jsp init params that don't exist for this servlet
for (Map.Entry<String, String> entry:jsp.getInitParameters().entrySet())
{
if (!_initParams.containsKey(entry.getKey()))
setInitParameter(entry.getKey(), entry.getValue());
}
//jsp specific: set up the jsp-file on the JspServlet so it can precompile iff load-on-startup is >=0
if (_initOnStartup)
setInitParameter("jspFile", _forcedPath);
}
} }
} }
} }
@ -784,6 +797,78 @@ public class ServletHolder extends Holder<Servlet> implements UserIdentity.Scope
return false; return false;
return ("org.apache.jasper.servlet.JspServlet".equals(classname)); return ("org.apache.jasper.servlet.JspServlet".equals(classname));
} }
/* ------------------------------------------------------------ */
private String getNameOfJspClass (String jsp)
{
if (jsp == null)
return "";
int i = jsp.lastIndexOf('/') + 1;
jsp = jsp.substring(i);
try
{
Class jspUtil = Loader.loadClass(Holder.class, "org.apache.jasper.compiler.JspUtil");
Method makeJavaIdentifier = jspUtil.getMethod("makeJavaIdentifier", String.class);
return (String)makeJavaIdentifier.invoke(null, jsp);
}
catch (Exception e)
{
String tmp = jsp.replace('.','_');
LOG.warn("Unable to make identifier for jsp "+jsp +" trying "+tmp+" instead");
if (LOG.isDebugEnabled())
LOG.warn(e);
return tmp;
}
}
/* ------------------------------------------------------------ */
private String getPackageOfJspClass (String jsp)
{
if (jsp == null)
return "";
int i = jsp.lastIndexOf('/');
if (i <= 0)
return "";
try
{
Class jspUtil = Loader.loadClass(Holder.class, "org.apache.jasper.compiler.JspUtil");
Method makeJavaPackage = jspUtil.getMethod("makeJavaPackage", String.class);
return (String)makeJavaPackage.invoke(null, jsp.substring(0,i));
}
catch (Exception e)
{
String tmp = jsp.substring(1).replace('/','.');
LOG.warn("Unable to make package for jsp "+jsp +" trying "+tmp+" instead");
if (LOG.isDebugEnabled())
LOG.warn(e);
return tmp;
}
}
/* ------------------------------------------------------------ */
private String getJspPackagePrefix ()
{
String jspPackageName = (String)getServletHandler().getServletContext().getAttribute(JSP_GENERATED_PACKAGE_NAME );
if (jspPackageName == null)
jspPackageName = "org.apache.jsp";
return jspPackageName;
}
/* ------------------------------------------------------------ */
private String getClassNameForJsp (String jsp)
{
if (jsp == null)
return null;
return getJspPackagePrefix() + "." +getPackageOfJspClass(jsp) + "." + getNameOfJspClass(jsp);
}
/* ------------------------------------------------------------ */ /* ------------------------------------------------------------ */