View Javadoc

1   // ========================================================================
2   // Copyright (c) 2006-2010 Mort Bay Consulting Pty. Ltd.
3   // ------------------------------------------------------------------------
4   // All rights reserved. This program and the accompanying materials
5   // are made available under the terms of the Eclipse Public License v1.0
6   // and Apache License v2.0 which accompanies this distribution.
7   // The Eclipse Public License is available at 
8   // http://www.eclipse.org/legal/epl-v10.html
9   // The Apache License v2.0 is available at
10  // http://www.opensource.org/licenses/apache2.0.php
11  // You may elect to redistribute this code under either of these licenses. 
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   * Descriptor
33   *
34   * A web descriptor (web.xml/web-defaults.xml/web-overrides.xml).
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; //default to container version
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          //set up cache of DTDs and schemas locally        
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; // does not apply before 2.5
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         //Process the web.xml's optional <absolute-ordering> element              
208         XmlParser.Node ordering = _root.get("absolute-ordering");
209         if (ordering == null)
210            return;
211         
212         _isOrdered = true;
213         //If an absolute-ordering was already set, then ignore it in favor of this new one
214        // _processor.setOrdering(new AbsoluteOrdering());
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                 //((AbsoluteOrdering)_processor.getOrdering()).addOthers();
226                 _ordering.add("others");
227             else if (node.getTag().equalsIgnoreCase("name"))
228                 //((AbsoluteOrdering)_processor.getOrdering()).add(node.toString(false,true));
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 }