Author: kkolinko Date: Mon Jun 30 12:37:38 2014 New Revision: 1606714 URL: http://svn.apache.org/r1606714 Log: Fix https://issues.apache.org/bugzilla/show_bug.cgi?id=56658 Avoid delay between registrations of mappings for context and for its servlets.
Added: tomcat/trunk/java/org/apache/catalina/mapper/WrapperMappingInfo.java (with props) Modified: tomcat/trunk/java/org/apache/catalina/mapper/Mapper.java tomcat/trunk/java/org/apache/catalina/mapper/MapperListener.java tomcat/trunk/test/org/apache/catalina/mapper/TestMapper.java tomcat/trunk/webapps/docs/changelog.xml Modified: tomcat/trunk/java/org/apache/catalina/mapper/Mapper.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/mapper/Mapper.java?rev=1606714&r1=1606713&r2=1606714&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/catalina/mapper/Mapper.java (original) +++ tomcat/trunk/java/org/apache/catalina/mapper/Mapper.java Mon Jun 30 12:37:38 2014 @@ -214,10 +214,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, Host, String, String, Context, String[], WebResourceRoot, Collection)} */ + @Deprecated public void addContextVersion(String hostName, Host host, String path, String version, Context context, String[] welcomeResources, WebResourceRoot 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, Host host, String path, + String version, Context context, String[] welcomeResources, + WebResourceRoot resources, Collection<WrapperMappingInfo> wrappers) { MappedHost mappedHost = exactFind(hosts, hostName); if (mappedHost == null) { @@ -236,6 +257,9 @@ public final class Mapper { synchronized (mappedHost) { ContextVersion newContextVersion = new ContextVersion(version, path, slashCount, context, resources, welcomeResources); + if (wrappers != null) { + addWrappers(newContextVersion, wrappers); + } ContextList contextList = mappedHost.contextList; MappedContext mappedContext = exactFind(contextList.contexts, path); @@ -304,28 +328,70 @@ public final class Mapper { } - public void addWrapper(String hostName, String contextPath, String version, - String path, Wrapper wrapper, boolean jspWildCard, - boolean resourceOnly) { + private ContextVersion findContextVersion(String hostName, + String contextPath, String version, boolean silent) { MappedHost host = exactFind(hosts, hostName); if (host == null) { - return; + if (!silent) { + log.error("No host found: " + hostName); + } + return null; } MappedContext context = exactFind(host.contextList.contexts, contextPath); if (context == null) { - log.error("No context found: " + contextPath ); - return; + if (!silent) { + log.error("No context found: " + contextPath); + } + return null; } ContextVersion contextVersion = exactFind(context.versions, version); if (contextVersion == null) { - log.error("No context version found: " + contextPath + " " + - version); + if (!silent) { + log.error("No context version found: " + contextPath + " " + + version); + } + return null; + } + return contextVersion; + } + + + public void addWrapper(String hostName, String contextPath, String version, + String path, Wrapper wrapper, boolean jspWildCard, + boolean resourceOnly) { + ContextVersion contextVersion = findContextVersion(hostName, + contextPath, version, false); + if (contextVersion == null) { return; } addWrapper(contextVersion, 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. @@ -334,9 +400,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, Wrapper wrapper, boolean jspWildCard, boolean resourceOnly) { @@ -403,16 +469,8 @@ public final class Mapper { */ public void removeWrapper(String hostName, String contextPath, String version, String path) { - MappedHost host = exactFind(hosts, hostName); - if (host == null) { - return; - } - MappedContext context = exactFind(host.contextList.contexts, - contextPath); - if (context == null) { - return; - } - ContextVersion contextVersion = exactFind(context.versions, version); + ContextVersion contextVersion = findContextVersion(hostName, + contextPath, version, true); if (contextVersion == null) { return; } @@ -494,20 +552,9 @@ public final class Mapper { */ public void addWelcomeFile(String hostName, String contextPath, String version, String welcomeFile) { - MappedHost host = exactFind(hosts, hostName); - if (host == null) { - return; - } - MappedContext context = exactFind(host.contextList.contexts, - contextPath); - if (context == null) { - log.error("No context found: " + contextPath); - return; - } - ContextVersion contextVersion = exactFind(context.versions, version); + ContextVersion contextVersion = findContextVersion(hostName, + contextPath, version, false); if (contextVersion == null) { - log.error("No context version found: " + contextPath + " " - + version); return; } int len = contextVersion.welcomeResources.length + 1; @@ -527,20 +574,9 @@ public final class Mapper { */ public void removeWelcomeFile(String hostName, String contextPath, String version, String welcomeFile) { - MappedHost host = exactFind(hosts, hostName); - if (host == null) { - return; - } - MappedContext context = exactFind(host.contextList.contexts, - contextPath); - if (context == null) { - log.error("No context found: " + contextPath); - return; - } - ContextVersion contextVersion = exactFind(context.versions, version); + ContextVersion contextVersion = findContextVersion(hostName, + contextPath, version, false); if (contextVersion == null) { - log.error("No context version found: " + contextPath + " " - + version); return; } int match = -1; @@ -571,20 +607,9 @@ public final class Mapper { */ public void clearWelcomeFiles(String hostName, String contextPath, String version) { - MappedHost host = exactFind(hosts, hostName); - if (host == null) { - return; - } - MappedContext context = exactFind(host.contextList.contexts, - contextPath); - if (context == null) { - log.error("No context found: " + contextPath); - return; - } - ContextVersion contextVersion = exactFind(context.versions, version); + ContextVersion contextVersion = findContextVersion(hostName, + contextPath, version, false); if (contextVersion == null) { - log.error("No context version found: " + contextPath + " " - + version); return; } contextVersion.welcomeResources = new String[0]; Modified: tomcat/trunk/java/org/apache/catalina/mapper/MapperListener.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/mapper/MapperListener.java?rev=1606714&r1=1606713&r2=1606714&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/catalina/mapper/MapperListener.java (original) +++ tomcat/trunk/java/org/apache/catalina/mapper/MapperListener.java Mon Jun 30 12:37:38 2014 @@ -16,6 +16,9 @@ */ package org.apache.catalina.mapper; +import java.util.ArrayList; +import java.util.List; + import org.apache.catalina.Container; import org.apache.catalina.ContainerEvent; import org.apache.catalina.ContainerListener; @@ -319,13 +322,14 @@ public class MapperListener extends Life */ private void unregisterWrapper(Wrapper wrapper) { - String contextPath = ((Context) wrapper.getParent()).getPath(); + Context context = ((Context) wrapper.getParent()); + String contextPath = context.getPath(); String wrapperName = wrapper.getName(); if ("/".equals(contextPath)) { contextPath = ""; } - String version = ((Context) wrapper.getParent()).getWebappVersion(); + String version = context.getWebappVersion(); String hostName = wrapper.getParent().getParent().getName(); String[] mappings = wrapper.findMappings(); @@ -354,14 +358,21 @@ public class MapperListener extends Life WebResourceRoot resources = context.getResources(); String[] welcomeFiles = context.findWelcomeFiles(); - - mapper.addContextVersion(host.getName(), host, contextPath, - context.getWebappVersion(), context, welcomeFiles, resources); + List<WrapperMappingInfo> wrappers = new ArrayList<>(); 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, service)); + } } + mapper.addContextVersion(host.getName(), host, contextPath, + context.getWebappVersion(), context, welcomeFiles, resources, + wrappers); + if(log.isDebugEnabled()) { log.debug(sm.getString("mapperListener.registerContext", contextPath, service)); @@ -400,7 +411,6 @@ 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)) { @@ -409,19 +419,34 @@ public class MapperListener extends Life String version = context.getWebappVersion(); String hostName = context.getParent().getName(); - String[] mappings = wrapper.findMappings(); + List<WrapperMappingInfo> wrappers = new ArrayList<>(); + prepareWrapperMappingInfo(context, wrapper, wrappers); + mapper.addWrappers(hostName, contextPath, version, wrappers); + if(log.isDebugEnabled()) { + log.debug(sm.getString("mapperListener.registerWrapper", + wrapper.getName(), contextPath, service)); + } + } + + /** + * 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, service)); + wrappers.add(new WrapperMappingInfo(mapping, wrapper, jspWildCard, + resourceOnly)); } } Added: tomcat/trunk/java/org/apache/catalina/mapper/WrapperMappingInfo.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/mapper/WrapperMappingInfo.java?rev=1606714&view=auto ============================================================================== --- tomcat/trunk/java/org/apache/catalina/mapper/WrapperMappingInfo.java (added) +++ tomcat/trunk/java/org/apache/catalina/mapper/WrapperMappingInfo.java Mon Jun 30 12:37:38 2014 @@ -0,0 +1,55 @@ +/* + * 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. + */ +package org.apache.catalina.mapper; + +import org.apache.catalina.Wrapper; + +/** + * Encapsulates information used to register a Wrapper mapping. + */ +public class WrapperMappingInfo { + + private final String mapping; + private final Wrapper wrapper; + private final boolean jspWildCard; + private final boolean resourceOnly; + + public WrapperMappingInfo(String mapping, Wrapper wrapper, + boolean jspWildCard, boolean resourceOnly) { + this.mapping = mapping; + this.wrapper = wrapper; + this.jspWildCard = jspWildCard; + this.resourceOnly = resourceOnly; + } + + public String getMapping() { + return mapping; + } + + public Wrapper getWrapper() { + return wrapper; + } + + public boolean isJspWildCard() { + return jspWildCard; + } + + public boolean isResourceOnly() { + return resourceOnly; + } + +} Propchange: tomcat/trunk/java/org/apache/catalina/mapper/WrapperMappingInfo.java ------------------------------------------------------------------------------ svn:eol-style = native Modified: tomcat/trunk/test/org/apache/catalina/mapper/TestMapper.java URL: http://svn.apache.org/viewvc/tomcat/trunk/test/org/apache/catalina/mapper/TestMapper.java?rev=1606714&r1=1606713&r2=1606714&view=diff ============================================================================== --- tomcat/trunk/test/org/apache/catalina/mapper/TestMapper.java (original) +++ tomcat/trunk/test/org/apache/catalina/mapper/TestMapper.java Mon Jun 30 12:37:38 2014 @@ -16,6 +16,7 @@ */ package org.apache.catalina.mapper; +import java.util.Arrays; import java.util.HashMap; import java.util.concurrent.atomic.AtomicBoolean; @@ -95,30 +96,39 @@ public class TestMapper extends LoggingB Host host = createHost("blah7"); mapper.addContextVersion("iowejoiejfoiew", host, "", - "0", createContext("context0"), new String[0], null); + "0", createContext("context0"), new String[0], null, null); mapper.addContextVersion("iowejoiejfoiew", host, "/foo", - "0", createContext("context1"), new String[0], null); + "0", createContext("context1"), new String[0], null, null); mapper.addContextVersion("iowejoiejfoiew", host, "/foo/bar", - "0", createContext("context2"), welcomes, null); - mapper.addContextVersion("iowejoiejfoiew", host, "/foo/bar/bla", - "0", createContext("context3"), new String[0], null); - - mapper.addWrapper("iowejoiejfoiew", "/foo/bar", "0", "/fo/*", - createWrapper("wrapper0"), false, false); - mapper.addWrapper("iowejoiejfoiew", "/foo/bar", "0", "/", - createWrapper("wrapper1"), false, false); - mapper.addWrapper("iowejoiejfoiew", "/foo/bar", "0", "/blh", - createWrapper("wrapper2"), false, false); - mapper.addWrapper("iowejoiejfoiew", "/foo/bar", "0", "*.jsp", - createWrapper("wrapper3"), false, false); - mapper.addWrapper("iowejoiejfoiew", "/foo/bar", "0", "/blah/bou/*", - createWrapper("wrapper4"), false, false); - mapper.addWrapper("iowejoiejfoiew", "/foo/bar", "0", "/blah/bobou/*", - createWrapper("wrapper5"), false, false); - mapper.addWrapper("iowejoiejfoiew", "/foo/bar", "0", "*.htm", - createWrapper("wrapper6"), false, false); - mapper.addWrapper("iowejoiejfoiew", "/foo/bar/bla", "0", "/bobou/*", - createWrapper("wrapper7"), false, false); + "0", createContext("context2"), welcomes, null, null); + + mapper.addWrappers("iowejoiejfoiew", "/foo/bar", "0", Arrays + .asList(new WrapperMappingInfo[] { + new WrapperMappingInfo("/fo/*", + createWrapper("wrapper0"), false, false), + new WrapperMappingInfo("/", createWrapper("wrapper1"), + false, false), + new WrapperMappingInfo("/blh", + createWrapper("wrapper2"), false, false), + new WrapperMappingInfo("*.jsp", + createWrapper("wrapper3"), false, false), + new WrapperMappingInfo("/blah/bou/*", + createWrapper("wrapper4"), false, false), + new WrapperMappingInfo("/blah/bobou/*", + createWrapper("wrapper5"), false, false), + new WrapperMappingInfo("*.htm", + createWrapper("wrapper6"), false, false) })); + + mapper.addContextVersion( + "iowejoiejfoiew", + host, + "/foo/bar/bla", + "0", + createContext("context3"), + new String[0], + null, + Arrays.asList(new WrapperMappingInfo[] { new WrapperMappingInfo( + "/bobou/*", createWrapper("wrapper7"), false, false) })); } @Test @@ -259,15 +269,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() { @@ -278,7 +288,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/trunk/webapps/docs/changelog.xml URL: http://svn.apache.org/viewvc/tomcat/trunk/webapps/docs/changelog.xml?rev=1606714&r1=1606713&r2=1606714&view=diff ============================================================================== --- tomcat/trunk/webapps/docs/changelog.xml (original) +++ tomcat/trunk/webapps/docs/changelog.xml Mon Jun 30 12:37:38 2014 @@ -77,10 +77,14 @@ work in <code>Mapper</code>. (kkolinko) </fix> <scode> - Remove <code>context</code> and <code>wrapper</code> fields and - deprecate their setters in <code>Request</code> class. (kkolinko) + Remove <code>context</code> and <code>wrapper</code> fields in + <code>Request</code> class and deprecate their setters. (kkolinko) </scode> <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