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
19package org.eclipse.jetty.webapp;
20
21import java.io.IOException;
22import java.net.MalformedURLException;
23
24import org.eclipse.jetty.servlet.ErrorPageErrorHandler;
25import org.eclipse.jetty.servlet.ServletHandler;
26import org.eclipse.jetty.util.log.Log;
27import org.eclipse.jetty.util.log.Logger;
28import org.eclipse.jetty.util.resource.Resource;
29
30/* ------------------------------------------------------------------------------- */
31/**
32 * Configure by parsing default web.xml and web.xml
33 *
34 */
35public class WebXmlConfiguration extends AbstractConfiguration
36{
37    private static final Logger LOG = Log.getLogger(WebXmlConfiguration.class);
38
39
40    /* ------------------------------------------------------------------------------- */
41    /**
42     *
43     */
44    @Override
45    public void preConfigure (WebAppContext context) throws Exception
46    {
47        //parse webdefault.xml
48        String defaultsDescriptor = context.getDefaultsDescriptor();
49        if (defaultsDescriptor != null && defaultsDescriptor.length() > 0)
50        {
51            Resource dftResource = Resource.newSystemResource(defaultsDescriptor);
52            if (dftResource == null)
53                dftResource = context.newResource(defaultsDescriptor);
54            context.getMetaData().setDefaults (dftResource);
55        }
56
57        //parse, but don't process web.xml
58        Resource webxml = findWebXml(context);
59        if (webxml != null)
60        {
61            context.getMetaData().setWebXml(webxml);
62            context.getServletContext().setEffectiveMajorVersion(context.getMetaData().getWebXml().getMajorVersion());
63            context.getServletContext().setEffectiveMinorVersion(context.getMetaData().getWebXml().getMinorVersion());
64        }
65
66        //parse but don't process override-web.xml
67        for (String overrideDescriptor : context.getOverrideDescriptors())
68        {
69            if (overrideDescriptor != null && overrideDescriptor.length() > 0)
70            {
71                Resource orideResource = Resource.newSystemResource(overrideDescriptor);
72                if (orideResource == null)
73                    orideResource = context.newResource(overrideDescriptor);
74                context.getMetaData().addOverride(orideResource);
75            }
76        }
77    }
78
79    /* ------------------------------------------------------------------------------- */
80    /**
81     * Process web-default.xml, web.xml, override-web.xml
82     *
83     */
84    @Override
85    public void configure (WebAppContext context) throws Exception
86    {
87        // cannot configure if the context is already started
88        if (context.isStarted())
89        {
90            LOG.debug("Cannot configure webapp after it is started");
91            return;
92        }
93
94        context.getMetaData().addDescriptorProcessor(new StandardDescriptorProcessor());
95    }
96
97    /* ------------------------------------------------------------------------------- */
98    protected Resource findWebXml(WebAppContext context) throws IOException, MalformedURLException
99    {
100        String descriptor = context.getDescriptor();
101        if (descriptor != null)
102        {
103            Resource web = context.newResource(descriptor);
104            if (web.exists() && !web.isDirectory()) return web;
105        }
106
107        Resource web_inf = context.getWebInf();
108        if (web_inf != null && web_inf.isDirectory())
109        {
110            // do web.xml file
111            Resource web = web_inf.addPath("web.xml");
112            if (web.exists()) return web;
113            if (LOG.isDebugEnabled())
114                LOG.debug("No WEB-INF/web.xml in " + context.getWar() + ". Serving files and default/dynamic servlets only");
115        }
116        return null;
117    }
118
119
120    /* ------------------------------------------------------------------------------- */
121    @Override
122    public void deconfigure (WebAppContext context) throws Exception
123    {
124        ServletHandler _servletHandler = context.getServletHandler();
125
126        context.setWelcomeFiles(null);
127
128        if (context.getErrorHandler() instanceof ErrorPageErrorHandler)
129            ((ErrorPageErrorHandler)
130                    context.getErrorHandler()).setErrorPages(null);
131
132
133        // TODO remove classpaths from classloader
134
135    }
136}
137