View Javadoc

1   /*
2    * $Id: WebXmlParser.java,v 1.18 2011/06/16 09:29:41 jbmeslin Exp $
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   * @author Olivier Oeuillot (latest modification by $Author: jbmeslin $)
29   * @version $Revision: 1.18 $ $Date: 2011/06/16 09:29:41 $
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      // private final ServletContext servletContext;
41  
42      private final Map servletByClassName = new HashMap();
43  
44      private final Map servletByName = new HashMap();
45  
46      public WebXmlParser(ServletContext servletContext) {
47          // this.servletContext = servletContext;
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      * @author Olivier Oeuillot (latest modification by $Author: jbmeslin $)
184      * @version $Revision: 1.18 $ $Date: 2011/06/16 09:29:41 $
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      * @author Olivier Oeuillot (latest modification by $Author: jbmeslin $)
220      * @version $Revision: 1.18 $ $Date: 2011/06/16 09:29:41 $
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 }