View Javadoc

1   //
2   //  ========================================================================
3   //  Copyright (c) 1995-2016 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() 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                  //set up cache of DTDs and schemas locally
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                     //try both javax/servlet/resources and javax/servlet/jsp/resources to load 
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; // does not apply before 2.5
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         //Process the web.xml's optional <absolute-ordering> element
272         XmlParser.Node ordering = _root.get("absolute-ordering");
273         if (ordering == null)
274            return;
275 
276         _isOrdered = true;
277         //If an absolute-ordering was already set, then ignore it in favor of this new one
278        // _processor.setOrdering(new AbsoluteOrdering());
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                 //((AbsoluteOrdering)_processor.getOrdering()).addOthers();
290                 _ordering.add("others");
291             else if (node.getTag().equalsIgnoreCase("name"))
292                 //((AbsoluteOrdering)_processor.getOrdering()).add(node.toString(false,true));
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 }