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;
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
public class JspConfig {
- private static final String WEB_XML = "/WEB-INF/web.xml";
-
// Logger
private final Log log = LogFactory.getLog(JspConfig.class);
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) {
} catch (Exception ex) {
throw new JasperException(ex);
} finally {
- if (is != null) {
- try {
- is.close();
- } catch (Throwable t) {}
+ if (webXml != null) {
+ webXml.close();
}
}
}
if (!initialized) {
synchronized (this) {
if (!initialized) {
- processWebDotXml(ctxt);
+ processWebDotXml();
defaultJspProperty = new JspProperty(defaultIsXml,
defaultIsELIgnored,
defaultIsScriptingInvalid,
public class TldLocationsCache {
- // Logger
- private final Log log = LogFactory.getLog(TldLocationsCache.class);
-
/**
* The types of URI one may specify for a tag library
*/
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";
* 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");
mappings.put(tagUri, new String[] { tagLoc, tagLoc2 });
}
} finally {
- if (is != null) {
- try {
- is.close();
- } catch (Throwable t) {}
+ if (webXml != null) {
+ webXml.close();
}
}
}
--- /dev/null
+/*
+ * 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"));
+ }
+ }
+ }
+}
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 \