Mercurial Hosting > luan
changeset 864:e21ca9878a10
simplify ThreadPool use
author | Franklin Schmidt <fschmidt@gmail.com> |
---|---|
date | Sun, 02 Oct 2016 16:17:38 -0600 |
parents | 88d3c8ff242a |
children | 6b210bb66c63 |
files | src/org/eclipse/jetty/server/AbstractConnector.java src/org/eclipse/jetty/server/Server.java src/org/eclipse/jetty/server/nio/SelectChannelConnector.java src/org/eclipse/jetty/util/component/AggregateLifeCycle.java |
diffstat | 4 files changed, 1435 insertions(+), 1602 deletions(-) [+] |
line wrap: on
line diff
--- a/src/org/eclipse/jetty/server/AbstractConnector.java Sun Oct 02 05:22:55 2016 -0600 +++ b/src/org/eclipse/jetty/server/AbstractConnector.java Sun Oct 02 16:17:38 2016 -0600 @@ -55,998 +55,977 @@ */ public abstract class AbstractConnector extends AggregateLifeCycle implements HttpBuffers, Connector, Dumpable { - private static final Logger LOG = LoggerFactory.getLogger(AbstractConnector.class); + private static final Logger LOG = LoggerFactory.getLogger(AbstractConnector.class); - private String _name; + private String _name; - private Server _server; - private ThreadPool _threadPool; - private String _host; - private int _port = 0; - private String _integralScheme = HttpSchemes.HTTPS; - private int _integralPort = 0; - private String _confidentialScheme = HttpSchemes.HTTPS; - private int _confidentialPort = 0; - private int _acceptQueueSize = 0; - private int _acceptors = 1; - private int _acceptorPriorityOffset = 0; - private boolean _useDNS; - private boolean _forwarded; - private String _hostHeader; + private Server _server; + private String _host; + private int _port = 0; + private String _integralScheme = HttpSchemes.HTTPS; + private int _integralPort = 0; + private String _confidentialScheme = HttpSchemes.HTTPS; + private int _confidentialPort = 0; + private int _acceptQueueSize = 0; + private int _acceptors = 1; + private int _acceptorPriorityOffset = 0; + private boolean _useDNS; + private boolean _forwarded; + private String _hostHeader; - private String _forwardedHostHeader = HttpHeaders.X_FORWARDED_HOST; - private String _forwardedServerHeader = HttpHeaders.X_FORWARDED_SERVER; - private String _forwardedForHeader = HttpHeaders.X_FORWARDED_FOR; - private String _forwardedProtoHeader = HttpHeaders.X_FORWARDED_PROTO; - private String _forwardedCipherSuiteHeader; - private String _forwardedSslSessionIdHeader; - private boolean _reuseAddress = true; + private String _forwardedHostHeader = HttpHeaders.X_FORWARDED_HOST; + private String _forwardedServerHeader = HttpHeaders.X_FORWARDED_SERVER; + private String _forwardedForHeader = HttpHeaders.X_FORWARDED_FOR; + private String _forwardedProtoHeader = HttpHeaders.X_FORWARDED_PROTO; + private String _forwardedCipherSuiteHeader; + private String _forwardedSslSessionIdHeader; + private boolean _reuseAddress = true; - protected int _maxIdleTime = 200000; - protected int _lowResourceMaxIdleTime = -1; - protected int _soLingerTime = -1; - - private transient Thread[] _acceptorThreads; - - protected final HttpBuffersImpl _buffers = new HttpBuffersImpl(); + protected int _maxIdleTime = 200000; + protected int _lowResourceMaxIdleTime = -1; + protected int _soLingerTime = -1; - /* ------------------------------------------------------------ */ - /** - */ - public AbstractConnector() - { - addBean(_buffers); - } + private transient Thread[] _acceptorThreads; + + protected final HttpBuffersImpl _buffers = new HttpBuffersImpl(); - /* ------------------------------------------------------------ */ - /* - */ - public Server getServer() - { - return _server; - } + /* ------------------------------------------------------------ */ + /** + */ + public AbstractConnector() + { + addBean(_buffers); + } - /* ------------------------------------------------------------ */ - public void setServer(Server server) - { - _server = server; - } + /* ------------------------------------------------------------ */ + /* + */ + public Server getServer() + { + return _server; + } - /* ------------------------------------------------------------ */ - public ThreadPool getThreadPool() - { - return _threadPool; - } + /* ------------------------------------------------------------ */ + public void setServer(Server server) + { + _server = server; + } - /* ------------------------------------------------------------ */ - /** Set the ThreadPool. - * The threadpool passed is added via {@link #addBean(Object)} so that - * it's lifecycle may be managed as a {@link AggregateLifeCycle}. - * @param pool the threadPool to set - */ - public void setThreadPool(ThreadPool pool) - { - removeBean(_threadPool); - _threadPool = pool; - addBean(_threadPool); - } + /* ------------------------------------------------------------ */ + public ThreadPool getThreadPool() + { + return _server.getThreadPool(); + } + + /* ------------------------------------------------------------ */ + /** + */ + public void setHost(String host) + { + _host = host; + } - /* ------------------------------------------------------------ */ - /** - */ - public void setHost(String host) - { - _host = host; - } + /* ------------------------------------------------------------ */ + /* + */ + public String getHost() + { + return _host; + } - /* ------------------------------------------------------------ */ - /* - */ - public String getHost() - { - return _host; - } + /* ------------------------------------------------------------ */ + public void setPort(int port) + { + _port = port; + } - /* ------------------------------------------------------------ */ - public void setPort(int port) - { - _port = port; - } + /* ------------------------------------------------------------ */ + public int getPort() + { + return _port; + } - /* ------------------------------------------------------------ */ - public int getPort() - { - return _port; - } - - /* ------------------------------------------------------------ */ - /** - * @return Returns the maxIdleTime. - */ - public int getMaxIdleTime() - { - return _maxIdleTime; - } + /* ------------------------------------------------------------ */ + /** + * @return Returns the maxIdleTime. + */ + public int getMaxIdleTime() + { + return _maxIdleTime; + } - /* ------------------------------------------------------------ */ - /** - * Set the maximum Idle time for a connection, which roughly translates to the {@link Socket#setSoTimeout(int)} call, although with NIO implementations - * other mechanisms may be used to implement the timeout. The max idle time is applied: - * <ul> - * <li>When waiting for a new request to be received on a connection</li> - * <li>When reading the headers and content of a request</li> - * <li>When writing the headers and content of a response</li> - * </ul> - * Jetty interprets this value as the maximum time between some progress being made on the connection. So if a single byte is read or written, then the - * timeout (if implemented by jetty) is reset. However, in many instances, the reading/writing is delegated to the JVM, and the semantic is more strictly - * enforced as the maximum time a single read/write operation can take. Note, that as Jetty supports writes of memory mapped file buffers, then a write may - * take many 10s of seconds for large content written to a slow device. - * <p> - * Previously, Jetty supported separate idle timeouts and IO operation timeouts, however the expense of changing the value of soTimeout was significant, so - * these timeouts were merged. With the advent of NIO, it may be possible to again differentiate these values (if there is demand). - * - * @param maxIdleTime - * The maxIdleTime to set. - */ - public void setMaxIdleTime(int maxIdleTime) - { - _maxIdleTime = maxIdleTime; - } + /* ------------------------------------------------------------ */ + /** + * Set the maximum Idle time for a connection, which roughly translates to the {@link Socket#setSoTimeout(int)} call, although with NIO implementations + * other mechanisms may be used to implement the timeout. The max idle time is applied: + * <ul> + * <li>When waiting for a new request to be received on a connection</li> + * <li>When reading the headers and content of a request</li> + * <li>When writing the headers and content of a response</li> + * </ul> + * Jetty interprets this value as the maximum time between some progress being made on the connection. So if a single byte is read or written, then the + * timeout (if implemented by jetty) is reset. However, in many instances, the reading/writing is delegated to the JVM, and the semantic is more strictly + * enforced as the maximum time a single read/write operation can take. Note, that as Jetty supports writes of memory mapped file buffers, then a write may + * take many 10s of seconds for large content written to a slow device. + * <p> + * Previously, Jetty supported separate idle timeouts and IO operation timeouts, however the expense of changing the value of soTimeout was significant, so + * these timeouts were merged. With the advent of NIO, it may be possible to again differentiate these values (if there is demand). + * + * @param maxIdleTime + * The maxIdleTime to set. + */ + public void setMaxIdleTime(int maxIdleTime) + { + _maxIdleTime = maxIdleTime; + } - /* ------------------------------------------------------------ */ - /** - * @return Returns the maxIdleTime when resources are low. - */ - public int getLowResourcesMaxIdleTime() - { - return _lowResourceMaxIdleTime; - } + /* ------------------------------------------------------------ */ + /** + * @return Returns the maxIdleTime when resources are low. + */ + public int getLowResourcesMaxIdleTime() + { + return _lowResourceMaxIdleTime; + } + + /* ------------------------------------------------------------ */ + /** + * @param maxIdleTime + * The maxIdleTime to set when resources are low. + */ + public void setLowResourcesMaxIdleTime(int maxIdleTime) + { + _lowResourceMaxIdleTime = maxIdleTime; + } - /* ------------------------------------------------------------ */ - /** - * @param maxIdleTime - * The maxIdleTime to set when resources are low. - */ - public void setLowResourcesMaxIdleTime(int maxIdleTime) - { - _lowResourceMaxIdleTime = maxIdleTime; - } + /* ------------------------------------------------------------ */ + /** + * @return Returns the maxIdleTime when resources are low. + * @deprecated + */ + @Deprecated + public final int getLowResourceMaxIdleTime() + { + return getLowResourcesMaxIdleTime(); + } - /* ------------------------------------------------------------ */ - /** - * @return Returns the maxIdleTime when resources are low. - * @deprecated - */ - @Deprecated - public final int getLowResourceMaxIdleTime() - { - return getLowResourcesMaxIdleTime(); - } + /* ------------------------------------------------------------ */ + /** + * @param maxIdleTime + * The maxIdleTime to set when resources are low. + * @deprecated + */ + @Deprecated + public final void setLowResourceMaxIdleTime(int maxIdleTime) + { + setLowResourcesMaxIdleTime(maxIdleTime); + } - /* ------------------------------------------------------------ */ - /** - * @param maxIdleTime - * The maxIdleTime to set when resources are low. - * @deprecated - */ - @Deprecated - public final void setLowResourceMaxIdleTime(int maxIdleTime) - { - setLowResourcesMaxIdleTime(maxIdleTime); - } + /* ------------------------------------------------------------ */ + /** + * @return Returns the soLingerTime. + */ + public int getSoLingerTime() + { + return _soLingerTime; + } - /* ------------------------------------------------------------ */ - /** - * @return Returns the soLingerTime. - */ - public int getSoLingerTime() - { - return _soLingerTime; - } + /* ------------------------------------------------------------ */ + /** + * @return Returns the acceptQueueSize. + */ + public int getAcceptQueueSize() + { + return _acceptQueueSize; + } - /* ------------------------------------------------------------ */ - /** - * @return Returns the acceptQueueSize. - */ - public int getAcceptQueueSize() - { - return _acceptQueueSize; - } + /* ------------------------------------------------------------ */ + /** + * @param acceptQueueSize + * The acceptQueueSize to set. + */ + public void setAcceptQueueSize(int acceptQueueSize) + { + _acceptQueueSize = acceptQueueSize; + } - /* ------------------------------------------------------------ */ - /** - * @param acceptQueueSize - * The acceptQueueSize to set. - */ - public void setAcceptQueueSize(int acceptQueueSize) - { - _acceptQueueSize = acceptQueueSize; - } + /* ------------------------------------------------------------ */ + /** + * @return Returns the number of acceptor threads. + */ + public int getAcceptors() + { + return _acceptors; + } - /* ------------------------------------------------------------ */ - /** - * @return Returns the number of acceptor threads. - */ - public int getAcceptors() - { - return _acceptors; - } + /* ------------------------------------------------------------ */ + /** + * @param acceptors + * The number of acceptor threads to set. + */ + public void setAcceptors(int acceptors) + { + if (acceptors > 2 * Runtime.getRuntime().availableProcessors()) + LOG.warn("Acceptors should be <=2*availableProcessors: " + this); + _acceptors = acceptors; + } - /* ------------------------------------------------------------ */ - /** - * @param acceptors - * The number of acceptor threads to set. - */ - public void setAcceptors(int acceptors) - { - if (acceptors > 2 * Runtime.getRuntime().availableProcessors()) - LOG.warn("Acceptors should be <=2*availableProcessors: " + this); - _acceptors = acceptors; - } + /* ------------------------------------------------------------ */ + /** + * @param soLingerTime + * The soLingerTime to set or -1 to disable. + */ + public void setSoLingerTime(int soLingerTime) + { + _soLingerTime = soLingerTime; + } - /* ------------------------------------------------------------ */ - /** - * @param soLingerTime - * The soLingerTime to set or -1 to disable. - */ - public void setSoLingerTime(int soLingerTime) - { - _soLingerTime = soLingerTime; - } + /* ------------------------------------------------------------ */ + @Override + protected void doStart() throws Exception + { + if (_server == null) + throw new IllegalStateException("No server"); + + // open listener port + open(); + + super.doStart(); - /* ------------------------------------------------------------ */ - @Override - protected void doStart() throws Exception - { - if (_server == null) - throw new IllegalStateException("No server"); - - // open listener port - open(); + // Start selector thread + synchronized (this) + { + _acceptorThreads = new Thread[getAcceptors()]; - if (_threadPool == null) - { - _threadPool = _server.getThreadPool(); - addBean(_threadPool,false); - } + ThreadPool _threadPool = getThreadPool(); + for (int i = 0; i < _acceptorThreads.length; i++) + if (!_threadPool.dispatch(new Acceptor(i))) + throw new IllegalStateException("!accepting"); + if (_threadPool.isLowOnThreads()) + LOG.warn("insufficient threads configured for {}",this); + } - super.doStart(); - - // Start selector thread - synchronized (this) - { - _acceptorThreads = new Thread[getAcceptors()]; + LOG.info("Started {}",this); + } - for (int i = 0; i < _acceptorThreads.length; i++) - if (!_threadPool.dispatch(new Acceptor(i))) - throw new IllegalStateException("!accepting"); - if (_threadPool.isLowOnThreads()) - LOG.warn("insufficient threads configured for {}",this); - } + /* ------------------------------------------------------------ */ + @Override + protected void doStop() throws Exception + { + try + { + close(); + } + catch (IOException e) + { + LOG.warn("",e); + } - LOG.info("Started {}",this); - } + super.doStop(); - /* ------------------------------------------------------------ */ - @Override - protected void doStop() throws Exception - { - try - { - close(); - } - catch (IOException e) - { - LOG.warn("",e); - } - - super.doStop(); + Thread[] acceptors; + synchronized (this) + { + acceptors = _acceptorThreads; + _acceptorThreads = null; + } + if (acceptors != null) + { + for (Thread thread : acceptors) + { + if (thread != null) + thread.interrupt(); + } + } + } - Thread[] acceptors; - synchronized (this) - { - acceptors = _acceptorThreads; - _acceptorThreads = null; - } - if (acceptors != null) - { - for (Thread thread : acceptors) - { - if (thread != null) - thread.interrupt(); - } - } - } + /* ------------------------------------------------------------ */ + public void join() throws InterruptedException + { + Thread[] threads; + synchronized(this) + { + threads=_acceptorThreads; + } + if (threads != null) + for (Thread thread : threads) + if (thread != null) + thread.join(); + } - /* ------------------------------------------------------------ */ - public void join() throws InterruptedException - { - Thread[] threads; - synchronized(this) - { - threads=_acceptorThreads; - } - if (threads != null) - for (Thread thread : threads) - if (thread != null) - thread.join(); - } + /* ------------------------------------------------------------ */ + protected void configure(Socket socket) throws IOException + { + try + { + socket.setTcpNoDelay(true); + if (_soLingerTime >= 0) + socket.setSoLinger(true,_soLingerTime / 1000); + else + socket.setSoLinger(false,0); + } + catch (Exception e) + { + LOG.trace("",e); + } + } - /* ------------------------------------------------------------ */ - protected void configure(Socket socket) throws IOException - { - try - { - socket.setTcpNoDelay(true); - if (_soLingerTime >= 0) - socket.setSoLinger(true,_soLingerTime / 1000); - else - socket.setSoLinger(false,0); - } - catch (Exception e) - { - LOG.trace("",e); - } - } + /* ------------------------------------------------------------ */ + public void customize(EndPoint endpoint, Request request) throws IOException + { + if (isForwarded()) + checkForwardedHeaders(endpoint,request); + } + + /* ------------------------------------------------------------ */ + protected void checkForwardedHeaders(EndPoint endpoint, Request request) throws IOException + { + HttpFields httpFields = request.getConnection().getRequestFields(); - /* ------------------------------------------------------------ */ - public void customize(EndPoint endpoint, Request request) throws IOException - { - if (isForwarded()) - checkForwardedHeaders(endpoint,request); - } - - /* ------------------------------------------------------------ */ - protected void checkForwardedHeaders(EndPoint endpoint, Request request) throws IOException - { - HttpFields httpFields = request.getConnection().getRequestFields(); + // Do SSL first + if (getForwardedCipherSuiteHeader()!=null) + { + String cipher_suite=httpFields.getStringField(getForwardedCipherSuiteHeader()); + if (cipher_suite!=null) + request.setAttribute("javax.servlet.request.cipher_suite",cipher_suite); + } + if (getForwardedSslSessionIdHeader()!=null) + { + String ssl_session_id=httpFields.getStringField(getForwardedSslSessionIdHeader()); + if(ssl_session_id!=null) + { + request.setAttribute("javax.servlet.request.ssl_session_id", ssl_session_id); + request.setScheme(HttpSchemes.HTTPS); + } + } - // Do SSL first - if (getForwardedCipherSuiteHeader()!=null) - { - String cipher_suite=httpFields.getStringField(getForwardedCipherSuiteHeader()); - if (cipher_suite!=null) - request.setAttribute("javax.servlet.request.cipher_suite",cipher_suite); - } - if (getForwardedSslSessionIdHeader()!=null) - { - String ssl_session_id=httpFields.getStringField(getForwardedSslSessionIdHeader()); - if(ssl_session_id!=null) - { - request.setAttribute("javax.servlet.request.ssl_session_id", ssl_session_id); - request.setScheme(HttpSchemes.HTTPS); - } - } + // Retrieving headers from the request + String forwardedHost = getLeftMostFieldValue(httpFields,getForwardedHostHeader()); + String forwardedServer = getLeftMostFieldValue(httpFields,getForwardedServerHeader()); + String forwardedFor = getLeftMostFieldValue(httpFields,getForwardedForHeader()); + String forwardedProto = getLeftMostFieldValue(httpFields,getForwardedProtoHeader()); - // Retrieving headers from the request - String forwardedHost = getLeftMostFieldValue(httpFields,getForwardedHostHeader()); - String forwardedServer = getLeftMostFieldValue(httpFields,getForwardedServerHeader()); - String forwardedFor = getLeftMostFieldValue(httpFields,getForwardedForHeader()); - String forwardedProto = getLeftMostFieldValue(httpFields,getForwardedProtoHeader()); + if (_hostHeader != null) + { + // Update host header + httpFields.put(HttpHeaders.HOST_BUFFER,_hostHeader); + request.setServerName(null); + request.setServerPort(-1); + request.getServerName(); + } + else if (forwardedHost != null) + { + // Update host header + httpFields.put(HttpHeaders.HOST_BUFFER,forwardedHost); + request.setServerName(null); + request.setServerPort(-1); + request.getServerName(); + } + else if (forwardedServer != null) + { + // Use provided server name + request.setServerName(forwardedServer); + } - if (_hostHeader != null) - { - // Update host header - httpFields.put(HttpHeaders.HOST_BUFFER,_hostHeader); - request.setServerName(null); - request.setServerPort(-1); - request.getServerName(); - } - else if (forwardedHost != null) - { - // Update host header - httpFields.put(HttpHeaders.HOST_BUFFER,forwardedHost); - request.setServerName(null); - request.setServerPort(-1); - request.getServerName(); - } - else if (forwardedServer != null) - { - // Use provided server name - request.setServerName(forwardedServer); - } + if (forwardedFor != null) + { + request.setRemoteAddr(forwardedFor); + InetAddress inetAddress = null; - if (forwardedFor != null) - { - request.setRemoteAddr(forwardedFor); - InetAddress inetAddress = null; + if (_useDNS) + { + try + { + inetAddress = InetAddress.getByName(forwardedFor); + } + catch (UnknownHostException e) + { + LOG.trace("",e); + } + } - if (_useDNS) - { - try - { - inetAddress = InetAddress.getByName(forwardedFor); - } - catch (UnknownHostException e) - { - LOG.trace("",e); - } - } + request.setRemoteHost(inetAddress == null?forwardedFor:inetAddress.getHostName()); + } - request.setRemoteHost(inetAddress == null?forwardedFor:inetAddress.getHostName()); - } + if (forwardedProto != null) + { + request.setScheme(forwardedProto); + } + } - if (forwardedProto != null) - { - request.setScheme(forwardedProto); - } - } + /* ------------------------------------------------------------ */ + protected String getLeftMostFieldValue(HttpFields fields, String header) + { + if (header == null) + return null; - /* ------------------------------------------------------------ */ - protected String getLeftMostFieldValue(HttpFields fields, String header) - { - if (header == null) - return null; + String headerValue = fields.getStringField(header); - String headerValue = fields.getStringField(header); + if (headerValue == null) + return null; + + int commaIndex = headerValue.indexOf(','); - if (headerValue == null) - return null; - - int commaIndex = headerValue.indexOf(','); + if (commaIndex == -1) + { + // Single value + return headerValue; + } - if (commaIndex == -1) - { - // Single value - return headerValue; - } + // The left-most value is the farthest downstream client + return headerValue.substring(0,commaIndex); + } + + /* ------------------------------------------------------------ */ + public void persist(EndPoint endpoint) throws IOException + { + } - // The left-most value is the farthest downstream client - return headerValue.substring(0,commaIndex); - } - - /* ------------------------------------------------------------ */ - public void persist(EndPoint endpoint) throws IOException - { - } + /* ------------------------------------------------------------ */ + /* + * @see org.eclipse.jetty.server.Connector#getConfidentialPort() + */ + public int getConfidentialPort() + { + return _confidentialPort; + } - /* ------------------------------------------------------------ */ - /* - * @see org.eclipse.jetty.server.Connector#getConfidentialPort() - */ - public int getConfidentialPort() - { - return _confidentialPort; - } + /* ------------------------------------------------------------ */ + /* ------------------------------------------------------------ */ + /* + * @see org.eclipse.jetty.server.Connector#getConfidentialScheme() + */ + public String getConfidentialScheme() + { + return _confidentialScheme; + } - /* ------------------------------------------------------------ */ - /* ------------------------------------------------------------ */ - /* - * @see org.eclipse.jetty.server.Connector#getConfidentialScheme() - */ - public String getConfidentialScheme() - { - return _confidentialScheme; - } + /* ------------------------------------------------------------ */ + /* + * @see org.eclipse.jetty.server.Connector#isConfidential(org.eclipse.jetty.server .Request) + */ + public boolean isIntegral(Request request) + { + return false; + } + + /* ------------------------------------------------------------ */ + /* + * @see org.eclipse.jetty.server.Connector#getConfidentialPort() + */ + public int getIntegralPort() + { + return _integralPort; + } - /* ------------------------------------------------------------ */ - /* - * @see org.eclipse.jetty.server.Connector#isConfidential(org.eclipse.jetty.server .Request) - */ - public boolean isIntegral(Request request) - { - return false; - } + /* ------------------------------------------------------------ */ + /* + * @see org.eclipse.jetty.server.Connector#getIntegralScheme() + */ + public String getIntegralScheme() + { + return _integralScheme; + } - /* ------------------------------------------------------------ */ - /* - * @see org.eclipse.jetty.server.Connector#getConfidentialPort() - */ - public int getIntegralPort() - { - return _integralPort; - } - - /* ------------------------------------------------------------ */ - /* - * @see org.eclipse.jetty.server.Connector#getIntegralScheme() - */ - public String getIntegralScheme() - { - return _integralScheme; - } + /* ------------------------------------------------------------ */ + /* + * @see org.eclipse.jetty.server.Connector#isConfidential(org.eclipse.jetty.server.Request) + */ + public boolean isConfidential(Request request) + { + return _forwarded && request.getScheme().equalsIgnoreCase(HttpSchemes.HTTPS); + } - /* ------------------------------------------------------------ */ - /* - * @see org.eclipse.jetty.server.Connector#isConfidential(org.eclipse.jetty.server.Request) - */ - public boolean isConfidential(Request request) - { - return _forwarded && request.getScheme().equalsIgnoreCase(HttpSchemes.HTTPS); - } + /* ------------------------------------------------------------ */ + /** + * @param confidentialPort + * The confidentialPort to set. + */ + public void setConfidentialPort(int confidentialPort) + { + _confidentialPort = confidentialPort; + } - /* ------------------------------------------------------------ */ - /** - * @param confidentialPort - * The confidentialPort to set. - */ - public void setConfidentialPort(int confidentialPort) - { - _confidentialPort = confidentialPort; - } + /* ------------------------------------------------------------ */ + /** + * @param confidentialScheme + * The confidentialScheme to set. + */ + public void setConfidentialScheme(String confidentialScheme) + { + _confidentialScheme = confidentialScheme; + } - /* ------------------------------------------------------------ */ - /** - * @param confidentialScheme - * The confidentialScheme to set. - */ - public void setConfidentialScheme(String confidentialScheme) - { - _confidentialScheme = confidentialScheme; - } + /* ------------------------------------------------------------ */ + /** + * @param integralPort + * The integralPort to set. + */ + public void setIntegralPort(int integralPort) + { + _integralPort = integralPort; + } - /* ------------------------------------------------------------ */ - /** - * @param integralPort - * The integralPort to set. - */ - public void setIntegralPort(int integralPort) - { - _integralPort = integralPort; - } + /* ------------------------------------------------------------ */ + /** + * @param integralScheme + * The integralScheme to set. + */ + public void setIntegralScheme(String integralScheme) + { + _integralScheme = integralScheme; + } - /* ------------------------------------------------------------ */ - /** - * @param integralScheme - * The integralScheme to set. - */ - public void setIntegralScheme(String integralScheme) - { - _integralScheme = integralScheme; - } + /* ------------------------------------------------------------ */ + protected abstract void accept(int acceptorID) throws IOException, InterruptedException; - /* ------------------------------------------------------------ */ - protected abstract void accept(int acceptorID) throws IOException, InterruptedException; + /* ------------------------------------------------------------ */ + public void stopAccept(int acceptorID) throws Exception + { + } - /* ------------------------------------------------------------ */ - public void stopAccept(int acceptorID) throws Exception - { - } + /* ------------------------------------------------------------ */ + public boolean getResolveNames() + { + return _useDNS; + } - /* ------------------------------------------------------------ */ - public boolean getResolveNames() - { - return _useDNS; - } + /* ------------------------------------------------------------ */ + public void setResolveNames(boolean resolve) + { + _useDNS = resolve; + } - /* ------------------------------------------------------------ */ - public void setResolveNames(boolean resolve) - { - _useDNS = resolve; - } - - /* ------------------------------------------------------------ */ - /** - * Is reverse proxy handling on? - * - * @return true if this connector is checking the x-forwarded-for/host/server headers - */ - public boolean isForwarded() - { - return _forwarded; - } + /* ------------------------------------------------------------ */ + /** + * Is reverse proxy handling on? + * + * @return true if this connector is checking the x-forwarded-for/host/server headers + */ + public boolean isForwarded() + { + return _forwarded; + } - /* ------------------------------------------------------------ */ - /** - * Set reverse proxy handling. If set to true, then the X-Forwarded headers (or the headers set in their place) are looked for to set the request protocol, - * host, server and client ip. - * - * @param check - * true if this connector is checking the x-forwarded-for/host/server headers - * @see #setForwardedForHeader(String) - * @see #setForwardedHostHeader(String) - * @see #setForwardedProtoHeader(String) - * @see #setForwardedServerHeader(String) - */ - public void setForwarded(boolean check) - { - if (check) - LOG.debug("{} is forwarded",this); - _forwarded = check; - } + /* ------------------------------------------------------------ */ + /** + * Set reverse proxy handling. If set to true, then the X-Forwarded headers (or the headers set in their place) are looked for to set the request protocol, + * host, server and client ip. + * + * @param check + * true if this connector is checking the x-forwarded-for/host/server headers + * @see #setForwardedForHeader(String) + * @see #setForwardedHostHeader(String) + * @see #setForwardedProtoHeader(String) + * @see #setForwardedServerHeader(String) + */ + public void setForwarded(boolean check) + { + if (check) + LOG.debug("{} is forwarded",this); + _forwarded = check; + } - /* ------------------------------------------------------------ */ - public String getHostHeader() - { - return _hostHeader; - } + /* ------------------------------------------------------------ */ + public String getHostHeader() + { + return _hostHeader; + } - /* ------------------------------------------------------------ */ - /** - * Set a forced valued for the host header to control what is returned by {@link ServletRequest#getServerName()} and {@link ServletRequest#getServerPort()}. - * This value is only used if {@link #isForwarded()} is true. - * - * @param hostHeader - * The value of the host header to force. - */ - public void setHostHeader(String hostHeader) - { - _hostHeader = hostHeader; - } + /* ------------------------------------------------------------ */ + /** + * Set a forced valued for the host header to control what is returned by {@link ServletRequest#getServerName()} and {@link ServletRequest#getServerPort()}. + * This value is only used if {@link #isForwarded()} is true. + * + * @param hostHeader + * The value of the host header to force. + */ + public void setHostHeader(String hostHeader) + { + _hostHeader = hostHeader; + } + + /* ------------------------------------------------------------ */ + /* + * + * @see #setForwarded(boolean) + */ + public String getForwardedHostHeader() + { + return _forwardedHostHeader; + } - /* ------------------------------------------------------------ */ - /* - * - * @see #setForwarded(boolean) - */ - public String getForwardedHostHeader() - { - return _forwardedHostHeader; - } + /* ------------------------------------------------------------ */ + /** + * @param forwardedHostHeader + * The header name for forwarded hosts (default x-forwarded-host) + * @see #setForwarded(boolean) + */ + public void setForwardedHostHeader(String forwardedHostHeader) + { + _forwardedHostHeader = forwardedHostHeader; + } - /* ------------------------------------------------------------ */ - /** - * @param forwardedHostHeader - * The header name for forwarded hosts (default x-forwarded-host) - * @see #setForwarded(boolean) - */ - public void setForwardedHostHeader(String forwardedHostHeader) - { - _forwardedHostHeader = forwardedHostHeader; - } - - /* ------------------------------------------------------------ */ - /** - * @return the header name for forwarded server. - * @see #setForwarded(boolean) - */ - public String getForwardedServerHeader() - { - return _forwardedServerHeader; - } + /* ------------------------------------------------------------ */ + /** + * @return the header name for forwarded server. + * @see #setForwarded(boolean) + */ + public String getForwardedServerHeader() + { + return _forwardedServerHeader; + } - /* ------------------------------------------------------------ */ - /** - * @param forwardedServerHeader - * The header name for forwarded server (default x-forwarded-server) - * @see #setForwarded(boolean) - */ - public void setForwardedServerHeader(String forwardedServerHeader) - { - _forwardedServerHeader = forwardedServerHeader; - } + /* ------------------------------------------------------------ */ + /** + * @param forwardedServerHeader + * The header name for forwarded server (default x-forwarded-server) + * @see #setForwarded(boolean) + */ + public void setForwardedServerHeader(String forwardedServerHeader) + { + _forwardedServerHeader = forwardedServerHeader; + } - /* ------------------------------------------------------------ */ - /** - * @see #setForwarded(boolean) - */ - public String getForwardedForHeader() - { - return _forwardedForHeader; - } + /* ------------------------------------------------------------ */ + /** + * @see #setForwarded(boolean) + */ + public String getForwardedForHeader() + { + return _forwardedForHeader; + } - /* ------------------------------------------------------------ */ - /** - * @param forwardedRemoteAddressHeader - * The header name for forwarded for (default x-forwarded-for) - * @see #setForwarded(boolean) - */ - public void setForwardedForHeader(String forwardedRemoteAddressHeader) - { - _forwardedForHeader = forwardedRemoteAddressHeader; - } + /* ------------------------------------------------------------ */ + /** + * @param forwardedRemoteAddressHeader + * The header name for forwarded for (default x-forwarded-for) + * @see #setForwarded(boolean) + */ + public void setForwardedForHeader(String forwardedRemoteAddressHeader) + { + _forwardedForHeader = forwardedRemoteAddressHeader; + } - /* ------------------------------------------------------------ */ - /** - * Get the forwardedProtoHeader. - * - * @return the forwardedProtoHeader (default X-Forwarded-For) - * @see #setForwarded(boolean) - */ - public String getForwardedProtoHeader() - { - return _forwardedProtoHeader; - } + /* ------------------------------------------------------------ */ + /** + * Get the forwardedProtoHeader. + * + * @return the forwardedProtoHeader (default X-Forwarded-For) + * @see #setForwarded(boolean) + */ + public String getForwardedProtoHeader() + { + return _forwardedProtoHeader; + } - /* ------------------------------------------------------------ */ - /** - * Set the forwardedProtoHeader. - * - * @param forwardedProtoHeader - * the forwardedProtoHeader to set (default X-Forwarded-For) - * @see #setForwarded(boolean) - */ - public void setForwardedProtoHeader(String forwardedProtoHeader) - { - _forwardedProtoHeader = forwardedProtoHeader; - } + /* ------------------------------------------------------------ */ + /** + * Set the forwardedProtoHeader. + * + * @param forwardedProtoHeader + * the forwardedProtoHeader to set (default X-Forwarded-For) + * @see #setForwarded(boolean) + */ + public void setForwardedProtoHeader(String forwardedProtoHeader) + { + _forwardedProtoHeader = forwardedProtoHeader; + } - /* ------------------------------------------------------------ */ - /** - * @return The header name holding a forwarded cipher suite (default null) - */ - public String getForwardedCipherSuiteHeader() - { - return _forwardedCipherSuiteHeader; - } + /* ------------------------------------------------------------ */ + /** + * @return The header name holding a forwarded cipher suite (default null) + */ + public String getForwardedCipherSuiteHeader() + { + return _forwardedCipherSuiteHeader; + } - /* ------------------------------------------------------------ */ - /** - * @param forwardedCipherSuite - * The header name holding a forwarded cipher suite (default null) - */ - public void setForwardedCipherSuiteHeader(String forwardedCipherSuite) - { - _forwardedCipherSuiteHeader = forwardedCipherSuite; - } + /* ------------------------------------------------------------ */ + /** + * @param forwardedCipherSuite + * The header name holding a forwarded cipher suite (default null) + */ + public void setForwardedCipherSuiteHeader(String forwardedCipherSuite) + { + _forwardedCipherSuiteHeader = forwardedCipherSuite; + } + + /* ------------------------------------------------------------ */ + /** + * @return The header name holding a forwarded SSL Session ID (default null) + */ + public String getForwardedSslSessionIdHeader() + { + return _forwardedSslSessionIdHeader; + } - /* ------------------------------------------------------------ */ - /** - * @return The header name holding a forwarded SSL Session ID (default null) - */ - public String getForwardedSslSessionIdHeader() - { - return _forwardedSslSessionIdHeader; - } + /* ------------------------------------------------------------ */ + /** + * @param forwardedSslSessionId + * The header name holding a forwarded SSL Session ID (default null) + */ + public void setForwardedSslSessionIdHeader(String forwardedSslSessionId) + { + _forwardedSslSessionIdHeader = forwardedSslSessionId; + } - /* ------------------------------------------------------------ */ - /** - * @param forwardedSslSessionId - * The header name holding a forwarded SSL Session ID (default null) - */ - public void setForwardedSslSessionIdHeader(String forwardedSslSessionId) - { - _forwardedSslSessionIdHeader = forwardedSslSessionId; - } + public int getRequestBufferSize() + { + return _buffers.getRequestBufferSize(); + } - public int getRequestBufferSize() - { - return _buffers.getRequestBufferSize(); - } + public void setRequestBufferSize(int requestBufferSize) + { + _buffers.setRequestBufferSize(requestBufferSize); + } - public void setRequestBufferSize(int requestBufferSize) - { - _buffers.setRequestBufferSize(requestBufferSize); - } + public int getRequestHeaderSize() + { + return _buffers.getRequestHeaderSize(); + } - public int getRequestHeaderSize() - { - return _buffers.getRequestHeaderSize(); - } - - public void setRequestHeaderSize(int requestHeaderSize) - { - _buffers.setRequestHeaderSize(requestHeaderSize); - } + public void setRequestHeaderSize(int requestHeaderSize) + { + _buffers.setRequestHeaderSize(requestHeaderSize); + } - public int getResponseBufferSize() - { - return _buffers.getResponseBufferSize(); - } + public int getResponseBufferSize() + { + return _buffers.getResponseBufferSize(); + } - public void setResponseBufferSize(int responseBufferSize) - { - _buffers.setResponseBufferSize(responseBufferSize); - } + public void setResponseBufferSize(int responseBufferSize) + { + _buffers.setResponseBufferSize(responseBufferSize); + } - public int getResponseHeaderSize() - { - return _buffers.getResponseHeaderSize(); - } + public int getResponseHeaderSize() + { + return _buffers.getResponseHeaderSize(); + } - public void setResponseHeaderSize(int responseHeaderSize) - { - _buffers.setResponseHeaderSize(responseHeaderSize); - } + public void setResponseHeaderSize(int responseHeaderSize) + { + _buffers.setResponseHeaderSize(responseHeaderSize); + } - public Type getRequestBufferType() - { - return _buffers.getRequestBufferType(); - } + public Type getRequestBufferType() + { + return _buffers.getRequestBufferType(); + } - public Type getRequestHeaderType() - { - return _buffers.getRequestHeaderType(); - } + public Type getRequestHeaderType() + { + return _buffers.getRequestHeaderType(); + } - public Type getResponseBufferType() - { - return _buffers.getResponseBufferType(); - } + public Type getResponseBufferType() + { + return _buffers.getResponseBufferType(); + } - public Type getResponseHeaderType() - { - return _buffers.getResponseHeaderType(); - } + public Type getResponseHeaderType() + { + return _buffers.getResponseHeaderType(); + } - public void setRequestBuffers(Buffers requestBuffers) - { - _buffers.setRequestBuffers(requestBuffers); - } + public void setRequestBuffers(Buffers requestBuffers) + { + _buffers.setRequestBuffers(requestBuffers); + } - public void setResponseBuffers(Buffers responseBuffers) - { - _buffers.setResponseBuffers(responseBuffers); - } + public void setResponseBuffers(Buffers responseBuffers) + { + _buffers.setResponseBuffers(responseBuffers); + } - public Buffers getRequestBuffers() - { - return _buffers.getRequestBuffers(); - } + public Buffers getRequestBuffers() + { + return _buffers.getRequestBuffers(); + } - public Buffers getResponseBuffers() - { - return _buffers.getResponseBuffers(); - } + public Buffers getResponseBuffers() + { + return _buffers.getResponseBuffers(); + } - public void setMaxBuffers(int maxBuffers) - { - _buffers.setMaxBuffers(maxBuffers); - } + public void setMaxBuffers(int maxBuffers) + { + _buffers.setMaxBuffers(maxBuffers); + } - public int getMaxBuffers() - { - return _buffers.getMaxBuffers(); - } + public int getMaxBuffers() + { + return _buffers.getMaxBuffers(); + } - /* ------------------------------------------------------------ */ - @Override - public String toString() - { - return String.format("%s@%s:%d", - getClass().getSimpleName(), - getHost()==null?"0.0.0.0":getHost(), - getLocalPort()<=0?getPort():getLocalPort()); - } + /* ------------------------------------------------------------ */ + @Override + public String toString() + { + return String.format("%s@%s:%d", + getClass().getSimpleName(), + getHost()==null?"0.0.0.0":getHost(), + getLocalPort()<=0?getPort():getLocalPort()); + } - /* ------------------------------------------------------------ */ - /* ------------------------------------------------------------ */ - /* ------------------------------------------------------------ */ - private class Acceptor implements Runnable - { - int _acceptor = 0; + /* ------------------------------------------------------------ */ + /* ------------------------------------------------------------ */ + /* ------------------------------------------------------------ */ + private class Acceptor implements Runnable + { + int _acceptor = 0; - Acceptor(int id) - { - _acceptor = id; - } + Acceptor(int id) + { + _acceptor = id; + } - /* ------------------------------------------------------------ */ - public void run() - { - Thread current = Thread.currentThread(); - String name; - synchronized (AbstractConnector.this) - { - if (_acceptorThreads == null) - return; + /* ------------------------------------------------------------ */ + public void run() + { + Thread current = Thread.currentThread(); + String name; + synchronized (AbstractConnector.this) + { + if (_acceptorThreads == null) + return; - _acceptorThreads[_acceptor] = current; - name = _acceptorThreads[_acceptor].getName(); - current.setName(name + " Acceptor" + _acceptor + " " + AbstractConnector.this); - } - int old_priority = current.getPriority(); + _acceptorThreads[_acceptor] = current; + name = _acceptorThreads[_acceptor].getName(); + current.setName(name + " Acceptor" + _acceptor + " " + AbstractConnector.this); + } + int old_priority = current.getPriority(); - try - { - current.setPriority(old_priority - _acceptorPriorityOffset); - while (isRunning() && getConnection() != null) - { - try - { - accept(_acceptor); - } - catch (EofException e) - { - LOG.trace("",e); - } - catch (IOException e) - { - LOG.trace("",e); - } - catch (InterruptedException x) - { - // Connector has been stopped - LOG.trace("",x); - } - catch (Throwable e) - { - LOG.warn("",e); - } - } - } - finally - { - current.setPriority(old_priority); - current.setName(name); + try + { + current.setPriority(old_priority - _acceptorPriorityOffset); + while (isRunning() && getConnection() != null) + { + try + { + accept(_acceptor); + } + catch (EofException e) + { + LOG.trace("",e); + } + catch (IOException e) + { + LOG.trace("",e); + } + catch (InterruptedException x) + { + // Connector has been stopped + LOG.trace("",x); + } + catch (Throwable e) + { + LOG.warn("",e); + } + } + } + finally + { + current.setPriority(old_priority); + current.setName(name); - synchronized (AbstractConnector.this) - { - if (_acceptorThreads != null) - _acceptorThreads[_acceptor] = null; - } - } - } - } + synchronized (AbstractConnector.this) + { + if (_acceptorThreads != null) + _acceptorThreads[_acceptor] = null; + } + } + } + } - /* ------------------------------------------------------------ */ - public String getName() - { - if (_name == null) - _name = (getHost() == null?"0.0.0.0":getHost()) + ":" + (getLocalPort() <= 0?getPort():getLocalPort()); - return _name; - } + /* ------------------------------------------------------------ */ + public String getName() + { + if (_name == null) + _name = (getHost() == null?"0.0.0.0":getHost()) + ":" + (getLocalPort() <= 0?getPort():getLocalPort()); + return _name; + } - /* ------------------------------------------------------------ */ - public void setName(String name) - { - _name = name; - } + /* ------------------------------------------------------------ */ + public void setName(String name) + { + _name = name; + } - /* ------------------------------------------------------------ */ - protected void connectionOpened(Connection connection) - { - } + /* ------------------------------------------------------------ */ + protected void connectionOpened(Connection connection) + { + } - /* ------------------------------------------------------------ */ - protected void connectionUpgraded(Connection oldConnection, Connection newConnection) - { - } + /* ------------------------------------------------------------ */ + protected void connectionUpgraded(Connection oldConnection, Connection newConnection) + { + } - /* ------------------------------------------------------------ */ - protected void connectionClosed(Connection connection) - { - connection.onClose(); - } + /* ------------------------------------------------------------ */ + protected void connectionClosed(Connection connection) + { + connection.onClose(); + } - /* ------------------------------------------------------------ */ - /** - * @return the acceptorPriority - */ - public int getAcceptorPriorityOffset() - { - return _acceptorPriorityOffset; - } + /* ------------------------------------------------------------ */ + /** + * @return the acceptorPriority + */ + public int getAcceptorPriorityOffset() + { + return _acceptorPriorityOffset; + } - /* ------------------------------------------------------------ */ - /** - * Set the priority offset of the acceptor threads. The priority is adjusted by this amount (default 0) to either favour the acceptance of new threads and - * newly active connections or to favour the handling of already dispatched connections. - * - * @param offset - * the amount to alter the priority of the acceptor threads. - */ - public void setAcceptorPriorityOffset(int offset) - { - _acceptorPriorityOffset = offset; - } + /* ------------------------------------------------------------ */ + /** + * Set the priority offset of the acceptor threads. The priority is adjusted by this amount (default 0) to either favour the acceptance of new threads and + * newly active connections or to favour the handling of already dispatched connections. + * + * @param offset + * the amount to alter the priority of the acceptor threads. + */ + public void setAcceptorPriorityOffset(int offset) + { + _acceptorPriorityOffset = offset; + } - /* ------------------------------------------------------------ */ - /** - * @return True if the the server socket will be opened in SO_REUSEADDR mode. - */ - public boolean getReuseAddress() - { - return _reuseAddress; - } + /* ------------------------------------------------------------ */ + /** + * @return True if the the server socket will be opened in SO_REUSEADDR mode. + */ + public boolean getReuseAddress() + { + return _reuseAddress; + } - /* ------------------------------------------------------------ */ - /** - * @param reuseAddress - * True if the the server socket will be opened in SO_REUSEADDR mode. - */ - public void setReuseAddress(boolean reuseAddress) - { - _reuseAddress = reuseAddress; - } + /* ------------------------------------------------------------ */ + /** + * @param reuseAddress + * True if the the server socket will be opened in SO_REUSEADDR mode. + */ + public void setReuseAddress(boolean reuseAddress) + { + _reuseAddress = reuseAddress; + } - /* ------------------------------------------------------------ */ - public boolean isLowResources() - { - if (_threadPool != null) - return _threadPool.isLowOnThreads(); - return _server.getThreadPool().isLowOnThreads(); - } + /* ------------------------------------------------------------ */ + public boolean isLowResources() + { + return getThreadPool().isLowOnThreads(); + } - /* ------------------------------------------------------------ */ - private void updateNotEqual(AtomicLong valueHolder, long compare, long value) - { - long oldValue = valueHolder.get(); - while (compare != oldValue) - { - if (valueHolder.compareAndSet(oldValue,value)) - break; - oldValue = valueHolder.get(); - } - } + /* ------------------------------------------------------------ */ + private void updateNotEqual(AtomicLong valueHolder, long compare, long value) + { + long oldValue = valueHolder.get(); + while (compare != oldValue) + { + if (valueHolder.compareAndSet(oldValue,value)) + break; + oldValue = valueHolder.get(); + } + } }
--- a/src/org/eclipse/jetty/server/Server.java Sun Oct 02 05:22:55 2016 -0600 +++ b/src/org/eclipse/jetty/server/Server.java Sun Oct 02 16:17:38 2016 -0600 @@ -57,19 +57,10 @@ { private static final Logger LOG = LoggerFactory.getLogger(Server.class); - private static final String __version; - static - { - if (Server.class.getPackage()!=null && - "Eclipse.org - Jetty".equals(Server.class.getPackage().getImplementationVendor()) && - Server.class.getPackage().getImplementationVersion()!=null) - __version=Server.class.getPackage().getImplementationVersion(); - else - __version=System.getProperty("jetty.version","8.y.z-SNAPSHOT"); - } + private static final String __version = "8"; private final AttributesMap _attributes = new AttributesMap(); - private ThreadPool _threadPool; + private final ThreadPool _threadPool; private Connector[] _connectors; private boolean _sendServerVersion = true; //send Server: header private boolean _sendDateHeader = false; //send Date: header @@ -81,12 +72,6 @@ /* ------------------------------------------------------------ */ - public Server() - { - setServer(this); - } - - /* ------------------------------------------------------------ */ /** Convenience constructor * Creates server and a {@link SelectChannelConnector} at the passed port. */ @@ -97,20 +82,9 @@ Connector connector=new SelectChannelConnector(); connector.setPort(port); setConnectors(new Connector[]{connector}); - } - /* ------------------------------------------------------------ */ - /** Convenience constructor - * Creates server and a {@link SelectChannelConnector} at the passed address. - */ - public Server(InetSocketAddress addr) - { - setServer(this); - - Connector connector=new SelectChannelConnector(); - connector.setHost(addr.getHostName()); - connector.setPort(addr.getPort()); - setConnectors(new Connector[]{connector}); + _threadPool = new QueuedThreadPool(); + addBean(_threadPool); } @@ -196,19 +170,6 @@ return _threadPool; } - /* ------------------------------------------------------------ */ - /** - * @param threadPool The threadPool to set. - */ - public void setThreadPool(ThreadPool threadPool) - { - if (_threadPool!=null) - removeBean(_threadPool); - _threadPool = threadPool; - if (_threadPool!=null) - addBean(_threadPool); - } - /** * @return true if {@link #dumpStdErr()} is called after starting */ @@ -259,9 +220,6 @@ MultiException mex=new MultiException(); - if (_threadPool==null) - setThreadPool(new QueuedThreadPool()); - try { super.doStart(); @@ -450,63 +408,6 @@ } /* ------------------------------------------------------------ */ - /** - * Add a LifeCycle object to be started/stopped - * along with the Server. - * @deprecated Use {@link #addBean(Object)} - * @param c - */ - @Deprecated - public void addLifeCycle (LifeCycle c) - { - addBean(c); - } - - /* ------------------------------------------------------------ */ - /** - * Add an associated bean. - * The bean will be added to the servers {@link Container} - * and if it is a {@link LifeCycle} instance, it will be - * started/stopped along with the Server. Any beans that are also - * {@link Destroyable}, will be destroyed with the server. - * @param o the bean object to add - */ - @Override - public boolean addBean(Object o) - { - if (super.addBean(o)) - { - return true; - } - return false; - } - - /** - * Remove a LifeCycle object to be started/stopped - * along with the Server - * @deprecated Use {@link #removeBean(Object)} - */ - @Deprecated - public void removeLifeCycle (LifeCycle c) - { - removeBean(c); - } - - /* ------------------------------------------------------------ */ - /** - * Remove an associated bean. - */ - @Override - public boolean removeBean (Object o) - { - if (super.removeBean(o)) - { - return true; - } - return false; - } - - /* ------------------------------------------------------------ */ /* * @see org.eclipse.util.AttributesMap#clearAttributes() */
--- a/src/org/eclipse/jetty/server/nio/SelectChannelConnector.java Sun Oct 02 05:22:55 2016 -0600 +++ b/src/org/eclipse/jetty/server/nio/SelectChannelConnector.java Sun Oct 02 16:17:38 2016 -0600 @@ -66,269 +66,260 @@ */ public class SelectChannelConnector extends AbstractNIOConnector { - protected ServerSocketChannel _acceptChannel; - private int _lowResourcesConnections; - private int _lowResourcesMaxIdleTime; - private int _localPort=-1; + protected ServerSocketChannel _acceptChannel; + private int _lowResourcesConnections; + private int _lowResourcesMaxIdleTime; + private int _localPort=-1; - private final SelectorManager _manager = new ConnectorSelectorManager(); + private final SelectorManager _manager = new ConnectorSelectorManager(); - /* ------------------------------------------------------------------------------- */ - /** - * Constructor. - * - */ - public SelectChannelConnector() - { - _manager.setMaxIdleTime(getMaxIdleTime()); - addBean(_manager,true); - setAcceptors(Math.max(1,(Runtime.getRuntime().availableProcessors()+3)/4)); - } - - @Override - public void setThreadPool(ThreadPool pool) - { - super.setThreadPool(pool); - // preserve start order - removeBean(_manager); - addBean(_manager,true); - } - - /* ------------------------------------------------------------ */ - @Override - public void accept(int acceptorID) throws IOException - { - ServerSocketChannel server; - synchronized(this) - { - server = _acceptChannel; - } + /* ------------------------------------------------------------------------------- */ + /** + * Constructor. + * + */ + public SelectChannelConnector() + { + _manager.setMaxIdleTime(getMaxIdleTime()); + addBean(_manager,true); + setAcceptors(Math.max(1,(Runtime.getRuntime().availableProcessors()+3)/4)); + } + + /* ------------------------------------------------------------ */ + @Override + public void accept(int acceptorID) throws IOException + { + ServerSocketChannel server; + synchronized(this) + { + server = _acceptChannel; + } + + if (server!=null && server.isOpen() && _manager.isStarted()) + { + SocketChannel channel = server.accept(); + channel.configureBlocking(false); + Socket socket = channel.socket(); + configure(socket); + _manager.register(channel); + } + } - if (server!=null && server.isOpen() && _manager.isStarted()) - { - SocketChannel channel = server.accept(); - channel.configureBlocking(false); - Socket socket = channel.socket(); - configure(socket); - _manager.register(channel); - } - } + /* ------------------------------------------------------------ */ + public void close() throws IOException + { + synchronized(this) + { + if (_acceptChannel != null) + { + removeBean(_acceptChannel); + if (_acceptChannel.isOpen()) + _acceptChannel.close(); + } + _acceptChannel = null; + _localPort=-2; + } + } - /* ------------------------------------------------------------ */ - public void close() throws IOException - { - synchronized(this) - { - if (_acceptChannel != null) - { - removeBean(_acceptChannel); - if (_acceptChannel.isOpen()) - _acceptChannel.close(); - } - _acceptChannel = null; - _localPort=-2; - } - } + /* ------------------------------------------------------------------------------- */ + @Override + public void customize(EndPoint endpoint, Request request) throws IOException + { + request.setTimeStamp(System.currentTimeMillis()); + endpoint.setMaxIdleTime(_maxIdleTime); + super.customize(endpoint, request); + } - /* ------------------------------------------------------------------------------- */ - @Override - public void customize(EndPoint endpoint, Request request) throws IOException - { - request.setTimeStamp(System.currentTimeMillis()); - endpoint.setMaxIdleTime(_maxIdleTime); - super.customize(endpoint, request); - } + /* ------------------------------------------------------------------------------- */ + @Override + public void persist(EndPoint endpoint) throws IOException + { + AsyncEndPoint aEndp = ((AsyncEndPoint)endpoint); + aEndp.setCheckForIdle(true); + super.persist(endpoint); + } - /* ------------------------------------------------------------------------------- */ - @Override - public void persist(EndPoint endpoint) throws IOException - { - AsyncEndPoint aEndp = ((AsyncEndPoint)endpoint); - aEndp.setCheckForIdle(true); - super.persist(endpoint); - } + /* ------------------------------------------------------------ */ + public SelectorManager getSelectorManager() + { + return _manager; + } - /* ------------------------------------------------------------ */ - public SelectorManager getSelectorManager() - { - return _manager; - } + /* ------------------------------------------------------------ */ + public synchronized Object getConnection() + { + return _acceptChannel; + } - /* ------------------------------------------------------------ */ - public synchronized Object getConnection() - { - return _acceptChannel; - } + /* ------------------------------------------------------------------------------- */ + public int getLocalPort() + { + synchronized(this) + { + return _localPort; + } + } - /* ------------------------------------------------------------------------------- */ - public int getLocalPort() - { - synchronized(this) - { - return _localPort; - } - } + /* ------------------------------------------------------------ */ + public void open() throws IOException + { + synchronized(this) + { + if (_acceptChannel == null) + { + // Create a new server socket + _acceptChannel = ServerSocketChannel.open(); + // Set to blocking mode + _acceptChannel.configureBlocking(true); - /* ------------------------------------------------------------ */ - public void open() throws IOException - { - synchronized(this) - { - if (_acceptChannel == null) - { - // Create a new server socket - _acceptChannel = ServerSocketChannel.open(); - // Set to blocking mode - _acceptChannel.configureBlocking(true); + // Bind the server socket to the local host and port + _acceptChannel.socket().setReuseAddress(getReuseAddress()); + InetSocketAddress addr = getHost()==null?new InetSocketAddress(getPort()):new InetSocketAddress(getHost(),getPort()); + _acceptChannel.socket().bind(addr,getAcceptQueueSize()); + + _localPort=_acceptChannel.socket().getLocalPort(); + if (_localPort<=0) + throw new IOException("Server channel not bound"); - // Bind the server socket to the local host and port - _acceptChannel.socket().setReuseAddress(getReuseAddress()); - InetSocketAddress addr = getHost()==null?new InetSocketAddress(getPort()):new InetSocketAddress(getHost(),getPort()); - _acceptChannel.socket().bind(addr,getAcceptQueueSize()); + addBean(_acceptChannel); + } + } + } - _localPort=_acceptChannel.socket().getLocalPort(); - if (_localPort<=0) - throw new IOException("Server channel not bound"); - - addBean(_acceptChannel); - } - } - } + /* ------------------------------------------------------------ */ + @Override + public void setMaxIdleTime(int maxIdleTime) + { + _manager.setMaxIdleTime(maxIdleTime); + super.setMaxIdleTime(maxIdleTime); + } - /* ------------------------------------------------------------ */ - @Override - public void setMaxIdleTime(int maxIdleTime) - { - _manager.setMaxIdleTime(maxIdleTime); - super.setMaxIdleTime(maxIdleTime); - } + /* ------------------------------------------------------------ */ + /** + * @return the lowResourcesConnections + */ + public int getLowResourcesConnections() + { + return _lowResourcesConnections; + } - /* ------------------------------------------------------------ */ - /** - * @return the lowResourcesConnections - */ - public int getLowResourcesConnections() - { - return _lowResourcesConnections; - } + /* ------------------------------------------------------------ */ + /** + * Set the number of connections, which if exceeded places this manager in low resources state. + * This is not an exact measure as the connection count is averaged over the select sets. + * @param lowResourcesConnections the number of connections + * @see #setLowResourcesMaxIdleTime(int) + */ + public void setLowResourcesConnections(int lowResourcesConnections) + { + _lowResourcesConnections=lowResourcesConnections; + } - /* ------------------------------------------------------------ */ - /** - * Set the number of connections, which if exceeded places this manager in low resources state. - * This is not an exact measure as the connection count is averaged over the select sets. - * @param lowResourcesConnections the number of connections - * @see #setLowResourcesMaxIdleTime(int) - */ - public void setLowResourcesConnections(int lowResourcesConnections) - { - _lowResourcesConnections=lowResourcesConnections; - } + /* ------------------------------------------------------------ */ + /** + * @return the lowResourcesMaxIdleTime + */ + @Override + public int getLowResourcesMaxIdleTime() + { + return _lowResourcesMaxIdleTime; + } - /* ------------------------------------------------------------ */ - /** - * @return the lowResourcesMaxIdleTime - */ - @Override - public int getLowResourcesMaxIdleTime() - { - return _lowResourcesMaxIdleTime; - } - - /* ------------------------------------------------------------ */ - /** - * Set the period in ms that a connection is allowed to be idle when this there are more - * than {@link #getLowResourcesConnections()} connections. This allows the server to rapidly close idle connections - * in order to gracefully handle high load situations. - * @param lowResourcesMaxIdleTime the period in ms that a connection is allowed to be idle when resources are low. - * @see #setMaxIdleTime(int) - */ - @Override - public void setLowResourcesMaxIdleTime(int lowResourcesMaxIdleTime) - { - _lowResourcesMaxIdleTime=lowResourcesMaxIdleTime; - super.setLowResourcesMaxIdleTime(lowResourcesMaxIdleTime); - } + /* ------------------------------------------------------------ */ + /** + * Set the period in ms that a connection is allowed to be idle when this there are more + * than {@link #getLowResourcesConnections()} connections. This allows the server to rapidly close idle connections + * in order to gracefully handle high load situations. + * @param lowResourcesMaxIdleTime the period in ms that a connection is allowed to be idle when resources are low. + * @see #setMaxIdleTime(int) + */ + @Override + public void setLowResourcesMaxIdleTime(int lowResourcesMaxIdleTime) + { + _lowResourcesMaxIdleTime=lowResourcesMaxIdleTime; + super.setLowResourcesMaxIdleTime(lowResourcesMaxIdleTime); + } - /* ------------------------------------------------------------ */ - /* - * @see org.eclipse.jetty.server.server.AbstractConnector#doStart() - */ - @Override - protected void doStart() throws Exception - { - _manager.setSelectSets(getAcceptors()); - _manager.setMaxIdleTime(getMaxIdleTime()); - _manager.setLowResourcesConnections(getLowResourcesConnections()); - _manager.setLowResourcesMaxIdleTime(getLowResourcesMaxIdleTime()); + /* ------------------------------------------------------------ */ + /* + * @see org.eclipse.jetty.server.server.AbstractConnector#doStart() + */ + @Override + protected void doStart() throws Exception + { + _manager.setSelectSets(getAcceptors()); + _manager.setMaxIdleTime(getMaxIdleTime()); + _manager.setLowResourcesConnections(getLowResourcesConnections()); + _manager.setLowResourcesMaxIdleTime(getLowResourcesMaxIdleTime()); - super.doStart(); - } + super.doStart(); + } - /* ------------------------------------------------------------ */ - protected SelectChannelEndPoint newEndPoint(SocketChannel channel, SelectSet selectSet, SelectionKey key) throws IOException - { - SelectChannelEndPoint endp= new SelectChannelEndPoint(channel,selectSet,key, SelectChannelConnector.this._maxIdleTime); - endp.setConnection(selectSet.getManager().newConnection(channel,endp, key.attachment())); - return endp; - } + /* ------------------------------------------------------------ */ + protected SelectChannelEndPoint newEndPoint(SocketChannel channel, SelectSet selectSet, SelectionKey key) throws IOException + { + SelectChannelEndPoint endp= new SelectChannelEndPoint(channel,selectSet,key, SelectChannelConnector.this._maxIdleTime); + endp.setConnection(selectSet.getManager().newConnection(channel,endp, key.attachment())); + return endp; + } - /* ------------------------------------------------------------------------------- */ - protected void endPointClosed(SelectChannelEndPoint endpoint) - { - connectionClosed(endpoint.getConnection()); - } + /* ------------------------------------------------------------------------------- */ + protected void endPointClosed(SelectChannelEndPoint endpoint) + { + connectionClosed(endpoint.getConnection()); + } - /* ------------------------------------------------------------------------------- */ - protected AsyncConnection newConnection(SocketChannel channel,final AsyncEndPoint endpoint) - { - return new AsyncHttpConnection(SelectChannelConnector.this,endpoint,getServer()); - } + /* ------------------------------------------------------------------------------- */ + protected AsyncConnection newConnection(SocketChannel channel,final AsyncEndPoint endpoint) + { + return new AsyncHttpConnection(SelectChannelConnector.this,endpoint,getServer()); + } - /* ------------------------------------------------------------ */ - /* ------------------------------------------------------------ */ - /* ------------------------------------------------------------ */ - private final class ConnectorSelectorManager extends SelectorManager - { - @Override - public boolean dispatch(Runnable task) - { - ThreadPool pool=getThreadPool(); - if (pool==null) - pool=getServer().getThreadPool(); - return pool.dispatch(task); - } + /* ------------------------------------------------------------ */ + /* ------------------------------------------------------------ */ + /* ------------------------------------------------------------ */ + private final class ConnectorSelectorManager extends SelectorManager + { + @Override + public boolean dispatch(Runnable task) + { + ThreadPool pool=getThreadPool(); + if (pool==null) + pool=getServer().getThreadPool(); + return pool.dispatch(task); + } - @Override - protected void endPointClosed(final SelectChannelEndPoint endpoint) - { - SelectChannelConnector.this.endPointClosed(endpoint); - } + @Override + protected void endPointClosed(final SelectChannelEndPoint endpoint) + { + SelectChannelConnector.this.endPointClosed(endpoint); + } - @Override - protected void endPointOpened(SelectChannelEndPoint endpoint) - { - // TODO handle max connections and low resources - connectionOpened(endpoint.getConnection()); - } + @Override + protected void endPointOpened(SelectChannelEndPoint endpoint) + { + // TODO handle max connections and low resources + connectionOpened(endpoint.getConnection()); + } - @Override - protected void endPointUpgraded(ConnectedEndPoint endpoint, Connection oldConnection) - { - connectionUpgraded(oldConnection,endpoint.getConnection()); - } + @Override + protected void endPointUpgraded(ConnectedEndPoint endpoint, Connection oldConnection) + { + connectionUpgraded(oldConnection,endpoint.getConnection()); + } - @Override - public AsyncConnection newConnection(SocketChannel channel,AsyncEndPoint endpoint, Object attachment) - { - return SelectChannelConnector.this.newConnection(channel,endpoint); - } + @Override + public AsyncConnection newConnection(SocketChannel channel,AsyncEndPoint endpoint, Object attachment) + { + return SelectChannelConnector.this.newConnection(channel,endpoint); + } - @Override - protected SelectChannelEndPoint newEndPoint(SocketChannel channel, SelectSet selectSet, SelectionKey sKey) throws IOException - { - return SelectChannelConnector.this.newEndPoint(channel,selectSet,sKey); - } - } + @Override + protected SelectChannelEndPoint newEndPoint(SocketChannel channel, SelectSet selectSet, SelectionKey sKey) throws IOException + { + return SelectChannelConnector.this.newEndPoint(channel,selectSet,sKey); + } + } }
--- a/src/org/eclipse/jetty/util/component/AggregateLifeCycle.java Sun Oct 02 05:22:55 2016 -0600 +++ b/src/org/eclipse/jetty/util/component/AggregateLifeCycle.java Sun Oct 02 16:17:38 2016 -0600 @@ -45,397 +45,359 @@ */ public class AggregateLifeCycle extends AbstractLifeCycle implements Destroyable, Dumpable { - private static final Logger LOG = LoggerFactory.getLogger(AggregateLifeCycle.class); - private final List<Bean> _beans=new CopyOnWriteArrayList<Bean>(); - private boolean _started=false; + private static final Logger LOG = LoggerFactory.getLogger(AggregateLifeCycle.class); + private final List<Bean> _beans=new CopyOnWriteArrayList<Bean>(); + private boolean _started=false; - private class Bean - { - Bean(Object b) - { - _bean=b; - } - final Object _bean; - volatile boolean _managed=true; - - public String toString() - { - return "{"+_bean+","+_managed+"}"; - } - } + private class Bean + { + Bean(Object b) + { + _bean=b; + } + final Object _bean; + volatile boolean _managed=true; + + public String toString() + { + return "{"+_bean+","+_managed+"}"; + } + } - /* ------------------------------------------------------------ */ - /** - * Start the managed lifecycle beans in the order they were added. - * @see org.eclipse.jetty.util.component.AbstractLifeCycle#doStart() - */ - @Override - protected void doStart() throws Exception - { - for (Bean b:_beans) - { - if (b._managed && b._bean instanceof LifeCycle) - { - LifeCycle l=(LifeCycle)b._bean; - if (!l.isRunning()) - l.start(); - } - } - // indicate that we are started, so that addBean will start other beans added. - _started=true; - super.doStart(); - } - - /* ------------------------------------------------------------ */ - /** - * Stop the joined lifecycle beans in the reverse order they were added. - * @see org.eclipse.jetty.util.component.AbstractLifeCycle#doStart() - */ - @Override - protected void doStop() throws Exception - { - _started=false; - super.doStop(); - List<Bean> reverse = new ArrayList<Bean>(_beans); - Collections.reverse(reverse); - for (Bean b:reverse) - { - if (b._managed && b._bean instanceof LifeCycle) - { - LifeCycle l=(LifeCycle)b._bean; - if (l.isRunning()) - l.stop(); - } - } - } + /* ------------------------------------------------------------ */ + /** + * Start the managed lifecycle beans in the order they were added. + * @see org.eclipse.jetty.util.component.AbstractLifeCycle#doStart() + */ + @Override + protected void doStart() throws Exception + { + for (Bean b:_beans) + { + if (b._managed && b._bean instanceof LifeCycle) + { + LifeCycle l=(LifeCycle)b._bean; + if (!l.isRunning()) + l.start(); + } + } + // indicate that we are started, so that addBean will start other beans added. + _started=true; + super.doStart(); + } + + /* ------------------------------------------------------------ */ + /** + * Stop the joined lifecycle beans in the reverse order they were added. + * @see org.eclipse.jetty.util.component.AbstractLifeCycle#doStart() + */ + @Override + protected void doStop() throws Exception + { + _started=false; + super.doStop(); + List<Bean> reverse = new ArrayList<Bean>(_beans); + Collections.reverse(reverse); + for (Bean b:reverse) + { + if (b._managed && b._bean instanceof LifeCycle) + { + LifeCycle l=(LifeCycle)b._bean; + if (l.isRunning()) + l.stop(); + } + } + } - /* ------------------------------------------------------------ */ - /** - * Destroy the joined Destroyable beans in the reverse order they were added. - * @see org.eclipse.jetty.util.component.Destroyable#destroy() - */ - public void destroy() - { - List<Bean> reverse = new ArrayList<Bean>(_beans); - Collections.reverse(reverse); - for (Bean b:reverse) - { - if (b._bean instanceof Destroyable && b._managed) - { - Destroyable d=(Destroyable)b._bean; - d.destroy(); - } - } - _beans.clear(); - } + /* ------------------------------------------------------------ */ + /** + * Destroy the joined Destroyable beans in the reverse order they were added. + * @see org.eclipse.jetty.util.component.Destroyable#destroy() + */ + public void destroy() + { + List<Bean> reverse = new ArrayList<Bean>(_beans); + Collections.reverse(reverse); + for (Bean b:reverse) + { + if (b._bean instanceof Destroyable && b._managed) + { + Destroyable d=(Destroyable)b._bean; + d.destroy(); + } + } + _beans.clear(); + } - /* ------------------------------------------------------------ */ - /** Is the bean contained in the aggregate. - * @param bean - * @return True if the aggregate contains the bean - */ - public boolean contains(Object bean) - { - for (Bean b:_beans) - if (b._bean==bean) - return true; - return false; - } - - /* ------------------------------------------------------------ */ - /** Is the bean joined to the aggregate. - * @param bean - * @return True if the aggregate contains the bean and it is joined - */ - public boolean isManaged(Object bean) - { - for (Bean b:_beans) - if (b._bean==bean) - return b._managed; - return false; - } - - /* ------------------------------------------------------------ */ - /** - * Add an associated bean. - * If the bean is a {@link LifeCycle}, then it will be managed if it is not - * already started and umanaged if it is already started. The {@link #addBean(Object, boolean)} - * method should be used if this is not correct, or the {@link #manage(Object)} and {@link #unmanage(Object)} - * methods may be used after an add to change the status. - * @param o the bean object to add - * @return true if the bean was added or false if it has already been added. - */ - public boolean addBean(Object o) - { - // beans are joined unless they are started lifecycles - return addBean(o,!((o instanceof LifeCycle)&&((LifeCycle)o).isStarted())); - } - - /* ------------------------------------------------------------ */ - /** Add an associated lifecycle. - * @param o The lifecycle to add - * @param managed True if the LifeCycle is to be joined, otherwise it will be disjoint. - * @return true if bean was added, false if already present. - */ - public boolean addBean(Object o, boolean managed) - { - if (contains(o)) - return false; - - Bean b = new Bean(o); - b._managed=managed; - _beans.add(b); - - if (o instanceof LifeCycle) - { - LifeCycle l=(LifeCycle)o; + /* ------------------------------------------------------------ */ + /** Is the bean contained in the aggregate. + * @param bean + * @return True if the aggregate contains the bean + */ + public boolean contains(Object bean) + { + for (Bean b:_beans) + if (b._bean==bean) + return true; + return false; + } + + /* ------------------------------------------------------------ */ + /** Is the bean joined to the aggregate. + * @param bean + * @return True if the aggregate contains the bean and it is joined + */ + public boolean isManaged(Object bean) + { + for (Bean b:_beans) + if (b._bean==bean) + return b._managed; + return false; + } + + /* ------------------------------------------------------------ */ + /** + * Add an associated bean. + * If the bean is a {@link LifeCycle}, then it will be managed if it is not + * already started and umanaged if it is already started. The {@link #addBean(Object, boolean)} + * method should be used if this is not correct, or the {@link #manage(Object)} and {@link #unmanage(Object)} + * methods may be used after an add to change the status. + * @param o the bean object to add + * @return true if the bean was added or false if it has already been added. + */ + public boolean addBean(Object o) + { + // beans are joined unless they are started lifecycles + return addBean(o,!((o instanceof LifeCycle)&&((LifeCycle)o).isStarted())); + } + + /* ------------------------------------------------------------ */ + /** Add an associated lifecycle. + * @param o The lifecycle to add + * @param managed True if the LifeCycle is to be joined, otherwise it will be disjoint. + * @return true if bean was added, false if already present. + */ + public boolean addBean(Object o, boolean managed) + { + if (contains(o)) + return false; + + Bean b = new Bean(o); + b._managed=managed; + _beans.add(b); + + if (o instanceof LifeCycle) + { + LifeCycle l=(LifeCycle)o; - // Start the bean if we are started - if (managed && _started) - { - try - { - l.start(); - } - catch(Exception e) - { - throw new RuntimeException (e); - } - } - } - return true; - } - - /* ------------------------------------------------------------ */ - /** - * Manage a bean by this aggregate, so that it is started/stopped/destroyed with the - * aggregate lifecycle. - * @param bean The bean to manage (must already have been added). - */ - public void manage(Object bean) - { - for (Bean b :_beans) - { - if (b._bean==bean) - { - b._managed=true; - return; - } - } - throw new IllegalArgumentException(); - } + // Start the bean if we are started + if (managed && _started) + { + try + { + l.start(); + } + catch(Exception e) + { + throw new RuntimeException (e); + } + } + } + return true; + } + + /* ------------------------------------------------------------ */ + /** Get dependent beans + * @return List of beans. + */ + public Collection<Object> getBeans() + { + return getBeans(Object.class); + } + + /* ------------------------------------------------------------ */ + /** Get dependent beans of a specific class + * @see #addBean(Object) + * @param clazz + * @return List of beans. + */ + public <T> List<T> getBeans(Class<T> clazz) + { + ArrayList<T> beans = new ArrayList<T>(); + for (Bean b:_beans) + { + if (clazz.isInstance(b._bean)) + beans.add((T)(b._bean)); + } + return beans; + } - /* ------------------------------------------------------------ */ - /** - * Unmanage a bean by this aggregate, so that it is not started/stopped/destroyed with the - * aggregate lifecycle. - * @param bean The bean to manage (must already have been added). - */ - public void unmanage(Object bean) - { - for (Bean b :_beans) - { - if (b._bean==bean) - { - b._managed=false; - return; - } - } - throw new IllegalArgumentException(); - } - - /* ------------------------------------------------------------ */ - /** Get dependent beans - * @return List of beans. - */ - public Collection<Object> getBeans() - { - return getBeans(Object.class); - } - - /* ------------------------------------------------------------ */ - /** Get dependent beans of a specific class - * @see #addBean(Object) - * @param clazz - * @return List of beans. - */ - public <T> List<T> getBeans(Class<T> clazz) - { - ArrayList<T> beans = new ArrayList<T>(); - for (Bean b:_beans) - { - if (clazz.isInstance(b._bean)) - beans.add((T)(b._bean)); - } - return beans; - } + + /* ------------------------------------------------------------ */ + /** Get dependent beans of a specific class. + * If more than one bean of the type exist, the first is returned. + * @see #addBean(Object) + * @param clazz + * @return bean or null + */ + public <T> T getBean(Class<T> clazz) + { + for (Bean b:_beans) + { + if (clazz.isInstance(b._bean)) + return (T)b._bean; + } + + return null; + } + + /* ------------------------------------------------------------ */ + /** + * Remove all associated bean. + */ + public void removeBeans () + { + _beans.clear(); + } - - /* ------------------------------------------------------------ */ - /** Get dependent beans of a specific class. - * If more than one bean of the type exist, the first is returned. - * @see #addBean(Object) - * @param clazz - * @return bean or null - */ - public <T> T getBean(Class<T> clazz) - { - for (Bean b:_beans) - { - if (clazz.isInstance(b._bean)) - return (T)b._bean; - } - - return null; - } - - /* ------------------------------------------------------------ */ - /** - * Remove all associated bean. - */ - public void removeBeans () - { - _beans.clear(); - } + /* ------------------------------------------------------------ */ + /** + * Remove an associated bean. + */ + public boolean removeBean (Object o) + { + Iterator<Bean> i = _beans.iterator(); + while(i.hasNext()) + { + Bean b=i.next(); + if (b._bean==o) + { + _beans.remove(b); + return true; + } + } + return false; + } - /* ------------------------------------------------------------ */ - /** - * Remove an associated bean. - */ - public boolean removeBean (Object o) - { - Iterator<Bean> i = _beans.iterator(); - while(i.hasNext()) - { - Bean b=i.next(); - if (b._bean==o) - { - _beans.remove(b); - return true; - } - } - return false; - } + /* ------------------------------------------------------------ */ + public void dumpStdErr() + { + try + { + dump(System.err,""); + } + catch (IOException e) + { + LOG.warn("",e); + } + } + + /* ------------------------------------------------------------ */ + public String dump() + { + return dump(this); + } + + /* ------------------------------------------------------------ */ + public static String dump(Dumpable dumpable) + { + StringBuilder b = new StringBuilder(); + try + { + dumpable.dump(b,""); + } + catch (IOException e) + { + LOG.warn("",e); + } + return b.toString(); + } - /* ------------------------------------------------------------ */ - public void dumpStdErr() - { - try - { - dump(System.err,""); - } - catch (IOException e) - { - LOG.warn("",e); - } - } - - /* ------------------------------------------------------------ */ - public String dump() - { - return dump(this); - } - - /* ------------------------------------------------------------ */ - public static String dump(Dumpable dumpable) - { - StringBuilder b = new StringBuilder(); - try - { - dumpable.dump(b,""); - } - catch (IOException e) - { - LOG.warn("",e); - } - return b.toString(); - } + /* ------------------------------------------------------------ */ + public void dump(Appendable out) throws IOException + { + dump(out,""); + } + + /* ------------------------------------------------------------ */ + protected void dumpThis(Appendable out) throws IOException + { + out.append(String.valueOf(this)).append(" - ").append(getState()).append("\n"); + } - /* ------------------------------------------------------------ */ - public void dump(Appendable out) throws IOException - { - dump(out,""); - } - - /* ------------------------------------------------------------ */ - protected void dumpThis(Appendable out) throws IOException - { - out.append(String.valueOf(this)).append(" - ").append(getState()).append("\n"); - } - - /* ------------------------------------------------------------ */ - public static void dumpObject(Appendable out,Object o) throws IOException - { - try - { - if (o instanceof LifeCycle) - out.append(String.valueOf(o)).append(" - ").append((AbstractLifeCycle.getState((LifeCycle)o))).append("\n"); - else - out.append(String.valueOf(o)).append("\n"); - } - catch(Throwable th) - { - out.append(" => ").append(th.toString()).append('\n'); - } - } - - /* ------------------------------------------------------------ */ - public void dump(Appendable out,String indent) throws IOException - { - dumpThis(out); - int size=_beans.size(); - if (size==0) - return; - int i=0; - for (Bean b : _beans) - { - i++; + /* ------------------------------------------------------------ */ + public static void dumpObject(Appendable out,Object o) throws IOException + { + try + { + if (o instanceof LifeCycle) + out.append(String.valueOf(o)).append(" - ").append((AbstractLifeCycle.getState((LifeCycle)o))).append("\n"); + else + out.append(String.valueOf(o)).append("\n"); + } + catch(Throwable th) + { + out.append(" => ").append(th.toString()).append('\n'); + } + } + + /* ------------------------------------------------------------ */ + public void dump(Appendable out,String indent) throws IOException + { + dumpThis(out); + int size=_beans.size(); + if (size==0) + return; + int i=0; + for (Bean b : _beans) + { + i++; - out.append(indent).append(" +- "); - if (b._managed) - { - if (b._bean instanceof Dumpable) - ((Dumpable)b._bean).dump(out,indent+(i==size?" ":" | ")); - else - dumpObject(out,b._bean); - } - else - dumpObject(out,b._bean); - } + out.append(indent).append(" +- "); + if (b._managed) + { + if (b._bean instanceof Dumpable) + ((Dumpable)b._bean).dump(out,indent+(i==size?" ":" | ")); + else + dumpObject(out,b._bean); + } + else + dumpObject(out,b._bean); + } - if (i!=size) - out.append(indent).append(" |\n"); - } - - /* ------------------------------------------------------------ */ - public static void dump(Appendable out,String indent,Collection<?>... collections) throws IOException - { - if (collections.length==0) - return; - int size=0; - for (Collection<?> c : collections) - size+=c.size(); - if (size==0) - return; + if (i!=size) + out.append(indent).append(" |\n"); + } + + /* ------------------------------------------------------------ */ + public static void dump(Appendable out,String indent,Collection<?>... collections) throws IOException + { + if (collections.length==0) + return; + int size=0; + for (Collection<?> c : collections) + size+=c.size(); + if (size==0) + return; - int i=0; - for (Collection<?> c : collections) - { - for (Object o : c) - { - i++; - out.append(indent).append(" +- "); + int i=0; + for (Collection<?> c : collections) + { + for (Object o : c) + { + i++; + out.append(indent).append(" +- "); - if (o instanceof Dumpable) - ((Dumpable)o).dump(out,indent+(i==size?" ":" | ")); - else - dumpObject(out,o); - } - - if (i!=size) - out.append(indent).append(" |\n"); - } - } + if (o instanceof Dumpable) + ((Dumpable)o).dump(out,indent+(i==size?" ":" | ")); + else + dumpObject(out,o); + } + + if (i!=size) + out.append(indent).append(" |\n"); + } + } }