103928aee4356845252ac6b662d5c72c29903813eJake Slack//
203928aee4356845252ac6b662d5c72c29903813eJake Slack//  ========================================================================
303928aee4356845252ac6b662d5c72c29903813eJake Slack//  Copyright (c) 1995-2014 Mort Bay Consulting Pty. Ltd.
403928aee4356845252ac6b662d5c72c29903813eJake Slack//  ------------------------------------------------------------------------
503928aee4356845252ac6b662d5c72c29903813eJake Slack//  All rights reserved. This program and the accompanying materials
603928aee4356845252ac6b662d5c72c29903813eJake Slack//  are made available under the terms of the Eclipse Public License v1.0
703928aee4356845252ac6b662d5c72c29903813eJake Slack//  and Apache License v2.0 which accompanies this distribution.
803928aee4356845252ac6b662d5c72c29903813eJake Slack//
903928aee4356845252ac6b662d5c72c29903813eJake Slack//      The Eclipse Public License is available at
1003928aee4356845252ac6b662d5c72c29903813eJake Slack//      http://www.eclipse.org/legal/epl-v10.html
1103928aee4356845252ac6b662d5c72c29903813eJake Slack//
1203928aee4356845252ac6b662d5c72c29903813eJake Slack//      The Apache License v2.0 is available at
1303928aee4356845252ac6b662d5c72c29903813eJake Slack//      http://www.opensource.org/licenses/apache2.0.php
1403928aee4356845252ac6b662d5c72c29903813eJake Slack//
1503928aee4356845252ac6b662d5c72c29903813eJake Slack//  You may elect to redistribute this code under either of these licenses.
1603928aee4356845252ac6b662d5c72c29903813eJake Slack//  ========================================================================
1703928aee4356845252ac6b662d5c72c29903813eJake Slack//
1803928aee4356845252ac6b662d5c72c29903813eJake Slack
1903928aee4356845252ac6b662d5c72c29903813eJake Slackpackage org.eclipse.jetty.server;
2003928aee4356845252ac6b662d5c72c29903813eJake Slack
2103928aee4356845252ac6b662d5c72c29903813eJake Slackimport java.io.IOException;
2203928aee4356845252ac6b662d5c72c29903813eJake Slackimport java.net.InetSocketAddress;
2303928aee4356845252ac6b662d5c72c29903813eJake Slackimport java.util.Enumeration;
2403928aee4356845252ac6b662d5c72c29903813eJake Slack
2503928aee4356845252ac6b662d5c72c29903813eJake Slackimport javax.servlet.AsyncContext;
2603928aee4356845252ac6b662d5c72c29903813eJake Slackimport javax.servlet.ServletException;
2703928aee4356845252ac6b662d5c72c29903813eJake Slackimport javax.servlet.http.HttpServletRequest;
2803928aee4356845252ac6b662d5c72c29903813eJake Slackimport javax.servlet.http.HttpServletResponse;
2903928aee4356845252ac6b662d5c72c29903813eJake Slack
3003928aee4356845252ac6b662d5c72c29903813eJake Slackimport org.eclipse.jetty.http.HttpGenerator;
3103928aee4356845252ac6b662d5c72c29903813eJake Slackimport org.eclipse.jetty.http.HttpURI;
3203928aee4356845252ac6b662d5c72c29903813eJake Slackimport org.eclipse.jetty.server.handler.HandlerWrapper;
3303928aee4356845252ac6b662d5c72c29903813eJake Slackimport org.eclipse.jetty.server.nio.SelectChannelConnector;
3403928aee4356845252ac6b662d5c72c29903813eJake Slackimport org.eclipse.jetty.util.Attributes;
3503928aee4356845252ac6b662d5c72c29903813eJake Slackimport org.eclipse.jetty.util.AttributesMap;
3603928aee4356845252ac6b662d5c72c29903813eJake Slackimport org.eclipse.jetty.util.LazyList;
3703928aee4356845252ac6b662d5c72c29903813eJake Slackimport org.eclipse.jetty.util.MultiException;
3803928aee4356845252ac6b662d5c72c29903813eJake Slackimport org.eclipse.jetty.util.TypeUtil;
3903928aee4356845252ac6b662d5c72c29903813eJake Slackimport org.eclipse.jetty.util.URIUtil;
4003928aee4356845252ac6b662d5c72c29903813eJake Slackimport org.eclipse.jetty.util.component.Container;
4103928aee4356845252ac6b662d5c72c29903813eJake Slackimport org.eclipse.jetty.util.component.Destroyable;
4203928aee4356845252ac6b662d5c72c29903813eJake Slackimport org.eclipse.jetty.util.component.LifeCycle;
4303928aee4356845252ac6b662d5c72c29903813eJake Slackimport org.eclipse.jetty.util.log.Log;
4403928aee4356845252ac6b662d5c72c29903813eJake Slackimport org.eclipse.jetty.util.log.Logger;
4503928aee4356845252ac6b662d5c72c29903813eJake Slackimport org.eclipse.jetty.util.thread.QueuedThreadPool;
4603928aee4356845252ac6b662d5c72c29903813eJake Slackimport org.eclipse.jetty.util.thread.ShutdownThread;
4703928aee4356845252ac6b662d5c72c29903813eJake Slackimport org.eclipse.jetty.util.thread.ThreadPool;
4803928aee4356845252ac6b662d5c72c29903813eJake Slack
4903928aee4356845252ac6b662d5c72c29903813eJake Slack/* ------------------------------------------------------------ */
5003928aee4356845252ac6b662d5c72c29903813eJake Slack/** Jetty HTTP Servlet Server.
5103928aee4356845252ac6b662d5c72c29903813eJake Slack * This class is the main class for the Jetty HTTP Servlet server.
5203928aee4356845252ac6b662d5c72c29903813eJake Slack * It aggregates Connectors (HTTP request receivers) and request Handlers.
5303928aee4356845252ac6b662d5c72c29903813eJake Slack * The server is itself a handler and a ThreadPool.  Connectors use the ThreadPool methods
5403928aee4356845252ac6b662d5c72c29903813eJake Slack * to run jobs that will eventually call the handle method.
5503928aee4356845252ac6b662d5c72c29903813eJake Slack *
5603928aee4356845252ac6b662d5c72c29903813eJake Slack *  @org.apache.xbean.XBean  description="Creates an embedded Jetty web server"
5703928aee4356845252ac6b662d5c72c29903813eJake Slack */
5803928aee4356845252ac6b662d5c72c29903813eJake Slackpublic class Server extends HandlerWrapper implements Attributes
5903928aee4356845252ac6b662d5c72c29903813eJake Slack{
6003928aee4356845252ac6b662d5c72c29903813eJake Slack    private static final Logger LOG = Log.getLogger(Server.class);
6103928aee4356845252ac6b662d5c72c29903813eJake Slack
6203928aee4356845252ac6b662d5c72c29903813eJake Slack    private static final String __version;
6303928aee4356845252ac6b662d5c72c29903813eJake Slack    static
6403928aee4356845252ac6b662d5c72c29903813eJake Slack    {
6503928aee4356845252ac6b662d5c72c29903813eJake Slack        if (Server.class.getPackage()!=null &&
6603928aee4356845252ac6b662d5c72c29903813eJake Slack            "Eclipse.org - Jetty".equals(Server.class.getPackage().getImplementationVendor()) &&
6703928aee4356845252ac6b662d5c72c29903813eJake Slack             Server.class.getPackage().getImplementationVersion()!=null)
6803928aee4356845252ac6b662d5c72c29903813eJake Slack            __version=Server.class.getPackage().getImplementationVersion();
6903928aee4356845252ac6b662d5c72c29903813eJake Slack        else
7003928aee4356845252ac6b662d5c72c29903813eJake Slack            __version=System.getProperty("jetty.version","8.y.z-SNAPSHOT");
7103928aee4356845252ac6b662d5c72c29903813eJake Slack    }
7203928aee4356845252ac6b662d5c72c29903813eJake Slack
7303928aee4356845252ac6b662d5c72c29903813eJake Slack    private final Container _container=new Container();
7403928aee4356845252ac6b662d5c72c29903813eJake Slack    private final AttributesMap _attributes = new AttributesMap();
7503928aee4356845252ac6b662d5c72c29903813eJake Slack    private ThreadPool _threadPool;
7603928aee4356845252ac6b662d5c72c29903813eJake Slack    private Connector[] _connectors;
7703928aee4356845252ac6b662d5c72c29903813eJake Slack    private SessionIdManager _sessionIdManager;
7803928aee4356845252ac6b662d5c72c29903813eJake Slack    private boolean _sendServerVersion = true; //send Server: header
7903928aee4356845252ac6b662d5c72c29903813eJake Slack    private boolean _sendDateHeader = false; //send Date: header
8003928aee4356845252ac6b662d5c72c29903813eJake Slack    private int _graceful=0;
8103928aee4356845252ac6b662d5c72c29903813eJake Slack    private boolean _stopAtShutdown;
8203928aee4356845252ac6b662d5c72c29903813eJake Slack    private boolean _dumpAfterStart=false;
8303928aee4356845252ac6b662d5c72c29903813eJake Slack    private boolean _dumpBeforeStop=false;
8403928aee4356845252ac6b662d5c72c29903813eJake Slack    private boolean _uncheckedPrintWriter=false;
8503928aee4356845252ac6b662d5c72c29903813eJake Slack
8603928aee4356845252ac6b662d5c72c29903813eJake Slack
8703928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------ */
8803928aee4356845252ac6b662d5c72c29903813eJake Slack    public Server()
8903928aee4356845252ac6b662d5c72c29903813eJake Slack    {
9003928aee4356845252ac6b662d5c72c29903813eJake Slack        setServer(this);
9103928aee4356845252ac6b662d5c72c29903813eJake Slack    }
9203928aee4356845252ac6b662d5c72c29903813eJake Slack
9303928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------ */
9403928aee4356845252ac6b662d5c72c29903813eJake Slack    /** Convenience constructor
9503928aee4356845252ac6b662d5c72c29903813eJake Slack     * Creates server and a {@link SelectChannelConnector} at the passed port.
9603928aee4356845252ac6b662d5c72c29903813eJake Slack     */
9703928aee4356845252ac6b662d5c72c29903813eJake Slack    public Server(int port)
9803928aee4356845252ac6b662d5c72c29903813eJake Slack    {
9903928aee4356845252ac6b662d5c72c29903813eJake Slack        setServer(this);
10003928aee4356845252ac6b662d5c72c29903813eJake Slack
10103928aee4356845252ac6b662d5c72c29903813eJake Slack        Connector connector=new SelectChannelConnector();
10203928aee4356845252ac6b662d5c72c29903813eJake Slack        connector.setPort(port);
10303928aee4356845252ac6b662d5c72c29903813eJake Slack        setConnectors(new Connector[]{connector});
10403928aee4356845252ac6b662d5c72c29903813eJake Slack    }
10503928aee4356845252ac6b662d5c72c29903813eJake Slack
10603928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------ */
10703928aee4356845252ac6b662d5c72c29903813eJake Slack    /** Convenience constructor
10803928aee4356845252ac6b662d5c72c29903813eJake Slack     * Creates server and a {@link SelectChannelConnector} at the passed address.
10903928aee4356845252ac6b662d5c72c29903813eJake Slack     */
11003928aee4356845252ac6b662d5c72c29903813eJake Slack    public Server(InetSocketAddress addr)
11103928aee4356845252ac6b662d5c72c29903813eJake Slack    {
11203928aee4356845252ac6b662d5c72c29903813eJake Slack        setServer(this);
11303928aee4356845252ac6b662d5c72c29903813eJake Slack
11403928aee4356845252ac6b662d5c72c29903813eJake Slack        Connector connector=new SelectChannelConnector();
11503928aee4356845252ac6b662d5c72c29903813eJake Slack        connector.setHost(addr.getHostName());
11603928aee4356845252ac6b662d5c72c29903813eJake Slack        connector.setPort(addr.getPort());
11703928aee4356845252ac6b662d5c72c29903813eJake Slack        setConnectors(new Connector[]{connector});
11803928aee4356845252ac6b662d5c72c29903813eJake Slack    }
11903928aee4356845252ac6b662d5c72c29903813eJake Slack
12003928aee4356845252ac6b662d5c72c29903813eJake Slack
12103928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------ */
12203928aee4356845252ac6b662d5c72c29903813eJake Slack    public static String getVersion()
12303928aee4356845252ac6b662d5c72c29903813eJake Slack    {
12403928aee4356845252ac6b662d5c72c29903813eJake Slack        return __version;
12503928aee4356845252ac6b662d5c72c29903813eJake Slack    }
12603928aee4356845252ac6b662d5c72c29903813eJake Slack
12703928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------ */
12803928aee4356845252ac6b662d5c72c29903813eJake Slack    /**
12903928aee4356845252ac6b662d5c72c29903813eJake Slack     * @return Returns the container.
13003928aee4356845252ac6b662d5c72c29903813eJake Slack     */
13103928aee4356845252ac6b662d5c72c29903813eJake Slack    public Container getContainer()
13203928aee4356845252ac6b662d5c72c29903813eJake Slack    {
13303928aee4356845252ac6b662d5c72c29903813eJake Slack        return _container;
13403928aee4356845252ac6b662d5c72c29903813eJake Slack    }
13503928aee4356845252ac6b662d5c72c29903813eJake Slack
13603928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------ */
13703928aee4356845252ac6b662d5c72c29903813eJake Slack    public boolean getStopAtShutdown()
13803928aee4356845252ac6b662d5c72c29903813eJake Slack    {
13903928aee4356845252ac6b662d5c72c29903813eJake Slack        return _stopAtShutdown;
14003928aee4356845252ac6b662d5c72c29903813eJake Slack    }
14103928aee4356845252ac6b662d5c72c29903813eJake Slack
14203928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------ */
14303928aee4356845252ac6b662d5c72c29903813eJake Slack    public void setStopAtShutdown(boolean stop)
14403928aee4356845252ac6b662d5c72c29903813eJake Slack    {
14503928aee4356845252ac6b662d5c72c29903813eJake Slack        //if we now want to stop
14603928aee4356845252ac6b662d5c72c29903813eJake Slack        if (stop)
14703928aee4356845252ac6b662d5c72c29903813eJake Slack        {
14803928aee4356845252ac6b662d5c72c29903813eJake Slack            //and we weren't stopping before
14903928aee4356845252ac6b662d5c72c29903813eJake Slack            if (!_stopAtShutdown)
15003928aee4356845252ac6b662d5c72c29903813eJake Slack            {
15103928aee4356845252ac6b662d5c72c29903813eJake Slack                //only register to stop if we're already started (otherwise we'll do it in doStart())
15203928aee4356845252ac6b662d5c72c29903813eJake Slack                if (isStarted())
15303928aee4356845252ac6b662d5c72c29903813eJake Slack                    ShutdownThread.register(this);
15403928aee4356845252ac6b662d5c72c29903813eJake Slack            }
15503928aee4356845252ac6b662d5c72c29903813eJake Slack        }
15603928aee4356845252ac6b662d5c72c29903813eJake Slack        else
15703928aee4356845252ac6b662d5c72c29903813eJake Slack            ShutdownThread.deregister(this);
15803928aee4356845252ac6b662d5c72c29903813eJake Slack
15903928aee4356845252ac6b662d5c72c29903813eJake Slack        _stopAtShutdown=stop;
16003928aee4356845252ac6b662d5c72c29903813eJake Slack    }
16103928aee4356845252ac6b662d5c72c29903813eJake Slack
16203928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------ */
16303928aee4356845252ac6b662d5c72c29903813eJake Slack    /**
16403928aee4356845252ac6b662d5c72c29903813eJake Slack     * @return Returns the connectors.
16503928aee4356845252ac6b662d5c72c29903813eJake Slack     */
16603928aee4356845252ac6b662d5c72c29903813eJake Slack    public Connector[] getConnectors()
16703928aee4356845252ac6b662d5c72c29903813eJake Slack    {
16803928aee4356845252ac6b662d5c72c29903813eJake Slack        return _connectors;
16903928aee4356845252ac6b662d5c72c29903813eJake Slack    }
17003928aee4356845252ac6b662d5c72c29903813eJake Slack
17103928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------ */
17203928aee4356845252ac6b662d5c72c29903813eJake Slack    public void addConnector(Connector connector)
17303928aee4356845252ac6b662d5c72c29903813eJake Slack    {
17403928aee4356845252ac6b662d5c72c29903813eJake Slack        setConnectors((Connector[])LazyList.addToArray(getConnectors(), connector, Connector.class));
17503928aee4356845252ac6b662d5c72c29903813eJake Slack    }
17603928aee4356845252ac6b662d5c72c29903813eJake Slack
17703928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------ */
17803928aee4356845252ac6b662d5c72c29903813eJake Slack    /**
17903928aee4356845252ac6b662d5c72c29903813eJake Slack     * Conveniance method which calls {@link #getConnectors()} and {@link #setConnectors(Connector[])} to
18003928aee4356845252ac6b662d5c72c29903813eJake Slack     * remove a connector.
18103928aee4356845252ac6b662d5c72c29903813eJake Slack     * @param connector The connector to remove.
18203928aee4356845252ac6b662d5c72c29903813eJake Slack     */
18303928aee4356845252ac6b662d5c72c29903813eJake Slack    public void removeConnector(Connector connector) {
18403928aee4356845252ac6b662d5c72c29903813eJake Slack        setConnectors((Connector[])LazyList.removeFromArray (getConnectors(), connector));
18503928aee4356845252ac6b662d5c72c29903813eJake Slack    }
18603928aee4356845252ac6b662d5c72c29903813eJake Slack
18703928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------ */
18803928aee4356845252ac6b662d5c72c29903813eJake Slack    /** Set the connectors for this server.
18903928aee4356845252ac6b662d5c72c29903813eJake Slack     * Each connector has this server set as it's ThreadPool and its Handler.
19003928aee4356845252ac6b662d5c72c29903813eJake Slack     * @param connectors The connectors to set.
19103928aee4356845252ac6b662d5c72c29903813eJake Slack     */
19203928aee4356845252ac6b662d5c72c29903813eJake Slack    public void setConnectors(Connector[] connectors)
19303928aee4356845252ac6b662d5c72c29903813eJake Slack    {
19403928aee4356845252ac6b662d5c72c29903813eJake Slack        if (connectors!=null)
19503928aee4356845252ac6b662d5c72c29903813eJake Slack        {
19603928aee4356845252ac6b662d5c72c29903813eJake Slack            for (int i=0;i<connectors.length;i++)
19703928aee4356845252ac6b662d5c72c29903813eJake Slack                connectors[i].setServer(this);
19803928aee4356845252ac6b662d5c72c29903813eJake Slack        }
19903928aee4356845252ac6b662d5c72c29903813eJake Slack
20003928aee4356845252ac6b662d5c72c29903813eJake Slack        _container.update(this, _connectors, connectors, "connector");
20103928aee4356845252ac6b662d5c72c29903813eJake Slack        _connectors = connectors;
20203928aee4356845252ac6b662d5c72c29903813eJake Slack    }
20303928aee4356845252ac6b662d5c72c29903813eJake Slack
20403928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------ */
20503928aee4356845252ac6b662d5c72c29903813eJake Slack    /**
20603928aee4356845252ac6b662d5c72c29903813eJake Slack     * @return Returns the threadPool.
20703928aee4356845252ac6b662d5c72c29903813eJake Slack     */
20803928aee4356845252ac6b662d5c72c29903813eJake Slack    public ThreadPool getThreadPool()
20903928aee4356845252ac6b662d5c72c29903813eJake Slack    {
21003928aee4356845252ac6b662d5c72c29903813eJake Slack        return _threadPool;
21103928aee4356845252ac6b662d5c72c29903813eJake Slack    }
21203928aee4356845252ac6b662d5c72c29903813eJake Slack
21303928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------ */
21403928aee4356845252ac6b662d5c72c29903813eJake Slack    /**
21503928aee4356845252ac6b662d5c72c29903813eJake Slack     * @param threadPool The threadPool to set.
21603928aee4356845252ac6b662d5c72c29903813eJake Slack     */
21703928aee4356845252ac6b662d5c72c29903813eJake Slack    public void setThreadPool(ThreadPool threadPool)
21803928aee4356845252ac6b662d5c72c29903813eJake Slack    {
21903928aee4356845252ac6b662d5c72c29903813eJake Slack        if (_threadPool!=null)
22003928aee4356845252ac6b662d5c72c29903813eJake Slack            removeBean(_threadPool);
22103928aee4356845252ac6b662d5c72c29903813eJake Slack        _container.update(this, _threadPool, threadPool, "threadpool",false);
22203928aee4356845252ac6b662d5c72c29903813eJake Slack        _threadPool = threadPool;
22303928aee4356845252ac6b662d5c72c29903813eJake Slack        if (_threadPool!=null)
22403928aee4356845252ac6b662d5c72c29903813eJake Slack            addBean(_threadPool);
22503928aee4356845252ac6b662d5c72c29903813eJake Slack    }
22603928aee4356845252ac6b662d5c72c29903813eJake Slack
22703928aee4356845252ac6b662d5c72c29903813eJake Slack    /**
22803928aee4356845252ac6b662d5c72c29903813eJake Slack     * @return true if {@link #dumpStdErr()} is called after starting
22903928aee4356845252ac6b662d5c72c29903813eJake Slack     */
23003928aee4356845252ac6b662d5c72c29903813eJake Slack    public boolean isDumpAfterStart()
23103928aee4356845252ac6b662d5c72c29903813eJake Slack    {
23203928aee4356845252ac6b662d5c72c29903813eJake Slack        return _dumpAfterStart;
23303928aee4356845252ac6b662d5c72c29903813eJake Slack    }
23403928aee4356845252ac6b662d5c72c29903813eJake Slack
23503928aee4356845252ac6b662d5c72c29903813eJake Slack    /**
23603928aee4356845252ac6b662d5c72c29903813eJake Slack     * @param dumpAfterStart true if {@link #dumpStdErr()} is called after starting
23703928aee4356845252ac6b662d5c72c29903813eJake Slack     */
23803928aee4356845252ac6b662d5c72c29903813eJake Slack    public void setDumpAfterStart(boolean dumpAfterStart)
23903928aee4356845252ac6b662d5c72c29903813eJake Slack    {
24003928aee4356845252ac6b662d5c72c29903813eJake Slack        _dumpAfterStart = dumpAfterStart;
24103928aee4356845252ac6b662d5c72c29903813eJake Slack    }
24203928aee4356845252ac6b662d5c72c29903813eJake Slack
24303928aee4356845252ac6b662d5c72c29903813eJake Slack    /**
24403928aee4356845252ac6b662d5c72c29903813eJake Slack     * @return true if {@link #dumpStdErr()} is called before stopping
24503928aee4356845252ac6b662d5c72c29903813eJake Slack     */
24603928aee4356845252ac6b662d5c72c29903813eJake Slack    public boolean isDumpBeforeStop()
24703928aee4356845252ac6b662d5c72c29903813eJake Slack    {
24803928aee4356845252ac6b662d5c72c29903813eJake Slack        return _dumpBeforeStop;
24903928aee4356845252ac6b662d5c72c29903813eJake Slack    }
25003928aee4356845252ac6b662d5c72c29903813eJake Slack
25103928aee4356845252ac6b662d5c72c29903813eJake Slack    /**
25203928aee4356845252ac6b662d5c72c29903813eJake Slack     * @param dumpBeforeStop true if {@link #dumpStdErr()} is called before stopping
25303928aee4356845252ac6b662d5c72c29903813eJake Slack     */
25403928aee4356845252ac6b662d5c72c29903813eJake Slack    public void setDumpBeforeStop(boolean dumpBeforeStop)
25503928aee4356845252ac6b662d5c72c29903813eJake Slack    {
25603928aee4356845252ac6b662d5c72c29903813eJake Slack        _dumpBeforeStop = dumpBeforeStop;
25703928aee4356845252ac6b662d5c72c29903813eJake Slack    }
25803928aee4356845252ac6b662d5c72c29903813eJake Slack
25903928aee4356845252ac6b662d5c72c29903813eJake Slack
26003928aee4356845252ac6b662d5c72c29903813eJake Slack
26103928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------ */
26203928aee4356845252ac6b662d5c72c29903813eJake Slack    @Override
26303928aee4356845252ac6b662d5c72c29903813eJake Slack    protected void doStart() throws Exception
26403928aee4356845252ac6b662d5c72c29903813eJake Slack    {
26503928aee4356845252ac6b662d5c72c29903813eJake Slack        if (getStopAtShutdown())
26603928aee4356845252ac6b662d5c72c29903813eJake Slack        {
26703928aee4356845252ac6b662d5c72c29903813eJake Slack            ShutdownThread.register(this);
26803928aee4356845252ac6b662d5c72c29903813eJake Slack        }
26903928aee4356845252ac6b662d5c72c29903813eJake Slack
27003928aee4356845252ac6b662d5c72c29903813eJake Slack        ShutdownMonitor.getInstance().start(); // initialize
27103928aee4356845252ac6b662d5c72c29903813eJake Slack
27203928aee4356845252ac6b662d5c72c29903813eJake Slack        LOG.info("jetty-"+__version);
27303928aee4356845252ac6b662d5c72c29903813eJake Slack        HttpGenerator.setServerVersion(__version);
27403928aee4356845252ac6b662d5c72c29903813eJake Slack
27503928aee4356845252ac6b662d5c72c29903813eJake Slack        MultiException mex=new MultiException();
27603928aee4356845252ac6b662d5c72c29903813eJake Slack
27703928aee4356845252ac6b662d5c72c29903813eJake Slack        if (_threadPool==null)
27803928aee4356845252ac6b662d5c72c29903813eJake Slack            setThreadPool(new QueuedThreadPool());
27903928aee4356845252ac6b662d5c72c29903813eJake Slack
28003928aee4356845252ac6b662d5c72c29903813eJake Slack        try
28103928aee4356845252ac6b662d5c72c29903813eJake Slack        {
28203928aee4356845252ac6b662d5c72c29903813eJake Slack            super.doStart();
28303928aee4356845252ac6b662d5c72c29903813eJake Slack        }
28403928aee4356845252ac6b662d5c72c29903813eJake Slack        catch(Throwable e)
28503928aee4356845252ac6b662d5c72c29903813eJake Slack        {
28603928aee4356845252ac6b662d5c72c29903813eJake Slack            mex.add(e);
28703928aee4356845252ac6b662d5c72c29903813eJake Slack        }
28803928aee4356845252ac6b662d5c72c29903813eJake Slack
28903928aee4356845252ac6b662d5c72c29903813eJake Slack        if (_connectors!=null && mex.size()==0)
29003928aee4356845252ac6b662d5c72c29903813eJake Slack        {
29103928aee4356845252ac6b662d5c72c29903813eJake Slack            for (int i=0;i<_connectors.length;i++)
29203928aee4356845252ac6b662d5c72c29903813eJake Slack            {
29303928aee4356845252ac6b662d5c72c29903813eJake Slack                try{_connectors[i].start();}
29403928aee4356845252ac6b662d5c72c29903813eJake Slack                catch(Throwable e)
29503928aee4356845252ac6b662d5c72c29903813eJake Slack                {
29603928aee4356845252ac6b662d5c72c29903813eJake Slack                    mex.add(e);
29703928aee4356845252ac6b662d5c72c29903813eJake Slack                }
29803928aee4356845252ac6b662d5c72c29903813eJake Slack            }
29903928aee4356845252ac6b662d5c72c29903813eJake Slack        }
30003928aee4356845252ac6b662d5c72c29903813eJake Slack
30103928aee4356845252ac6b662d5c72c29903813eJake Slack        if (isDumpAfterStart())
30203928aee4356845252ac6b662d5c72c29903813eJake Slack            dumpStdErr();
30303928aee4356845252ac6b662d5c72c29903813eJake Slack
30403928aee4356845252ac6b662d5c72c29903813eJake Slack        mex.ifExceptionThrow();
30503928aee4356845252ac6b662d5c72c29903813eJake Slack    }
30603928aee4356845252ac6b662d5c72c29903813eJake Slack
30703928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------ */
30803928aee4356845252ac6b662d5c72c29903813eJake Slack    @Override
30903928aee4356845252ac6b662d5c72c29903813eJake Slack    protected void doStop() throws Exception
31003928aee4356845252ac6b662d5c72c29903813eJake Slack    {
31103928aee4356845252ac6b662d5c72c29903813eJake Slack        if (isDumpBeforeStop())
31203928aee4356845252ac6b662d5c72c29903813eJake Slack            dumpStdErr();
31303928aee4356845252ac6b662d5c72c29903813eJake Slack
31403928aee4356845252ac6b662d5c72c29903813eJake Slack        MultiException mex=new MultiException();
31503928aee4356845252ac6b662d5c72c29903813eJake Slack
31603928aee4356845252ac6b662d5c72c29903813eJake Slack        if (_graceful>0)
31703928aee4356845252ac6b662d5c72c29903813eJake Slack        {
31803928aee4356845252ac6b662d5c72c29903813eJake Slack            if (_connectors!=null)
31903928aee4356845252ac6b662d5c72c29903813eJake Slack            {
32003928aee4356845252ac6b662d5c72c29903813eJake Slack                for (int i=_connectors.length;i-->0;)
32103928aee4356845252ac6b662d5c72c29903813eJake Slack                {
32203928aee4356845252ac6b662d5c72c29903813eJake Slack                    LOG.info("Graceful shutdown {}",_connectors[i]);
32303928aee4356845252ac6b662d5c72c29903813eJake Slack                    try{_connectors[i].close();}catch(Throwable e){mex.add(e);}
32403928aee4356845252ac6b662d5c72c29903813eJake Slack                }
32503928aee4356845252ac6b662d5c72c29903813eJake Slack            }
32603928aee4356845252ac6b662d5c72c29903813eJake Slack
32703928aee4356845252ac6b662d5c72c29903813eJake Slack            Handler[] contexts = getChildHandlersByClass(Graceful.class);
32803928aee4356845252ac6b662d5c72c29903813eJake Slack            for (int c=0;c<contexts.length;c++)
32903928aee4356845252ac6b662d5c72c29903813eJake Slack            {
33003928aee4356845252ac6b662d5c72c29903813eJake Slack                Graceful context=(Graceful)contexts[c];
33103928aee4356845252ac6b662d5c72c29903813eJake Slack                LOG.info("Graceful shutdown {}",context);
33203928aee4356845252ac6b662d5c72c29903813eJake Slack                context.setShutdown(true);
33303928aee4356845252ac6b662d5c72c29903813eJake Slack            }
33403928aee4356845252ac6b662d5c72c29903813eJake Slack            Thread.sleep(_graceful);
33503928aee4356845252ac6b662d5c72c29903813eJake Slack        }
33603928aee4356845252ac6b662d5c72c29903813eJake Slack
33703928aee4356845252ac6b662d5c72c29903813eJake Slack        if (_connectors!=null)
33803928aee4356845252ac6b662d5c72c29903813eJake Slack        {
33903928aee4356845252ac6b662d5c72c29903813eJake Slack            for (int i=_connectors.length;i-->0;)
34003928aee4356845252ac6b662d5c72c29903813eJake Slack                try{_connectors[i].stop();}catch(Throwable e){mex.add(e);}
34103928aee4356845252ac6b662d5c72c29903813eJake Slack        }
34203928aee4356845252ac6b662d5c72c29903813eJake Slack
34303928aee4356845252ac6b662d5c72c29903813eJake Slack        try {super.doStop(); } catch(Throwable e) { mex.add(e);}
34403928aee4356845252ac6b662d5c72c29903813eJake Slack
34503928aee4356845252ac6b662d5c72c29903813eJake Slack        mex.ifExceptionThrow();
34603928aee4356845252ac6b662d5c72c29903813eJake Slack
34703928aee4356845252ac6b662d5c72c29903813eJake Slack        if (getStopAtShutdown())
34803928aee4356845252ac6b662d5c72c29903813eJake Slack            ShutdownThread.deregister(this);
34903928aee4356845252ac6b662d5c72c29903813eJake Slack    }
35003928aee4356845252ac6b662d5c72c29903813eJake Slack
35103928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------ */
35203928aee4356845252ac6b662d5c72c29903813eJake Slack    /* Handle a request from a connection.
35303928aee4356845252ac6b662d5c72c29903813eJake Slack     * Called to handle a request on the connection when either the header has been received,
35403928aee4356845252ac6b662d5c72c29903813eJake Slack     * or after the entire request has been received (for short requests of known length), or
35503928aee4356845252ac6b662d5c72c29903813eJake Slack     * on the dispatch of an async request.
35603928aee4356845252ac6b662d5c72c29903813eJake Slack     */
35703928aee4356845252ac6b662d5c72c29903813eJake Slack    public void handle(AbstractHttpConnection connection) throws IOException, ServletException
35803928aee4356845252ac6b662d5c72c29903813eJake Slack    {
35903928aee4356845252ac6b662d5c72c29903813eJake Slack        final String target=connection.getRequest().getPathInfo();
36003928aee4356845252ac6b662d5c72c29903813eJake Slack        final Request request=connection.getRequest();
36103928aee4356845252ac6b662d5c72c29903813eJake Slack        final Response response=connection.getResponse();
36203928aee4356845252ac6b662d5c72c29903813eJake Slack
36303928aee4356845252ac6b662d5c72c29903813eJake Slack        if (LOG.isDebugEnabled())
36403928aee4356845252ac6b662d5c72c29903813eJake Slack        {
36503928aee4356845252ac6b662d5c72c29903813eJake Slack            LOG.debug("REQUEST "+target+" on "+connection);
36603928aee4356845252ac6b662d5c72c29903813eJake Slack            handle(target, request, request, response);
36703928aee4356845252ac6b662d5c72c29903813eJake Slack            LOG.debug("RESPONSE "+target+"  "+connection.getResponse().getStatus()+" handled="+request.isHandled());
36803928aee4356845252ac6b662d5c72c29903813eJake Slack        }
36903928aee4356845252ac6b662d5c72c29903813eJake Slack        else
37003928aee4356845252ac6b662d5c72c29903813eJake Slack            handle(target, request, request, response);
37103928aee4356845252ac6b662d5c72c29903813eJake Slack    }
37203928aee4356845252ac6b662d5c72c29903813eJake Slack
37303928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------ */
37403928aee4356845252ac6b662d5c72c29903813eJake Slack    /* Handle a request from a connection.
37503928aee4356845252ac6b662d5c72c29903813eJake Slack     * Called to handle a request on the connection when either the header has been received,
37603928aee4356845252ac6b662d5c72c29903813eJake Slack     * or after the entire request has been received (for short requests of known length), or
37703928aee4356845252ac6b662d5c72c29903813eJake Slack     * on the dispatch of an async request.
37803928aee4356845252ac6b662d5c72c29903813eJake Slack     */
37903928aee4356845252ac6b662d5c72c29903813eJake Slack    public void handleAsync(AbstractHttpConnection connection) throws IOException, ServletException
38003928aee4356845252ac6b662d5c72c29903813eJake Slack    {
38103928aee4356845252ac6b662d5c72c29903813eJake Slack        final AsyncContinuation async = connection.getRequest().getAsyncContinuation();
38203928aee4356845252ac6b662d5c72c29903813eJake Slack        final AsyncContinuation.AsyncEventState state = async.getAsyncEventState();
38303928aee4356845252ac6b662d5c72c29903813eJake Slack
38403928aee4356845252ac6b662d5c72c29903813eJake Slack        final Request baseRequest=connection.getRequest();
38503928aee4356845252ac6b662d5c72c29903813eJake Slack        final String path=state.getPath();
38603928aee4356845252ac6b662d5c72c29903813eJake Slack
38703928aee4356845252ac6b662d5c72c29903813eJake Slack        if (path!=null)
38803928aee4356845252ac6b662d5c72c29903813eJake Slack        {
38903928aee4356845252ac6b662d5c72c29903813eJake Slack            // this is a dispatch with a path
39003928aee4356845252ac6b662d5c72c29903813eJake Slack            final String contextPath=state.getServletContext().getContextPath();
39103928aee4356845252ac6b662d5c72c29903813eJake Slack            HttpURI uri = new HttpURI(URIUtil.addPaths(contextPath,path));
39203928aee4356845252ac6b662d5c72c29903813eJake Slack            baseRequest.setUri(uri);
39303928aee4356845252ac6b662d5c72c29903813eJake Slack            baseRequest.setRequestURI(null);
39403928aee4356845252ac6b662d5c72c29903813eJake Slack            baseRequest.setPathInfo(baseRequest.getRequestURI());
39503928aee4356845252ac6b662d5c72c29903813eJake Slack            if (uri.getQuery()!=null)
39603928aee4356845252ac6b662d5c72c29903813eJake Slack                baseRequest.mergeQueryString(uri.getQuery()); //we have to assume dispatch path and query are UTF8
39703928aee4356845252ac6b662d5c72c29903813eJake Slack        }
39803928aee4356845252ac6b662d5c72c29903813eJake Slack
39903928aee4356845252ac6b662d5c72c29903813eJake Slack        final String target=baseRequest.getPathInfo();
40003928aee4356845252ac6b662d5c72c29903813eJake Slack        final HttpServletRequest request=(HttpServletRequest)async.getRequest();
40103928aee4356845252ac6b662d5c72c29903813eJake Slack        final HttpServletResponse response=(HttpServletResponse)async.getResponse();
40203928aee4356845252ac6b662d5c72c29903813eJake Slack
40303928aee4356845252ac6b662d5c72c29903813eJake Slack        if (LOG.isDebugEnabled())
40403928aee4356845252ac6b662d5c72c29903813eJake Slack        {
40503928aee4356845252ac6b662d5c72c29903813eJake Slack            LOG.debug("REQUEST "+target+" on "+connection);
40603928aee4356845252ac6b662d5c72c29903813eJake Slack            handle(target, baseRequest, request, response);
40703928aee4356845252ac6b662d5c72c29903813eJake Slack            LOG.debug("RESPONSE "+target+"  "+connection.getResponse().getStatus());
40803928aee4356845252ac6b662d5c72c29903813eJake Slack        }
40903928aee4356845252ac6b662d5c72c29903813eJake Slack        else
41003928aee4356845252ac6b662d5c72c29903813eJake Slack            handle(target, baseRequest, request, response);
41103928aee4356845252ac6b662d5c72c29903813eJake Slack
41203928aee4356845252ac6b662d5c72c29903813eJake Slack    }
41303928aee4356845252ac6b662d5c72c29903813eJake Slack
41403928aee4356845252ac6b662d5c72c29903813eJake Slack
41503928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------ */
41603928aee4356845252ac6b662d5c72c29903813eJake Slack    public void join() throws InterruptedException
41703928aee4356845252ac6b662d5c72c29903813eJake Slack    {
41803928aee4356845252ac6b662d5c72c29903813eJake Slack        getThreadPool().join();
41903928aee4356845252ac6b662d5c72c29903813eJake Slack    }
42003928aee4356845252ac6b662d5c72c29903813eJake Slack
42103928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------ */
42203928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------ */
42303928aee4356845252ac6b662d5c72c29903813eJake Slack    /**
42403928aee4356845252ac6b662d5c72c29903813eJake Slack     * @return Returns the sessionIdManager.
42503928aee4356845252ac6b662d5c72c29903813eJake Slack     */
42603928aee4356845252ac6b662d5c72c29903813eJake Slack    public SessionIdManager getSessionIdManager()
42703928aee4356845252ac6b662d5c72c29903813eJake Slack    {
42803928aee4356845252ac6b662d5c72c29903813eJake Slack        return _sessionIdManager;
42903928aee4356845252ac6b662d5c72c29903813eJake Slack    }
43003928aee4356845252ac6b662d5c72c29903813eJake Slack
43103928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------ */
43203928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------ */
43303928aee4356845252ac6b662d5c72c29903813eJake Slack    /**
43403928aee4356845252ac6b662d5c72c29903813eJake Slack     * @param sessionIdManager The sessionIdManager to set.
43503928aee4356845252ac6b662d5c72c29903813eJake Slack     */
43603928aee4356845252ac6b662d5c72c29903813eJake Slack    public void setSessionIdManager(SessionIdManager sessionIdManager)
43703928aee4356845252ac6b662d5c72c29903813eJake Slack    {
43803928aee4356845252ac6b662d5c72c29903813eJake Slack        if (_sessionIdManager!=null)
43903928aee4356845252ac6b662d5c72c29903813eJake Slack            removeBean(_sessionIdManager);
44003928aee4356845252ac6b662d5c72c29903813eJake Slack        _container.update(this, _sessionIdManager, sessionIdManager, "sessionIdManager",false);
44103928aee4356845252ac6b662d5c72c29903813eJake Slack        _sessionIdManager = sessionIdManager;
44203928aee4356845252ac6b662d5c72c29903813eJake Slack        if (_sessionIdManager!=null)
44303928aee4356845252ac6b662d5c72c29903813eJake Slack            addBean(_sessionIdManager);
44403928aee4356845252ac6b662d5c72c29903813eJake Slack    }
44503928aee4356845252ac6b662d5c72c29903813eJake Slack
44603928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------ */
44703928aee4356845252ac6b662d5c72c29903813eJake Slack    public void setSendServerVersion (boolean sendServerVersion)
44803928aee4356845252ac6b662d5c72c29903813eJake Slack    {
44903928aee4356845252ac6b662d5c72c29903813eJake Slack        _sendServerVersion = sendServerVersion;
45003928aee4356845252ac6b662d5c72c29903813eJake Slack    }
45103928aee4356845252ac6b662d5c72c29903813eJake Slack
45203928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------ */
45303928aee4356845252ac6b662d5c72c29903813eJake Slack    public boolean getSendServerVersion()
45403928aee4356845252ac6b662d5c72c29903813eJake Slack    {
45503928aee4356845252ac6b662d5c72c29903813eJake Slack        return _sendServerVersion;
45603928aee4356845252ac6b662d5c72c29903813eJake Slack    }
45703928aee4356845252ac6b662d5c72c29903813eJake Slack
45803928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------ */
45903928aee4356845252ac6b662d5c72c29903813eJake Slack    /**
46003928aee4356845252ac6b662d5c72c29903813eJake Slack     * @param sendDateHeader
46103928aee4356845252ac6b662d5c72c29903813eJake Slack     */
46203928aee4356845252ac6b662d5c72c29903813eJake Slack    public void setSendDateHeader(boolean sendDateHeader)
46303928aee4356845252ac6b662d5c72c29903813eJake Slack    {
46403928aee4356845252ac6b662d5c72c29903813eJake Slack        _sendDateHeader = sendDateHeader;
46503928aee4356845252ac6b662d5c72c29903813eJake Slack    }
46603928aee4356845252ac6b662d5c72c29903813eJake Slack
46703928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------ */
46803928aee4356845252ac6b662d5c72c29903813eJake Slack    public boolean getSendDateHeader()
46903928aee4356845252ac6b662d5c72c29903813eJake Slack    {
47003928aee4356845252ac6b662d5c72c29903813eJake Slack        return _sendDateHeader;
47103928aee4356845252ac6b662d5c72c29903813eJake Slack    }
47203928aee4356845252ac6b662d5c72c29903813eJake Slack
47303928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------ */
47403928aee4356845252ac6b662d5c72c29903813eJake Slack    /**
47503928aee4356845252ac6b662d5c72c29903813eJake Slack     */
47603928aee4356845252ac6b662d5c72c29903813eJake Slack    @Deprecated
47703928aee4356845252ac6b662d5c72c29903813eJake Slack    public int getMaxCookieVersion()
47803928aee4356845252ac6b662d5c72c29903813eJake Slack    {
47903928aee4356845252ac6b662d5c72c29903813eJake Slack        return 1;
48003928aee4356845252ac6b662d5c72c29903813eJake Slack    }
48103928aee4356845252ac6b662d5c72c29903813eJake Slack
48203928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------ */
48303928aee4356845252ac6b662d5c72c29903813eJake Slack    /**
48403928aee4356845252ac6b662d5c72c29903813eJake Slack     */
48503928aee4356845252ac6b662d5c72c29903813eJake Slack    @Deprecated
48603928aee4356845252ac6b662d5c72c29903813eJake Slack    public void setMaxCookieVersion(int maxCookieVersion)
48703928aee4356845252ac6b662d5c72c29903813eJake Slack    {
48803928aee4356845252ac6b662d5c72c29903813eJake Slack    }
48903928aee4356845252ac6b662d5c72c29903813eJake Slack
49003928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------ */
49103928aee4356845252ac6b662d5c72c29903813eJake Slack    /**
49203928aee4356845252ac6b662d5c72c29903813eJake Slack     * Add a LifeCycle object to be started/stopped
49303928aee4356845252ac6b662d5c72c29903813eJake Slack     * along with the Server.
49403928aee4356845252ac6b662d5c72c29903813eJake Slack     * @deprecated Use {@link #addBean(Object)}
49503928aee4356845252ac6b662d5c72c29903813eJake Slack     * @param c
49603928aee4356845252ac6b662d5c72c29903813eJake Slack     */
49703928aee4356845252ac6b662d5c72c29903813eJake Slack    @Deprecated
49803928aee4356845252ac6b662d5c72c29903813eJake Slack    public void addLifeCycle (LifeCycle c)
49903928aee4356845252ac6b662d5c72c29903813eJake Slack    {
50003928aee4356845252ac6b662d5c72c29903813eJake Slack        addBean(c);
50103928aee4356845252ac6b662d5c72c29903813eJake Slack    }
50203928aee4356845252ac6b662d5c72c29903813eJake Slack
50303928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------ */
50403928aee4356845252ac6b662d5c72c29903813eJake Slack    /**
50503928aee4356845252ac6b662d5c72c29903813eJake Slack     * Add an associated bean.
50603928aee4356845252ac6b662d5c72c29903813eJake Slack     * The bean will be added to the servers {@link Container}
50703928aee4356845252ac6b662d5c72c29903813eJake Slack     * and if it is a {@link LifeCycle} instance, it will be
50803928aee4356845252ac6b662d5c72c29903813eJake Slack     * started/stopped along with the Server. Any beans that are also
50903928aee4356845252ac6b662d5c72c29903813eJake Slack     * {@link Destroyable}, will be destroyed with the server.
51003928aee4356845252ac6b662d5c72c29903813eJake Slack     * @param o the bean object to add
51103928aee4356845252ac6b662d5c72c29903813eJake Slack     */
51203928aee4356845252ac6b662d5c72c29903813eJake Slack    @Override
51303928aee4356845252ac6b662d5c72c29903813eJake Slack    public boolean addBean(Object o)
51403928aee4356845252ac6b662d5c72c29903813eJake Slack    {
51503928aee4356845252ac6b662d5c72c29903813eJake Slack        if (super.addBean(o))
51603928aee4356845252ac6b662d5c72c29903813eJake Slack        {
51703928aee4356845252ac6b662d5c72c29903813eJake Slack            _container.addBean(o);
51803928aee4356845252ac6b662d5c72c29903813eJake Slack            return true;
51903928aee4356845252ac6b662d5c72c29903813eJake Slack        }
52003928aee4356845252ac6b662d5c72c29903813eJake Slack        return false;
52103928aee4356845252ac6b662d5c72c29903813eJake Slack    }
52203928aee4356845252ac6b662d5c72c29903813eJake Slack
52303928aee4356845252ac6b662d5c72c29903813eJake Slack    /**
52403928aee4356845252ac6b662d5c72c29903813eJake Slack     * Remove a LifeCycle object to be started/stopped
52503928aee4356845252ac6b662d5c72c29903813eJake Slack     * along with the Server
52603928aee4356845252ac6b662d5c72c29903813eJake Slack     * @deprecated Use {@link #removeBean(Object)}
52703928aee4356845252ac6b662d5c72c29903813eJake Slack     */
52803928aee4356845252ac6b662d5c72c29903813eJake Slack    @Deprecated
52903928aee4356845252ac6b662d5c72c29903813eJake Slack    public void removeLifeCycle (LifeCycle c)
53003928aee4356845252ac6b662d5c72c29903813eJake Slack    {
53103928aee4356845252ac6b662d5c72c29903813eJake Slack        removeBean(c);
53203928aee4356845252ac6b662d5c72c29903813eJake Slack    }
53303928aee4356845252ac6b662d5c72c29903813eJake Slack
53403928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------ */
53503928aee4356845252ac6b662d5c72c29903813eJake Slack    /**
53603928aee4356845252ac6b662d5c72c29903813eJake Slack     * Remove an associated bean.
53703928aee4356845252ac6b662d5c72c29903813eJake Slack     */
53803928aee4356845252ac6b662d5c72c29903813eJake Slack    @Override
53903928aee4356845252ac6b662d5c72c29903813eJake Slack    public boolean removeBean (Object o)
54003928aee4356845252ac6b662d5c72c29903813eJake Slack    {
54103928aee4356845252ac6b662d5c72c29903813eJake Slack        if (super.removeBean(o))
54203928aee4356845252ac6b662d5c72c29903813eJake Slack        {
54303928aee4356845252ac6b662d5c72c29903813eJake Slack            _container.removeBean(o);
54403928aee4356845252ac6b662d5c72c29903813eJake Slack            return true;
54503928aee4356845252ac6b662d5c72c29903813eJake Slack        }
54603928aee4356845252ac6b662d5c72c29903813eJake Slack        return false;
54703928aee4356845252ac6b662d5c72c29903813eJake Slack    }
54803928aee4356845252ac6b662d5c72c29903813eJake Slack
54903928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------ */
55003928aee4356845252ac6b662d5c72c29903813eJake Slack    /*
55103928aee4356845252ac6b662d5c72c29903813eJake Slack     * @see org.eclipse.util.AttributesMap#clearAttributes()
55203928aee4356845252ac6b662d5c72c29903813eJake Slack     */
55303928aee4356845252ac6b662d5c72c29903813eJake Slack    public void clearAttributes()
55403928aee4356845252ac6b662d5c72c29903813eJake Slack    {
55503928aee4356845252ac6b662d5c72c29903813eJake Slack        _attributes.clearAttributes();
55603928aee4356845252ac6b662d5c72c29903813eJake Slack    }
55703928aee4356845252ac6b662d5c72c29903813eJake Slack
55803928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------ */
55903928aee4356845252ac6b662d5c72c29903813eJake Slack    /*
56003928aee4356845252ac6b662d5c72c29903813eJake Slack     * @see org.eclipse.util.AttributesMap#getAttribute(java.lang.String)
56103928aee4356845252ac6b662d5c72c29903813eJake Slack     */
56203928aee4356845252ac6b662d5c72c29903813eJake Slack    public Object getAttribute(String name)
56303928aee4356845252ac6b662d5c72c29903813eJake Slack    {
56403928aee4356845252ac6b662d5c72c29903813eJake Slack        return _attributes.getAttribute(name);
56503928aee4356845252ac6b662d5c72c29903813eJake Slack    }
56603928aee4356845252ac6b662d5c72c29903813eJake Slack
56703928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------ */
56803928aee4356845252ac6b662d5c72c29903813eJake Slack    /*
56903928aee4356845252ac6b662d5c72c29903813eJake Slack     * @see org.eclipse.util.AttributesMap#getAttributeNames()
57003928aee4356845252ac6b662d5c72c29903813eJake Slack     */
57103928aee4356845252ac6b662d5c72c29903813eJake Slack    public Enumeration getAttributeNames()
57203928aee4356845252ac6b662d5c72c29903813eJake Slack    {
57303928aee4356845252ac6b662d5c72c29903813eJake Slack        return AttributesMap.getAttributeNamesCopy(_attributes);
57403928aee4356845252ac6b662d5c72c29903813eJake Slack    }
57503928aee4356845252ac6b662d5c72c29903813eJake Slack
57603928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------ */
57703928aee4356845252ac6b662d5c72c29903813eJake Slack    /*
57803928aee4356845252ac6b662d5c72c29903813eJake Slack     * @see org.eclipse.util.AttributesMap#removeAttribute(java.lang.String)
57903928aee4356845252ac6b662d5c72c29903813eJake Slack     */
58003928aee4356845252ac6b662d5c72c29903813eJake Slack    public void removeAttribute(String name)
58103928aee4356845252ac6b662d5c72c29903813eJake Slack    {
58203928aee4356845252ac6b662d5c72c29903813eJake Slack        _attributes.removeAttribute(name);
58303928aee4356845252ac6b662d5c72c29903813eJake Slack    }
58403928aee4356845252ac6b662d5c72c29903813eJake Slack
58503928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------ */
58603928aee4356845252ac6b662d5c72c29903813eJake Slack    /*
58703928aee4356845252ac6b662d5c72c29903813eJake Slack     * @see org.eclipse.util.AttributesMap#setAttribute(java.lang.String, java.lang.Object)
58803928aee4356845252ac6b662d5c72c29903813eJake Slack     */
58903928aee4356845252ac6b662d5c72c29903813eJake Slack    public void setAttribute(String name, Object attribute)
59003928aee4356845252ac6b662d5c72c29903813eJake Slack    {
59103928aee4356845252ac6b662d5c72c29903813eJake Slack        _attributes.setAttribute(name, attribute);
59203928aee4356845252ac6b662d5c72c29903813eJake Slack    }
59303928aee4356845252ac6b662d5c72c29903813eJake Slack
59403928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------ */
59503928aee4356845252ac6b662d5c72c29903813eJake Slack    /**
59603928aee4356845252ac6b662d5c72c29903813eJake Slack     * @return the graceful
59703928aee4356845252ac6b662d5c72c29903813eJake Slack     */
59803928aee4356845252ac6b662d5c72c29903813eJake Slack    public int getGracefulShutdown()
59903928aee4356845252ac6b662d5c72c29903813eJake Slack    {
60003928aee4356845252ac6b662d5c72c29903813eJake Slack        return _graceful;
60103928aee4356845252ac6b662d5c72c29903813eJake Slack    }
60203928aee4356845252ac6b662d5c72c29903813eJake Slack
60303928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------ */
60403928aee4356845252ac6b662d5c72c29903813eJake Slack    /**
60503928aee4356845252ac6b662d5c72c29903813eJake Slack     * Set graceful shutdown timeout.  If set, the internal <code>doStop()</code> method will not immediately stop the
60603928aee4356845252ac6b662d5c72c29903813eJake Slack     * server. Instead, all {@link Connector}s will be closed so that new connections will not be accepted
60703928aee4356845252ac6b662d5c72c29903813eJake Slack     * and all handlers that implement {@link Graceful} will be put into the shutdown mode so that no new requests
60803928aee4356845252ac6b662d5c72c29903813eJake Slack     * will be accepted, but existing requests can complete.  The server will then wait the configured timeout
60903928aee4356845252ac6b662d5c72c29903813eJake Slack     * before stopping.
61003928aee4356845252ac6b662d5c72c29903813eJake Slack     * @param timeoutMS the milliseconds to wait for existing request to complete before stopping the server.
61103928aee4356845252ac6b662d5c72c29903813eJake Slack     *
61203928aee4356845252ac6b662d5c72c29903813eJake Slack     */
61303928aee4356845252ac6b662d5c72c29903813eJake Slack    public void setGracefulShutdown(int timeoutMS)
61403928aee4356845252ac6b662d5c72c29903813eJake Slack    {
61503928aee4356845252ac6b662d5c72c29903813eJake Slack        _graceful=timeoutMS;
61603928aee4356845252ac6b662d5c72c29903813eJake Slack    }
61703928aee4356845252ac6b662d5c72c29903813eJake Slack
61803928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------ */
61903928aee4356845252ac6b662d5c72c29903813eJake Slack    @Override
62003928aee4356845252ac6b662d5c72c29903813eJake Slack    public String toString()
62103928aee4356845252ac6b662d5c72c29903813eJake Slack    {
62203928aee4356845252ac6b662d5c72c29903813eJake Slack        return this.getClass().getName()+"@"+Integer.toHexString(hashCode());
62303928aee4356845252ac6b662d5c72c29903813eJake Slack    }
62403928aee4356845252ac6b662d5c72c29903813eJake Slack
62503928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------ */
62603928aee4356845252ac6b662d5c72c29903813eJake Slack    @Override
62703928aee4356845252ac6b662d5c72c29903813eJake Slack    public void dump(Appendable out,String indent) throws IOException
62803928aee4356845252ac6b662d5c72c29903813eJake Slack    {
62903928aee4356845252ac6b662d5c72c29903813eJake Slack        dumpThis(out);
63003928aee4356845252ac6b662d5c72c29903813eJake Slack        dump(out,indent,TypeUtil.asList(getHandlers()),getBeans(),TypeUtil.asList(_connectors));
63103928aee4356845252ac6b662d5c72c29903813eJake Slack    }
63203928aee4356845252ac6b662d5c72c29903813eJake Slack
63303928aee4356845252ac6b662d5c72c29903813eJake Slack
63403928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------ */
63503928aee4356845252ac6b662d5c72c29903813eJake Slack    public boolean isUncheckedPrintWriter()
63603928aee4356845252ac6b662d5c72c29903813eJake Slack    {
63703928aee4356845252ac6b662d5c72c29903813eJake Slack        return _uncheckedPrintWriter;
63803928aee4356845252ac6b662d5c72c29903813eJake Slack    }
63903928aee4356845252ac6b662d5c72c29903813eJake Slack
64003928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------ */
64103928aee4356845252ac6b662d5c72c29903813eJake Slack    public void setUncheckedPrintWriter(boolean unchecked)
64203928aee4356845252ac6b662d5c72c29903813eJake Slack    {
64303928aee4356845252ac6b662d5c72c29903813eJake Slack        _uncheckedPrintWriter=unchecked;
64403928aee4356845252ac6b662d5c72c29903813eJake Slack    }
64503928aee4356845252ac6b662d5c72c29903813eJake Slack
64603928aee4356845252ac6b662d5c72c29903813eJake Slack
64703928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------ */
64803928aee4356845252ac6b662d5c72c29903813eJake Slack    /* A handler that can be gracefully shutdown.
64903928aee4356845252ac6b662d5c72c29903813eJake Slack     * Called by doStop if a {@link #setGracefulShutdown} period is set.
65003928aee4356845252ac6b662d5c72c29903813eJake Slack     * TODO move this somewhere better
65103928aee4356845252ac6b662d5c72c29903813eJake Slack     */
65203928aee4356845252ac6b662d5c72c29903813eJake Slack    public interface Graceful extends Handler
65303928aee4356845252ac6b662d5c72c29903813eJake Slack    {
65403928aee4356845252ac6b662d5c72c29903813eJake Slack        public void setShutdown(boolean shutdown);
65503928aee4356845252ac6b662d5c72c29903813eJake Slack    }
65603928aee4356845252ac6b662d5c72c29903813eJake Slack
65703928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------ */
65803928aee4356845252ac6b662d5c72c29903813eJake Slack    public static void main(String...args) throws Exception
65903928aee4356845252ac6b662d5c72c29903813eJake Slack    {
66003928aee4356845252ac6b662d5c72c29903813eJake Slack        System.err.println(getVersion());
66103928aee4356845252ac6b662d5c72c29903813eJake Slack    }
66203928aee4356845252ac6b662d5c72c29903813eJake Slack}
663