1
2
3
4
5 package org.rcfaces.core.internal.util;
6
7 import java.io.CharArrayReader;
8 import java.io.IOException;
9 import java.io.InputStream;
10 import java.net.URL;
11 import java.util.ArrayList;
12 import java.util.HashMap;
13 import java.util.List;
14 import java.util.Map;
15
16 import javax.servlet.ServletContext;
17
18 import org.apache.commons.digester.Digester;
19 import org.apache.commons.digester.Rule;
20 import org.apache.commons.logging.Log;
21 import org.apache.commons.logging.LogFactory;
22 import org.xml.sax.Attributes;
23 import org.xml.sax.EntityResolver;
24 import org.xml.sax.InputSource;
25
26
27
28
29
30
31 public class WebXmlParser {
32 private static final String REVISION = "$Revision: 1.18 $";
33
34 private static final Log LOG = LogFactory.getLog(WebXmlParser.class);
35
36 private static final String WEB_XML_PATH = "/WEB-INF/web.xml";
37
38 private static final ServletBean[] SERVLET_BEAN_EMPTY_ARRAY = new ServletBean[0];
39
40
41
42 private final Map servletByClassName = new HashMap();
43
44 private final Map servletByName = new HashMap();
45
46 public WebXmlParser(ServletContext servletContext) {
47
48
49 URL url;
50 try {
51 url = servletContext.getResource(WEB_XML_PATH);
52
53 } catch (IOException ex) {
54 LOG.error("Can not get resource '" + WEB_XML_PATH + "'.", ex);
55 return;
56 }
57
58 InputStream inputStream;
59 try {
60 inputStream = url.openStream();
61
62 } catch (IOException ex) {
63 LOG.error("Can not open resource '" + WEB_XML_PATH + "'.", ex);
64 return;
65 }
66
67 try {
68 parse(inputStream, url.toString());
69
70 } finally {
71 try {
72 inputStream.close();
73
74 } catch (IOException e) {
75 LOG.error(e);
76 }
77 }
78 }
79
80 public ServletBean[] getServletsByClassName(String className) {
81 List l = (List) servletByClassName.get(className);
82
83 if (l == null) {
84 return SERVLET_BEAN_EMPTY_ARRAY;
85 }
86
87 return (ServletBean[]) l.toArray(new ServletBean[l.size()]);
88 }
89
90 public ServletBean getServletByName(String name) {
91 return (ServletBean) servletByName.get(name);
92 }
93
94 private void parse(InputStream inputStream, String resourceName) {
95 Digester digester = new Digester();
96 digester.setUseContextClassLoader(true);
97
98 digester.setEntityResolver(new EntityResolver() {
99 private static final String REVISION = "$Revision: 1.18 $";
100
101 public InputSource resolveEntity(String string, String string1) {
102 return new InputSource(new CharArrayReader(new char[0]));
103 }
104
105 });
106
107 digester.addRule("web-app/servlet", new Rule() {
108 private static final String REVISION = "$Revision: 1.18 $";
109
110 public void begin(String namespace, String name,
111 Attributes attributes) throws Exception {
112
113 ServletBean servletBean = new ServletBean();
114
115 super.digester.push(servletBean);
116 }
117
118 public void end(String namespace, String name) throws Exception {
119 ServletBean servletBean = (ServletBean) super.digester.pop();
120
121 servletByName.put(servletBean.getName(), servletBean);
122
123 List l = (List) servletByClassName.get(servletBean.className);
124 if (l == null) {
125 l = new ArrayList(4);
126 servletByClassName.put(servletBean.className, l);
127 }
128
129 l.add(servletBean);
130 }
131 });
132 digester.addBeanPropertySetter("web-app/servlet/servlet-name", "name");
133 digester.addBeanPropertySetter("web-app/servlet/servlet-class",
134 "className");
135 digester.addRule("web-app/servlet-mapping", new Rule() {
136 private static final String REVISION = "$Revision: 1.18 $";
137
138 public void begin(String namespace, String name,
139 Attributes attributes) throws Exception {
140
141 ServletMapping servletMapping = new ServletMapping();
142
143 super.digester.push(servletMapping);
144 }
145
146 public void end(String namespace, String name) throws Exception {
147 ServletMapping servletMapping = (ServletMapping) super.digester
148 .pop();
149
150 ServletBean servletBean = getServletByName(servletMapping.servletName);
151 if (servletBean == null) {
152 LOG.error("Can not find servlet '"
153 + servletMapping.servletName + "'.");
154 return;
155 }
156
157 servletBean.urlPatterns.add(servletMapping.urlPattern);
158 }
159 });
160 digester.addBeanPropertySetter("web-app/servlet-mapping/servlet-name",
161 "servletName");
162 digester.addBeanPropertySetter("web-app/servlet-mapping/url-pattern",
163 "urlPattern");
164
165 try {
166 digester.parse(inputStream);
167
168 } catch (Exception e) {
169 LOG.error("Can not parse '" + resourceName + "'.", e);
170
171 } finally {
172 try {
173 inputStream.close();
174
175 } catch (IOException e) {
176 LOG.error("Can not close '" + resourceName + "'.", e);
177 }
178 }
179 }
180
181
182
183
184
185
186 public static class ServletBean {
187 private static final String REVISION = "$Revision: 1.18 $";
188
189 private String name;
190
191 private String className;
192
193 private List urlPatterns = new ArrayList();
194
195 public String getClassName() {
196 return className;
197 }
198
199 public String[] listUrlPatterns() {
200 return (String[]) urlPatterns
201 .toArray(new String[urlPatterns.size()]);
202 }
203
204 public String getName() {
205 return name;
206 }
207
208 public void setClassName(String className) {
209 this.className = className;
210 }
211
212 public void setName(String name) {
213 this.name = name;
214 }
215 }
216
217
218
219
220
221
222 public static class ServletMapping {
223 private static final String REVISION = "$Revision: 1.18 $";
224
225 private String servletName;
226
227 private String urlPattern;
228
229 public String getServletName() {
230 return servletName;
231 }
232
233 public void setServletName(String servletName) {
234 this.servletName = servletName;
235 }
236
237 public String getUrlPattern() {
238 return urlPattern;
239 }
240
241 public void setUrlPattern(String urlPattern) {
242 this.urlPattern = urlPattern;
243 }
244
245 }
246 }