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