Author: kkolinko Date: Wed Jul 9 11:48:37 2014 New Revision: 1609112 URL: http://svn.apache.org/r1609112 Log: Fix https://issues.apache.org/bugzilla/show_bug.cgi?id=56658 Avoid delay between registrations of mappings for context and for its servlets.
It is backport of r1606714. Added: tomcat/tc7.0.x/trunk/java/org/apache/tomcat/util/http/mapper/WrapperMappingInfo.java - copied, changed from r1609073, tomcat/trunk/java/org/apache/catalina/mapper/WrapperMappingInfo.java Modified: tomcat/tc7.0.x/trunk/java/org/apache/catalina/connector/MapperListener.java tomcat/tc7.0.x/trunk/java/org/apache/tomcat/util/http/mapper/Mapper.java tomcat/tc7.0.x/trunk/test/org/apache/tomcat/util/http/mapper/TestMapper.java tomcat/tc7.0.x/trunk/webapps/docs/changelog.xml Modified: tomcat/tc7.0.x/trunk/java/org/apache/catalina/connector/MapperListener.java URL: http://svn.apache.org/viewvc/tomcat/tc7.0.x/trunk/java/org/apache/catalina/connector/MapperListener.java?rev=1609112&r1=1609111&r2=1609112&view=diff ============================================================================== --- tomcat/tc7.0.x/trunk/java/org/apache/catalina/connector/MapperListener.java (original) +++ tomcat/tc7.0.x/trunk/java/org/apache/catalina/connector/MapperListener.java Wed Jul 9 11:48:37 2014 @@ -16,6 +16,9 @@ */ package org.apache.catalina.connector; +import java.util.ArrayList; +import java.util.List; + import org.apache.catalina.Container; import org.apache.catalina.ContainerEvent; import org.apache.catalina.ContainerListener; @@ -32,6 +35,7 @@ import org.apache.catalina.util.Lifecycl import org.apache.juli.logging.Log; import org.apache.juli.logging.LogFactory; import org.apache.tomcat.util.http.mapper.Mapper; +import org.apache.tomcat.util.http.mapper.WrapperMappingInfo; import org.apache.tomcat.util.res.StringManager; @@ -360,14 +364,21 @@ public class MapperListener extends Life javax.naming.Context resources = context.getResources(); String[] welcomeFiles = context.findWelcomeFiles(); - - mapper.addContextVersion(host.getName(), host, contextPath, - context.getWebappVersion(), context, welcomeFiles, resources); + List<WrapperMappingInfo> wrappers = new ArrayList<WrapperMappingInfo>(); for (Container container : context.findChildren()) { - registerWrapper((Wrapper) container); + prepareWrapperMappingInfo(context, (Wrapper) container, wrappers); + + if(log.isDebugEnabled()) { + log.debug(sm.getString("mapperListener.registerWrapper", + container.getName(), contextPath, connector)); + } } + mapper.addContextVersion(host.getName(), host, contextPath, + context.getWebappVersion(), context, welcomeFiles, resources, + wrappers); + if(log.isDebugEnabled()) { log.debug(sm.getString("mapperListener.registerContext", contextPath, connector)); @@ -406,28 +417,42 @@ public class MapperListener extends Life */ private void registerWrapper(Wrapper wrapper) { - String wrapperName = wrapper.getName(); Context context = (Context) wrapper.getParent(); String contextPath = context.getPath(); if ("/".equals(contextPath)) { contextPath = ""; } - String version = ((Context) wrapper.getParent()).getWebappVersion(); + String version = context.getWebappVersion(); String hostName = context.getParent().getName(); - String[] mappings = wrapper.findMappings(); + List<WrapperMappingInfo> wrappers = new ArrayList<WrapperMappingInfo>(); + prepareWrapperMappingInfo(context, wrapper, wrappers); + mapper.addWrappers(hostName, contextPath, version, wrappers); + + if(log.isDebugEnabled()) { + log.debug(sm.getString("mapperListener.registerWrapper", + wrapper.getName(), contextPath, connector)); + } + } + /** + * Populate <code>wrappers</code> list with information for registration of + * mappings for this wrapper in this context. + * + * @param context + * @param wrapper + * @param list + */ + private void prepareWrapperMappingInfo(Context context, Wrapper wrapper, + List<WrapperMappingInfo> wrappers) { + String wrapperName = wrapper.getName(); + boolean resourceOnly = context.isResourceOnlyServlet(wrapperName); + String[] mappings = wrapper.findMappings(); for (String mapping : mappings) { boolean jspWildCard = (wrapperName.equals("jsp") && mapping.endsWith("/*")); - mapper.addWrapper(hostName, contextPath, version, mapping, wrapper, - jspWildCard, - context.isResourceOnlyServlet(wrapperName)); - } - - if(log.isDebugEnabled()) { - log.debug(sm.getString("mapperListener.registerWrapper", - wrapperName, contextPath, connector)); + wrappers.add(new WrapperMappingInfo(mapping, wrapper, jspWildCard, + resourceOnly)); } } Modified: tomcat/tc7.0.x/trunk/java/org/apache/tomcat/util/http/mapper/Mapper.java URL: http://svn.apache.org/viewvc/tomcat/tc7.0.x/trunk/java/org/apache/tomcat/util/http/mapper/Mapper.java?rev=1609112&r1=1609111&r2=1609112&view=diff ============================================================================== --- tomcat/tc7.0.x/trunk/java/org/apache/tomcat/util/http/mapper/Mapper.java (original) +++ tomcat/tc7.0.x/trunk/java/org/apache/tomcat/util/http/mapper/Mapper.java Wed Jul 9 11:48:37 2014 @@ -227,10 +227,31 @@ public final class Mapper { * @param context Context object * @param welcomeResources Welcome files defined for this context * @param resources Static resources of the context + * @deprecated Use {@link #addContextVersion(String, Object, String, String, Object, String[], javax.naming.Context, Collection)} */ + @Deprecated public void addContextVersion(String hostName, Object host, String path, String version, Object context, String[] welcomeResources, javax.naming.Context resources) { + addContextVersion(hostName, host, path, version, context, + welcomeResources, resources, null); + } + + /** + * Add a new Context to an existing Host. + * + * @param hostName Virtual host name this context belongs to + * @param host Host object + * @param path Context path + * @param version Context version + * @param context Context object + * @param welcomeResources Welcome files defined for this context + * @param resources Static resources of the context + * @param wrappers Information on wrapper mappings + */ + public void addContextVersion(String hostName, Object host, String path, + String version, Object context, String[] welcomeResources, + javax.naming.Context resources, Collection<WrapperMappingInfo> wrappers) { Host mappedHost = exactFind(hosts, hostName); if (mappedHost == null) { @@ -254,6 +275,9 @@ public final class Mapper { newContextVersion.object = context; newContextVersion.welcomeResources = welcomeResources; newContextVersion.resources = resources; + if (wrappers != null) { + addWrappers(newContextVersion, wrappers); + } ContextList contextList = mappedHost.contextList; Context mappedContext = exactFind(contextList.contexts, path); @@ -360,6 +384,30 @@ public final class Mapper { addWrapper(context, path, wrapper, jspWildCard, resourceOnly); } + public void addWrappers(String hostName, String contextPath, + String version, Collection<WrapperMappingInfo> wrappers) { + ContextVersion contextVersion = findContextVersion(hostName, + contextPath, version, false); + if (contextVersion == null) { + return; + } + addWrappers(contextVersion, wrappers); + } + + /** + * Adds wrappers to the given context. + * + * @param contextVersion The context to which to add the wrappers + * @param wrappers Information on wrapper mappings + */ + private void addWrappers(ContextVersion contextVersion, + Collection<WrapperMappingInfo> wrappers) { + for (WrapperMappingInfo wrapper : wrappers) { + addWrapper(contextVersion, wrapper.getMapping(), + wrapper.getWrapper(), wrapper.isJspWildCard(), + wrapper.isResourceOnly()); + } + } /** * Adds a wrapper to the given context. @@ -368,9 +416,9 @@ public final class Mapper { * @param path Wrapper mapping * @param wrapper The Wrapper object * @param jspWildCard true if the wrapper corresponds to the JspServlet + * and the mapping path contains a wildcard; false otherwise * @param resourceOnly true if this wrapper always expects a physical * resource to be present (such as a JSP) - * and the mapping path contains a wildcard; false otherwise */ protected void addWrapper(ContextVersion context, String path, Object wrapper, boolean jspWildCard, boolean resourceOnly) { Copied: tomcat/tc7.0.x/trunk/java/org/apache/tomcat/util/http/mapper/WrapperMappingInfo.java (from r1609073, tomcat/trunk/java/org/apache/catalina/mapper/WrapperMappingInfo.java) URL: http://svn.apache.org/viewvc/tomcat/tc7.0.x/trunk/java/org/apache/tomcat/util/http/mapper/WrapperMappingInfo.java?p2=tomcat/tc7.0.x/trunk/java/org/apache/tomcat/util/http/mapper/WrapperMappingInfo.java&p1=tomcat/trunk/java/org/apache/catalina/mapper/WrapperMappingInfo.java&r1=1609073&r2=1609112&rev=1609112&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/catalina/mapper/WrapperMappingInfo.java (original) +++ tomcat/tc7.0.x/trunk/java/org/apache/tomcat/util/http/mapper/WrapperMappingInfo.java Wed Jul 9 11:48:37 2014 @@ -14,9 +14,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.apache.catalina.mapper; - -import org.apache.catalina.Wrapper; +package org.apache.tomcat.util.http.mapper; /** * Encapsulates information used to register a Wrapper mapping. @@ -24,11 +22,13 @@ import org.apache.catalina.Wrapper; public class WrapperMappingInfo { private final String mapping; - private final Wrapper wrapper; + + /** <code>org.apache.catalina.Wrapper</code> */ + private final Object wrapper; private final boolean jspWildCard; private final boolean resourceOnly; - public WrapperMappingInfo(String mapping, Wrapper wrapper, + public WrapperMappingInfo(String mapping, /* Wrapper */Object wrapper, boolean jspWildCard, boolean resourceOnly) { this.mapping = mapping; this.wrapper = wrapper; @@ -40,7 +40,10 @@ public class WrapperMappingInfo { return mapping; } - public Wrapper getWrapper() { + /** + * @return <code>org.apache.catalina.Wrapper</code> + */ + public Object getWrapper() { return wrapper; } Modified: tomcat/tc7.0.x/trunk/test/org/apache/tomcat/util/http/mapper/TestMapper.java URL: http://svn.apache.org/viewvc/tomcat/tc7.0.x/trunk/test/org/apache/tomcat/util/http/mapper/TestMapper.java?rev=1609112&r1=1609111&r2=1609112&view=diff ============================================================================== --- tomcat/tc7.0.x/trunk/test/org/apache/tomcat/util/http/mapper/TestMapper.java (original) +++ tomcat/tc7.0.x/trunk/test/org/apache/tomcat/util/http/mapper/TestMapper.java Wed Jul 9 11:48:37 2014 @@ -16,6 +16,7 @@ */ package org.apache.tomcat.util.http.mapper; +import java.util.Arrays; import java.util.concurrent.atomic.AtomicBoolean; import static org.junit.Assert.assertEquals; @@ -62,30 +63,40 @@ public class TestMapper extends LoggingB welcomes[1] = "bobou"; mapper.addContextVersion("iowejoiejfoiew", "blah7", "", - "0", "context0", new String[0], null); + "0", "context0", new String[0], null, null); mapper.addContextVersion("iowejoiejfoiew", "blah7", "/foo", - "0", "context1", new String[0], null); + "0", "context1", new String[0], null, null); mapper.addContextVersion("iowejoiejfoiew", "blah7", "/foo/bar", - "0", "context2", welcomes, null); - mapper.addContextVersion("iowejoiejfoiew", "blah7", "/foo/bar/bla", - "0", "context3", new String[0], null); - - mapper.addWrapper("iowejoiejfoiew", "/foo/bar", "0", "/fo/*", - "wrapper0", false, false); - mapper.addWrapper("iowejoiejfoiew", "/foo/bar", "0", "/", - "wrapper1", false, false); - mapper.addWrapper("iowejoiejfoiew", "/foo/bar", "0", "/blh", - "wrapper2", false, false); - mapper.addWrapper("iowejoiejfoiew", "/foo/bar", "0", "*.jsp", - "wrapper3", false, false); - mapper.addWrapper("iowejoiejfoiew", "/foo/bar", "0", "/blah/bou/*", - "wrapper4", false, false); - mapper.addWrapper("iowejoiejfoiew", "/foo/bar", "0", "/blah/bobou/*", - "wrapper5", false, false); - mapper.addWrapper("iowejoiejfoiew", "/foo/bar", "0", "*.htm", - "wrapper6", false, false); - mapper.addWrapper("iowejoiejfoiew", "/foo/bar/bla", "0", "/bobou/*", - "wrapper7", false, false); + "0", "context2", welcomes, null, null); + + mapper.addWrappers( + "iowejoiejfoiew", + "/foo/bar", + "0", + Arrays.asList(new WrapperMappingInfo[] { + new WrapperMappingInfo("/fo/*", "wrapper0", false, + false), + new WrapperMappingInfo("/", "wrapper1", false, false), + new WrapperMappingInfo("/blh", "wrapper2", false, false), + new WrapperMappingInfo("*.jsp", "wrapper3", false, + false), + new WrapperMappingInfo("/blah/bou/*", "wrapper4", + false, false), + new WrapperMappingInfo("/blah/bobou/*", "wrapper5", + false, false), + new WrapperMappingInfo("*.htm", "wrapper6", false, + false) })); + + mapper.addContextVersion( + "iowejoiejfoiew", + "blah7", + "/foo/bar/bla", + "0", + "context3", + new String[0], + null, + Arrays.asList(new WrapperMappingInfo[] { new WrapperMappingInfo( + "/bobou/*", "wrapper7", false, false) })); } @Test @@ -225,15 +236,15 @@ public class TestMapper extends LoggingB mapper.setDefaultHostName("localhost"); mapper.addContextVersion("localhost", host, "", "0", contextRoot, - new String[0], null); + new String[0], null, null); mapper.addContextVersion("localhost", host, "/foo", "0", context1, - new String[0], null); + new String[0], null, null); mapper.addContextVersion("localhost", host, "/foo/bar", "0", context2, - new String[0], null); + new String[0], null, null); mapper.addContextVersion("localhost", host, "/foo/bar/bla", "0", - context3, new String[0], null); + context3, new String[0], null, null); mapper.addContextVersion("localhost", host, "/foo/bar/bla/baz", "0", - context4, new String[0], null); + context4, new String[0], null, null); final AtomicBoolean running = new AtomicBoolean(true); Thread t = new Thread() { @@ -244,7 +255,7 @@ public class TestMapper extends LoggingB "/foo/bar/bla/baz", "0"); mapper.addContextVersion("localhost", host, "/foo/bar/bla/baz", "0", context4, new String[0], - null); + null, null); } running.set(false); } Modified: tomcat/tc7.0.x/trunk/webapps/docs/changelog.xml URL: http://svn.apache.org/viewvc/tomcat/tc7.0.x/trunk/webapps/docs/changelog.xml?rev=1609112&r1=1609111&r2=1609112&view=diff ============================================================================== --- tomcat/tc7.0.x/trunk/webapps/docs/changelog.xml (original) +++ tomcat/tc7.0.x/trunk/webapps/docs/changelog.xml Wed Jul 9 11:48:37 2014 @@ -127,6 +127,10 @@ work in <code>Mapper</code>. (kkolinko) </fix> <fix> + <bug>56658</bug>: Avoid delay between registrations of mappings for + context and for its servlets. (kkolinko) + </fix> + <fix> <bug>56665</bug>: Correct the generation of the effective web.xml when elements contain an empty string as value. (violetagg) </fix> --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org