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