Author: markt
Date: Thu Jan 20 16:35:55 2011
New Revision: 1061376
URL: http://svn.apache.org/viewvc?rev=1061376&view=rev
Log:
Fix https://issues.apache.org/bugzilla/show_bug.cgi?id=50535
Provid an option (disabled by default) to serve resources from
/WEB-INF/classes/META-INF/resources
Added:
tomcat/trunk/test/webapp-3.0-fragments/WEB-INF/classes/META-INF/
tomcat/trunk/test/webapp-3.0-fragments/WEB-INF/classes/META-INF/resources/
tomcat/trunk/test/webapp-3.0-fragments/WEB-INF/classes/META-INF/resources/resourceG.jsp
(with props)
Modified:
tomcat/trunk/java/org/apache/catalina/core/StandardContext.java
tomcat/trunk/java/org/apache/catalina/startup/ContextConfig.java
tomcat/trunk/java/org/apache/naming/resources/BaseDirContext.java
tomcat/trunk/test/org/apache/catalina/core/TestStandardContextResources.java
tomcat/trunk/webapps/docs/config/context.xml
Modified: tomcat/trunk/java/org/apache/catalina/core/StandardContext.java
URL:
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/core/StandardContext.java?rev=1061376&r1=1061375&r2=1061376&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/core/StandardContext.java (original)
+++ tomcat/trunk/java/org/apache/catalina/core/StandardContext.java Thu Jan 20
16:35:55 2011
@@ -817,9 +817,22 @@ public class StandardContext extends Con
private String webappVersion = "";
+ private boolean addWebinfClassesResources = false;
+
// ----------------------------------------------------- Context Properties
+ public void setAddWebinfClassesResources(
+ boolean addWebinfClassesResources) {
+ this.addWebinfClassesResources = addWebinfClassesResources;
+ }
+
+
+ public boolean getAddWebinfClassesResources() {
+ return addWebinfClassesResources;
+ }
+
+
@Override
public void setWebappVersion(String webappVersion) {
if (null == webappVersion) {
@@ -4640,6 +4653,20 @@ public class StandardContext extends Con
((BaseDirContext) webappResources).allocate();
// Alias support
((BaseDirContext) webappResources).setAliases(getAliases());
+
+ if (effectiveMajorVersion >=3 && addWebinfClassesResources) {
+ try {
+ DirContext webInfCtx =
+ (DirContext) webappResources.lookup(
+ "/WEB-INF/classes");
+ // Do the lookup to make sure it exists
+ webInfCtx.lookup("META-INF/resources");
+ ((BaseDirContext) webappResources).addAltDirContext(
+ webInfCtx);
+ } catch (NamingException e) {
+ // Doesn't exist - ignore and carry on
+ }
+ }
}
// Register the cache in JMX
if (isCachingAllowed()) {
Modified: tomcat/trunk/java/org/apache/catalina/startup/ContextConfig.java
URL:
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/startup/ContextConfig.java?rev=1061376&r1=1061375&r2=1061376&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/startup/ContextConfig.java (original)
+++ tomcat/trunk/java/org/apache/catalina/startup/ContextConfig.java Thu Jan 20
16:35:55 2011
@@ -1294,6 +1294,8 @@ public class ContextConfig
}
}
processResourceJARs(resourceJars);
+ // See also StandardContext.resourcesStart() for
+ // WEB-INF/classes/META-INF/resources configuration
}
// Only look for ServletContainerInitializer if metadata is not
Modified: tomcat/trunk/java/org/apache/naming/resources/BaseDirContext.java
URL:
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/naming/resources/BaseDirContext.java?rev=1061376&r1=1061375&r2=1061376&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/naming/resources/BaseDirContext.java (original)
+++ tomcat/trunk/java/org/apache/naming/resources/BaseDirContext.java Thu Jan
20 16:35:55 2011
@@ -167,7 +167,15 @@ public abstract class BaseDirContext imp
}
}
-
+
+ /**
+ * Add an alternative DirContext (must contain META-INF/resources)
directly.
+ */
+ public void addAltDirContext(DirContext altDirContext) {
+ altDirContexts.add(altDirContext);
+ }
+
+
/**
* Add an alias.
*/
Modified:
tomcat/trunk/test/org/apache/catalina/core/TestStandardContextResources.java
URL:
http://svn.apache.org/viewvc/tomcat/trunk/test/org/apache/catalina/core/TestStandardContextResources.java?rev=1061376&r1=1061375&r2=1061376&view=diff
==============================================================================
---
tomcat/trunk/test/org/apache/catalina/core/TestStandardContextResources.java
(original)
+++
tomcat/trunk/test/org/apache/catalina/core/TestStandardContextResources.java
Thu Jan 20 16:35:55 2011
@@ -71,6 +71,35 @@ public class TestStandardContextResource
"<p>resourceD.jsp in resources.jar</p>");
assertPageContains("/test/folder/resourceE.jsp",
"<p>resourceE.jsp in the web application</p>");
+ assertPageContains("/test/resourceG.jsp",
+ "<p>resourceG.jsp in WEB-INF/classes</p>", 404);
+ }
+
+ public void testResourcesWebInfClasses() throws Exception {
+ Tomcat tomcat = getTomcatInstance();
+
+ // app dir is relative to server home
+ File appDir = new File("test/webapp-3.0-fragments");
+
+ // Need to cast to be able to set StandardContext specific attribute
+ StandardContext ctxt = (StandardContext)
+ tomcat.addWebapp(null, "/test", appDir.getAbsolutePath());
+ ctxt.setAddWebinfClassesResources(true);
+
+ tomcat.start();
+
+ assertPageContains("/test/resourceA.jsp",
+ "<p>resourceA.jsp in the web application</p>");
+ assertPageContains("/test/resourceB.jsp",
+ "<p>resourceB.jsp in resources.jar</p>");
+ assertPageContains("/test/folder/resourceC.jsp",
+ "<p>resourceC.jsp in the web application</p>");
+ assertPageContains("/test/folder/resourceD.jsp",
+ "<p>resourceD.jsp in resources.jar</p>");
+ assertPageContains("/test/folder/resourceE.jsp",
+ "<p>resourceE.jsp in the web application</p>");
+ assertPageContains("/test/resourceG.jsp",
+ "<p>resourceG.jsp in WEB-INF/classes</p>");
}
public void testResourcesAbsoluteOrdering() throws Exception {
@@ -196,11 +225,22 @@ public class TestStandardContextResource
}
}
- private void assertPageContains(String pageUrl, String expected)
+ private void assertPageContains(String pageUrl, String expectedBody)
throws IOException {
- ByteChunk res = getUrl("http://localhost:" + getPort() + pageUrl);
- String result = res.toString();
- assertTrue(result, result.indexOf(expected) > 0);
+ assertPageContains(pageUrl, expectedBody, 200);
+ }
+
+ private void assertPageContains(String pageUrl, String expectedBody,
+ int expectedStatus) throws IOException {
+ ByteChunk res = new ByteChunk();
+ int sc = getUrl("http://localhost:" + getPort() + pageUrl, res, null);
+
+ assertEquals(expectedStatus, sc);
+
+ if (expectedStatus == 200) {
+ String result = res.toString();
+ assertTrue(result, result.indexOf(expectedBody) > 0);
+ }
}
}
Added:
tomcat/trunk/test/webapp-3.0-fragments/WEB-INF/classes/META-INF/resources/resourceG.jsp
URL:
http://svn.apache.org/viewvc/tomcat/trunk/test/webapp-3.0-fragments/WEB-INF/classes/META-INF/resources/resourceG.jsp?rev=1061376&view=auto
==============================================================================
---
tomcat/trunk/test/webapp-3.0-fragments/WEB-INF/classes/META-INF/resources/resourceG.jsp
(added)
+++
tomcat/trunk/test/webapp-3.0-fragments/WEB-INF/classes/META-INF/resources/resourceG.jsp
Thu Jan 20 16:35:55 2011
@@ -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.
+--%>
+<%--
+ Resource file that is present both in the web application and in the
+ WEB-INF/lib/resources.jar file. The one in the web application should win.
+--%>
+<p>resourceG.jsp in WEB-INF/classes</p>
Propchange:
tomcat/trunk/test/webapp-3.0-fragments/WEB-INF/classes/META-INF/resources/resourceG.jsp
------------------------------------------------------------------------------
svn:eol-style = native
Modified: tomcat/trunk/webapps/docs/config/context.xml
URL:
http://svn.apache.org/viewvc/tomcat/trunk/webapps/docs/config/context.xml?rev=1061376&r1=1061375&r2=1061376&view=diff
==============================================================================
--- tomcat/trunk/webapps/docs/config/context.xml (original)
+++ tomcat/trunk/webapps/docs/config/context.xml Thu Jan 20 16:35:55 2011
@@ -397,6 +397,17 @@
<attributes>
+ <attribute name="addWebinfClassesResources" required="false">
+ <p>This attribute controls if, in addition to static resources being
+ served from <code>META-INF/resources</code> inside web application JAR
+ files, static resources are also served from
+ <code>WEB-INF/classes/META-INF/resources</code>. This only applies to
+ web applications with a major version of 3 or higher. Since this is a
+ proprietary extension to the Servlet 3 specification, it is disabled by
+ default. To enable this feature, set the attribute to
<code>true</code>.
+ </p>
+ </attribute>
+
<attribute name="aliases" required="false">
<p>This attribute provides a list of external locations from which to
load resources for this context. The list of aliases should be of
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]