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: [email protected]
For additional commands, e-mail: [email protected]