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