• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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.util.HashMap;
22 import java.util.Map;
23 
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.XmlConfiguration;
28 
29 
30 /**
31  *
32  * JettyWebConfiguration.
33  *
34  * Looks for Xmlconfiguration files in WEB-INF.  Searches in order for the first of jetty6-web.xml, jetty-web.xml or web-jetty.xml
35  *
36  *
37  *
38  */
39 public class JettyWebXmlConfiguration extends AbstractConfiguration
40 {
41     private static final Logger LOG = Log.getLogger(JettyWebXmlConfiguration.class);
42 
43     /** The value of this property points to the WEB-INF directory of
44      * the web-app currently installed.
45      * it is passed as a property to the jetty-web.xml file */
46     public static final String PROPERTY_THIS_WEB_INF_URL = "this.web-inf.url";
47 
48 
49     public static final String XML_CONFIGURATION = "org.eclipse.jetty.webapp.JettyWebXmlConfiguration";
50     public static final String JETTY_WEB_XML = "jetty-web.xml";
51 
52     /**
53      * Configure
54      * Apply web-jetty.xml configuration
55      * @see Configuration#configure(WebAppContext)
56      */
57     @Override
configure(WebAppContext context)58     public void configure (WebAppContext context) throws Exception
59     {
60         //cannot configure if the _context is already started
61         if (context.isStarted())
62         {
63             LOG.debug("Cannot configure webapp after it is started");
64             return;
65         }
66 
67         LOG.debug("Configuring web-jetty.xml");
68 
69         Resource web_inf = context.getWebInf();
70         // handle any WEB-INF descriptors
71         if(web_inf!=null&&web_inf.isDirectory())
72         {
73             // do jetty.xml file
74             Resource jetty=web_inf.addPath("jetty8-web.xml");
75             if(!jetty.exists())
76                 jetty=web_inf.addPath(JETTY_WEB_XML);
77             if(!jetty.exists())
78                 jetty=web_inf.addPath("web-jetty.xml");
79 
80             if(jetty.exists())
81             {
82                 // No server classes while configuring
83                 String[] old_server_classes = context.getServerClasses();
84                 try
85                 {
86                     context.setServerClasses(null);
87                     if(LOG.isDebugEnabled())
88                         LOG.debug("Configure: "+jetty);
89 
90                     XmlConfiguration jetty_config = (XmlConfiguration)context.getAttribute(XML_CONFIGURATION);
91 
92                     if (jetty_config==null)
93                     {
94                         jetty_config=new XmlConfiguration(jetty.getURL());
95                     }
96                     else
97                     {
98                         context.removeAttribute(XML_CONFIGURATION);
99                     }
100                     setupXmlConfiguration(context,jetty_config, web_inf);
101                     try
102                     {
103                         jetty_config.configure(context);
104                     }
105                     catch (ClassNotFoundException e)
106                     {
107                         LOG.warn("Unable to process jetty-web.xml", e);
108                     }
109                 }
110                 finally
111                 {
112                     if (context.getServerClasses()==null)
113                         context.setServerClasses(old_server_classes);
114                 }
115             }
116         }
117     }
118 
119     /**
120      * Configures some well-known properties before the XmlConfiguration reads
121      * the configuration.
122      * @param jetty_config The configuration object.
123      */
setupXmlConfiguration(WebAppContext context, XmlConfiguration jetty_config, Resource web_inf)124     private void setupXmlConfiguration(WebAppContext context, XmlConfiguration jetty_config, Resource web_inf)
125     {
126         setupXmlConfiguration(jetty_config,web_inf);
127     }
128 
129     /**
130      * Configures some well-known properties before the XmlConfiguration reads
131      * the configuration.
132      * @param jetty_config The configuration object.
133      */
setupXmlConfiguration(XmlConfiguration jetty_config, Resource web_inf)134     private void setupXmlConfiguration(XmlConfiguration jetty_config, Resource web_inf)
135     {
136     	Map<String,String> props = jetty_config.getProperties();
137     	if (props == null)
138     	{
139     		props = new HashMap<String, String>();
140     		jetty_config.setProperties(props);
141     	}
142 
143     	// TODO - should this be an id rather than a property?
144     	props.put(PROPERTY_THIS_WEB_INF_URL, String.valueOf(web_inf.getURL()));
145     }
146 }
147