Author: markt
Date: Sat Dec 7 20:43:46 2013
New Revision: 1548966
URL: http://svn.apache.org/r1548966
Log:
Fix https://issues.apache.org/bugzilla/show_bug.cgi?id=55811
Do not parse web-fragment.xml files when an empty absolute-ordering element is
present.
Modified:
tomcat/trunk/java/org/apache/catalina/startup/ContextConfig.java
tomcat/trunk/java/org/apache/jasper/servlet/JspCServletContext.java
tomcat/trunk/java/org/apache/tomcat/util/descriptor/web/FragmentJarScannerCallback.java
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=1548966&r1=1548965&r2=1548966&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/startup/ContextConfig.java (original)
+++ tomcat/trunk/java/org/apache/catalina/startup/ContextConfig.java Sat Dec 7
20:43:46 2013
@@ -1115,7 +1115,7 @@ public class ContextConfig implements Li
// provided by the container. If any of the application JARs have a
// web-fragment.xml it will be parsed at this point. web-fragment.xml
// files are ignored for container provided JARs.
- Map<String,WebXml> fragments = processJarsForWebFragments();
+ Map<String,WebXml> fragments = processJarsForWebFragments(webXml);
// Step 2. Order the fragments.
Set<WebXml> orderedFragments = null;
@@ -1840,15 +1840,23 @@ public class ContextConfig implements Li
*
* @return A map of JAR name to processed web fragment (if any)
*/
- protected Map<String,WebXml> processJarsForWebFragments() {
+ protected Map<String,WebXml> processJarsForWebFragments(WebXml
application) {
JarScanner jarScanner = context.getJarScanner();
boolean delegate = false;
if (context instanceof StandardContext) {
delegate = ((StandardContext) context).getDelegate();
}
+ boolean parseRequired = true;
+ Set<String> absoluteOrder = application.getAbsoluteOrdering();
+ if (absoluteOrder != null && absoluteOrder.isEmpty() &&
+ !context.getXmlValidation()) {
+ // Skip parsing when there is an empty absolute ordering and
+ // validation is not enabled
+ parseRequired = false;
+ }
FragmentJarScannerCallback callback =
- new FragmentJarScannerCallback(webXmlParser, delegate);
+ new FragmentJarScannerCallback(webXmlParser, delegate,
parseRequired);
jarScanner.scan(JarScanType.PLUGGABILITY,
context.getServletContext(), callback);
Modified: tomcat/trunk/java/org/apache/jasper/servlet/JspCServletContext.java
URL:
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/jasper/servlet/JspCServletContext.java?rev=1548966&r1=1548965&r2=1548966&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/jasper/servlet/JspCServletContext.java
(original)
+++ tomcat/trunk/java/org/apache/jasper/servlet/JspCServletContext.java Sat Dec
7 20:43:46 2013
@@ -143,6 +143,13 @@ public class JspCServletContext implemen
return webXml;
}
+ // If an empty absolute ordering element is present, fragment
processing
+ // may be skipped.
+ Set<String> absoluteOrdering = webXml.getAbsoluteOrdering();
+ if (absoluteOrdering != null && absoluteOrdering.isEmpty()) {
+ return webXml;
+ }
+
Map<String, WebXml> fragments = scanForFragments(webXmlParser);
Set<WebXml> orderedFragments = WebXml.orderWebFragments(webXml,
fragments, this);
@@ -158,7 +165,8 @@ public class JspCServletContext implemen
// TODO - configure filter rules from Ant rather then system properties
scanner.setJarScanFilter(new StandardJarScanFilter());
- FragmentJarScannerCallback callback = new
FragmentJarScannerCallback(webXmlParser, false);
+ FragmentJarScannerCallback callback =
+ new FragmentJarScannerCallback(webXmlParser, false, true);
scanner.scan(JarScanType.PLUGGABILITY, this, callback);
if (!callback.isOk()) {
throw new
JasperException(Localizer.getMessage("jspc.error.invalidFragment"));
Modified:
tomcat/trunk/java/org/apache/tomcat/util/descriptor/web/FragmentJarScannerCallback.java
URL:
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/util/descriptor/web/FragmentJarScannerCallback.java?rev=1548966&r1=1548965&r2=1548966&view=diff
==============================================================================
---
tomcat/trunk/java/org/apache/tomcat/util/descriptor/web/FragmentJarScannerCallback.java
(original)
+++
tomcat/trunk/java/org/apache/tomcat/util/descriptor/web/FragmentJarScannerCallback.java
Sat Dec 7 20:43:46 2013
@@ -39,12 +39,15 @@ public class FragmentJarScannerCallback
"META-INF/web-fragment.xml";
private final WebXmlParser webXmlParser;
private final boolean delegate;
+ private final boolean parseRequired;
private final Map<String,WebXml> fragments = new HashMap<>();
private boolean ok = true;
- public FragmentJarScannerCallback(WebXmlParser webXmlParser, boolean
delegate) {
+ public FragmentJarScannerCallback(WebXmlParser webXmlParser, boolean
delegate,
+ boolean parseRequired) {
this.webXmlParser = webXmlParser;
this.delegate = delegate;
+ this.parseRequired = parseRequired;
}
@Override
@@ -61,8 +64,10 @@ public class FragmentJarScannerCallback
try {
// Only web application JARs are checked for web-fragment.xml
- // files
- if (isWebapp) {
+ // files.
+ // web-fragment.xml files don't need to be parsed if they are never
+ // going to be used.
+ if (isWebapp && parseRequired) {
jar = JarFactory.newInstance(url);
is = jar.getInputStream(FRAGMENT_LOCATION);
}
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]