File: WebXml.java

package info (click to toggle)
tomcat7 7.0.56-3%2Bdeb8u11
  • links: PTS, VCS
  • area: main
  • in suites: jessie
  • size: 35,688 kB
  • ctags: 41,823
  • sloc: java: 249,464; xml: 51,553; jsp: 3,037; sh: 1,361; perl: 269; makefile: 195
file content (121 lines) | stat: -rw-r--r-- 4,374 bytes parent folder | download | duplicates (6)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
/*
 * 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"));
            }
        }
    }
}