Return-Path: Delivered-To: apmail-tomcat-dev-archive@www.apache.org Received: (qmail 69464 invoked from network); 5 Sep 2006 15:14:46 -0000 Received: from hermes.apache.org (HELO mail.apache.org) (209.237.227.199) by minotaur.apache.org with SMTP; 5 Sep 2006 15:14:46 -0000 Received: (qmail 93641 invoked by uid 500); 5 Sep 2006 15:14:42 -0000 Delivered-To: apmail-tomcat-dev-archive@tomcat.apache.org Received: (qmail 93406 invoked by uid 500); 5 Sep 2006 15:14:41 -0000 Mailing-List: contact dev-help@tomcat.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: "Tomcat Developers List" Delivered-To: mailing list dev@tomcat.apache.org Received: (qmail 93395 invoked by uid 500); 5 Sep 2006 15:14:40 -0000 Delivered-To: apmail-jakarta-tomcat-dev@jakarta.apache.org Received: (qmail 93392 invoked by uid 99); 5 Sep 2006 15:14:40 -0000 Received: from asf.osuosl.org (HELO asf.osuosl.org) (140.211.166.49) by apache.org (qpsmtpd/0.29) with ESMTP; Tue, 05 Sep 2006 08:14:40 -0700 X-ASF-Spam-Status: No, hits=-9.4 required=10.0 tests=ALL_TRUSTED,NO_REAL_NAME X-Spam-Check-By: apache.org Received-SPF: pass (asf.osuosl.org: local policy) Received: from [140.211.166.113] (HELO eris.apache.org) (140.211.166.113) by apache.org (qpsmtpd/0.29) with ESMTP; Tue, 05 Sep 2006 08:14:39 -0700 Received: by eris.apache.org (Postfix, from userid 65534) id 2698B1A981A; Tue, 5 Sep 2006 08:14:18 -0700 (PDT) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r440368 - in /tomcat/sandbox/tomcat-lite: java/org/apache/tomcat/lite/ java/org/apache/tomcat/servlets/jsp/ webapps/ROOT/WEB-INF/ Date: Tue, 05 Sep 2006 15:14:17 -0000 To: tomcat-dev@jakarta.apache.org From: costin@apache.org X-Mailer: svnmailer-1.1.0 Message-Id: <20060905151419.2698B1A981A@eris.apache.org> X-Virus-Checked: Checked by ClamAV on apache.org X-Spam-Rating: minotaur.apache.org 1.6.2 0/1000/N Author: costin Date: Tue Sep 5 08:14:12 2006 New Revision: 440368 URL: http://svn.apache.org/viewvc?view=rev&rev=440368 Log: Few more fixes Modified: tomcat/sandbox/tomcat-lite/java/org/apache/tomcat/lite/ServletConfigImpl.java tomcat/sandbox/tomcat-lite/java/org/apache/tomcat/lite/ServletContextImpl.java tomcat/sandbox/tomcat-lite/java/org/apache/tomcat/servlets/jsp/JspCompileServlet.java tomcat/sandbox/tomcat-lite/java/org/apache/tomcat/servlets/jsp/JspProxyServlet.java tomcat/sandbox/tomcat-lite/webapps/ROOT/WEB-INF/web.xml Modified: tomcat/sandbox/tomcat-lite/java/org/apache/tomcat/lite/ServletConfigImpl.java URL: http://svn.apache.org/viewvc/tomcat/sandbox/tomcat-lite/java/org/apache/tomcat/lite/ServletConfigImpl.java?view=diff&rev=440368&r1=440367&r2=440368 ============================================================================== --- tomcat/sandbox/tomcat-lite/java/org/apache/tomcat/lite/ServletConfigImpl.java (original) +++ tomcat/sandbox/tomcat-lite/java/org/apache/tomcat/lite/ServletConfigImpl.java Tue Sep 5 08:14:12 2006 @@ -23,6 +23,7 @@ import java.lang.reflect.Method; import java.util.Enumeration; import java.util.HashSet; +import java.util.Map; import java.util.Stack; import javax.servlet.Servlet; @@ -57,10 +58,16 @@ public static final String JSP_SERVLET_CLASS = "org.apache.tomcat.servlets.jsp.JspProxyServlet"; + public static final String JSP_SERVLET_NAME = "jsp"; + + public static final String JSP_SERVLET_COMPILER_CLASS = + "org.apache.tomcat.servlets.jsp.JspCompileServlet"; + + public static final String JSP_SERVLET_COMPILER_NAME = "jspCompiler"; + public static final String SINGLE_THREADED_PROXY = "org.apache.tomcat.servlets.jsp.SingleThreadedProxyServlet"; - public static final String JSP_SERVLET_NAME = "jsp"; ServletData data; @@ -110,6 +117,14 @@ ctx.facade.notifyAdd(this); } + public ServletConfigImpl(ServletContextImpl ctx, String name, + String classname) { + data = new ServletData(); + data.servletName = name; + data.servletClass = classname; + this.ctx = ctx; + ctx.facade.notifyAdd(this); + } /** * Return the available date/time for this servlet, in milliseconds since Modified: tomcat/sandbox/tomcat-lite/java/org/apache/tomcat/lite/ServletContextImpl.java URL: http://svn.apache.org/viewvc/tomcat/sandbox/tomcat-lite/java/org/apache/tomcat/lite/ServletContextImpl.java?view=diff&rev=440368&r1=440367&r2=440368 ============================================================================== --- tomcat/sandbox/tomcat-lite/java/org/apache/tomcat/lite/ServletContextImpl.java (original) +++ tomcat/sandbox/tomcat-lite/java/org/apache/tomcat/lite/ServletContextImpl.java Tue Sep 5 08:14:12 2006 @@ -36,6 +36,7 @@ import java.util.Properties; import java.util.Set; import java.util.Map.Entry; +import java.util.concurrent.ConcurrentHashMap; import javax.servlet.Filter; import javax.servlet.RequestDispatcher; @@ -97,6 +98,8 @@ transient Log log; + public static String CONTAINER_PREFIX = "__x_"; + /** * Prefix to use in servlet names that are used internally. */ @@ -125,7 +128,7 @@ /** * The context attributes for this context. */ - private transient HashMap attributes = new HashMap(); + private transient Map attributes = new ConcurrentHashMap(); /** * List of read only attributes for this context. @@ -291,11 +294,48 @@ * @param name Name of the context attribute to return */ public Object getAttribute(String name) { + if (name.startsWith(CONTAINER_PREFIX)) { + Object o = getContainerAttribute(name); + if (o != null) return o; + } + return (attributes.get(name)); + } - synchronized (attributes) { - return (attributes.get(name)); + /** + * Tomcat-lite core has the goal to provide maximum power to webapps, by + * exposing internals and allowing apps to take container-specific + * optimizations. However it tries to avoid the need for a servlet to + * depend on tomcat-lite, so servlets can be generic, but still check + * and use special features if tomcat-lite is detected. + * + * Example use of attributes ( and the tomcat-lite independent way ): + * - CONTAINER_PREFIX + servlet_ + servletname -> returns a servlet, + * similar with the old deprecated getServlet() method. Equivalent + * mechanism: have the serlvet load-on-startup and set the attribute with + * 'this'. Benefit: more power to the app on controlling the lifecycle, + * more flexiblity, use servlets as java beans, with real methods insted + * of just service() - a mini-component model based on servlets. + * + * + * @param name + */ + private Object getContainerAttribute(String name) { + // special code to avoid load-on-startup for container servlets + // like jsp + if (name.startsWith(CONTAINER_PREFIX + "servlet_")) { + String sname = name.substring(CONTAINER_PREFIX.length() + + "servlet_".length()); + + ServletConfigImpl sc = getServletConfig(sname); + if (sc == null) return null; + try { + Servlet s = sc.loadServlet(); + return s; + } catch (ServletException e) { + e.printStackTrace(); + } } - + return null; } @@ -304,11 +344,7 @@ * associated with this context. */ public Enumeration getAttributeNames() { - - synchronized (attributes) { - return new Enumerator(attributes.keySet(), true); - } - + return new Enumerator(attributes.keySet(), true); } @@ -684,15 +720,13 @@ boolean found = false; // Remove the specified attribute - synchronized (attributes) { - // Check for read only attribute - found = attributes.containsKey(name); - if (found) { - value = attributes.get(name); - attributes.remove(name); - } else { - return; - } + // Check for read only attribute + found = attributes.containsKey(name); + if (found) { + value = attributes.get(name); + attributes.remove(name); + } else { + return; } // Notify interested application event listeners @@ -860,8 +894,6 @@ } } - public static final String INTERNAL_PREFIX = "_SERVLET_IMPL_"; - public void initListeners() throws ServletException { Iterator fI = webAppData.listenerClass.iterator(); while (fI.hasNext()) { @@ -873,12 +905,9 @@ } catch (Throwable e) { log.warn("Error initializing listener " + listenerClass, e); } - } - setAttribute(INTERNAL_PREFIX + ".EventListeners", lifecycleListeners); - + setAttribute(CONTAINER_PREFIX + ".EventListeners", lifecycleListeners); } - public static String CONTAINER_PREFIX = "__x_"; public ClassLoader getClassLoader() { if( repository != null ) @@ -1014,17 +1043,30 @@ ServletData sd = new ServletData(); sd.servletName = "default"; ServletConfigImpl fileS = new ServletConfigImpl(this, sd); - + addServletConfig(fileS); Servlet defaultS = new WebdavServlet(); defaultS.init(fileS); fileS.setServlet(defaultS); addMapping("/", fileS); - sd = new ServletData(); - sd.servletName = ServletConfigImpl.JSP_SERVLET_NAME; - fileS = new ServletConfigImpl(this, sd); - sd.servletClass = ServletConfigImpl.JSP_SERVLET_CLASS; + File f = new File(basePath + "/WEB-INF/tmp"); + f.mkdirs(); + setAttribute("javax.servlet.context.tempdir", + f.getAbsolutePath()); + + fileS = new ServletConfigImpl(this, + ServletConfigImpl.JSP_SERVLET_NAME, + ServletConfigImpl.JSP_SERVLET_CLASS); addMapping("*.jsp", fileS); + addServletConfig(fileS); + + fileS = new ServletConfigImpl(this, + ServletConfigImpl.JSP_SERVLET_COMPILER_NAME, + ServletConfigImpl.JSP_SERVLET_COMPILER_CLASS); + f = new File(basePath + "/WEB-INF/classes"); + f.mkdirs(); + fileS.data.initParams.put("scratchdir", f.getAbsolutePath()); + addServletConfig(fileS); } private void readWebXml(String base) throws ServletException { Modified: tomcat/sandbox/tomcat-lite/java/org/apache/tomcat/servlets/jsp/JspCompileServlet.java URL: http://svn.apache.org/viewvc/tomcat/sandbox/tomcat-lite/java/org/apache/tomcat/servlets/jsp/JspCompileServlet.java?view=diff&rev=440368&r1=440367&r2=440368 ============================================================================== --- tomcat/sandbox/tomcat-lite/java/org/apache/tomcat/servlets/jsp/JspCompileServlet.java (original) +++ tomcat/sandbox/tomcat-lite/java/org/apache/tomcat/servlets/jsp/JspCompileServlet.java Tue Sep 5 08:14:12 2006 @@ -17,8 +17,7 @@ package org.apache.tomcat.servlets.jsp; import java.io.IOException; -import java.lang.reflect.Constructor; -import java.util.Enumeration; +import java.io.PrintWriter; import javax.servlet.Servlet; import javax.servlet.ServletConfig; @@ -28,16 +27,10 @@ import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; - -import org.apache.jasper.Constants; import org.apache.jasper.EmbeddedServletOptions; import org.apache.jasper.Options; import org.apache.jasper.compiler.JspRuntimeContext; -import org.apache.jasper.compiler.Localizer; import org.apache.jasper.servlet.JspServletWrapper; -import org.apache.tomcat.servlets.jsp.*; /** * Based on JspServlet, but specialized in compiling servlets. @@ -46,12 +39,6 @@ public class JspCompileServlet extends HttpServlet implements JspProxyServlet.PageCompiler { - // Logger - private Log log = LogFactory.getLog(JspCompileServlet.class); - - private ServletContext context; - private ServletConfig config; - private Options options; private JspRuntimeContext rctxt; @@ -60,126 +47,16 @@ */ public void init(ServletConfig config) throws ServletException { super.init(config); - this.config = config; - this.context = config.getServletContext(); + ServletContext context = config.getServletContext(); + // Initialize the JSP Runtime Context + options = new EmbeddedServletOptions(config, context); - // Initialize the JSP Runtime Context - // Check for a custom Options implementation - String engineOptionsName = - config.getInitParameter("engineOptionsClass"); - if (engineOptionsName != null) { - // Instantiate the indicated Options implementation - try { - ClassLoader loader = Thread.currentThread() - .getContextClassLoader(); - Class engineOptionsClass = loader.loadClass(engineOptionsName); - Class[] ctorSig = { ServletConfig.class, ServletContext.class }; - Constructor ctor = engineOptionsClass.getConstructor(ctorSig); - Object[] args = { config, context }; - options = (Options) ctor.newInstance(args); - } catch (Throwable e) { - // Need to localize this. - log.warn("Failed to load engineOptionsClass", e); - // Use the default Options implementation - options = new EmbeddedServletOptions(config, context); - } - } else { - // Use the default Options implementation - options = new EmbeddedServletOptions(config, context); - } rctxt = new JspRuntimeContext(context, options); - if (log.isDebugEnabled()) { - log.debug(Localizer.getMessage("jsp.message.scratch.dir.is", - options.getScratchDir().toString())); - log.debug(Localizer.getMessage("jsp.message.dont.modify.servlets")); - } - - context.setAttribute(JspProxyServlet.CONTAINER_PREFIX + "jspCompiler", - this); - } - - - /** - * Returns the number of JSPs for which JspServletWrappers exist, i.e., - * the number of JSPs that have been loaded into the webapp with which - * this JspServlet is associated. - * - *

This info may be used for monitoring purposes. - * - * @return The number of JSPs that have been loaded into the webapp with - * which this JspServlet is associated - */ - public int getJspCount() { - return this.rctxt.getJspCount(); - } - - - /** - * Resets the JSP reload counter. - * - * @param count Value to which to reset the JSP reload counter - */ - public void setJspReloadCount(int count) { - this.rctxt.setJspReloadCount(count); - } - - - /** - * Gets the number of JSPs that have been reloaded. - * - *

This info may be used for monitoring purposes. - * - * @return The number of JSPs (in the webapp with which this JspServlet is - * associated) that have been reloaded - */ - public int getJspReloadCount() { - return this.rctxt.getJspReloadCount(); - } - - - boolean preCompile(HttpServletRequest request) throws ServletException { - String queryString = request.getQueryString(); - if (queryString == null) { - return (false); - } - int start = queryString.indexOf(Constants.PRECOMPILE); - if (start < 0) { - return (false); - } - queryString = - queryString.substring(start + Constants.PRECOMPILE.length()); - if (queryString.length() == 0) { - return (true); // ?jsp_precompile - } - if (queryString.startsWith("&")) { - return (true); // ?jsp_precompile&foo=bar... - } - if (!queryString.startsWith("=")) { - return (false); // part of some other name or value - } - int limit = queryString.length(); - int ampersand = queryString.indexOf("&"); - if (ampersand > 0) { - limit = ampersand; - } - String value = queryString.substring(1, limit); - if (value.equals("true")) { - return (true); // ?jsp_precompile=true - } else if (value.equals("false")) { - // Spec says if jsp_precompile=false, the request should not - // be delivered to the JSP page; the easiest way to implement - // this is to set the flag to true, and precompile the page anyway. - // This still conforms to the spec, since it says the - // precompilation request can be ignored. - return (true); // ?jsp_precompile=false - } else { - throw new ServletException("Cannot have request parameter " + - Constants.PRECOMPILE + " set to " + - value); - } + // if load-on-startup: allow other servlets to find us + context.setAttribute(JspProxyServlet.CONTAINER_PREFIX + + "servlet_jspCompiler", this); } - /** This is no longer 'compiling' or invoking jsps. Just some status info * for debugging. @@ -187,113 +64,28 @@ public void service (HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { - - String jspUri = null; - - String jspFile = (String) request.getAttribute(Constants.JSP_FILE); - if (jspFile != null) { - // JSP is specified via in declaration - jspUri = jspFile; - } else { - /* - * Check to see if the requested JSP has been the target of a - * RequestDispatcher.include() - */ - jspUri = (String) request.getAttribute(Constants.INC_SERVLET_PATH); - if (jspUri != null) { - /* - * Requested JSP has been target of - * RequestDispatcher.include(). Its path is assembled from the - * relevant javax.servlet.include.* request attributes - */ - String pathInfo = (String) request.getAttribute( - "javax.servlet.include.path_info"); - if (pathInfo != null) { - jspUri += pathInfo; - } - } else { - /* - * Requested JSP has not been the target of a - * RequestDispatcher.include(). Reconstruct its path from the - * request's getServletPath() and getPathInfo() - */ - jspUri = request.getServletPath(); - String pathInfo = request.getPathInfo(); - if (pathInfo != null) { - jspUri += pathInfo; - } - } - } - - if (log.isDebugEnabled()) { - log.debug("JspEngine --> " + jspUri); - log.debug("\t ServletPath: " + request.getServletPath()); - log.debug("\t PathInfo: " + request.getPathInfo()); - log.debug("\t RealPath: " + context.getRealPath(jspUri)); - log.debug("\t RequestURI: " + request.getRequestURI()); - log.debug("\t QueryString: " + request.getQueryString()); - log.debug("\t Request Params: "); - Enumeration e = request.getParameterNames(); - while (e.hasMoreElements()) { - String name = (String) e.nextElement(); - log.debug("\t\t " + name + " = " - + request.getParameter(name)); - } + String preCompile = request.getParameter("preCompile"); + if (null != preCompile) { + compileAndInitPage(getServletContext(), preCompile, + getServletConfig()); + return; + } + String action = request.getParameter("action"); + if (action == null) { + PrintWriter out = response.getWriter(); + // info about the context + out.println("jspCount=" + rctxt.getJspCount()); + out.println("jspReloadCount=" + rctxt.getJspReloadCount()); + out.println("scratchDir='" + options.getScratchDir().toString() + + "'"); + return; } - - try { - boolean precompile = preCompile(request); - serviceJspFile(request, response, jspUri, null, precompile); - } catch (RuntimeException e) { - throw e; - } catch (ServletException e) { - throw e; - } catch (IOException e) { - throw e; - } catch (Throwable e) { - throw new ServletException(e); - } - } public void destroy() { rctxt.destroy(); } - - // -------------------------------------------------------- Private Methods - - private void serviceJspFile(HttpServletRequest request, - HttpServletResponse response, String jspUri, - Throwable exception, boolean precompile) - throws ServletException, IOException { - - JspServletWrapper wrapper = - (JspServletWrapper) rctxt.getWrapper(jspUri); - if (wrapper == null) { - synchronized(this) { - wrapper = (JspServletWrapper) rctxt.getWrapper(jspUri); - if (wrapper == null) { - // Check if the requested JSP page exists, to avoid - // creating unnecessary directories and files. - if (null == context.getResource(jspUri)) { - response.sendError(HttpServletResponse.SC_NOT_FOUND, - jspUri); - return; - } - boolean isErrorPage = exception != null; - wrapper = new JspServletWrapper(config, options, jspUri, - isErrorPage, rctxt); - rctxt.addWrapper(jspUri,wrapper); - } - } - } - - wrapper.service(request, response, precompile); - - } - - public Servlet compileAndInitPage(ServletContext ctx, String jspUri, ServletConfig cfg) @@ -307,11 +99,11 @@ if (wrapper == null) { // Check if the requested JSP page exists, to avoid // creating unnecessary directories and files. - if (null == context.getResource(jspUri)) { + if (null == ctx.getResource(jspUri)) { return null; } //boolean isErrorPage = exception != null; - wrapper = new JspServletWrapper(config, options, jspUri, + wrapper = new JspServletWrapper(cfg, options, jspUri, false, rctxt); rctxt.addWrapper(jspUri,wrapper); } Modified: tomcat/sandbox/tomcat-lite/java/org/apache/tomcat/servlets/jsp/JspProxyServlet.java URL: http://svn.apache.org/viewvc/tomcat/sandbox/tomcat-lite/java/org/apache/tomcat/servlets/jsp/JspProxyServlet.java?view=diff&rev=440368&r1=440367&r2=440368 ============================================================================== --- tomcat/sandbox/tomcat-lite/java/org/apache/tomcat/servlets/jsp/JspProxyServlet.java (original) +++ tomcat/sandbox/tomcat-lite/java/org/apache/tomcat/servlets/jsp/JspProxyServlet.java Tue Sep 5 08:14:12 2006 @@ -14,6 +14,7 @@ import org.apache.coyote.Request; import org.apache.coyote.Response; +import org.apache.jasper.Constants; import org.apache.jasper.JasperException; import org.apache.jasper.JspC; import org.apache.tomcat.lite.ServletConfigImpl; @@ -64,7 +65,7 @@ super.init(arg0); jspFile = arg0.getInitParameter(CONTAINER_PREFIX + "jspFile"); - pageCompiler = (PageCompiler)getServletContext().getAttribute(CONTAINER_PREFIX + "jspCompiler"); + pageCompiler = (PageCompiler)getServletContext().getAttribute(CONTAINER_PREFIX + "servlet_jspCompiler"); if (jspFile != null) { realJspServlet = loadProxy(jspFile); if (realJspServlet == null) { @@ -140,6 +141,49 @@ realJspServlet.service(req, arg1); } + + boolean preCompile(HttpServletRequest request) throws ServletException { + String queryString = request.getQueryString(); + if (queryString == null) { + return (false); + } + int start = queryString.indexOf("jsp_precompile"); + if (start < 0) { + return (false); + } + queryString = + queryString.substring(start + "jsp_precompile".length()); + if (queryString.length() == 0) { + return (true); // ?jsp_precompile + } + if (queryString.startsWith("&")) { + return (true); // ?jsp_precompile&foo=bar... + } + if (!queryString.startsWith("=")) { + return (false); // part of some other name or value + } + int limit = queryString.length(); + int ampersand = queryString.indexOf("&"); + if (ampersand > 0) { + limit = ampersand; + } + String value = queryString.substring(1, limit); + if (value.equals("true")) { + return (true); // ?jsp_precompile=true + } else if (value.equals("false")) { + // Spec says if jsp_precompile=false, the request should not + // be delivered to the JSP page; the easiest way to implement + // this is to set the flag to true, and precompile the page anyway. + // This still conforms to the spec, since it says the + // precompilation request can be ignored. + return (true); // ?jsp_precompile=false + } else { + throw new ServletException("Cannot have request parameter " + + Constants.PRECOMPILE + " set to " + + value); + } + } + public HttpServlet loadProxy(String jspFile) { Modified: tomcat/sandbox/tomcat-lite/webapps/ROOT/WEB-INF/web.xml URL: http://svn.apache.org/viewvc/tomcat/sandbox/tomcat-lite/webapps/ROOT/WEB-INF/web.xml?view=diff&rev=440368&r1=440367&r2=440368 ============================================================================== --- tomcat/sandbox/tomcat-lite/webapps/ROOT/WEB-INF/web.xml (original) +++ tomcat/sandbox/tomcat-lite/webapps/ROOT/WEB-INF/web.xml Tue Sep 5 08:14:12 2006 @@ -4,13 +4,10 @@ simpleIP/dav/* - _jspCompilerorg.apache.tomcat.servlets.jsp.JspCompileServlet - 1 - _tc_usersorg.apache.tomcat.servlets.sec.DigestAuthenticator u.testpass - _jspCompiler/_jspcOA + jspCompiler/_jspc dav/dav/* --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscribe@tomcat.apache.org For additional commands, e-mail: dev-help@tomcat.apache.org