1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package org.eclipse.jetty.webapp;
20
21 import java.net.URL;
22 import java.util.ArrayList;
23 import java.util.Iterator;
24 import java.util.List;
25
26 import javax.servlet.Servlet;
27
28 import org.eclipse.jetty.util.Loader;
29 import org.eclipse.jetty.util.log.Log;
30 import org.eclipse.jetty.util.log.Logger;
31 import org.eclipse.jetty.util.resource.Resource;
32 import org.eclipse.jetty.xml.XmlParser;
33 import org.xml.sax.InputSource;
34
35
36
37
38
39
40
41
42 public class WebDescriptor extends Descriptor
43 {
44 private static final Logger LOG = Log.getLogger(WebDescriptor.class);
45
46 protected static XmlParser _parserSingleton;
47 protected MetaDataComplete _metaDataComplete;
48 protected int _majorVersion = 3;
49 protected int _minorVersion = 0;
50 protected ArrayList<String> _classNames = new ArrayList<String>();
51 protected boolean _distributable;
52
53 protected boolean _isOrdered = false;
54 protected List<String> _ordering = new ArrayList<String>();
55
56 @Override
57 public void ensureParser() throws ClassNotFoundException
58 {
59 synchronized (WebDescriptor.class)
60 {
61 if (_parserSingleton == null)
62 _parserSingleton = newParser(isValidating());
63 }
64
65 if (_parserSingleton.isValidating()==isValidating())
66 _parser = _parserSingleton;
67 else
68 _parser = newParser(isValidating());
69 }
70
71 public static XmlParser newParser(boolean validating) throws ClassNotFoundException
72 {
73 XmlParser xmlParser=new XmlParser(validating)
74 {
75 boolean mapped=false;
76
77 @Override
78 protected InputSource resolveEntity(String pid, String sid)
79 {
80 if (!mapped)
81 {
82 mapResources();
83 mapped=true;
84 }
85 InputSource is = super.resolveEntity(pid,sid);
86 return is;
87 }
88
89 void mapResources()
90 {
91
92 URL dtd22=Loader.getResource(Servlet.class,"javax/servlet/resources/web-app_2_2.dtd");
93 URL dtd23=Loader.getResource(Servlet.class,"javax/servlet/resources/web-app_2_3.dtd");
94 URL j2ee14xsd=Loader.getResource(Servlet.class,"javax/servlet/resources/j2ee_1_4.xsd");
95 URL javaee5=Loader.getResource(Servlet.class,"javax/servlet/resources/javaee_5.xsd");
96 URL javaee6=Loader.getResource(Servlet.class,"javax/servlet/resources/javaee_6.xsd");
97 URL javaee7=Loader.getResource(Servlet.class,"javax/servlet/resources/javaee_7.xsd");
98
99 URL webapp24xsd=Loader.getResource(Servlet.class,"javax/servlet/resources/web-app_2_4.xsd");
100 URL webapp25xsd=Loader.getResource(Servlet.class,"javax/servlet/resources/web-app_2_5.xsd");
101 URL webapp30xsd=Loader.getResource(Servlet.class,"javax/servlet/resources/web-app_3_0.xsd");
102 URL webapp31xsd=Loader.getResource(Servlet.class,"javax/servlet/resources/web-app_3_1.xsd");
103
104 URL webcommon30xsd=Loader.getResource(Servlet.class,"javax/servlet/resources/web-common_3_0.xsd");
105 URL webcommon31xsd=Loader.getResource(Servlet.class,"javax/servlet/resources/web-common_3_1.xsd");
106
107 URL webfragment30xsd=Loader.getResource(Servlet.class,"javax/servlet/resources/web-fragment_3_0.xsd");
108 URL webfragment31xsd=Loader.getResource(Servlet.class,"javax/servlet/resources/web-fragment_3_1.xsd");
109
110 URL schemadtd=Loader.getResource(Servlet.class,"javax/servlet/resources/XMLSchema.dtd");
111 URL xmlxsd=Loader.getResource(Servlet.class,"javax/servlet/resources/xml.xsd");
112 URL webservice11xsd=Loader.getResource(Servlet.class,"javax/servlet/resources/j2ee_web_services_client_1_1.xsd");
113 URL webservice12xsd=Loader.getResource(Servlet.class,"javax/servlet/resources/javaee_web_services_client_1_2.xsd");
114 URL webservice13xsd=Loader.getResource(Servlet.class,"javax/servlet/resources/javaee_web_services_client_1_3.xsd");
115 URL webservice14xsd=Loader.getResource(Servlet.class,"javax/servlet/resources/javaee_web_services_client_1_4.xsd");
116 URL datatypesdtd=Loader.getResource(Servlet.class,"javax/servlet/resources/datatypes.dtd");
117
118 URL jsp20xsd = null;
119 URL jsp21xsd = null;
120 URL jsp22xsd = null;
121 URL jsp23xsd = null;
122
123 try
124 {
125
126 jsp20xsd = Loader.getResource(Servlet.class, "javax/servlet/resources/jsp_2_0.xsd");
127 jsp21xsd = Loader.getResource(Servlet.class, "javax/servlet/resources/jsp_2_1.xsd");
128 jsp22xsd = Loader.getResource(Servlet.class, "javax/servlet/resources/jsp_2_2.xsd");
129 jsp23xsd = Loader.getResource(Servlet.class, "javax/servlet/resources/jsp_2_3.xsd");
130 }
131 catch (Exception e)
132 {
133 LOG.ignore(e);
134 }
135 finally
136 {
137 if (jsp20xsd == null) jsp20xsd = Loader.getResource(Servlet.class, "javax/servlet/jsp/resources/jsp_2_0.xsd");
138 if (jsp21xsd == null) jsp21xsd = Loader.getResource(Servlet.class, "javax/servlet/jsp/resources/jsp_2_1.xsd");
139 if (jsp22xsd == null) jsp22xsd = Loader.getResource(Servlet.class, "javax/servlet/jsp/resources/jsp_2_2.xsd");
140 if (jsp23xsd == null) jsp23xsd = Loader.getResource(Servlet.class, "javax/servlet/jsp/resources/jsp_2_3.xsd");
141 }
142
143 redirectEntity("web-app_2_2.dtd",dtd22);
144 redirectEntity("-//Sun Microsystems, Inc.//DTD Web Application 2.2//EN",dtd22);
145 redirectEntity("web.dtd",dtd23);
146 redirectEntity("web-app_2_3.dtd",dtd23);
147 redirectEntity("-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN",dtd23);
148 redirectEntity("XMLSchema.dtd",schemadtd);
149 redirectEntity("http://www.w3.org/2001/XMLSchema.dtd",schemadtd);
150 redirectEntity("-//W3C//DTD XMLSCHEMA 200102//EN",schemadtd);
151 redirectEntity("jsp_2_0.xsd",jsp20xsd);
152 redirectEntity("http://java.sun.com/xml/ns/j2ee/jsp_2_0.xsd",jsp20xsd);
153 redirectEntity("http://java.sun.com/xml/ns/javaee/jsp_2_1.xsd",jsp21xsd);
154 redirectEntity("jsp_2_2.xsd",jsp22xsd);
155 redirectEntity("http://java.sun.com/xml/ns/javaee/jsp_2_2.xsd",jsp22xsd);
156 redirectEntity("jsp_2_3.xsd",jsp23xsd);
157 redirectEntity("http://xmlns.jcp.org/xml/ns/javaee/jsp_2_3.xsd",jsp23xsd);
158 redirectEntity("j2ee_1_4.xsd",j2ee14xsd);
159 redirectEntity("http://java.sun.com/xml/ns/j2ee/j2ee_1_4.xsd",j2ee14xsd);
160 redirectEntity( "http://java.sun.com/xml/ns/javaee/javaee_5.xsd",javaee5);
161 redirectEntity( "http://java.sun.com/xml/ns/javaee/javaee_6.xsd",javaee6);
162 redirectEntity( "http://xmlns.jcp.org/xml/ns/javaee/javaee_7.xsd",javaee7);
163 redirectEntity("web-app_2_4.xsd",webapp24xsd);
164 redirectEntity("http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd",webapp24xsd);
165 redirectEntity("web-app_2_5.xsd",webapp25xsd);
166 redirectEntity("http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd",webapp25xsd);
167 redirectEntity("web-app_3_0.xsd",webapp30xsd);
168 redirectEntity("http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd",webapp30xsd);
169 redirectEntity("web-common_3_0.xsd",webcommon30xsd);
170 redirectEntity("http://java.sun.com/xml/ns/javaee/web-common_3_0.xsd",webcommon30xsd);
171 redirectEntity("web-fragment_3_0.xsd",webfragment30xsd);
172 redirectEntity("http://java.sun.com/xml/ns/javaee/web-fragment_3_0.xsd",webfragment30xsd);
173 redirectEntity("web-app_3_1.xsd",webapp31xsd);
174 redirectEntity("http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd",webapp31xsd);
175
176 redirectEntity("web-common_3_1.xsd",webcommon30xsd);
177 redirectEntity("http://xmlns.jcp.org/xml/ns/javaee/web-common_3_1.xsd",webcommon31xsd);
178 redirectEntity("web-fragment_3_1.xsd",webfragment30xsd);
179 redirectEntity("http://xmlns.jcp.org/xml/ns/javaee/web-fragment_3_1.xsd",webfragment31xsd);
180 redirectEntity("xml.xsd",xmlxsd);
181 redirectEntity("http://www.w3.org/2001/xml.xsd",xmlxsd);
182 redirectEntity("datatypes.dtd",datatypesdtd);
183 redirectEntity("http://www.w3.org/2001/datatypes.dtd",datatypesdtd);
184 redirectEntity("j2ee_web_services_client_1_1.xsd",webservice11xsd);
185 redirectEntity("http://www.ibm.com/webservices/xsd/j2ee_web_services_client_1_1.xsd",webservice11xsd);
186 redirectEntity("javaee_web_services_client_1_2.xsd",webservice12xsd);
187 redirectEntity("http://www.ibm.com/webservices/xsd/javaee_web_services_client_1_2.xsd",webservice12xsd);
188 redirectEntity("javaee_web_services_client_1_3.xsd",webservice13xsd);
189 redirectEntity("http://java.sun.com/xml/ns/javaee/javaee_web_services_client_1_3.xsd",webservice13xsd);
190 redirectEntity("javaee_web_services_client_1_4.xsd",webservice14xsd);
191 redirectEntity("http://xmlns.jcp.org/xml/ns/javaee/javaee_web_services_client_1_4.xsd",webservice14xsd);
192 }
193 };
194
195 return xmlParser;
196 }
197
198
199 public WebDescriptor (Resource xml)
200 {
201 super(xml);
202 }
203
204 public void parse ()
205 throws Exception
206 {
207 super.parse();
208 processVersion();
209 processOrdering();
210 }
211
212 public MetaDataComplete getMetaDataComplete()
213 {
214 return _metaDataComplete;
215 }
216
217
218
219 public int getMajorVersion ()
220 {
221 return _majorVersion;
222 }
223
224 public int getMinorVersion()
225 {
226 return _minorVersion;
227 }
228
229
230 public void processVersion ()
231 {
232 String version = _root.getAttribute("version", "DTD");
233 if ("DTD".equals(version))
234 {
235 _majorVersion = 2;
236 _minorVersion = 3;
237 String dtd = _parser.getDTD();
238 if (dtd != null && dtd.indexOf("web-app_2_2") >= 0)
239 {
240 _majorVersion = 2;
241 _minorVersion = 2;
242 }
243 }
244 else
245 {
246 int dot = version.indexOf(".");
247 if (dot > 0)
248 {
249 _majorVersion = Integer.parseInt(version.substring(0,dot));
250 _minorVersion = Integer.parseInt(version.substring(dot+1));
251 }
252 }
253
254 if (_majorVersion <= 2 && _minorVersion < 5)
255 _metaDataComplete = MetaDataComplete.True;
256 else
257 {
258 String s = (String)_root.getAttribute("metadata-complete");
259 if (s == null)
260 _metaDataComplete = MetaDataComplete.NotSet;
261 else
262 _metaDataComplete = Boolean.valueOf(s).booleanValue()?MetaDataComplete.True:MetaDataComplete.False;
263 }
264
265 if (LOG.isDebugEnabled())
266 LOG.debug(_xml.toString()+": Calculated metadatacomplete = " + _metaDataComplete + " with version=" + version);
267 }
268
269 public void processOrdering ()
270 {
271
272 XmlParser.Node ordering = _root.get("absolute-ordering");
273 if (ordering == null)
274 return;
275
276 _isOrdered = true;
277
278
279
280 Iterator<Object> iter = ordering.iterator();
281 XmlParser.Node node = null;
282 while (iter.hasNext())
283 {
284 Object o = iter.next();
285 if (!(o instanceof XmlParser.Node)) continue;
286 node = (XmlParser.Node) o;
287
288 if (node.getTag().equalsIgnoreCase("others"))
289
290 _ordering.add("others");
291 else if (node.getTag().equalsIgnoreCase("name"))
292
293 _ordering.add(node.toString(false,true));
294 }
295 }
296
297 public void addClassName (String className)
298 {
299 if (!_classNames.contains(className))
300 _classNames.add(className);
301 }
302
303 public ArrayList<String> getClassNames ()
304 {
305 return _classNames;
306 }
307
308 public void setDistributable (boolean distributable)
309 {
310 _distributable = distributable;
311 }
312
313 public boolean isDistributable()
314 {
315 return _distributable;
316 }
317
318 public void setValidating (boolean validating)
319 {
320 _validating = validating;
321 }
322
323 public boolean isValidating ()
324 {
325 return _validating;
326 }
327
328 public boolean isOrdered()
329 {
330 return _isOrdered;
331 }
332
333 public List<String> getOrdering()
334 {
335 return _ordering;
336 }
337
338
339 }