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

Reply via email to