New helper class to provide web.xml to those Jasper classes that need to parse it...
authormarkt <markt@13f79535-47bb-0310-9956-ffa450edef68>
Wed, 30 Dec 2009 16:51:52 +0000 (16:51 +0000)
committermarkt <markt@13f79535-47bb-0310-9956-ffa450edef68>
Wed, 30 Dec 2009 16:51:52 +0000 (16:51 +0000)
git-svn-id: https://svn.apache.org/repos/asf/tomcat/trunk@894672 13f79535-47bb-0310-9956-ffa450edef68

java/org/apache/jasper/compiler/JspConfig.java
java/org/apache/jasper/compiler/TldLocationsCache.java
java/org/apache/jasper/compiler/WebXml.java [new file with mode: 0644]
java/org/apache/jasper/resources/LocalStrings.properties

index ac9fd6f..0fa529d 100644 (file)
 
 package org.apache.jasper.compiler;
 
-import java.io.InputStream;
 import java.util.Iterator;
 import java.util.Vector;
-import java.net.URL;
 
 import javax.servlet.ServletContext;
 
@@ -29,7 +27,6 @@ import org.apache.jasper.xmlparser.ParserUtils;
 import org.apache.jasper.xmlparser.TreeNode;
 import org.apache.juli.logging.Log;
 import org.apache.juli.logging.LogFactory;
-import org.xml.sax.InputSource;
 
 /**
  * Handles the jsp-config element in WEB_INF/web.xml.  This is used
@@ -41,8 +38,6 @@ import org.xml.sax.InputSource;
 
 public class JspConfig {
 
-    private static final String WEB_XML = "/WEB-INF/web.xml";
-
     // Logger
     private final Log log = LogFactory.getLog(JspConfig.class);
 
@@ -75,23 +70,16 @@ public class JspConfig {
         return 2.3;
     }
 
-    private void processWebDotXml(ServletContext ctxt) throws JasperException {
+    private void processWebDotXml() throws JasperException {
 
-        InputStream is = null;
+        WebXml webXml = null;
 
         try {
-            URL uri = ctxt.getResource(WEB_XML);
-            if (uri == null) {
-                // no web.xml
-                return;
-            }
-
-            is = uri.openStream();
-            InputSource ip = new InputSource(is);
-            ip.setSystemId(uri.toExternalForm()); 
-
+            webXml = new WebXml(ctxt);
+            
             ParserUtils pu = new ParserUtils();
-            TreeNode webApp = pu.parseXMLDocument(WEB_XML, ip);
+            TreeNode webApp = pu.parseXMLDocument(webXml.getSystemId(),
+                    webXml.getInputSource());
 
             if (webApp == null
                     || getVersion(webApp) < 2.4) {
@@ -222,10 +210,8 @@ public class JspConfig {
         } catch (Exception ex) {
             throw new JasperException(ex);
         } finally {
-            if (is != null) {
-                try {
-                    is.close();
-                } catch (Throwable t) {}
+            if (webXml != null) {
+                webXml.close();
             }
         }
     }
@@ -235,7 +221,7 @@ public class JspConfig {
         if (!initialized) {
             synchronized (this) {
                 if (!initialized) {
-                    processWebDotXml(ctxt);
+                    processWebDotXml();
                     defaultJspProperty = new JspProperty(defaultIsXml,
                             defaultIsELIgnored,
                             defaultIsScriptingInvalid,
index 4a6488e..04e20cc 100644 (file)
@@ -81,9 +81,6 @@ import org.apache.tomcat.JarScannerCallback;
 
 public class TldLocationsCache {
 
-    // Logger
-    private final Log log = LogFactory.getLog(TldLocationsCache.class);
-
     /**
      * The types of URI one may specify for a tag library
      */
@@ -93,8 +90,6 @@ public class TldLocationsCache {
 
     private static final String WEB_INF = "/WEB-INF/";
     private static final String WEB_INF_LIB = "/WEB-INF/lib/";
-    private static final String WEB_XML = "/WEB-INF/web.xml";
-    private static final String FILE_PROTOCOL = "file:";
     private static final String JAR_EXT = ".jar";
     private static final String TLD_EXT = ".tld";
 
@@ -238,67 +233,17 @@ public class TldLocationsCache {
      * This is not kept in sync with o.a.c.startup.TldConfig as the Jasper only
      * needs the URI to TLD mappings from scan web.xml whereas TldConfig needs
      * to scan the actual TLD files.
-     * 
-     * Search order is:
-     * - web.xml scanned by Tomcat and placed in context attribute
-     * - location specified by ALT_DD_ATTR
-     * - /WEB-INF/web.xml
      */    
     private void tldScanWebXml() throws Exception {
 
-        InputStream is = null;
-        String systemId = null;
-
+        WebXml webXml = null;
         try {
-            // Is a web.xml provided as context attribute?
-            String webXml = (String) ctxt.getAttribute(
-                    org.apache.tomcat.util.scan.Constants.MERGED_WEB_XML);
-            if (webXml != null) {
-                is = new ByteArrayInputStream(webXml.getBytes());
-                systemId = org.apache.tomcat.util.scan.Constants.MERGED_WEB_XML;
-            }
-            
-            // If not available as context attribute, look for an alternative
-            // location
-            if (is == null) {
-                // Acquire input stream to web application deployment descriptor
-                String altDDName = (String)ctxt.getAttribute(
-                                                        Constants.ALT_DD_ATTR);
-                if (altDDName != null) {
-                    try {
-                        URL uri =
-                            new URL(FILE_PROTOCOL+altDDName.replace('\\', '/'));
-                        is = uri.openStream();
-                        systemId = uri.toExternalForm();
-                    } catch (MalformedURLException e) {
-                        log.warn(Localizer.getMessage(
-                                "jsp.error.internal.filenotfound",
-                                altDDName));
-                    }
-                }
-            }
+            webXml = new WebXml(ctxt);
             
-            // Finally, try the default /WEB-INF/web.xml
-            if (is == null) {
-                URL uri = ctxt.getResource(WEB_XML);
-                if (uri == null) {
-                    log.warn(Localizer.getMessage(
-                            "jsp.error.internal.filenotfound", WEB_XML));
-                } else {
-                    is = uri.openStream();
-                    systemId = uri.toExternalForm();
-                }
-            }
-
-            if (is == null) {
-                return;
-            }
-            InputSource ip = new InputSource(is);
-            ip.setSystemId(systemId); 
-
             // Parse the web application deployment descriptor
             TreeNode webtld = null;
-            webtld = new ParserUtils().parseXMLDocument(systemId, ip);
+            webtld = new ParserUtils().parseXMLDocument(webXml.getSystemId(),
+                    webXml.getInputSource());
 
             // Allow taglib to be an element of the root or jsp-config (JSP2.0)
             TreeNode jspConfig = webtld.findChild("jsp-config");
@@ -332,10 +277,8 @@ public class TldLocationsCache {
                 mappings.put(tagUri, new String[] { tagLoc, tagLoc2 });
             }
         } finally {
-            if (is != null) {
-                try {
-                    is.close();
-                } catch (Throwable t) {}
+            if (webXml != null) {
+                webXml.close();
             }
         }
     }
diff --git a/java/org/apache/jasper/compiler/WebXml.java b/java/org/apache/jasper/compiler/WebXml.java
new file mode 100644 (file)
index 0000000..d6ffb4e
--- /dev/null
@@ -0,0 +1,120 @@
+/*
+ * 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.jasper.compiler;
+
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.MalformedURLException;
+import java.net.URL;
+
+import javax.servlet.ServletContext;
+
+import org.apache.jasper.Constants;
+import org.apache.juli.logging.Log;
+import org.apache.juli.logging.LogFactory;
+import org.xml.sax.InputSource;
+
+/**
+ * Provides Jasper with a standard mechanism for gaining access to the web.xml
+ * file associated with the current application. This isn't as simple as looking
+ * in /WEB-INF/web.xml. In embedded scenarios, an alternative web.xml may be
+ * provided and in Servlet 3.0 / JSP 2.2 environments an application's web.xml
+ * may be the result of merging a number of web-fragment.xml files and/or
+ * annotations with the main web.xml
+ * 
+ * Clients *must* ensure that they call {@link #close()} to clean up resources. 
+ */
+public class WebXml {
+    private static final String FILE_PROTOCOL = "file:";
+    private static final String WEB_XML = "/WEB-INF/web.xml";
+
+    private final Log log = LogFactory.getLog(WebXml.class);
+            
+    private InputStream is;
+    private InputSource ip;
+    private String systemId;
+
+    public WebXml(ServletContext ctxt) throws IOException {
+        // Is a web.xml provided as context attribute?
+        String webXml = (String) ctxt.getAttribute(
+                org.apache.tomcat.util.scan.Constants.MERGED_WEB_XML);
+        if (webXml != null) {
+            is = new ByteArrayInputStream(webXml.getBytes());
+            systemId = org.apache.tomcat.util.scan.Constants.MERGED_WEB_XML;
+        }
+        
+        // If not available as context attribute, look for an alternative
+        // location
+        if (is == null) {
+            // Acquire input stream to web application deployment descriptor
+            String altDDName = (String)ctxt.getAttribute(
+                                                    Constants.ALT_DD_ATTR);
+            if (altDDName != null) {
+                try {
+                    URL uri =
+                        new URL(FILE_PROTOCOL+altDDName.replace('\\', '/'));
+                    is = uri.openStream();
+                    systemId = uri.toExternalForm();
+                } catch (MalformedURLException e) {
+                    log.warn(Localizer.getMessage(
+                            "jsp.error.internal.filenotfound",
+                            altDDName));
+                }
+            }
+        }
+        
+        // Finally, try the default /WEB-INF/web.xml
+        if (is == null) {
+            URL uri = ctxt.getResource(WEB_XML);
+            if (uri == null) {
+                log.warn(Localizer.getMessage(
+                        "jsp.error.internal.filenotfound", WEB_XML));
+            } else {
+                is = uri.openStream();
+                systemId = uri.toExternalForm();
+            }
+        }
+
+        if (is == null) {
+            systemId = null;
+        } else {
+            ip = new InputSource(is);
+            ip.setSystemId(systemId);
+        }
+    }
+    
+    public String getSystemId() {
+        return systemId;
+    }
+
+    public InputSource getInputSource() {
+        return ip;
+    }
+
+    public void close() {
+        if (is != null) {
+            try {
+                is.close();
+            } catch (IOException e) {
+                log.error(Localizer.getMessage(
+                        "jsp.error.stream.close.failed"));
+            }
+        }
+    }
+}
index 725f7fc..d1b5390 100644 (file)
@@ -87,6 +87,7 @@ jsp.error.not.impl.taglib=Internal error: Tag extensions not implemented
 jsp.error.include.missing.file=Missing file argument to include
 jsp.error.include.bad.file=Bad file argument to include 
 jsp.error.include.exception=Unable to include {0}
+jsp.error.stream.close.failed=Failed to close stream
 jsp.error.stream.closed=Stream closed
 jsp.error.invalid.forward=Invalid forward tag
 jsp.error.unknownException=Unhandled error! You might want to consider having an error page \