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