svn commit: r1036792 - in /tomcat/trunk: java/org/apache/catalina/util/ContextName.java test/org/apache/catalina/util/TestContextName.java
Author: markt Date: Fri Nov 19 10:33:54 2010 New Revision: 1036792 URL: http://svn.apache.org/viewvc?rev=1036792&view=rev Log: Add displayName to ContextName Fix some bugs in ContextName constructors Add a test case for ContextName Added: tomcat/trunk/test/org/apache/catalina/util/TestContextName.java (with props) Modified: tomcat/trunk/java/org/apache/catalina/util/ContextName.java Modified: tomcat/trunk/java/org/apache/catalina/util/ContextName.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/util/ContextName.java?rev=1036792&r1=1036791&r2=1036792&view=diff == --- tomcat/trunk/java/org/apache/catalina/util/ContextName.java (original) +++ tomcat/trunk/java/org/apache/catalina/util/ContextName.java Fri Nov 19 10:33:54 2010 @@ -47,21 +47,21 @@ public final class ContextName { baseName = name; } +String tmp; // Extract version number int versionIndex = baseName.indexOf(VERSION_MARKER); if (versionIndex > -1) { version = baseName.substring(versionIndex + 2); +tmp = baseName.substring(0, versionIndex); } else { version = ""; +tmp = baseName; } -if (ROOT_NAME.equals(baseName)) { +if (ROOT_NAME.equals(tmp)) { path = ""; -} else if (versionIndex > -1) { -path = "/" + baseName.substring(0, versionIndex).replaceAll( -FWD_SLASH_REPLACEMENT, "/"); } else { -path = "/" + baseName.replaceAll(FWD_SLASH_REPLACEMENT, "/"); +path = "/" + tmp.replaceAll(FWD_SLASH_REPLACEMENT, "/"); } if (versionIndex > -1) { @@ -101,7 +101,7 @@ public final class ContextName { // Base name is converted path + version StringBuilder tmp = new StringBuilder(); -if ("".equals(path)) { +if ("".equals(this.path)) { tmp.append(ROOT_NAME); } else { tmp.append(this.path.substring(1).replaceAll("/", @@ -129,4 +129,25 @@ public final class ContextName { public String getName() { return name; } + +public String getDisplayName() { +StringBuilder tmp = new StringBuilder(); +if (path == "") { +tmp.append('/'); +} else { +tmp.append(path); +} + +if (version != "") { +tmp.append(VERSION_MARKER); +tmp.append(version); +} + +return tmp.toString(); +} + +@Override +public String toString() { +return getDisplayName(); +} } Added: tomcat/trunk/test/org/apache/catalina/util/TestContextName.java URL: http://svn.apache.org/viewvc/tomcat/trunk/test/org/apache/catalina/util/TestContextName.java?rev=1036792&view=auto == --- tomcat/trunk/test/org/apache/catalina/util/TestContextName.java (added) +++ tomcat/trunk/test/org/apache/catalina/util/TestContextName.java Fri Nov 19 10:33:54 2010 @@ -0,0 +1,140 @@ +package org.apache.catalina.util; + +import junit.framework.TestCase; + +public class TestContextName extends TestCase { + +private ContextName cn1; +private ContextName cn2; +private ContextName cn3; +private ContextName cn4; +private ContextName cn5; +private ContextName cn6; +private ContextName cn7; +private ContextName cn8; +private ContextName cn9; +private ContextName cn10; +private ContextName cn11; +private ContextName cn12; +private ContextName cn13; +private ContextName cn14; +private ContextName cn15; +private ContextName cn16; + +@Override +protected void setUp() throws Exception { +super.setUp(); +cn1 = new ContextName(null, null); +cn2 = new ContextName("", null); +cn3 = new ContextName("/", null); +cn4 = new ContextName("/foo", null); +cn5 = new ContextName("/foo/bar", null); +cn6 = new ContextName(null, "A"); +cn7 = new ContextName("", "B"); +cn8 = new ContextName("/", "C"); +cn9 = new ContextName("/foo", "D"); +cn10 = new ContextName("/foo/bar", "E"); +cn11 = new ContextName("ROOT"); +cn12 = new ContextName("foo"); +cn13 = new ContextName("foo#bar"); +cn14 = new ContextName("ROOT##A"); +cn15 = new ContextName("foo##D"); +cn16 = new ContextName("foo#bar##E"); +} + +public void testGetBaseName() { +assertEquals("ROOT", cn1.getBaseName()); +assertEquals("ROOT", cn2.getBaseName()); +assertEquals("ROOT", cn3.getBaseName()); +assertEquals("foo", cn4.getBaseName()); +assertEquals("foo#bar", cn5.getBaseName()); +assertEquals("ROOT##A", cn6.getBaseName()); +assertEquals("ROOT##B", cn7.getBaseName());
svn commit: r1036828 - in /tomcat/trunk: java/org/apache/catalina/manager/HTMLManagerServlet.java java/org/apache/catalina/manager/ManagerServlet.java webapps/manager/WEB-INF/jsp/sessionDetail.jsp web
Author: markt Date: Fri Nov 19 12:55:27 2010 New Revision: 1036828 URL: http://svn.apache.org/viewvc?rev=1036828&view=rev Log: Changes to Manager and HTML Manager to support parallel deployment Modified: tomcat/trunk/java/org/apache/catalina/manager/HTMLManagerServlet.java tomcat/trunk/java/org/apache/catalina/manager/ManagerServlet.java tomcat/trunk/webapps/manager/WEB-INF/jsp/sessionDetail.jsp tomcat/trunk/webapps/manager/WEB-INF/jsp/sessionsList.jsp Modified: tomcat/trunk/java/org/apache/catalina/manager/HTMLManagerServlet.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/manager/HTMLManagerServlet.java?rev=1036828&r1=1036827&r2=1036828&view=diff == --- tomcat/trunk/java/org/apache/catalina/manager/HTMLManagerServlet.java (original) +++ tomcat/trunk/java/org/apache/catalina/manager/HTMLManagerServlet.java Fri Nov 19 12:55:27 2010 @@ -125,6 +125,10 @@ public final class HTMLManagerServlet ex String command = request.getPathInfo(); String path = request.getParameter("path"); +ContextName cn = null; +if (path != null) { +cn = new ContextName(path, request.getParameter("version")); +} // Prepare our output writer to generate the response message response.setContentType("text/html; charset=" + Constants.CHARSET); @@ -137,10 +141,10 @@ public final class HTMLManagerServlet ex // List always displayed - nothing to do here } else if (command.equals("/sessions")) { try { -doSessions(path, request, response, smClient); +doSessions(cn, request, response, smClient); return; } catch (Exception e) { -log("HTMLManagerServlet.sessions[" + path + "]", e); +log("HTMLManagerServlet.sessions[" + cn + "]", e); message = smClient.getString("managerServlet.exception", e.toString()); } @@ -180,7 +184,16 @@ public final class HTMLManagerServlet ex String command = request.getPathInfo(); String path = request.getParameter("path"); +ContextName cn = null; +if (path != null) { +cn = new ContextName(path, request.getParameter("version")); +} String deployPath = request.getParameter("deployPath"); +ContextName deployCn = null; +if (deployPath != null) { +deployCn = new ContextName(deployPath, +request.getParameter("deployVersion")); +} String deployConfig = request.getParameter("deployConfig"); String deployWar = request.getParameter("deployWar"); @@ -195,18 +208,18 @@ public final class HTMLManagerServlet ex } else if (command.equals("/upload")) { message = upload(request, smClient); } else if (command.equals("/deploy")) { -message = deployInternal(deployConfig, deployPath, deployWar, +message = deployInternal(deployConfig, deployCn, deployWar, smClient); } else if (command.equals("/reload")) { -message = reload(path, smClient); +message = reload(cn, smClient); } else if (command.equals("/undeploy")) { -message = undeploy(path, smClient); +message = undeploy(cn, smClient); } else if (command.equals("/expire")) { -message = expireSessions(path, request, smClient); +message = expireSessions(cn, request, smClient); } else if (command.equals("/start")) { -message = start(path, smClient); +message = start(cn, smClient); } else if (command.equals("/stop")) { -message = stop(path, smClient); +message = stop(cn, smClient); } else if (command.equals("/findleaks")) { message = findleaks(smClient); } else { @@ -370,17 +383,17 @@ public final class HTMLManagerServlet ex * web application archive. * * @param config URL of the context configuration file to be deployed - * @param path Context path of the application to be deployed + * @param cn Name of the application to be deployed * @param war URL of the web application archive to be deployed * @return message String */ -protected String deployInternal(String config, String path, String war, +protected String deployInternal(String config, ContextName cn, String war, StringManager smClient) { StringWriter stringWriter = new StringWriter(); PrintWriter printWriter = new PrintWriter(stringWriter); -super.deploy(printWriter, config, path, war, false, smClient); +super.deploy(printWriter, config, cn, war, false, smClient); return stringWriter.toString(); } @@ -493,6 +506,15 @@ public final class HTM
svn commit: r1036882 - in /tomcat/trunk/java/org/apache/catalina/ha/session: JvmRouteBinderValve.java JvmRouteSessionIDBinderListener.java SessionIDMessage.java
Author: markt Date: Fri Nov 19 15:00:32 2010 New Revision: 1036882 URL: http://svn.apache.org/viewvc?rev=1036882&view=rev Log: Parallel deployment One more place where contexy.getPath() needs to be replaced with context.getName() Modified: tomcat/trunk/java/org/apache/catalina/ha/session/JvmRouteBinderValve.java tomcat/trunk/java/org/apache/catalina/ha/session/JvmRouteSessionIDBinderListener.java tomcat/trunk/java/org/apache/catalina/ha/session/SessionIDMessage.java Modified: tomcat/trunk/java/org/apache/catalina/ha/session/JvmRouteBinderValve.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/ha/session/JvmRouteBinderValve.java?rev=1036882&r1=1036881&r2=1036882&view=diff == --- tomcat/trunk/java/org/apache/catalina/ha/session/JvmRouteBinderValve.java (original) +++ tomcat/trunk/java/org/apache/catalina/ha/session/JvmRouteBinderValve.java Fri Nov 19 15:00:32 2010 @@ -416,7 +416,7 @@ public class JvmRouteBinderValve extends msg.setOrignalSessionID(sessionId); msg.setBackupSessionID(newSessionID); Context context = request.getContext(); -msg.setContextPath(context.getPath()); +msg.setContextName(context.getName()); msg.setHost(context.getParent().getName()); c.send(msg); } Modified: tomcat/trunk/java/org/apache/catalina/ha/session/JvmRouteSessionIDBinderListener.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/ha/session/JvmRouteSessionIDBinderListener.java?rev=1036882&r1=1036881&r2=1036882&view=diff == --- tomcat/trunk/java/org/apache/catalina/ha/session/JvmRouteSessionIDBinderListener.java (original) +++ tomcat/trunk/java/org/apache/catalina/ha/session/JvmRouteSessionIDBinderListener.java Fri Nov 19 15:00:32 2010 @@ -128,7 +128,7 @@ public class JvmRouteSessionIDBinderList "jvmRoute.receiveMessage.sessionIDChanged", sessionmsg .getOrignalSessionID(), sessionmsg .getBackupSessionID(), sessionmsg -.getContextPath())); +.getContextName())); Container container = getCluster().getContainer(); Container host = null ; if(container instanceof Engine) { @@ -138,7 +138,7 @@ public class JvmRouteSessionIDBinderList } if (host != null) { Context context = (Context) host.findChild(sessionmsg -.getContextPath()); +.getContextName()); if (context != null) { try { Session session = context.getManager().findSession( @@ -148,17 +148,17 @@ public class JvmRouteSessionIDBinderList } else if (log.isInfoEnabled()) log.info(sm.getString("jvmRoute.lostSession", sessionmsg.getOrignalSessionID(), -sessionmsg.getContextPath())); +sessionmsg.getContextName())); } catch (IOException e) { log.error(e); } } else if (log.isErrorEnabled()) log.error(sm.getString("jvmRoute.contextNotFound", -sessionmsg.getContextPath(), ((StandardEngine) host +sessionmsg.getContextName(), ((StandardEngine) host .getParent()).getJvmRoute())); } else if (log.isErrorEnabled()) -log.error(sm.getString("jvmRoute.hostNotFound", sessionmsg.getContextPath())); +log.error(sm.getString("jvmRoute.hostNotFound", sessionmsg.getContextName())); } return; } Modified: tomcat/trunk/java/org/apache/catalina/ha/session/SessionIDMessage.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/ha/session/SessionIDMessage.java?rev=1036882&r1=1036881&r2=1036882&view=diff == --- tomcat/trunk/java/org/apache/catalina/ha/session/SessionIDMessage.java (original) +++ tomcat/trunk/java/org/apache/catalina/ha/session/SessionIDMessage.java Fri Nov 19 15:00:32 2010 @@ -36,7 +36,7 @@ public class SessionIDMessage extends Cl private String backupSessionID; private String host ; -private String contextPath; +private String contextName; @Override public String getUniqueId() { @@ -44,7 +44,7 @@ public class SessionIDMessage extends Cl result.append("#-#"); result.append(getHost()); result.append("#-#"); -result.append(get
svn commit: r1036918 - in /tomcat/trunk: java/org/apache/catalina/core/ContainerBase.java webapps/docs/changelog.xml
Author: markt Date: Fri Nov 19 16:20:09 2010 New Revision: 1036918 URL: http://svn.apache.org/viewvc?rev=1036918&view=rev Log: The 60s timeout waiting for session info from other nodes will block processing of all cluster messages. As well as lost session updates, this can result in lost sessions if a fail-over occurs while the messages are being blocked. Modified: tomcat/trunk/java/org/apache/catalina/core/ContainerBase.java tomcat/trunk/webapps/docs/changelog.xml Modified: tomcat/trunk/java/org/apache/catalina/core/ContainerBase.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/core/ContainerBase.java?rev=1036918&r1=1036917&r2=1036918&view=diff == --- tomcat/trunk/java/org/apache/catalina/core/ContainerBase.java (original) +++ tomcat/trunk/java/org/apache/catalina/core/ContainerBase.java Fri Nov 19 16:20:09 2010 @@ -799,29 +799,32 @@ public abstract class ContainerBase exte "' is not unique"); child.setParent(this); // May throw IAE children.put(child.getName(), child); +} -// Start child -if ((getState().isAvailable() || -LifecycleState.STARTING_PREP.equals(getState())) && -startChildren) { -boolean success = false; -try { -child.start(); -success = true; -} catch (LifecycleException e) { -log.error("ContainerBase.addChild: start: ", e); -throw new IllegalStateException -("ContainerBase.addChild: start: " + e); -} finally { -if (!success) { +// Start child +// Don't do this inside sync block - start can be a slow process and +// locking the children object can cause problems elsewhere +if ((getState().isAvailable() || +LifecycleState.STARTING_PREP.equals(getState())) && +startChildren) { +boolean success = false; +try { +child.start(); +success = true; +} catch (LifecycleException e) { +log.error("ContainerBase.addChild: start: ", e); +throw new IllegalStateException +("ContainerBase.addChild: start: " + e); +} finally { +if (!success) { +synchronized (children) { children.remove(child.getName()); } } } - -fireContainerEvent(ADD_CHILD_EVENT, child); } +fireContainerEvent(ADD_CHILD_EVENT, child); } @@ -864,7 +867,7 @@ public abstract class ContainerBase exte if (name == null) return (null); -synchronized (children) { // Required by post-start changes +synchronized (children) { return children.get(name); } Modified: tomcat/trunk/webapps/docs/changelog.xml URL: http://svn.apache.org/viewvc/tomcat/trunk/webapps/docs/changelog.xml?rev=1036918&r1=1036917&r2=1036918&view=diff == --- tomcat/trunk/webapps/docs/changelog.xml (original) +++ tomcat/trunk/webapps/docs/changelog.xml Fri Nov 19 16:20:09 2010 @@ -140,6 +140,12 @@ Reduce synchronization in session managers to improve performance of session creation. (markt) + +If starting children automatically when adding them to a container (e.g. +when adding a Context to a Host) don't lock the parent's set +of children whilst the new child is being started since this can block +other threads and cause issues such as lost cluster messages. (markt) + @@ -205,6 +211,11 @@ send options to be set for the reply message. Based on a patch by Ariel. (markt) + +Ensure that a new Context waiting for session data from other nodes in +the cluster does not block the processing of clustering messages for +other Contexts. (markt) + - To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org
svn commit: r1036949 - in /tomcat/trunk: java/org/apache/catalina/connector/ java/org/apache/tomcat/util/http/mapper/ test/org/apache/tomcat/util/http/mapper/ webapps/docs/ webapps/docs/config/
Author: markt Date: Fri Nov 19 17:18:04 2010 New Revision: 1036949 URL: http://svn.apache.org/viewvc?rev=1036949&view=rev Log: Add the final component of parallel deployment Modified: tomcat/trunk/java/org/apache/catalina/connector/CoyoteAdapter.java tomcat/trunk/java/org/apache/catalina/connector/MapperListener.java tomcat/trunk/java/org/apache/tomcat/util/http/mapper/Mapper.java tomcat/trunk/java/org/apache/tomcat/util/http/mapper/MappingData.java tomcat/trunk/test/org/apache/tomcat/util/http/mapper/TestMapper.java tomcat/trunk/webapps/docs/changelog.xml tomcat/trunk/webapps/docs/config/context.xml tomcat/trunk/webapps/docs/tomcat-docs.xsl Modified: tomcat/trunk/java/org/apache/catalina/connector/CoyoteAdapter.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/connector/CoyoteAdapter.java?rev=1036949&r1=1036948&r2=1036949&view=diff == --- tomcat/trunk/java/org/apache/catalina/connector/CoyoteAdapter.java (original) +++ tomcat/trunk/java/org/apache/catalina/connector/CoyoteAdapter.java Fri Nov 19 17:18:04 2010 @@ -570,62 +570,89 @@ public class CoyoteAdapter implements Ad //reset mapping data, should prolly be done elsewhere request.getMappingData().recycle(); } -connector.getMapper().map(serverName, decodedURI, - request.getMappingData()); -request.setContext((Context) request.getMappingData().context); -request.setWrapper((Wrapper) request.getMappingData().wrapper); - -// Filter trace method -if (!connector.getAllowTrace() -&& req.method().equalsIgnoreCase("TRACE")) { -Wrapper wrapper = request.getWrapper(); -String header = null; -if (wrapper != null) { -String[] methods = wrapper.getServletMethods(); -if (methods != null) { -for (int i=0; i 0; i--) { +Context ctxt = (Context) objs[i - 1]; +if (ctxt.getManager().findSession(sessionID) != null) { +// Was the correct context already mapped? +if (ctxt.equals(request.getMappingData().context)) { +mapRequired = false; +} else { +// Set version so second time through mapping the +// correct context is found +version = ctxt.getWebappVersion(); +// Reset mapping +request.getMappingData().recycle(); +break; +} +} +} +if (version == null) { +// No matching context found. No need to re-map +mapRequired = false; +} +} } + } // Possible redirect @@ -651,9 +678,33 @@ public class CoyoteAdapter implements Ad return false; } -// Finally look for session ID in cookies and SSL session -parseSessionCookiesId(req, request); -parseSessionSslId(request); +// Filter trace method +if (!connector.getAllowTrace() +&& req.method().equalsIgnoreCase("TRACE")) { +Wrapper wrapper = request.getWrapper(); +String header = null; +if (wrapper != null) { +String[] methods = wrapper.getServletMethods(); +if (methods != null) { +for (int i=0; ihttp://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/connector/MapperListener.java?rev=1036949&r1=1036948&r2=1036949&view=diff == --- tomcat/trunk/java/org/apache/catalina/connector/MapperListener.java (original) +++ tomcat/trunk/java/org/apache/catalina/connector/MapperListener.java Fri Nov 19 17:18:04 2010 @@ -161,12 +161,13 @@ public class MapperListener implements C if ("/".equals(contextPath)) { contextPath = ""; } +String version = ((Context) wrapper.getParent()).getWebappVersion(); String hostName = context.getParent().getName(); String wrapperName = wrapper.getName(); String mapping = (String) event.getData(); boolean jspWildCard = ("jsp".equals(wrapperName) && mapping.endsWith("/*")); -mapper.addWrapper(hostName, contextPath, mapping, wrapper, +mapper.addWrapper(hostName, contextPath, version, mapping, wrapper, jspWildCard, context.isResourceOnlyServlet(wrapperName)); } else if (event.g
DO NOT REPLY [Bug 50303] New: typo, improvements to Tomcat 6 doc
https://issues.apache.org/bugzilla/show_bug.cgi?id=50303 Summary: typo, improvements to Tomcat 6 doc Product: Tomcat 6 Version: unspecified Platform: PC Status: NEW Severity: normal Priority: P2 Component: Documentation AssignedTo: dev@tomcat.apache.org ReportedBy: til...@snafu.de Hello, 1) In http://tomcat.apache.org/tomcat-6.0-doc/jndi-resources-howto.html#JavaMail_Sessions please correct message.setFrom(new InternetAddress(request.getParameter("from")); to message.setFrom(new InternetAddress(request.getParameter("from"))); 2) "The Java Activation Framework can be downloaded from Sun's site." isn't correct, the link goes nowhere. According to Oracle, JAF is part of java SE 6. http://java.sun.com/products/javamail/javamail-1_4_2.html 3) After "4. Install the JavaMail libraries", and "1. Install Your JDBC Driver" you might want to mention "restart tomcat". Tilman Hausherr -- Configure bugmail: https://issues.apache.org/bugzilla/userprefs.cgi?tab=email --- You are receiving this mail because: --- You are the assignee for the bug. - To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org
svn commit: r1036969 - in /tomcat/trunk: java/org/apache/jasper/compiler/Parser.java test/org/apache/jasper/compiler/TestParser.java test/webapp-3.0/WEB-INF/tags/bug49297.tag test/webapp-3.0/bug49nnn/
Author: markt Date: Fri Nov 19 18:21:29 2010 New Revision: 1036969 URL: http://svn.apache.org/viewvc?rev=1036969&view=rev Log: Additional fix for https://issues.apache.org/bugzilla/show_bug.cgi?id=49297 Handle tag directives in a similar manner to page directives Added: tomcat/trunk/test/webapp-3.0/WEB-INF/tags/bug49297.tag tomcat/trunk/test/webapp-3.0/bug49nnn/bug49297Tag.jsp (with props) Modified: tomcat/trunk/java/org/apache/jasper/compiler/Parser.java tomcat/trunk/test/org/apache/jasper/compiler/TestParser.java Modified: tomcat/trunk/java/org/apache/jasper/compiler/Parser.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/jasper/compiler/Parser.java?rev=1036969&r1=1036968&r2=1036969&view=diff == --- tomcat/trunk/java/org/apache/jasper/compiler/Parser.java (original) +++ tomcat/trunk/java/org/apache/jasper/compiler/Parser.java Fri Nov 19 18:21:29 2010 @@ -572,7 +572,7 @@ class Parser implements TagConstants { * Attribute)* */ private void parseTagDirective(Node parent) throws JasperException { -Attributes attrs = parseAttributes(); +Attributes attrs = parseAttributes(true); Node.TagDirective n = new Node.TagDirective(attrs, start, parent); /* Modified: tomcat/trunk/test/org/apache/jasper/compiler/TestParser.java URL: http://svn.apache.org/viewvc/tomcat/trunk/test/org/apache/jasper/compiler/TestParser.java?rev=1036969&r1=1036968&r2=1036969&view=diff == --- tomcat/trunk/test/org/apache/jasper/compiler/TestParser.java (original) +++ tomcat/trunk/test/org/apache/jasper/compiler/TestParser.java Fri Nov 19 18:21:29 2010 @@ -254,6 +254,25 @@ public class TestParser extends TomcatBa assertEquals(500, sc); } +public void testBug49297Tag() throws Exception { + +Tomcat tomcat = getTomcatInstance(); + +File appDir = new File("test/webapp-3.0"); +// app dir is relative to server home +tomcat.addWebapp(null, "/test", appDir.getAbsolutePath()); + +tomcat.start(); + +ByteChunk res = new ByteChunk(); +int sc = getUrl("http://localhost:"; + getPort() + +"/test/bug49nnn/bug49297Tag.jsp", res, +new HashMap>()); + +assertEquals(200, sc); +assertEcho(res.toString(), "OK"); +} + /** Assertion for text printed by tags:echo */ private static void assertEcho(String result, String expected) { assertTrue(result.indexOf("" + expected + "") > 0); Added: tomcat/trunk/test/webapp-3.0/WEB-INF/tags/bug49297.tag URL: http://svn.apache.org/viewvc/tomcat/trunk/test/webapp-3.0/WEB-INF/tags/bug49297.tag?rev=1036969&view=auto == --- tomcat/trunk/test/webapp-3.0/WEB-INF/tags/bug49297.tag (added) +++ tomcat/trunk/test/webapp-3.0/WEB-INF/tags/bug49297.tag Fri Nov 19 18:21:29 2010 @@ -0,0 +1,21 @@ +<%-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--%><%@ tag import="java.util.List" import="java.util.ArrayList"%><%@ +tag body-content="empty" %><% +// Make sure the imports above do work +List l = new ArrayList(); +l.add("OK"); +%><%=l.get(0)%> \ No newline at end of file Added: tomcat/trunk/test/webapp-3.0/bug49nnn/bug49297Tag.jsp URL: http://svn.apache.org/viewvc/tomcat/trunk/test/webapp-3.0/bug49nnn/bug49297Tag.jsp?rev=1036969&view=auto == --- tomcat/trunk/test/webapp-3.0/bug49nnn/bug49297Tag.jsp (added) +++ tomcat/trunk/test/webapp-3.0/bug49nnn/bug49297Tag.jsp Fri Nov 19 18:21:29 2010 @@ -0,0 +1,23 @@ +<%-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.or
DO NOT REPLY [Bug 49297] Whitespace absence is allowed before attribute name in a custom tag
https://issues.apache.org/bugzilla/show_bug.cgi?id=49297 Mark Thomas changed: What|Removed |Added Status|REOPENED|RESOLVED Resolution||FIXED --- Comment #11 from Mark Thomas 2010-11-19 13:22:37 EST --- Tag directives fixed too -- Configure bugmail: https://issues.apache.org/bugzilla/userprefs.cgi?tab=email --- You are receiving this mail because: --- You are the assignee for the bug. - To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org
DO NOT REPLY [Bug 50303] typo, improvements to Tomcat 6 doc
https://issues.apache.org/bugzilla/show_bug.cgi?id=50303 Tilman Hausherr changed: What|Removed |Added URL||http://tomcat.apache.org/to ||mcat-6.0-doc/jndi-resources ||-howto.html Platform|PC |All OS/Version||All Severity|normal |enhancement -- Configure bugmail: https://issues.apache.org/bugzilla/userprefs.cgi?tab=email --- You are receiving this mail because: --- You are the assignee for the bug. - To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org
DO NOT REPLY [Bug 50303] typo, improvements to Tomcat 6 doc
https://issues.apache.org/bugzilla/show_bug.cgi?id=50303 Mark Thomas changed: What|Removed |Added Severity|enhancement |normal --- Comment #1 from Mark Thomas 2010-11-19 13:28:05 EST --- typo == bug -- Configure bugmail: https://issues.apache.org/bugzilla/userprefs.cgi?tab=email --- You are receiving this mail because: --- You are the assignee for the bug. - To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org
svn commit: r1036972 - in /tomcat/trunk: java/javax/el/CompositeELResolver.java webapps/docs/changelog.xml
Author: markt Date: Fri Nov 19 18:31:17 2010 New Revision: 1036972 URL: http://svn.apache.org/viewvc?rev=1036972&view=rev Log: Fix https://issues.apache.org/bugzilla/show_bug.cgi?id=50293 Increase default resolver array size. (Jasper adds 5 resolvers.) Modified: tomcat/trunk/java/javax/el/CompositeELResolver.java tomcat/trunk/webapps/docs/changelog.xml Modified: tomcat/trunk/java/javax/el/CompositeELResolver.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/javax/el/CompositeELResolver.java?rev=1036972&r1=1036971&r2=1036972&view=diff == --- tomcat/trunk/java/javax/el/CompositeELResolver.java (original) +++ tomcat/trunk/java/javax/el/CompositeELResolver.java Fri Nov 19 18:31:17 2010 @@ -29,7 +29,7 @@ public class CompositeELResolver extends public CompositeELResolver() { this.size = 0; -this.resolvers = new ELResolver[2]; +this.resolvers = new ELResolver[8]; } public void add(ELResolver elResolver) { Modified: tomcat/trunk/webapps/docs/changelog.xml URL: http://svn.apache.org/viewvc/tomcat/trunk/webapps/docs/changelog.xml?rev=1036972&r1=1036971&r2=1036972&view=diff == --- tomcat/trunk/webapps/docs/changelog.xml (original) +++ tomcat/trunk/webapps/docs/changelog.xml Fri Nov 19 18:31:17 2010 @@ -197,6 +197,11 @@ 50192: Improve performance for EL when running under a security manager. Based on a patch by Robert Goff. (markt) + +50293: Increase the size of internal ELResolver array from 2 +to 8 since in typical usage there are at least 5 resolvers. Based on a +patch by Robert Goff. (markt) + - To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org
DO NOT REPLY [Bug 50293] javax.el.CompositeELResolver synchronization issue
https://issues.apache.org/bugzilla/show_bug.cgi?id=50293 Mark Thomas changed: What|Removed |Added Status|NEW |RESOLVED Resolution||FIXED --- Comment #1 from Mark Thomas 2010-11-19 13:32:24 EST --- The EL spec states the ELContexts are not thread-safe. By extension, neither are ELResolvers. The point regarding increasing the default size is a valid one. I have increased it to 8 for 7.0.5 onwards as per your suggestion. -- Configure bugmail: https://issues.apache.org/bugzilla/userprefs.cgi?tab=email --- You are receiving this mail because: --- You are the assignee for the bug. - To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org
svn commit: r1036975 - in /tomcat/trunk/webapps/docs: changelog.xml jndi-resources-howto.xml
Author: markt Date: Fri Nov 19 18:49:11 2010 New Revision: 1036975 URL: http://svn.apache.org/viewvc?rev=1036975&view=rev Log: Fix https://issues.apache.org/bugzilla/show_bug.cgi?id=50303 Update JavaMail download location JAF is included in Java SE 6 Modified: tomcat/trunk/webapps/docs/changelog.xml tomcat/trunk/webapps/docs/jndi-resources-howto.xml Modified: tomcat/trunk/webapps/docs/changelog.xml URL: http://svn.apache.org/viewvc/tomcat/trunk/webapps/docs/changelog.xml?rev=1036975&r1=1036974&r2=1036975&view=diff == --- tomcat/trunk/webapps/docs/changelog.xml (original) +++ tomcat/trunk/webapps/docs/changelog.xml Fri Nov 19 18:49:11 2010 @@ -265,6 +265,10 @@ Improve Tomcat Logging documentation. (kkolinko) + +50303: Update JNDI how-to to reflect new JavaMail download +location and that JAF is now included in Java SE 6. (markt) + Modified: tomcat/trunk/webapps/docs/jndi-resources-howto.xml URL: http://svn.apache.org/viewvc/tomcat/trunk/webapps/docs/jndi-resources-howto.xml?rev=1036975&r1=1036974&r2=1036975&view=diff == --- tomcat/trunk/webapps/docs/jndi-resources-howto.xml (original) +++ tomcat/trunk/webapps/docs/jndi-resources-howto.xml Fri Nov 19 18:49:11 2010 @@ -456,7 +456,7 @@ Context envCtx = (Context) initCtx.looku Session session = (Session) envCtx.lookup("mail/Session"); Message message = new MimeMessage(session); -message.setFrom(new InternetAddress(request.getParameter("from")); +message.setFrom(new InternetAddress(request.getParameter("from"))); InternetAddress to[] = new InternetAddress[1]; to[0] = new InternetAddress(request.getParameter("to")); message.setRecipients(Message.RecipientType.TO, to); @@ -494,21 +494,22 @@ Transport.send(message); 4. Install the JavaMail libraries -http://java.sun.com/products/javamail/downloads/index.html"; target="_blank"> -Download the JavaMail API. The JavaMail API requires the Java Activation -Framework (JAF) API as well. The Java Activation Framework can be downloaded -from http://java.sun.com/products/javabeans/glasgow/jaf.html";>Sun's site. - +http://www.oracle.com/technetwork/java/index-138643.html";> +Download the JavaMail API. -This download includes 2 vital libraries for the configuration; -activation.jar and mail.jar. Unpackage both distributions and place -them into $CATALINA_HOME/lib so that they are available to -Tomcat during the initialization of the mail Session Resource. -Note: placing these jars in both $CATALINA_HOME/lib and a -web application's lib folder will cause an error, so ensure you have -them in the $CATALINA_HOME/lib location only. +Unpackage the distribution and place mail.jar into $CATALINA_HOME/lib so +that it is available to Tomcat during the initialization of the mail Session +Resource. Note: placing this jar in both $CATALINA_HOME/lib +and a web application's lib folder will cause an error, so ensure you have +it in the $CATALINA_HOME/lib location only. +5. Restart Tomcat + +For the additional JAR to be visible to Tomcat, it is necessary for the +Tomcat instance to be restarted. + + Example Application The /examples application included with Tomcat contains - To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org
svn commit: r1036976 - in /tomcat/tc6.0.x/trunk/webapps/docs: changelog.xml jndi-resources-howto.xml
Author: markt Date: Fri Nov 19 18:49:40 2010 New Revision: 1036976 URL: http://svn.apache.org/viewvc?rev=1036976&view=rev Log: Fix https://issues.apache.org/bugzilla/show_bug.cgi?id=50303 Update JavaMail and JAF download locations JAF is included in Java SE 6 Modified: tomcat/tc6.0.x/trunk/webapps/docs/changelog.xml tomcat/tc6.0.x/trunk/webapps/docs/jndi-resources-howto.xml Modified: tomcat/tc6.0.x/trunk/webapps/docs/changelog.xml URL: http://svn.apache.org/viewvc/tomcat/tc6.0.x/trunk/webapps/docs/changelog.xml?rev=1036976&r1=1036975&r2=1036976&view=diff == --- tomcat/tc6.0.x/trunk/webapps/docs/changelog.xml (original) +++ tomcat/tc6.0.x/trunk/webapps/docs/changelog.xml Fri Nov 19 18:49:40 2010 @@ -308,6 +308,10 @@ must be removed from all users and the new admin-gui and admin-script roles used instead. (markt) + +50303: Update JNDI how-to to reflect new JavaMail and JAF +download locations and that JAF is now included in Java SE 6. (markt) + Modified: tomcat/tc6.0.x/trunk/webapps/docs/jndi-resources-howto.xml URL: http://svn.apache.org/viewvc/tomcat/tc6.0.x/trunk/webapps/docs/jndi-resources-howto.xml?rev=1036976&r1=1036975&r2=1036976&view=diff == --- tomcat/tc6.0.x/trunk/webapps/docs/jndi-resources-howto.xml (original) +++ tomcat/tc6.0.x/trunk/webapps/docs/jndi-resources-howto.xml Fri Nov 19 18:49:40 2010 @@ -456,7 +456,7 @@ Context envCtx = (Context) initCtx.looku Session session = (Session) envCtx.lookup("mail/Session"); Message message = new MimeMessage(session); -message.setFrom(new InternetAddress(request.getParameter("from")); +message.setFrom(new InternetAddress(request.getParameter("from"))); InternetAddress to[] = new InternetAddress[1]; to[0] = new InternetAddress(request.getParameter("to")); message.setRecipients(Message.RecipientType.TO, to); @@ -494,19 +494,20 @@ Transport.send(message); 4. Install the JavaMail libraries -http://java.sun.com/products/javamail/downloads/index.html"; target="_blank"> +http://www.oracle.com/technetwork/java/index-138643.html";> Download the JavaMail API. The JavaMail API requires the Java Activation -Framework (JAF) API as well. The Java Activation Framework can be downloaded -from http://java.sun.com/products/javabeans/glasgow/jaf.html";>Sun's site. +Framework (JAF) API as well. The Java Activation Framework is included in +Java SE 6 onwards. Java SE 5 users can download the latest version, +http://www.oracle.com/technetwork/java/javase/downloads/index-135046.html";> +JAF 1.1.1. -This download includes 2 vital libraries for the configuration; -activation.jar and mail.jar. Unpackage both distributions and place -them into $CATALINA_HOME/lib so that they are available to -Tomcat during the initialization of the mail Session Resource. -Note: placing these jars in both $CATALINA_HOME/lib and a -web application's lib folder will cause an error, so ensure you have -them in the $CATALINA_HOME/lib location only. +Unpackage the distribution(s) and place mail.jar (and activation.jar if +required) into $CATALINA_HOME/lib so the JAR(s) is(are) available to Tomcat +during the initialization of the mail Session Resource. +Note: placing jars in both $CATALINA_HOME/lib and a web +application's lib folder will cause an error, so ensure mail.jar (and +activation.jar) is(are) placed only the $CATALINA_HOME/lib location. Example Application - To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org
DO NOT REPLY [Bug 50303] typo, improvements to Tomcat 6 doc
https://issues.apache.org/bugzilla/show_bug.cgi?id=50303 Mark Thomas changed: What|Removed |Added Status|NEW |RESOLVED Resolution||FIXED --- Comment #2 from Mark Thomas 2010-11-19 13:51:46 EST --- Thanks for the report. This has been fixed in 7.0.x and 6.0.x and will be included in 7.0.5 and 6.0.30 onwards. -- Configure bugmail: https://issues.apache.org/bugzilla/userprefs.cgi?tab=email --- You are receiving this mail because: --- You are the assignee for the bug. - To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org
svn commit: r1036981 - /tomcat/tc6.0.x/trunk/java/org/apache/tomcat/jni/Error.java
Author: markt Date: Fri Nov 19 19:01:34 2010 New Revision: 1036981 URL: http://svn.apache.org/viewvc?rev=1036981&view=rev Log: Additional info for https://issues.apache.org/bugzilla/show_bug.cgi?id=50273 Add the error number to the message Modified: tomcat/tc6.0.x/trunk/java/org/apache/tomcat/jni/Error.java Modified: tomcat/tc6.0.x/trunk/java/org/apache/tomcat/jni/Error.java URL: http://svn.apache.org/viewvc/tomcat/tc6.0.x/trunk/java/org/apache/tomcat/jni/Error.java?rev=1036981&r1=1036980&r2=1036981&view=diff == --- tomcat/tc6.0.x/trunk/java/org/apache/tomcat/jni/Error.java (original) +++ tomcat/tc6.0.x/trunk/java/org/apache/tomcat/jni/Error.java Fri Nov 19 19:01:34 2010 @@ -43,7 +43,7 @@ public class Error extends Exception { */ private Error(int error, String description) { -super(description); +super(error + ": " + description); this.error = error; this.description = description; } - To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org
DO NOT REPLY [Bug 50273] AprEndpoint logs socket accept fails altough error is harmless
https://issues.apache.org/bugzilla/show_bug.cgi?id=50273 Mark Thomas changed: What|Removed |Added Component|Native:Integration |Connectors --- Comment #1 from Mark Thomas 2010-11-19 14:05:10 EST --- We need to figure out the error number to correctly filter out this particular error. I'll take a look and see if I can figure out what it is from the Tomcat native / APR source (233 is looking like a good bet). In case I can't and for future use, I have modified the 7.0.x code to include it in the exception message. -- Configure bugmail: https://issues.apache.org/bugzilla/userprefs.cgi?tab=email --- You are receiving this mail because: --- You are the assignee for the bug. - To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org
DO NOT REPLY [Bug 50304] New: ISAPI connector isn't passing cookie when changing directories.
https://issues.apache.org/bugzilla/show_bug.cgi?id=50304 Summary: ISAPI connector isn't passing cookie when changing directories. Product: Tomcat Connectors Version: 1.2.30 Platform: PC Status: NEW Severity: normal Priority: P2 Component: isapi AssignedTo: dev@tomcat.apache.org ReportedBy: benthecomputer...@gmail.com I have my site setup so that it sets a cookie in the root folder. When I change to a different folder, I need to be able to access the same cookie. I have found that if I browse to just the folder (eg: /test) then the cookie does not get retrieved, even though in Firebug is shows that the cookie is still set. My site checks for the cookie and if it cannot find it, then it tries to set it again, so every time I visit /test, it tries to set the cookie, over and over again. If however I browse to /test/index.jsp then the cookie shows up just fine. When I browse directly to Tomcat it works fine as well, it is just when IIS passes the connection over that there is an issue. I have tried both the 1.2.30 and 1.2.31 dll with the same results. Thanks for the help! -- Configure bugmail: https://issues.apache.org/bugzilla/userprefs.cgi?tab=email --- You are receiving this mail because: --- You are the assignee for the bug. - To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org
DO NOT REPLY [Bug 50273] AprEndpoint logs socket accept fails altough error is harmless
https://issues.apache.org/bugzilla/show_bug.cgi?id=50273 --- Comment #2 from Mark Thomas 2010-11-19 14:43:32 EST --- Hmm. The error code is indeed 233 but the HP-UX folks have re-used an existing error code that can also a genuine error has occurred. Therefore, we can't ignore this universally since it will represent real problems on other platforms (and possibly also on HP-UX). There is some useful info in this httpd thread http://httpd.markmail.org/thread/djrcyntamxrkulns I have a couple of ideas for this that I need to try out. -- Configure bugmail: https://issues.apache.org/bugzilla/userprefs.cgi?tab=email --- You are receiving this mail because: --- You are the assignee for the bug. - To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org
DO NOT REPLY [Bug 50282] Reference from javax.security.auth.login.LoginContext.contextClassLoader initalized in static code block prevents an undeployed Web application from being garbage collected (s
https://issues.apache.org/bugzilla/show_bug.cgi?id=50282 --- Comment #4 from Justin Almquist 2010-11-19 16:19:34 EST --- I don't have a sample webapp, however this article describes exactly how we setup our authentication mechanism using JAAS: http://download.oracle.com/javase/1.4.2/docs/guide/security/jgss/tutorials/AcnOnly.html -- Configure bugmail: https://issues.apache.org/bugzilla/userprefs.cgi?tab=email --- You are receiving this mail because: --- You are the assignee for the bug. - To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org
DO NOT REPLY [Bug 50273] AprEndpoint logs socket accept fails altough error is harmless
https://issues.apache.org/bugzilla/show_bug.cgi?id=50273 --- Comment #3 from Michael Osipov <1983-01...@gmx.net> 2010-11-19 16:37:58 EST --- Mark, if I can assist somehow, please let me now. I am running 6.0.x only. I can recompile a patched libtcnative and see if this works and a modified tomcat for test purposes with the current libtcnative. -- Configure bugmail: https://issues.apache.org/bugzilla/userprefs.cgi?tab=email --- You are receiving this mail because: --- You are the assignee for the bug. - To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org
DO NOT REPLY [Bug 50305] New: Provide an option to disable session tracking with URL
https://issues.apache.org/bugzilla/show_bug.cgi?id=50305 Summary: Provide an option to disable session tracking with URL Product: Tomcat 7 Version: 7.0.4 Platform: All OS/Version: All Status: NEW Severity: enhancement Priority: P2 Component: Catalina AssignedTo: dev@tomcat.apache.org ReportedBy: sylvain.laur...@gmail.com For internal (non-public) applications, where we know that all users browsers support cookies, there's no need for URL rewriting to track sessions. Furthermore having sessionID in the URLs has the following drawback : the first returned page contains URLs that reference static resources (images, CSS, JS...) with the session ID, but the following pages contain the same URL without the sessionID. Thus those resources are downloaded twice instead of once. This option should be disabled by default since it is not spec compliant. Proposition : -- Configure bugmail: https://issues.apache.org/bugzilla/userprefs.cgi?tab=email --- You are receiving this mail because: --- You are the assignee for the bug. - To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org
DO NOT REPLY [Bug 50305] Provide an option to disable session tracking with URL
https://issues.apache.org/bugzilla/show_bug.cgi?id=50305 --- Comment #1 from sylvain.laur...@gmail.com 2010-11-19 18:00:12 EST --- Created an attachment (id=26322) --> (https://issues.apache.org/bugzilla/attachment.cgi?id=26322) Patch for tc7 Proposed patch for tc7. Note that this feature is not useful for servlet 3 webapps since this can be configured in web.xml. I'd like to backport this to tc6. -- Configure bugmail: https://issues.apache.org/bugzilla/userprefs.cgi?tab=email --- You are receiving this mail because: --- You are the assignee for the bug. - To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org
DO NOT REPLY [Bug 50306] New: Detect stuck threads
https://issues.apache.org/bugzilla/show_bug.cgi?id=50306 Summary: Detect stuck threads Product: Tomcat 7 Version: 7.0.4 Platform: All OS/Version: All Status: NEW Severity: enhancement Priority: P2 Component: Catalina AssignedTo: dev@tomcat.apache.org ReportedBy: sylvain.laur...@gmail.com Feature request : regularly scan worker threads and if one has been processing the same request for longer than a configurable delay, log a warning with the stack trace of that thread. This would allow to detect very long running threads, usually the ones that are stuck in a network call or in a deadlock. -- Configure bugmail: https://issues.apache.org/bugzilla/userprefs.cgi?tab=email --- You are receiving this mail because: --- You are the assignee for the bug. - To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org