View Javadoc

1   //
2   //  ========================================================================
3   //  Copyright (c) 1995-2014 Mort Bay Consulting Pty. Ltd.
4   //  ------------------------------------------------------------------------
5   //  All rights reserved. This program and the accompanying materials
6   //  are made available under the terms of the Eclipse Public License v1.0
7   //  and Apache License v2.0 which accompanies this distribution.
8   //
9   //      The Eclipse Public License is available at
10  //      http://www.eclipse.org/legal/epl-v10.html
11  //
12  //      The Apache License v2.0 is available at
13  //      http://www.opensource.org/licenses/apache2.0.php
14  //
15  //  You may elect to redistribute this code under either of these licenses.
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   * Descriptor
39   *
40   * A web descriptor (web.xml/web-defaults.xml/web-overrides.xml).
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; //default to container version
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                  //set up cache of DTDs and schemas locally
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                     //try both javax/servlet/resources and javax/servlet/jsp/resources to load 
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; // does not apply before 2.5
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         //Process the web.xml's optional <absolute-ordering> element
269         XmlParser.Node ordering = _root.get("absolute-ordering");
270         if (ordering == null)
271            return;
272 
273         _isOrdered = true;
274         //If an absolute-ordering was already set, then ignore it in favor of this new one
275        // _processor.setOrdering(new AbsoluteOrdering());
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                 //((AbsoluteOrdering)_processor.getOrdering()).addOthers();
287                 _ordering.add("others");
288             else if (node.getTag().equalsIgnoreCase("name"))
289                 //((AbsoluteOrdering)_processor.getOrdering()).add(node.toString(false,true));
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 }