| /* |
| * 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.IOException; |
| import java.io.InputStream; |
| import java.io.StringReader; |
| 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 stream; |
| private InputSource source; |
| 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) { |
| source = new InputSource(new StringReader(webXml)); |
| systemId = org.apache.tomcat.util.scan.Constants.MERGED_WEB_XML; |
| } |
| |
| // If not available as context attribute, look for an alternative |
| // location |
| if (source == 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('\\', '/')); |
| stream = uri.openStream(); |
| source = new InputSource(stream); |
| systemId = uri.toExternalForm(); |
| } catch (MalformedURLException e) { |
| log.warn(Localizer.getMessage( |
| "jsp.error.internal.filenotfound", |
| altDDName)); |
| } |
| } |
| } |
| |
| // Finally, try the default /WEB-INF/web.xml |
| if (source == null) { |
| URL uri = ctxt.getResource(WEB_XML); |
| if (uri == null) { |
| log.warn(Localizer.getMessage( |
| "jsp.error.internal.filenotfound", WEB_XML)); |
| } else { |
| stream = uri.openStream(); |
| source = new InputSource(stream); |
| systemId = uri.toExternalForm(); |
| } |
| } |
| |
| if (source == null) { |
| systemId = null; |
| } else { |
| source.setSystemId(systemId); |
| } |
| } |
| |
| public String getSystemId() { |
| return systemId; |
| } |
| |
| public InputSource getInputSource() { |
| return source; |
| } |
| |
| public void close() { |
| if (stream != null) { |
| try { |
| stream.close(); |
| } catch (IOException e) { |
| log.error(Localizer.getMessage( |
| "jsp.error.stream.close.failed")); |
| } |
| } |
| } |
| } |