17. Araxis Merge ファイル比較レポート

このレポートは Araxis Merge2016-08-05 08:17:33 +0000 によって作成されました。Merge に関する情報については http://www.araxis.com/merge/ をご覧ください。このレポートは XHTML と CSS2 を使用し、最新の標準基準に準拠したブラウザでご覧になれます。このレポートを印刷するための最適条件は、背景の色とイメージの印刷を可能にして、印刷の向きは横を使用します。

17.1 ファイルの比較

#ロケーションファイル更新日
1/Merge Test Files/jakarta-tomcat-4.0.6-src/catalina/src/share/org/apache/catalina/connector/http10HttpConnector.java2002-10-08 14:15:36 +0000
2/Merge Test Files/jakarta-tomcat-4.1.18-src/catalina/src/share/org/apache/catalina/connector/http10HttpConnector.java2002-12-19 13:49:44 +0000
3/Merge Test Files/jakarta-tomcat-4.1.24-src/catalina/src/share/org/apache/catalina/connector/http10HttpConnector.java2003-03-19 09:18:38 +0000
注意: Merge は2番目のファイルをほかのファイルの共通の親ファイルとみなします。

17.2 比較の概要

説明第1ファイルと第2ファイル第2ファイルと第3ファイル共通の親との比較
テキスト ブロックテキスト ブロックテキスト ブロック
変更なし11217612294
変更箇所54600546
挿入箇所5210000
削除箇所0000521
注意: 自動マージは 0 個の不一致を残します。

17.3 比較のオプション

余白余白の相違を意味のあるものとして扱う
大文字/小文字大文字と小文字の相違を意味のあるものとして扱う
行終端文字行終端文字(CRLF 文字)の相違を意味のあるものとして扱う
CR/LF 文字比較の詳細に示されない

17.4 有効な正規表現

有効な正規表現はありません。

17.5 比較の詳細

1 /* 1 /* 1 /*
2  * $Header: /home/cvs/jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/connector/http10/HttpConnector.java,v 1.12 2001/09/11 17:33:
02 craigmcc Exp $
 2  * $Header: /home/cvs/jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/connector/http10/HttpConnector.java,v 1.17 2002/03/18 07:15:40
 
remm
 Exp $
 2  * $Header: /home/cvs/jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/connector/http10/HttpConnector.java,v 1.17 2002/03/18 07:15:40 remm Exp $
3  * $Revision: 1.12 $ 3  * $Revision: 1.17 $ 3  * $Revision: 1.17 $
4  * $Date: 2001/09/11 17:33:
02 $
 4  * $Date: 2002/03/18 07:15:40
 $
 4  * $Date: 2002/03/18 07:15:40 $
5  * 5  * 5  *
6  * ==================================================================== 6  * ==================================================================== 6  * ====================================================================
7  * 7  * 7  *
8  * The Apache Software License, Version 1.1 8  * The Apache Software License, Version 1.1 8  * The Apache Software License, Version 1.1
9  * 9  * 9  *
10  * Copyright (c) 1999 The Apache Software Foundation.  All rights 10  * Copyright (c) 1999 The Apache Software Foundation.  All rights 10  * Copyright (c) 1999 The Apache Software Foundation.  All rights
11  * reserved. 11  * reserved. 11  * reserved.
12  * 12  * 12  *
13  * Redistribution and use in source and binary forms, with or without 13  * Redistribution and use in source and binary forms, with or without 13  * Redistribution and use in source and binary forms, with or without
14  * modification, are permitted provided that the following conditions 14  * modification, are permitted provided that the following conditions 14  * modification, are permitted provided that the following conditions
15  * are met: 15  * are met: 15  * are met:
16  * 16  * 16  *
17  * 1. Redistributions of source code must retain the above copyright 17  * 1. Redistributions of source code must retain the above copyright 17  * 1. Redistributions of source code must retain the above copyright
18  *    notice, this list of conditions and the following disclaimer. 18  *    notice, this list of conditions and the following disclaimer. 18  *    notice, this list of conditions and the following disclaimer.
19  * 19  * 19  *
20  * 2. Redistributions in binary form must reproduce the above copyright 20  * 2. Redistributions in binary form must reproduce the above copyright 20  * 2. Redistributions in binary form must reproduce the above copyright
21  *    notice, this list of conditions and the following disclaimer in 21  *    notice, this list of conditions and the following disclaimer in 21  *    notice, this list of conditions and the following disclaimer in
22  *    the documentation and/or other materials provided with the 22  *    the documentation and/or other materials provided with the 22  *    the documentation and/or other materials provided with the
23  *    distribution. 23  *    distribution. 23  *    distribution.
24  * 24  * 24  *
25  * 3. The end-user documentation included with the redistribution, if 25  * 3. The end-user documentation included with the redistribution, if 25  * 3. The end-user documentation included with the redistribution, if
26  *    any, must include the following acknowlegement: 26  *    any, must include the following acknowlegement: 26  *    any, must include the following acknowlegement:
27  *       "This product includes software developed by the 27  *       "This product includes software developed by the 27  *       "This product includes software developed by the
28  *        Apache Software Foundation (http://www.apache.org/)." 28  *        Apache Software Foundation (http://www.apache.org/)." 28  *        Apache Software Foundation (http://www.apache.org/)."
29  *    Alternately, this acknowlegement may appear in the software itself, 29  *    Alternately, this acknowlegement may appear in the software itself, 29  *    Alternately, this acknowlegement may appear in the software itself,
30  *    if and wherever such third-party acknowlegements normally appear. 30  *    if and wherever such third-party acknowlegements normally appear. 30  *    if and wherever such third-party acknowlegements normally appear.
31  * 31  * 31  *
32  * 4. The names "The Jakarta Project", "Tomcat", and "Apache Software 32  * 4. The names "The Jakarta Project", "Tomcat", and "Apache Software 32  * 4. The names "The Jakarta Project", "Tomcat", and "Apache Software
33  *    Foundation" must not be used to endorse or promote products derived 33  *    Foundation" must not be used to endorse or promote products derived 33  *    Foundation" must not be used to endorse or promote products derived
34  *    from this software without prior written permission. For written 34  *    from this software without prior written permission. For written 34  *    from this software without prior written permission. For written
35  *    permission, please contact apache@apache.org. 35  *    permission, please contact apache@apache.org. 35  *    permission, please contact apache@apache.org.
36  * 36  * 36  *
37  * 5. Products derived from this software may not be called "Apache" 37  * 5. Products derived from this software may not be called "Apache" 37  * 5. Products derived from this software may not be called "Apache"
38  *    nor may "Apache" appear in their names without prior written 38  *    nor may "Apache" appear in their names without prior written 38  *    nor may "Apache" appear in their names without prior written
39  *    permission of the Apache Group. 39  *    permission of the Apache Group. 39  *    permission of the Apache Group.
40  * 40  * 40  *
41  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED 41  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED 41  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
42  * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 42  * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 42  * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
43  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 43  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 43  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
44  * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR 44  * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR 44  * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
45  * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 45  * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 45  * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
46  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 46  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 46  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
47  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF 47  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF 47  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
48  * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 48  * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 48  * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
49  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 49  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 49  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
50  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT 50  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT 50  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
51  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 51  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 51  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
52  * SUCH DAMAGE. 52  * SUCH DAMAGE. 52  * SUCH DAMAGE.
53  * ==================================================================== 53  * ==================================================================== 53  * ====================================================================
54  * 54  * 54  *
55  * This software consists of voluntary contributions made by many 55  * This software consists of voluntary contributions made by many 55  * This software consists of voluntary contributions made by many
56  * individuals on behalf of the Apache Software Foundation.  For more 56  * individuals on behalf of the Apache Software Foundation.  For more 56  * individuals on behalf of the Apache Software Foundation.  For more
57  * information on the Apache Software Foundation, please see 57  * information on the Apache Software Foundation, please see 57  * information on the Apache Software Foundation, please see
58  * <http://www.apache.org/>. 58  * <http://www.apache.org/>. 58  * <http://www.apache.org/>.
59  * 59  * 59  *
60  * [Additional notices, if required by prior licensing conditions] 60  * [Additional notices, if required by prior licensing conditions] 60  * [Additional notices, if required by prior licensing conditions]
61  * 61  * 61  *
62  */ 62  */ 62  */
63  63  63 
64  64  64 
65 package org.apache.catalina.connector.http10; 65 package org.apache.catalina.connector.http10; 65 package org.apache.catalina.connector.http10;
66  66  66 
67  67  67 
68 import java.io.IOException; 68 import java.io.IOException; 68 import java.io.IOException;
69 import java.net.InetAddress; 69 import java.net.InetAddress; 69 import java.net.InetAddress;
70 import java.net.ServerSocket; 70 import java.net.ServerSocket; 70 import java.net.ServerSocket;
71 import java.net.Socket; 71 import java.net.Socket; 71 import java.net.Socket;
72 import java.security.AccessControlException; 72 import java.security.AccessControlException; 72 import java.security.AccessControlException;
73 import java.util.Stack; 73 import java.util.Stack; 73 import java.util.Stack;
74 import java.util.Vector; 74 import java.util.Vector; 74 import java.util.Vector;
    75 import java.security.KeyStoreException; 75 import java.security.KeyStoreException;
    76 import java.security.NoSuchAlgorithmException; 76 import java.security.NoSuchAlgorithmException;
    77 import java.security.cert.CertificateException; 77 import java.security.cert.CertificateException;
    78 import java.security.UnrecoverableKeyException; 78 import java.security.UnrecoverableKeyException;
    79 import java.security.KeyManagementException; 79 import java.security.KeyManagementException;
75 import org.apache.catalina.Connector; 80 import org.apache.catalina.Connector; 80 import org.apache.catalina.Connector;
76 import org.apache.catalina.Container; 81 import org.apache.catalina.Container; 81 import org.apache.catalina.Container;
77 import org.apache.catalina.HttpRequest; 82 import org.apache.catalina.HttpRequest; 82 import org.apache.catalina.HttpRequest;
78 import org.apache.catalina.HttpResponse; 83 import org.apache.catalina.HttpResponse; 83 import org.apache.catalina.HttpResponse;
79 import org.apache.catalina.Lifecycle; 84 import org.apache.catalina.Lifecycle; 84 import org.apache.catalina.Lifecycle;
80 import org.apache.catalina.LifecycleEvent; 85 import org.apache.catalina.LifecycleEvent; 85 import org.apache.catalina.LifecycleEvent;
81 import org.apache.catalina.LifecycleException; 86 import org.apache.catalina.LifecycleException; 86 import org.apache.catalina.LifecycleException;
82 import org.apache.catalina.LifecycleListener; 87 import org.apache.catalina.LifecycleListener; 87 import org.apache.catalina.LifecycleListener;
83 import org.apache.catalina.Logger; 88 import org.apache.catalina.Logger; 88 import org.apache.catalina.Logger;
84 import org.apache.catalina.Request; 89 import org.apache.catalina.Request; 89 import org.apache.catalina.Request;
85 import org.apache.catalina.Response; 90 import org.apache.catalina.Response; 90 import org.apache.catalina.Response;
86 import org.apache.catalina.Service; 91 import org.apache.catalina.Service; 91 import org.apache.catalina.Service;
87 import org.apache.catalina.net.DefaultServerSocketFactory; 92 import org.apache.catalina.net.DefaultServerSocketFactory; 92 import org.apache.catalina.net.DefaultServerSocketFactory;
88 import org.apache.catalina.net.ServerSocketFactory; 93 import org.apache.catalina.net.ServerSocketFactory; 93 import org.apache.catalina.net.ServerSocketFactory;
89 import org.apache.catalina.util.LifecycleSupport; 94 import org.apache.catalina.util.LifecycleSupport; 94 import org.apache.catalina.util.LifecycleSupport;
90 import org.apache.catalina.util.StringManager; 95 import org.apache.catalina.util.StringManager; 95 import org.apache.catalina.util.StringManager;
91  96  96 
92  97  97 
93 /** 98 /** 98 /**
94  * Simple implementation of an HTTP/1.0 Connector, for testing and debugging 99  * Simple implementation of an HTTP/1.0 Connector, for testing and debugging 99  * Simple implementation of an HTTP/1.0 Connector, for testing and debugging
95  * purposes.  Not intended to be the final solution. 100  * purposes.  Not intended to be the final solution. 100  * purposes.  Not intended to be the final solution.
96  * 101  * 101  *
97  * @author Craig R. McClanahan 102  * @author Craig R. McClanahan 102  * @author Craig R. McClanahan
98  * @version $Revision: 1.12 $ $Date: 2001/09/11 17:33:
02 $
 103  * @version $Revision: 1.17 $ $Date: 2002/03/18 07:15:40
 $
 103  * @version $Revision: 1.17 $ $Date: 2002/03/18 07:15:40 $
    104  * @deprecated 104  * @deprecated
99  */ 105  */ 105  */
100  106  106 
101  107  107 
102 public final class HttpConnector 108 public final class HttpConnector 108 public final class HttpConnector
103     implements Connector, Lifecycle, Runnable { 109     implements Connector, Lifecycle, Runnable { 109     implements Connector, Lifecycle, Runnable {
104  110  110 
105  111  111 
106     // ----------------------------------------------------- Instance Variables 112     // ----------------------------------------------------- Instance Variables 112     // ----------------------------------------------------- Instance Variables
107  113  113 
108  114  114 
109     /** 115     /** 115     /**
110      * The accept count for this Connector. 116      * The accept count for this Connector. 116      * The accept count for this Connector.
111      */ 117      */ 117      */
112     private int acceptCount = 10; 118     private int acceptCount = 10; 118     private int acceptCount = 10;
113  119  119 
114  120  120 
115     /** 121     /** 121     /**
116      * The IP address on which to bind, if any.  If <code>null</code>, all 122      * The IP address on which to bind, if any.  If <code>null</code>, all 122      * The IP address on which to bind, if any.  If <code>null</code>, all
117      * addresses on the server will be bound. 123      * addresses on the server will be bound. 123      * addresses on the server will be bound.
118      */ 124      */ 124      */
119     private String address = null; 125     private String address = null; 125     private String address = null;
120  126  126 
121  127  127 
122     /** 128     /** 128     /**
123      * The input buffer size we should create on input streams. 129      * The input buffer size we should create on input streams. 129      * The input buffer size we should create on input streams.
124      */ 130      */ 130      */
125     private int bufferSize = 2048; 131     private int bufferSize = 2048; 131     private int bufferSize = 2048;
126  132  132 
127  133  133 
128     /** 134     /** 134     /**
129      * The Container used for processing requests received by this Connector. 135      * The Container used for processing requests received by this Connector. 135      * The Container used for processing requests received by this Connector.
130      */ 136      */ 136      */
131     protected Container container = null; 137     protected Container container = null; 137     protected Container container = null;
132  138  138 
133  139  139 
134     /** 140     /** 140     /**
135      * The set of processors that have ever been created. 141      * The set of processors that have ever been created. 141      * The set of processors that have ever been created.
136      */ 142      */ 142      */
137     private Vector created = new Vector(); 143     private Vector created = new Vector(); 143     private Vector created = new Vector();
138  144  144 
139  145  145 
140     /** 146     /** 146     /**
141      * The current number of processors that have been created. 147      * The current number of processors that have been created. 147      * The current number of processors that have been created.
142      */ 148      */ 148      */
143     private int curProcessors = 0; 149     private int curProcessors = 0; 149     private int curProcessors = 0;
144  150  150 
145  151  151 
146     /** 152     /** 152     /**
147      * The debugging detail level for this component. 153      * The debugging detail level for this component. 153      * The debugging detail level for this component.
148      */ 154      */ 154      */
149     private int debug = 0; 155     private int debug = 0; 155     private int debug = 0;
150  156  156 
151  157  157 
152     /** 158     /** 158     /**
153      * The "enable DNS lookups" flag for this Connector. 159      * The "enable DNS lookups" flag for this Connector. 159      * The "enable DNS lookups" flag for this Connector.
154      */ 160      */ 160      */
155     private boolean enableLookups = false; 161     private boolean enableLookups = false; 161     private boolean enableLookups = false;
156  162  162 
157  163  163 
158     /** 164     /** 164     /**
159      * The server socket factory for this component. 165      * The server socket factory for this component. 165      * The server socket factory for this component.
160      */ 166      */ 166      */
161     private ServerSocketFactory factory = null; 167     private ServerSocketFactory factory = null; 167     private ServerSocketFactory factory = null;
162  168  168 
163  169  169 
164     /** 170     /** 170     /**
165      * Descriptive information about this Connector implementation. 171      * Descriptive information about this Connector implementation. 171      * Descriptive information about this Connector implementation.
166      */ 172      */ 172      */
167     private static final String info = 173     private static final String info = 173     private static final String info =
168         "org.apache.catalina.connector.http10.HttpConnector/1.0"; 174         "org.apache.catalina.connector.http10.HttpConnector/1.0"; 174         "org.apache.catalina.connector.http10.HttpConnector/1.0";
169  175  175 
170  176  176 
171     /** 177     /** 177     /**
172      * The lifecycle event support for this component. 178      * The lifecycle event support for this component. 178      * The lifecycle event support for this component.
173      */ 179      */ 179      */
174     protected LifecycleSupport lifecycle = new LifecycleSupport(this); 180     protected LifecycleSupport lifecycle = new LifecycleSupport(this); 180     protected LifecycleSupport lifecycle = new LifecycleSupport(this);
175  181  181 
176  182  182 
177     /** 183     /** 183     /**
178      * Timeout value on the incoming connection. 184      * Timeout value on the incoming connection. 184      * Timeout value on the incoming connection.
179      * Note : a negative value of 0 means no timeout. 185      * Note : a negative value of 0 means no timeout. 185      * Note : a negative value of 0 means no timeout.
180      */ 186      */ 186      */
181     private int connectionTimeout = Constants.DEFAULT_CONNECTION_TIMEOUT; 187     private int connectionTimeout = Constants.DEFAULT_CONNECTION_TIMEOUT; 187     private int connectionTimeout = Constants.DEFAULT_CONNECTION_TIMEOUT;
182  188  188 
183  189  189 
184     /** 190     /** 190     /**
185      * The minimum number of processors to start at initialization time. 191      * The minimum number of processors to start at initialization time. 191      * The minimum number of processors to start at initialization time.
186      */ 192      */ 192      */
187     protected int minProcessors = 5; 193     protected int minProcessors = 5; 193     protected int minProcessors = 5;
188  194  194 
189  195  195 
190     /** 196     /** 196     /**
191      * The maximum number of processors allowed, or <0 for unlimited. 197      * The maximum number of processors allowed, or <0 for unlimited. 197      * The maximum number of processors allowed, or <0 for unlimited.
192      */ 198      */ 198      */
193     private int maxProcessors = 20; 199     private int maxProcessors = 20; 199     private int maxProcessors = 20;
194  200  200 
195  201  201 
196     /** 202     /** 202     /**
197      * The port number on which we listen for HTTP requests. 203      * The port number on which we listen for HTTP requests. 203      * The port number on which we listen for HTTP requests.
198      */ 204      */ 204      */
199     private int port = 8080; 205     private int port = 8080; 205     private int port = 8080;
200  206  206 
201  207  207 
202     /** 208     /** 208     /**
203      * The set of processors that have been created but are not currently 209      * The set of processors that have been created but are not currently 209      * The set of processors that have been created but are not currently
204      * being used to process a request. 210      * being used to process a request. 210      * being used to process a request.
205      */ 211      */ 211      */
206     private Stack processors = new Stack(); 212     private Stack processors = new Stack(); 212     private Stack processors = new Stack();
207  213  213 
208  214  214 
209     /** 215     /** 215     /**
210      * The server name to which we should pretend requests to this Connector 216      * The server name to which we should pretend requests to this Connector 216      * The server name to which we should pretend requests to this Connector
211      * were directed.  This is useful when operating Tomcat behind a proxy 217      * were directed.  This is useful when operating Tomcat behind a proxy 217      * were directed.  This is useful when operating Tomcat behind a proxy
212      * server, so that redirects get constructed accurately.  If not specified, 218      * server, so that redirects get constructed accurately.  If not specified, 218      * server, so that redirects get constructed accurately.  If not specified,
213      * the server name included in the <code>Host</code> header is used. 219      * the server name included in the <code>Host</code> header is used. 219      * the server name included in the <code>Host</code> header is used.
214      */ 220      */ 220      */
215     private String proxyName = null; 221     private String proxyName = null; 221     private String proxyName = null;
216  222  222 
217  223  223 
218     /** 224     /** 224     /**
219      * The server port to which we should pretent requests to this Connector 225      * The server port to which we should pretent requests to this Connector 225      * The server port to which we should pretent requests to this Connector
220      * were directed.  This is useful when operating Tomcat behind a proxy 226      * were directed.  This is useful when operating Tomcat behind a proxy 226      * were directed.  This is useful when operating Tomcat behind a proxy
221      * server, so that redirects get constructed accurately.  If not specified, 227      * server, so that redirects get constructed accurately.  If not specified, 227      * server, so that redirects get constructed accurately.  If not specified,
222      * the port number specified by the <code>port</code> property is used. 228      * the port number specified by the <code>port</code> property is used. 228      * the port number specified by the <code>port</code> property is used.
223      */ 229      */ 229      */
224     private int proxyPort = 0; 230     private int proxyPort = 0; 230     private int proxyPort = 0;
225  231  231 
226  232  232 
227     /** 233     /** 233     /**
228      * The redirect port for non-SSL to SSL redirects. 234      * The redirect port for non-SSL to SSL redirects. 234      * The redirect port for non-SSL to SSL redirects.
229      */ 235      */ 235      */
230     private int redirectPort = 443; 236     private int redirectPort = 443; 236     private int redirectPort = 443;
231  237  237 
232  238  238 
233     /** 239     /** 239     /**
234      * The request scheme that will be set on all requests received 240      * The request scheme that will be set on all requests received 240      * The request scheme that will be set on all requests received
235      * through this connector. 241      * through this connector. 241      * through this connector.
236      */ 242      */ 242      */
237     private String scheme = "http"; 243     private String scheme = "http"; 243     private String scheme = "http";
238  244  244 
239  245  245 
240     /** 246     /** 246     /**
241      * The secure connection flag that will be set on all requests received 247      * The secure connection flag that will be set on all requests received 247      * The secure connection flag that will be set on all requests received
242      * through this connector. 248      * through this connector. 248      * through this connector.
243      */ 249      */ 249      */
244     private boolean secure = false; 250     private boolean secure = false; 250     private boolean secure = false;
245  251  251 
246  252  252 
247     /** 253     /** 253     /**
248      * The server socket through which we listen for incoming TCP connections. 254      * The server socket through which we listen for incoming TCP connections. 254      * The server socket through which we listen for incoming TCP connections.
249      */ 255      */ 255      */
250     private ServerSocket serverSocket = null; 256     private ServerSocket serverSocket = null; 256     private ServerSocket serverSocket = null;
251  257  257 
252  258  258 
253     /** 259     /** 259     /**
254      * The <code>Service</code> we are associated with (if any). 260      * The <code>Service</code> we are associated with (if any). 260      * The <code>Service</code> we are associated with (if any).
255      */ 261      */ 261      */
256     private Service service = null; 262     private Service service = null; 262     private Service service = null;
257  263  263 
258  264  264 
259     /** 265     /** 265     /**
260      * The string manager for this package. 266      * The string manager for this package. 266      * The string manager for this package.
261      */ 267      */ 267      */
262     private StringManager sm = 268     private StringManager sm = 268     private StringManager sm =
263         StringManager.getManager(Constants.Package); 269         StringManager.getManager(Constants.Package); 269         StringManager.getManager(Constants.Package);
264  270  270 
265  271  271 
266     /** 272     /** 272     /**
267      * Has this component been initialized yet? 273      * Has this component been initialized yet? 273      * Has this component been initialized yet?
268      */ 274      */ 274      */
269     private boolean initialized = false; 275     private boolean initialized = false; 275     private boolean initialized = false;
270  276  276 
271  277  277 
272     /** 278     /** 278     /**
273      * Has this component been started yet? 279      * Has this component been started yet? 279      * Has this component been started yet?
274      */ 280      */ 280      */
275     private boolean started = false; 281     private boolean started = false; 281     private boolean started = false;
276  282  282 
277  283  283 
278     /** 284     /** 284     /**
279      * The shutdown signal to our background thread 285      * The shutdown signal to our background thread 285      * The shutdown signal to our background thread
280      */ 286      */ 286      */
281     private boolean stopped = false; 287     private boolean stopped = false; 287     private boolean stopped = false;
282  288  288 
283  289  289 
284     /** 290     /** 290     /**
285      * The background thread. 291      * The background thread. 291      * The background thread.
286      */ 292      */ 292      */
287     private Thread thread = null; 293     private Thread thread = null; 293     private Thread thread = null;
288  294  294 
289  295  295 
290     /** 296     /** 296     /**
291      * The name to register for the background thread. 297      * The name to register for the background thread. 297      * The name to register for the background thread.
292      */ 298      */ 298      */
293     private String threadName = null; 299     private String threadName = null; 299     private String threadName = null;
294  300  300 
295  301  301 
296     /** 302     /** 302     /**
297      * The thread synchronization object. 303      * The thread synchronization object. 303      * The thread synchronization object.
298      */ 304      */ 304      */
299     private Object threadSync = new Object(); 305     private Object threadSync = new Object(); 305     private Object threadSync = new Object();
300  306  306 
301  307  307 
302     // ------------------------------------------------------------- Properties 308     // ------------------------------------------------------------- Properties 308     // ------------------------------------------------------------- Properties
303  309  309 
304  310  310 
305     /** 311     /** 311     /**
306      * Return the connection timeout for this Connector. 312      * Return the connection timeout for this Connector. 312      * Return the connection timeout for this Connector.
307      */ 313      */ 313      */
308     public int getConnectionTimeout() { 314     public int getConnectionTimeout() { 314     public int getConnectionTimeout() {
309  315  315 
310         return (connectionTimeout); 316         return (connectionTimeout); 316         return (connectionTimeout);
311  317  317 
312     } 318     } 318     }
313  319  319 
314  320  320 
315     /** 321     /** 321     /**
316      * Set the connection timeout for this Connector. 322      * Set the connection timeout for this Connector. 322      * Set the connection timeout for this Connector.
317      * 323      * 323      *
318      * @param count The new connection timeout 324      * @param count The new connection timeout 324      * @param count The new connection timeout
319      */ 325      */ 325      */
320     public void setConnectionTimeout(int connectionTimeout) { 326     public void setConnectionTimeout(int connectionTimeout) { 326     public void setConnectionTimeout(int connectionTimeout) {
321  327  327 
322         this.connectionTimeout = connectionTimeout; 328         this.connectionTimeout = connectionTimeout; 328         this.connectionTimeout = connectionTimeout;
323  329  329 
324     } 330     } 330     }
325  331  331 
326  332  332 
327     /** 333     /** 333     /**
328      * Return the accept count for this Connector. 334      * Return the accept count for this Connector. 334      * Return the accept count for this Connector.
329      */ 335      */ 335      */
330     public int getAcceptCount() { 336     public int getAcceptCount() { 336     public int getAcceptCount() {
331  337  337 
332         return (acceptCount); 338         return (acceptCount); 338         return (acceptCount);
333  339  339 
334     } 340     } 340     }
335  341  341 
336  342  342 
337     /** 343     /** 343     /**
338      * Set the accept count for this Connector. 344      * Set the accept count for this Connector. 344      * Set the accept count for this Connector.
339      * 345      * 345      *
340      * @param count The new accept count 346      * @param count The new accept count 346      * @param count The new accept count
341      */ 347      */ 347      */
342     public void setAcceptCount(int count) { 348     public void setAcceptCount(int count) { 348     public void setAcceptCount(int count) {
343  349  349 
344         this.acceptCount = count; 350         this.acceptCount = count; 350         this.acceptCount = count;
345  351  351 
346     } 352     } 352     }
347  353  353 
348  354  354 
349     /** 355     /** 355     /**
350      * Return the bind IP address for this Connector. 356      * Return the bind IP address for this Connector. 356      * Return the bind IP address for this Connector.
351      */ 357      */ 357      */
352     public String getAddress() { 358     public String getAddress() { 358     public String getAddress() {
353  359  359 
354         return (this.address); 360         return (this.address); 360         return (this.address);
355  361  361 
356     } 362     } 362     }
357  363  363 
358  364  364 
359     /** 365     /** 365     /**
360      * Set the bind IP address for this Connector. 366      * Set the bind IP address for this Connector. 366      * Set the bind IP address for this Connector.
361      * 367      * 367      *
362      * @param address The bind IP address 368      * @param address The bind IP address 368      * @param address The bind IP address
363      */ 369      */ 369      */
364     public void setAddress(String address) { 370     public void setAddress(String address) { 370     public void setAddress(String address) {
365  371  371 
366         this.address = address; 372         this.address = address; 372         this.address = address;
367  373  373 
368     } 374     } 374     }
369  375  375 
370  376  376 
371     /** 377     /** 377     /**
372      * Is this connector available for processing requests? 378      * Is this connector available for processing requests? 378      * Is this connector available for processing requests?
373      */ 379      */ 379      */
374     public boolean isAvailable() { 380     public boolean isAvailable() { 380     public boolean isAvailable() {
375  381  381 
376         return (started); 382         return (started); 382         return (started);
377  383  383 
378     } 384     } 384     }
379  385  385 
380  386  386 
381     /** 387     /** 387     /**
382      * Return the input buffer size for this Connector. 388      * Return the input buffer size for this Connector. 388      * Return the input buffer size for this Connector.
383      */ 389      */ 389      */
384     public int getBufferSize() { 390     public int getBufferSize() { 390     public int getBufferSize() {
385  391  391 
386         return (this.bufferSize); 392         return (this.bufferSize); 392         return (this.bufferSize);
387  393  393 
388     } 394     } 394     }
389  395  395 
390  396  396 
391     /** 397     /** 397     /**
392      * Set the input buffer size for this Connector. 398      * Set the input buffer size for this Connector. 398      * Set the input buffer size for this Connector.
393      * 399      * 399      *
394      * @param bufferSize The new input buffer size. 400      * @param bufferSize The new input buffer size. 400      * @param bufferSize The new input buffer size.
395      */ 401      */ 401      */
396     public void setBufferSize(int bufferSize) { 402     public void setBufferSize(int bufferSize) { 402     public void setBufferSize(int bufferSize) {
397  403  403 
398         this.bufferSize = bufferSize; 404         this.bufferSize = bufferSize; 404         this.bufferSize = bufferSize;
399  405  405 
400     } 406     } 406     }
401  407  407 
402  408  408 
403     /** 409     /** 409     /**
404      * Return the Container used for processing requests received by this 410      * Return the Container used for processing requests received by this 410      * Return the Container used for processing requests received by this
405      * Connector. 411      * Connector. 411      * Connector.
406      */ 412      */ 412      */
407     public Container getContainer() { 413     public Container getContainer() { 413     public Container getContainer() {
408  414  414 
409         return (container); 415         return (container); 415         return (container);
410  416  416 
411     } 417     } 417     }
412  418  418 
413  419  419 
414     /** 420     /** 420     /**
415      * Set the Container used for processing requests received by this 421      * Set the Container used for processing requests received by this 421      * Set the Container used for processing requests received by this
416      * Connector. 422      * Connector. 422      * Connector.
417      * 423      * 423      *
418      * @param container The new Container to use 424      * @param container The new Container to use 424      * @param container The new Container to use
419      */ 425      */ 425      */
420     public void setContainer(Container container) { 426     public void setContainer(Container container) { 426     public void setContainer(Container container) {
421  427  427 
422         this.container = container; 428         this.container = container; 428         this.container = container;
423  429  429 
424     } 430     } 430     }
425  431  431 
426  432  432 
427     /** 433     /** 433     /**
428      * Return the current number of processors that have been created. 434      * Return the current number of processors that have been created. 434      * Return the current number of processors that have been created.
429      */ 435      */ 435      */
430     public int getCurProcessors() { 436     public int getCurProcessors() { 436     public int getCurProcessors() {
431  437  437 
432         return (curProcessors); 438         return (curProcessors); 438         return (curProcessors);
433  439  439 
434     } 440     } 440     }
435  441  441 
436  442  442 
437     /** 443     /** 443     /**
438      * Return the debugging detail level for this component. 444      * Return the debugging detail level for this component. 444      * Return the debugging detail level for this component.
439      */ 445      */ 445      */
440     public int getDebug() { 446     public int getDebug() { 446     public int getDebug() {
441  447  447 
442         return (debug); 448         return (debug); 448         return (debug);
443  449  449 
444     } 450     } 450     }
445  451  451 
446  452  452 
447     /** 453     /** 453     /**
448      * Set the debugging detail level for this component. 454      * Set the debugging detail level for this component. 454      * Set the debugging detail level for this component.
449      * 455      * 455      *
450      * @param debug The new debugging detail level 456      * @param debug The new debugging detail level 456      * @param debug The new debugging detail level
451      */ 457      */ 457      */
452     public void setDebug(int debug) { 458     public void setDebug(int debug) { 458     public void setDebug(int debug) {
453  459  459 
454         this.debug = debug; 460         this.debug = debug; 460         this.debug = debug;
455  461  461 
456     } 462     } 462     }
457  463  463 
458  464  464 
459     /** 465     /** 465     /**
460      * Return the "enable DNS lookups" flag. 466      * Return the "enable DNS lookups" flag. 466      * Return the "enable DNS lookups" flag.
461      */ 467      */ 467      */
462     public boolean getEnableLookups() { 468     public boolean getEnableLookups() { 468     public boolean getEnableLookups() {
463  469  469 
464         return (this.enableLookups); 470         return (this.enableLookups); 470         return (this.enableLookups);
465  471  471 
466     } 472     } 472     }
467  473  473 
468  474  474 
469     /** 475     /** 475     /**
470      * Set the "enable DNS lookups" flag. 476      * Set the "enable DNS lookups" flag. 476      * Set the "enable DNS lookups" flag.
471      * 477      * 477      *
472      * @param enableLookups The new "enable DNS lookups" flag value 478      * @param enableLookups The new "enable DNS lookups" flag value 478      * @param enableLookups The new "enable DNS lookups" flag value
473      */ 479      */ 479      */
474     public void setEnableLookups(boolean enableLookups) { 480     public void setEnableLookups(boolean enableLookups) { 480     public void setEnableLookups(boolean enableLookups) {
475  481  481 
476         this.enableLookups = enableLookups; 482         this.enableLookups = enableLookups; 482         this.enableLookups = enableLookups;
477  483  483 
478     } 484     } 484     }
479  485  485 
480  486  486 
481     /** 487     /** 487     /**
482      * Return the server socket factory used by this Container. 488      * Return the server socket factory used by this Container. 488      * Return the server socket factory used by this Container.
483      */ 489      */ 489      */
484     public ServerSocketFactory getFactory() { 490     public ServerSocketFactory getFactory() { 490     public ServerSocketFactory getFactory() {
485  491  491 
486         if (this.factory == null) { 492         if (this.factory == null) { 492         if (this.factory == null) {
487             synchronized (this) { 493             synchronized (this) { 493             synchronized (this) {
488                 this.factory = new DefaultServerSocketFactory(); 494                 this.factory = new DefaultServerSocketFactory(); 494                 this.factory = new DefaultServerSocketFactory();
489             } 495             } 495             }
490         } 496         } 496         }
491         return (this.factory); 497         return (this.factory); 497         return (this.factory);
492  498  498 
493     } 499     } 499     }
494  500  500 
495  501  501 
496     /** 502     /** 502     /**
497      * Set the server socket factory used by this Container. 503      * Set the server socket factory used by this Container. 503      * Set the server socket factory used by this Container.
498      * 504      * 504      *
499      * @param factory The new server socket factory 505      * @param factory The new server socket factory 505      * @param factory The new server socket factory
500      */ 506      */ 506      */
501     public void setFactory(ServerSocketFactory factory) { 507     public void setFactory(ServerSocketFactory factory) { 507     public void setFactory(ServerSocketFactory factory) {
502  508  508 
503         this.factory = factory; 509         this.factory = factory; 509         this.factory = factory;
504  510  510 
505     } 511     } 511     }
506  512  512 
507  513  513 
508     /** 514     /** 514     /**
509      * Return descriptive information about this Connector implementation. 515      * Return descriptive information about this Connector implementation. 515      * Return descriptive information about this Connector implementation.
510      */ 516      */ 516      */
511     public String getInfo() { 517     public String getInfo() { 517     public String getInfo() {
512  518  518 
513         return (info); 519         return (info); 519         return (info);
514  520  520 
515     } 521     } 521     }
516  522  522 
517  523  523 
518     /** 524     /** 524     /**
519      * Return the minimum number of processors to start at initialization. 525      * Return the minimum number of processors to start at initialization. 525      * Return the minimum number of processors to start at initialization.
520      */ 526      */ 526      */
521     public int getMinProcessors() { 527     public int getMinProcessors() { 527     public int getMinProcessors() {
522  528  528 
523         return (minProcessors); 529         return (minProcessors); 529         return (minProcessors);
524  530  530 
525     } 531     } 531     }
526  532  532 
527  533  533 
528     /** 534     /** 534     /**
529      * Set the minimum number of processors to start at initialization. 535      * Set the minimum number of processors to start at initialization. 535      * Set the minimum number of processors to start at initialization.
530      * 536      * 536      *
531      * @param minProcessors The new minimum processors 537      * @param minProcessors The new minimum processors 537      * @param minProcessors The new minimum processors
532      */ 538      */ 538      */
533     public void setMinProcessors(int minProcessors) { 539     public void setMinProcessors(int minProcessors) { 539     public void setMinProcessors(int minProcessors) {
534  540  540 
535         this.minProcessors = minProcessors; 541         this.minProcessors = minProcessors; 541         this.minProcessors = minProcessors;
536  542  542 
537     } 543     } 543     }
538  544  544 
539  545  545 
540     /** 546     /** 546     /**
541      * Return the maximum number of processors allowed, or <0 for unlimited. 547      * Return the maximum number of processors allowed, or <0 for unlimited. 547      * Return the maximum number of processors allowed, or <0 for unlimited.
542      */ 548      */ 548      */
543     public int getMaxProcessors() { 549     public int getMaxProcessors() { 549     public int getMaxProcessors() {
544  550  550 
545         return (maxProcessors); 551         return (maxProcessors); 551         return (maxProcessors);
546  552  552 
547     } 553     } 553     }
548  554  554 
549  555  555 
550     /** 556     /** 556     /**
551      * Set the maximum number of processors allowed, or <0 for unlimited. 557      * Set the maximum number of processors allowed, or <0 for unlimited. 557      * Set the maximum number of processors allowed, or <0 for unlimited.
552      * 558      * 558      *
553      * @param maxProcessors The new maximum processors 559      * @param maxProcessors The new maximum processors 559      * @param maxProcessors The new maximum processors
554      */ 560      */ 560      */
555     public void setMaxProcessors(int maxProcessors) { 561     public void setMaxProcessors(int maxProcessors) { 561     public void setMaxProcessors(int maxProcessors) {
556  562  562 
557         this.maxProcessors = maxProcessors; 563         this.maxProcessors = maxProcessors; 563         this.maxProcessors = maxProcessors;
558  564  564 
559     } 565     } 565     }
560  566  566 
561  567  567 
562     /** 568     /** 568     /**
563      * Return the port number on which we listen for HTTP requests. 569      * Return the port number on which we listen for HTTP requests. 569      * Return the port number on which we listen for HTTP requests.
564      */ 570      */ 570      */
565     public int getPort() { 571     public int getPort() { 571     public int getPort() {
566  572  572 
567         return (this.port); 573         return (this.port); 573         return (this.port);
568  574  574 
569     } 575     } 575     }
570  576  576 
571  577  577 
572     /** 578     /** 578     /**
573      * Set the port number on which we listen for HTTP requests. 579      * Set the port number on which we listen for HTTP requests. 579      * Set the port number on which we listen for HTTP requests.
574      * 580      * 580      *
575      * @param port The new port number 581      * @param port The new port number 581      * @param port The new port number
576      */ 582      */ 582      */
577     public void setPort(int port) { 583     public void setPort(int port) { 583     public void setPort(int port) {
578  584  584 
579         this.port = port; 585         this.port = port; 585         this.port = port;
580  586  586 
581     } 587     } 587     }
582  588  588 
583  589  589 
584     /** 590     /** 590     /**
585      * Return the proxy server name for this Connector. 591      * Return the proxy server name for this Connector. 591      * Return the proxy server name for this Connector.
586      */ 592      */ 592      */
587     public String getProxyName() { 593     public String getProxyName() { 593     public String getProxyName() {
588  594  594 
589         return (this.proxyName); 595         return (this.proxyName); 595         return (this.proxyName);
590  596  596 
591     } 597     } 597     }
592  598  598 
593  599  599 
594     /** 600     /** 600     /**
595      * Set the proxy server name for this Connector. 601      * Set the proxy server name for this Connector. 601      * Set the proxy server name for this Connector.
596      * 602      * 602      *
597      * @param proxyName The new proxy server name 603      * @param proxyName The new proxy server name 603      * @param proxyName The new proxy server name
598      */ 604      */ 604      */
599     public void setProxyName(String proxyName) { 605     public void setProxyName(String proxyName) { 605     public void setProxyName(String proxyName) {
600  606  606 
601         this.proxyName = proxyName; 607         this.proxyName = proxyName; 607         this.proxyName = proxyName;
602  608  608 
603     } 609     } 609     }
604  610  610 
605  611  611 
606     /** 612     /** 612     /**
607      * Return the proxy server port for this Connector. 613      * Return the proxy server port for this Connector. 613      * Return the proxy server port for this Connector.
608      */ 614      */ 614      */
609     public int getProxyPort() { 615     public int getProxyPort() { 615     public int getProxyPort() {
610  616  616 
611         return (this.proxyPort); 617         return (this.proxyPort); 617         return (this.proxyPort);
612  618  618 
613     } 619     } 619     }
614  620  620 
615  621  621 
616     /** 622     /** 622     /**
617      * Set the proxy server port for this Connector. 623      * Set the proxy server port for this Connector. 623      * Set the proxy server port for this Connector.
618      * 624      * 624      *
619      * @param proxyPort The new proxy server port 625      * @param proxyPort The new proxy server port 625      * @param proxyPort The new proxy server port
620      */ 626      */ 626      */
621     public void setProxyPort(int proxyPort) { 627     public void setProxyPort(int proxyPort) { 627     public void setProxyPort(int proxyPort) {
622  628  628 
623         this.proxyPort = proxyPort; 629         this.proxyPort = proxyPort; 629         this.proxyPort = proxyPort;
624  630  630 
625     } 631     } 631     }
626  632  632 
627  633  633 
628     /** 634     /** 634     /**
629      * Return the port number to which a request should be redirected if 635      * Return the port number to which a request should be redirected if 635      * Return the port number to which a request should be redirected if
630      * it comes in on a non-SSL port and is subject to a security constraint 636      * it comes in on a non-SSL port and is subject to a security constraint 636      * it comes in on a non-SSL port and is subject to a security constraint
631      * with a transport guarantee that requires SSL. 637      * with a transport guarantee that requires SSL. 637      * with a transport guarantee that requires SSL.
632      */ 638      */ 638      */
633     public int getRedirectPort() { 639     public int getRedirectPort() { 639     public int getRedirectPort() {
634  640  640 
635         return (this.redirectPort); 641         return (this.redirectPort); 641         return (this.redirectPort);
636  642  642 
637     } 643     } 643     }
638  644  644 
639  645  645 
640     /** 646     /** 646     /**
641      * Set the redirect port number. 647      * Set the redirect port number. 647      * Set the redirect port number.
642      * 648      * 648      *
643      * @param redirectPort The redirect port number (non-SSL to SSL) 649      * @param redirectPort The redirect port number (non-SSL to SSL) 649      * @param redirectPort The redirect port number (non-SSL to SSL)
644      */ 650      */ 650      */
645     public void setRedirectPort(int redirectPort) { 651     public void setRedirectPort(int redirectPort) { 651     public void setRedirectPort(int redirectPort) {
646  652  652 
647         this.redirectPort = redirectPort; 653         this.redirectPort = redirectPort; 653         this.redirectPort = redirectPort;
648  654  654 
649     } 655     } 655     }
650  656  656 
651  657  657 
652     /** 658     /** 658     /**
653      * Return the scheme that will be assigned to requests received 659      * Return the scheme that will be assigned to requests received 659      * Return the scheme that will be assigned to requests received
654      * through this connector.  Default value is "http". 660      * through this connector.  Default value is "http". 660      * through this connector.  Default value is "http".
655      */ 661      */ 661      */
656     public String getScheme() { 662     public String getScheme() { 662     public String getScheme() {
657  663  663 
658         return (this.scheme); 664         return (this.scheme); 664         return (this.scheme);
659  665  665 
660     } 666     } 666     }
661  667  667 
662  668  668 
663     /** 669     /** 669     /**
664      * Set the scheme that will be assigned to requests received through 670      * Set the scheme that will be assigned to requests received through 670      * Set the scheme that will be assigned to requests received through
665      * this connector. 671      * this connector. 671      * this connector.
666      * 672      * 672      *
667      * @param scheme The new scheme 673      * @param scheme The new scheme 673      * @param scheme The new scheme
668      */ 674      */ 674      */
669     public void setScheme(String scheme) { 675     public void setScheme(String scheme) { 675     public void setScheme(String scheme) {
670  676  676 
671         this.scheme = scheme; 677         this.scheme = scheme; 677         this.scheme = scheme;
672  678  678 
673     } 679     } 679     }
674  680  680 
675  681  681 
676     /** 682     /** 682     /**
677      * Return the secure connection flag that will be assigned to requests 683      * Return the secure connection flag that will be assigned to requests 683      * Return the secure connection flag that will be assigned to requests
678      * received through this connector.  Default value is "false". 684      * received through this connector.  Default value is "false". 684      * received through this connector.  Default value is "false".
679      */ 685      */ 685      */
680     public boolean getSecure() { 686     public boolean getSecure() { 686     public boolean getSecure() {
681  687  687 
682         return (this.secure); 688         return (this.secure); 688         return (this.secure);
683  689  689 
684     } 690     } 690     }
685  691  691 
686  692  692 
687     /** 693     /** 693     /**
688      * Set the secure connection flag that will be assigned to requests 694      * Set the secure connection flag that will be assigned to requests 694      * Set the secure connection flag that will be assigned to requests
689      * received through this connector. 695      * received through this connector. 695      * received through this connector.
690      * 696      * 696      *
691      * @param secure The new secure connection flag 697      * @param secure The new secure connection flag 697      * @param secure The new secure connection flag
692      */ 698      */ 698      */
693     public void setSecure(boolean secure) { 699     public void setSecure(boolean secure) { 699     public void setSecure(boolean secure) {
694  700  700 
695         this.secure = secure; 701         this.secure = secure; 701         this.secure = secure;
696  702  702 
697     } 703     } 703     }
698  704  704 
699  705  705 
700     /** 706     /** 706     /**
701      * Return the <code>Service</code> with which we are associated (if any). 707      * Return the <code>Service</code> with which we are associated (if any). 707      * Return the <code>Service</code> with which we are associated (if any).
702      */ 708      */ 708      */
703     public Service getService() { 709     public Service getService() { 709     public Service getService() {
704  710  710 
705         return (this.service); 711         return (this.service); 711         return (this.service);
706  712  712 
707     } 713     } 713     }
708  714  714 
709  715  715 
710     /** 716     /** 716     /**
711      * Set the <code>Service</code> with which we are associated (if any). 717      * Set the <code>Service</code> with which we are associated (if any). 717      * Set the <code>Service</code> with which we are associated (if any).
712      * 718      * 718      *
713      * @param service The service that owns this Engine 719      * @param service The service that owns this Engine 719      * @param service The service that owns this Engine
714      */ 720      */ 720      */
715     public void setService(Service service) { 721     public void setService(Service service) { 721     public void setService(Service service) {
716  722  722 
717         this.service = service; 723         this.service = service; 723         this.service = service;
718  724  724 
719     } 725     } 725     }
720  726  726 
721  727  727 
722     // --------------------------------------------------------- Public Methods 728     // --------------------------------------------------------- Public Methods 728     // --------------------------------------------------------- Public Methods
723  729  729 
724  730  730 
725     /** 731     /** 731     /**
726      * Create (or allocate) and return a Request object suitable for 732      * Create (or allocate) and return a Request object suitable for 732      * Create (or allocate) and return a Request object suitable for
727      * specifying the contents of a Request to the responsible Container. 733      * specifying the contents of a Request to the responsible Container. 733      * specifying the contents of a Request to the responsible Container.
728      */ 734      */ 734      */
729     public Request createRequest() { 735     public Request createRequest() { 735     public Request createRequest() {
730  736  736 
731         HttpRequestImpl request = new HttpRequestImpl(); 737         HttpRequestImpl request = new HttpRequestImpl(); 737         HttpRequestImpl request = new HttpRequestImpl();
732         request.setConnector(this); 738         request.setConnector(this); 738         request.setConnector(this);
733         return (request); 739         return (request); 739         return (request);
734  740  740 
735     } 741     } 741     }
736  742  742 
737  743  743 
738     /** 744     /** 744     /**
739      * Create (or allocate) and return a Response object suitable for 745      * Create (or allocate) and return a Response object suitable for 745      * Create (or allocate) and return a Response object suitable for
740      * receiving the contents of a Response from the responsible Container. 746      * receiving the contents of a Response from the responsible Container. 746      * receiving the contents of a Response from the responsible Container.
741      */ 747      */ 747      */
742     public Response createResponse() { 748     public Response createResponse() { 748     public Response createResponse() {
743  749  749 
744         HttpResponseImpl response = new HttpResponseImpl(); 750         HttpResponseImpl response = new HttpResponseImpl(); 750         HttpResponseImpl response = new HttpResponseImpl();
745         response.setConnector(this); 751         response.setConnector(this); 751         response.setConnector(this);
746         return (response); 752         return (response); 752         return (response);
747  753  753 
748     } 754     } 754     }
749  755  755 
750  756  756 
751     // -------------------------------------------------------- Package Methods 757     // -------------------------------------------------------- Package Methods 757     // -------------------------------------------------------- Package Methods
752  758  758 
753  759  759 
754     /** 760     /** 760     /**
755      * Recycle the specified Processor so that it can be used again. 761      * Recycle the specified Processor so that it can be used again. 761      * Recycle the specified Processor so that it can be used again.
756      * 762      * 762      *
757      * @param processor The processor to be recycled 763      * @param processor The processor to be recycled 763      * @param processor The processor to be recycled
758      */ 764      */ 764      */
759     void recycle(HttpProcessor processor) { 765     void recycle(HttpProcessor processor) { 765     void recycle(HttpProcessor processor) {
760  766  766 
761         processors.push(processor); 767         processors.push(processor); 767         processors.push(processor);
762  768  768 
763     } 769     } 769     }
764  770  770 
765  771  771 
766     // -------------------------------------------------------- Private Methods 772     // -------------------------------------------------------- Private Methods 772     // -------------------------------------------------------- Private Methods
767  773  773 
768  774  774 
769     /** 775     /** 775     /**
770      * Create (or allocate) and return an available processor for use in 776      * Create (or allocate) and return an available processor for use in 776      * Create (or allocate) and return an available processor for use in
771      * processing a specific HTTP request, if possible.  If the maximum 777      * processing a specific HTTP request, if possible.  If the maximum 777      * processing a specific HTTP request, if possible.  If the maximum
772      * allowed processors have already been created and are in use, return 778      * allowed processors have already been created and are in use, return 778      * allowed processors have already been created and are in use, return
773      * <code>null</code> instead. 779      * <code>null</code> instead. 779      * <code>null</code> instead.
774      */ 780      */ 780      */
775     private HttpProcessor createProcessor() { 781     private HttpProcessor createProcessor() { 781     private HttpProcessor createProcessor() {
776  782  782 
777         synchronized (processors) { 783         synchronized (processors) { 783         synchronized (processors) {
778             if (processors.size() > 0) 784             if (processors.size() > 0) 784             if (processors.size() > 0)
779                 return ((HttpProcessor) processors.pop()); 785                 return ((HttpProcessor) processors.pop()); 785                 return ((HttpProcessor) processors.pop());
780             if ((maxProcessors > 0) && (curProcessors < maxProcessors)) { 786             if ((maxProcessors > 0) && (curProcessors < maxProcessors)) { 786             if ((maxProcessors > 0) && (curProcessors < maxProcessors)) {
781                 return (newProcessor()); 787                 return (newProcessor()); 787                 return (newProcessor());
782             } else { 788             } else { 788             } else {
783                 if (maxProcessors < 0) { 789                 if (maxProcessors < 0) { 789                 if (maxProcessors < 0) {
784                     return (newProcessor()); 790                     return (newProcessor()); 790                     return (newProcessor());
785                 } else { 791                 } else { 791                 } else {
786                     return (null); 792                     return (null); 792                     return (null);
787                 } 793                 } 793                 }
788             } 794             } 794             }
789         } 795         } 795         }
790  796  796 
791     } 797     } 797     }
792  798  798 
793  799  799 
794     /** 800     /** 800     /**
795      * Log a message on the Logger associated with our Container (if any). 801      * Log a message on the Logger associated with our Container (if any). 801      * Log a message on the Logger associated with our Container (if any).
796      * 802      * 802      *
797      * @param message Message to be logged 803      * @param message Message to be logged 803      * @param message Message to be logged
798      */ 804      */ 804      */
799     private void log(String message) { 805     private void log(String message) { 805     private void log(String message) {
800  806  806 
801         Logger logger = container.getLogger(); 807         Logger logger = container.getLogger(); 807         Logger logger = container.getLogger();
802         String localName = threadName; 808         String localName = threadName; 808         String localName = threadName;
803         if (localName == null) 809         if (localName == null) 809         if (localName == null)
804             localName = "HttpConnector"; 810             localName = "HttpConnector"; 810             localName = "HttpConnector";
805         if (logger != null) 811         if (logger != null) 811         if (logger != null)
806             logger.log(localName + " " + message); 812             logger.log(localName + " " + message); 812             logger.log(localName + " " + message);
807         else 813         else 813         else
808             System.out.println(localName + " " + message); 814             System.out.println(localName + " " + message); 814             System.out.println(localName + " " + message);
809  815  815 
810     } 816     } 816     }
811  817  817 
812  818  818 
813     /** 819     /** 819     /**
814      * Log a message on the Logger associated with our Container (if any). 820      * Log a message on the Logger associated with our Container (if any). 820      * Log a message on the Logger associated with our Container (if any).
815      * 821      * 821      *
816      * @param message Message to be logged 822      * @param message Message to be logged 822      * @param message Message to be logged
817      * @param throwable Associated exception 823      * @param throwable Associated exception 823      * @param throwable Associated exception
818      */ 824      */ 824      */
819     private void log(String message, Throwable throwable) { 825     private void log(String message, Throwable throwable) { 825     private void log(String message, Throwable throwable) {
820  826  826 
821         Logger logger = container.getLogger(); 827         Logger logger = container.getLogger(); 827         Logger logger = container.getLogger();
822         String localName = threadName; 828         String localName = threadName; 828         String localName = threadName;
823         if (localName == null) 829         if (localName == null) 829         if (localName == null)
824             localName = "HttpConnector"; 830             localName = "HttpConnector"; 830             localName = "HttpConnector";
825         if (logger != null) 831         if (logger != null) 831         if (logger != null)
826             logger.log(localName + " " + message, throwable); 832             logger.log(localName + " " + message, throwable); 832             logger.log(localName + " " + message, throwable);
827         else { 833         else { 833         else {
828             System.out.println(localName + " " + message); 834             System.out.println(localName + " " + message); 834             System.out.println(localName + " " + message);
829             throwable.printStackTrace(System.out); 835             throwable.printStackTrace(System.out); 835             throwable.printStackTrace(System.out);
830         } 836         } 836         }
831  837  837 
832     } 838     } 838     }
833  839  839 
834  840  840 
835     /** 841     /** 841     /**
836      * Create and return a new processor suitable for processing HTTP 842      * Create and return a new processor suitable for processing HTTP 842      * Create and return a new processor suitable for processing HTTP
837      * requests and returning the corresponding responses. 843      * requests and returning the corresponding responses. 843      * requests and returning the corresponding responses.
838      */ 844      */ 844      */
839     private HttpProcessor newProcessor() { 845     private HttpProcessor newProcessor() { 845     private HttpProcessor newProcessor() {
840  846  846 
841         HttpProcessor processor = new HttpProcessor(this, curProcessors++); 847         HttpProcessor processor = new HttpProcessor(this, curProcessors++); 847         HttpProcessor processor = new HttpProcessor(this, curProcessors++);
842         if (processor instanceof Lifecycle) { 848         if (processor instanceof Lifecycle) { 848         if (processor instanceof Lifecycle) {
843             try { 849             try { 849             try {
844                 ((Lifecycle) processor).start(); 850                 ((Lifecycle) processor).start(); 850                 ((Lifecycle) processor).start();
845             } catch (LifecycleException e) { 851             } catch (LifecycleException e) { 851             } catch (LifecycleException e) {
846                 log("newProcessor", e); 852                 log("newProcessor", e); 852                 log("newProcessor", e);
847                 return (null); 853                 return (null); 853                 return (null);
848             } 854             } 854             }
849         } 855         } 855         }
850         created.addElement(processor); 856         created.addElement(processor); 856         created.addElement(processor);
851         return (processor); 857         return (processor); 857         return (processor);
852  858  858 
853     } 859     } 859     }
854  860  860 
855  861  861 
856     /** 862     /** 862     /**
857      * Open and return the server socket for this Connector.  If an IP 863      * Open and return the server socket for this Connector.  If an IP 863      * Open and return the server socket for this Connector.  If an IP
858      * address has been specified, the socket will be opened only on that 864      * address has been specified, the socket will be opened only on that 864      * address has been specified, the socket will be opened only on that
859      * address; otherwise it will be opened on all addresses. 865      * address; otherwise it will be opened on all addresses. 865      * address; otherwise it will be opened on all addresses.
860      * 866      * 866      *
861      * @exception IOException if an input/output err
or
 
occurs
 867      * @exception IOException 
               input/output or network erro
r
 867      * @exception IOException                input/output or network error
    868      * @exception KeyStoreException          error instantiating the 868      * @exception KeyStoreException          error instantiating the
    869      *                                       KeyStore from file (SSL only) 869      *                                       KeyStore from file (SSL only)
    870      * @exception NoSuchAlgorithmException   KeyStore algorithm unsupported 870      * @exception NoSuchAlgorithmException   KeyStore algorithm unsupported
    871      *                                       by current provider (SSL only) 871      *                                       by current provider (SSL only)
    872      * @exception CertificateException       general certificate error (SSL only) 872      * @exception CertificateException       general certificate error (SSL only)
    873      * @exception UnrecoverableKeyException  internal KeyStore problem with 873      * @exception UnrecoverableKeyException  internal KeyStore problem with
    874      *                                       the certificate (SSL only) 874      *                                       the certificate (SSL only)
    875      * @exception KeyManagementException     problem in the key management 875      * @exception KeyManagementException     problem in the key management
    876      *                                       layer (SSL only) 876      *                                       layer (SSL only)
862      */ 877      */ 877      */
863     private ServerSocket open() throws IOException { 878     private ServerSocket open()
 878     private ServerSocket open()
    879     throws IOException, KeyStoreException, NoSuchAlgorithmException, 879     throws IOException, KeyStoreException, NoSuchAlgorithmException,
    880            CertificateException, UnrecoverableKeyException, 880            CertificateException, UnrecoverableKeyException,
    881            KeyManagementException 881            KeyManagementException
    882     { 882     {
864  883  883 
865         // Acquire the server socket factory for this Connector 884         // Acquire the server socket factory for this Connector 884         // Acquire the server socket factory for this Connector
866         ServerSocketFactory factory = getFactory(); 885         ServerSocketFactory factory = getFactory(); 885         ServerSocketFactory factory = getFactory();
867  886  886 
868         // If no address is specified, open a connection on all addresses 887         // If no address is specified, open a connection on all addresses 887         // If no address is specified, open a connection on all addresses
869         if (address == null) { 888         if (address == null) { 888         if (address == null) {
870             log(sm.getString("httpConnector.allAddresses")); 889             log(sm.getString("httpConnector.allAddresses")); 889             log(sm.getString("httpConnector.allAddresses"));
871             return (factory.createSocket(port, acceptCount)); 890             return (factory.createSocket(port, acceptCount)); 890             return (factory.createSocket(port, acceptCount));
872         } 891         } 891         }
873  892  892 
874         // Open a server socket on the specified address 893         // Open a server socket on the specified address 893         // Open a server socket on the specified address
875         InetAddress[] addresses = 894         InetAddress[] addresses = 894         InetAddress[] addresses =
876             InetAddress.getAllByName(InetAddress.getLocalHost().getHostName()); 895             InetAddress.getAllByName(InetAddress.getLocalHost().getHostName()); 895             InetAddress.getAllByName(InetAddress.getLocalHost().getHostName());
877         int i; 896         int i; 896         int i;
878         for (i = 0; i < addresses.length; i++) { 897         for (i = 0; i < addresses.length; i++) { 897         for (i = 0; i < addresses.length; i++) {
879             if (addresses[i].getHostAddress().equals(address)) 898             if (addresses[i].getHostAddress().equals(address)) 898             if (addresses[i].getHostAddress().equals(address))
880                 break; 899                 break; 899                 break;
881         } 900         } 900         }
882         if (i < addresses.length) { 901         if (i < addresses.length) { 901         if (i < addresses.length) {
883             log(sm.getString("httpConnector.anAddress", address)); 902             log(sm.getString("httpConnector.anAddress", address)); 902             log(sm.getString("httpConnector.anAddress", address));
884             return (factory.createSocket(port, acceptCount, addresses[i])); 903             return (factory.createSocket(port, acceptCount, addresses[i])); 903             return (factory.createSocket(port, acceptCount, addresses[i]));
885         } else { 904         } else { 904         } else {
886             log(sm.getString("httpConnector.noAddress", address)); 905             log(sm.getString("httpConnector.noAddress", address)); 905             log(sm.getString("httpConnector.noAddress", address));
887             return (factory.createSocket(port, acceptCount)); 906             return (factory.createSocket(port, acceptCount)); 906             return (factory.createSocket(port, acceptCount));
888         } 907         } 907         }
889  908  908 
890     } 909     } 909     }
891  910  910 
892  911  911 
893     // ---------------------------------------------- Background Thread Methods 912     // ---------------------------------------------- Background Thread Methods 912     // ---------------------------------------------- Background Thread Methods
894  913  913 
895  914  914 
896     /** 915     /** 915     /**
897      * The background thread that listens for incoming TCP/IP connections and 916      * The background thread that listens for incoming TCP/IP connections and 916      * The background thread that listens for incoming TCP/IP connections and
898      * hands them off to an appropriate processor. 917      * hands them off to an appropriate processor. 917      * hands them off to an appropriate processor.
899      */ 918      */ 918      */
900     public void run() { 919     public void run() { 919     public void run() {
901  920  920 
902         // Loop until we receive a shutdown command 921         // Loop until we receive a shutdown command 921         // Loop until we receive a shutdown command
903         while (!stopped) { 922         while (!stopped) { 922         while (!stopped) {
904  923  923 
905             // Accept the next incoming connection from the server socket 924             // Accept the next incoming connection from the server socket 924             // Accept the next incoming connection from the server socket
906             Socket socket = null; 925             Socket socket = null; 925             Socket socket = null;
907             try { 926             try { 926             try {
908                 socket = serverSocket.accept(); 927                 socket = serverSocket.accept(); 927                 socket = serverSocket.accept();
909                 if (connectionTimeout > 0) 928                 if (connectionTimeout > 0) 928                 if (connectionTimeout > 0)
910                     socket.setSoTimeout(connectionTimeout); 929                     socket.setSoTimeout(connectionTimeout); 929                     socket.setSoTimeout(connectionTimeout);
911             } catch (AccessControlException ace) { 930             } catch (AccessControlException ace) { 930             } catch (AccessControlException ace) {
912                 log("socket accept security exception: " + ace.getMessage()); 931                 log("socket accept security exception: " + ace.getMessage()); 931                 log("socket accept security exception: " + ace.getMessage());
913                 continue; 932                 continue; 932                 continue;
914             } catch (IOException e) { 933             } catch (IOException e) { 933             } catch (IOException e) {
915                 if (started && !stopped) 934                 if (started && !stopped) 934                 if (started && !stopped)
916                     log("accept: ", e); 935                     log("accept: ", e); 935                     log("accept: ", e);
917                 break; 936                 break; 936                 break;
918             } 937             } 937             }
919  938  938 
920             // Hand this socket off to an appropriate processor 939             // Hand this socket off to an appropriate processor 939             // Hand this socket off to an appropriate processor
921             HttpProcessor processor = createProcessor(); 940             HttpProcessor processor = createProcessor(); 940             HttpProcessor processor = createProcessor();
922             if (processor == null) { 941             if (processor == null) { 941             if (processor == null) {
923                 try { 942                 try { 942                 try {
924                     log(sm.getString("httpConnector.noProcessor")); 943                     log(sm.getString("httpConnector.noProcessor")); 943                     log(sm.getString("httpConnector.noProcessor"));
925                     socket.close(); 944                     socket.close(); 944                     socket.close();
926                 } catch (IOException e) { 945                 } catch (IOException e) { 945                 } catch (IOException e) {
927                     ; 946                     ; 946                     ;
928                 } 947                 } 947                 }
929                 continue; 948                 continue; 948                 continue;
930             } 949             } 949             }
931             processor.assign(socket); 950             processor.assign(socket); 950             processor.assign(socket);
932  951  951 
933             // The processor will recycle itself when it finishes 952             // The processor will recycle itself when it finishes 952             // The processor will recycle itself when it finishes
934  953  953 
935         } 954         } 954         }
936  955  955 
937         // Notify the threadStop() method that we have shut ourselves down 956         // Notify the threadStop() method that we have shut ourselves down 956         // Notify the threadStop() method that we have shut ourselves down
938         synchronized (threadSync) { 957         synchronized (threadSync) { 957         synchronized (threadSync) {
939             threadSync.notifyAll(); 958             threadSync.notifyAll(); 958             threadSync.notifyAll();
940         } 959         } 959         }
941  960  960 
942     } 961     } 961     }
943  962  962 
944  963  963 
945     /** 964     /** 964     /**
946      * Start the background processing thread. 965      * Start the background processing thread. 965      * Start the background processing thread.
947      */ 966      */ 966      */
948     private void threadStart() { 967     private void threadStart() { 967     private void threadStart() {
949  968  968 
950         log(sm.getString("httpConnector.starting")); 969         log(sm.getString("httpConnector.starting")); 969         log(sm.getString("httpConnector.starting"));
951  970  970 
952         thread = new Thread(this, threadName); 971         thread = new Thread(this, threadName); 971         thread = new Thread(this, threadName);
953         thread.setDaemon(true); 972         thread.setDaemon(true); 972         thread.setDaemon(true);
954         thread.start(); 973         thread.start(); 973         thread.start();
955  974  974 
956     } 975     } 975     }
957  976  976 
958  977  977 
959     /** 978     /** 978     /**
960      * Stop the background processing thread. 979      * Stop the background processing thread. 979      * Stop the background processing thread.
961      */ 980      */ 980      */
962     private void threadStop() { 981     private void threadStop() { 981     private void threadStop() {
963  982  982 
964         log(sm.getString("httpConnector.stopping")); 983         log(sm.getString("httpConnector.stopping")); 983         log(sm.getString("httpConnector.stopping"));
965  984  984 
966         stopped = true; 985         stopped = true; 985         stopped = true;
967         synchronized (threadSync) { 986         synchronized (threadSync) { 986         synchronized (threadSync) {
968             try { 987             try { 987             try {
969                 threadSync.wait(5000); 988                 threadSync.wait(5000); 988                 threadSync.wait(5000);
970             } catch (InterruptedException e) { 989             } catch (InterruptedException e) { 989             } catch (InterruptedException e) {
971                 ; 990                 ; 990                 ;
972             } 991             } 991             }
973         } 992         } 992         }
974         thread = null; 993         thread = null; 993         thread = null;
975  994  994 
976     } 995     } 995     }
977  996  996 
978  997  997 
979     // ------------------------------------------------------ Lifecycle Methods 998     // ------------------------------------------------------ Lifecycle Methods 998     // ------------------------------------------------------ Lifecycle Methods
980  999  999 
981  1000  1000 
982     /** 1001     /** 1001     /**
983      * Add a lifecycle event listener to this component. 1002      * Add a lifecycle event listener to this component. 1002      * Add a lifecycle event listener to this component.
984      * 1003      * 1003      *
985      * @param listener The listener to add 1004      * @param listener The listener to add 1004      * @param listener The listener to add
986      */ 1005      */ 1005      */
987     public void addLifecycleListener(LifecycleListener listener) { 1006     public void addLifecycleListener(LifecycleListener listener) { 1006     public void addLifecycleListener(LifecycleListener listener) {
988  1007  1007 
989         lifecycle.addLifecycleListener(listener); 1008         lifecycle.addLifecycleListener(listener); 1008         lifecycle.addLifecycleListener(listener);
990  1009  1009 
991     } 1010     } 1010     }
992  1011  1011 
993  1012  1012 
994     /** 1013     /** 1013     /**
    1014      * Get the lifecycle listeners associated with this lifecycle. If this  1014      * Get the lifecycle listeners associated with this lifecycle. If this 
    1015      * Lifecycle has no listeners registered, a zero-length array is returned. 1015      * Lifecycle has no listeners registered, a zero-length array is returned.
    1016      */ 1016      */
    1017     public LifecycleListener[] findLifecycleListeners() { 1017     public LifecycleListener[] findLifecycleListeners() {
    1018  1018 
    1019         return lifecycle.findLifecycleListeners(); 1019         return lifecycle.findLifecycleListeners();
    1020  1020 
    1021     } 1021     }
    1022  1022 
    1023  1023 
    1024     /** 1024     /**
995      * Remove a lifecycle event listener from this component. 1025      * Remove a lifecycle event listener from this component. 1025      * Remove a lifecycle event listener from this component.
996      * 1026      * 1026      *
997      * @param listener The listener to add 1027      * @param listener The listener to add 1027      * @param listener The listener to add
998      */ 1028      */ 1028      */
999     public void removeLifecycleListener(LifecycleListener listener) { 1029     public void removeLifecycleListener(LifecycleListener listener) { 1029     public void removeLifecycleListener(LifecycleListener listener) {
1000  1030  1030 
1001         lifecycle.removeLifecycleListener(listener); 1031         lifecycle.removeLifecycleListener(listener); 1031         lifecycle.removeLifecycleListener(listener);
1002  1032  1032 
1003     } 1033     } 1033     }
1004  1034  1034 
1005  1035  1035 
1006     /** 1036     /** 1036     /**
1007      * Initialize this connector (create ServerSocket here!) 1037      * Initialize this connector (create ServerSocket here!) 1037      * Initialize this connector (create ServerSocket here!)
1008      */ 1038      */ 1038      */
1009     public void initialize() 1039     public void initialize() 1039     public void initialize()
1010     throws LifecycleException { 1040     throws LifecycleException { 1040     throws LifecycleException {
1011         if (initialized) 1041         if (initialized) 1041         if (initialized)
1012             throw new LifecycleException ( 1042             throw new LifecycleException ( 1042             throw new LifecycleException (
1013                 sm.getString("httpConnector.alreadyInitialized")); 1043                 sm.getString("httpConnector.alreadyInitialized")); 1043                 sm.getString("httpConnector.alreadyInitialized"));
    1044  1044 
1014         this.initialized=true; 1045         this.initialized=true; 1045         this.initialized=true;
    1046         Exception eRethrow = null; 1046         Exception eRethrow = null;
1015  1047  1047 
1016         // Establish a server socket on the specified port 1048         // Establish a server socket on the specified port 1048         // Establish a server socket on the specified port
1017         try { 1049         try { 1049         try {
1018             serverSocket = open(); 1050             serverSocket = open(); 1050             serverSocket = open();
1019         } catch (IOException 
e) {
 1051         } catch (IOException ioe) { 1051         } catch (IOException ioe) {
1020             thronew LifecycleException(threadName + ".o
p
en", 
e);
 1052             log("httpConne
c
t
o
r, io problem: ", ioe);
 1052             log("httpConnector, io problem: ", ioe);
    1053             eRethrow = ioe; 1053             eRethrow = ioe;
    1054         } catch (KeyStoreException kse) { 1054         } catch (KeyStoreException kse) {
    1055             log("httpConnector, keystore problem: ", kse); 1055             log("httpConnector, keystore problem: ", kse);
    1056             eRethrow = kse; 1056             eRethrow = kse;
    1057         } catch (NoSuchAlgorithmException nsae) { 1057         } catch (NoSuchAlgorithmException nsae) {
    1058             log("httpConnector, keystore algorithm problem: ", nsae); 1058             log("httpConnector, keystore algorithm problem: ", nsae);
    1059             eRethrow = nsae; 1059             eRethrow = nsae;
    1060         } catch (CertificateException ce) { 1060         } catch (CertificateException ce) {
    1061             log("httpConnector, certificate problem: ", ce); 1061             log("httpConnector, certificate problem: ", ce);
    1062             eRethrow = ce; 1062             eRethrow = ce;
    1063         } catch (UnrecoverableKeyException uke) { 1063         } catch (UnrecoverableKeyException uke) {
    1064             log("httpConnector, unrecoverable key: ", uke); 1064             log("httpConnector, unrecoverable key: ", uke);
    1065             eRethrow = uke; 1065             eRethrow = uke;
    1066         } catch (KeyManagementException kme) { 1066         } catch (KeyManagementException kme) {
    1067             log("httpConnector, key management problem: ", kme); 1067             log("httpConnector, key management problem: ", kme);
    1068             eRethrow = kme; 1068             eRethrow = kme;
1021         } 1069         } 1069         }
1022  1070  1070 
    1071         if ( eRethrow != null ) 1071         if ( eRethrow != null )
    1072             throw new LifecycleException(threadName + ".open", eRethrow); 1072             throw new LifecycleException(threadName + ".open", eRethrow);
    1073  1073 
1023     } 1074     } 1074     }
1024  1075  1075 
1025     /** 1076     /** 1076     /**
1026      * Begin processing requests via this Connector. 1077      * Begin processing requests via this Connector. 1077      * Begin processing requests via this Connector.
1027      * 1078      * 1078      *
1028      * @exception LifecycleException if a fatal startup error occurs 1079      * @exception LifecycleException if a fatal startup error occurs 1079      * @exception LifecycleException if a fatal startup error occurs
1029      */ 1080      */ 1080      */
1030     public void start() throws LifecycleException { 1081     public void start() throws LifecycleException { 1081     public void start() throws LifecycleException {
1031  1082  1082 
1032         // Validate and update our current state 1083         // Validate and update our current state 1083         // Validate and update our current state
1033         if (started) 1084         if (started) 1084         if (started)
1034             throw new LifecycleException 1085             throw new LifecycleException 1085             throw new LifecycleException
1035                 (sm.getString("httpConnector.alreadyStarted")); 1086                 (sm.getString("httpConnector.alreadyStarted")); 1086                 (sm.getString("httpConnector.alreadyStarted"));
1036         threadName = "HttpConnector[" + port + "]"; 1087         threadName = "HttpConnector[" + port + "]"; 1087         threadName = "HttpConnector[" + port + "]";
1037         lifecycle.fireLifecycleEvent(START_EVENT, null); 1088         lifecycle.fireLifecycleEvent(START_EVENT, null); 1088         lifecycle.fireLifecycleEvent(START_EVENT, null);
1038         started = true; 1089         started = true; 1089         started = true;
1039  1090  1090 
1040         // Start our background thread 1091         // Start our background thread 1091         // Start our background thread
1041         threadStart(); 1092         threadStart(); 1092         threadStart();
1042  1093  1093 
1043         // Create the specified minimum number of processors 1094         // Create the specified minimum number of processors 1094         // Create the specified minimum number of processors
1044         while (curProcessors < minProcessors) { 1095         while (curProcessors < minProcessors) { 1095         while (curProcessors < minProcessors) {
1045             if ((maxProcessors > 0) && (curProcessors >= maxProcessors)) 1096             if ((maxProcessors > 0) && (curProcessors >= maxProcessors)) 1096             if ((maxProcessors > 0) && (curProcessors >= maxProcessors))
1046                 break; 1097                 break; 1097                 break;
1047             HttpProcessor processor = newProcessor(); 1098             HttpProcessor processor = newProcessor(); 1098             HttpProcessor processor = newProcessor();
1048             recycle(processor); 1099             recycle(processor); 1099             recycle(processor);
1049         } 1100         } 1100         }
1050  1101  1101 
1051     } 1102     } 1102     }
1052  1103  1103 
1053  1104  1104 
1054     /** 1105     /** 1105     /**
1055      * Terminate processing requests via this Connector. 1106      * Terminate processing requests via this Connector. 1106      * Terminate processing requests via this Connector.
1056      * 1107      * 1107      *
1057      * @exception LifecycleException if a fatal shutdown error occurs 1108      * @exception LifecycleException if a fatal shutdown error occurs 1108      * @exception LifecycleException if a fatal shutdown error occurs
1058      */ 1109      */ 1109      */
1059     public void stop() throws LifecycleException { 1110     public void stop() throws LifecycleException { 1110     public void stop() throws LifecycleException {
1060  1111  1111 
1061         // Validate and update our current state 1112         // Validate and update our current state 1112         // Validate and update our current state
1062         if (!started) 1113         if (!started) 1113         if (!started)
1063             throw new LifecycleException 1114             throw new LifecycleException 1114             throw new LifecycleException
1064                 (sm.getString("httpConnector.notStarted")); 1115                 (sm.getString("httpConnector.notStarted")); 1115                 (sm.getString("httpConnector.notStarted"));
1065         lifecycle.fireLifecycleEvent(STOP_EVENT, null); 1116         lifecycle.fireLifecycleEvent(STOP_EVENT, null); 1116         lifecycle.fireLifecycleEvent(STOP_EVENT, null);
1066         started = false; 1117         started = false; 1117         started = false;
1067  1118  1118 
1068         // Gracefully shut down all processors we have created 1119         // Gracefully shut down all processors we have created 1119         // Gracefully shut down all processors we have created
1069         for (int i = created.size() - 1; i >= 0; i--) { 1120         for (int i = created.size() - 1; i >= 0; i--) { 1120         for (int i = created.size() - 1; i >= 0; i--) {
1070             HttpProcessor processor = (HttpProcessor) created.elementAt(i); 1121             HttpProcessor processor = (HttpProcessor) created.elementAt(i); 1121             HttpProcessor processor = (HttpProcessor) created.elementAt(i);
1071             if (processor instanceof Lifecycle) { 1122             if (processor instanceof Lifecycle) { 1122             if (processor instanceof Lifecycle) {
1072                 try { 1123                 try { 1123                 try {
1073                     ((Lifecycle) processor).stop(); 1124                     ((Lifecycle) processor).stop(); 1124                     ((Lifecycle) processor).stop();
1074                 } catch (LifecycleException e) { 1125                 } catch (LifecycleException e) { 1125                 } catch (LifecycleException e) {
1075                     log("HttpConnector.stop", e); 1126                     log("HttpConnector.stop", e); 1126                     log("HttpConnector.stop", e);
1076                 } 1127                 } 1127                 }
1077             } 1128             } 1128             }
1078         } 1129         } 1129         }
1079  1130  1130 
1080         // Close the server socket we were using 1131         // Close the server socket we were using 1131         // Close the server socket we were using
1081         if (serverSocket != null) { 1132         if (serverSocket != null) { 1132         if (serverSocket != null) {
1082             try { 1133             try { 1133             try {
1083                 serverSocket.close(); 1134                 serverSocket.close(); 1134                 serverSocket.close();
1084             } catch (IOException e) { 1135             } catch (IOException e) { 1135             } catch (IOException e) {
1085                 ; 1136                 ; 1136                 ;
1086             } 1137             } 1137             }
1087             serverSocket = null; 1138             serverSocket = null; 1138             serverSocket = null;
1088         } 1139         } 1139         }
1089  1140  1140 
1090         // Stop our background thread 1141         // Stop our background thread 1141         // Stop our background thread
1091         threadStop(); 1142         threadStop(); 1142         threadStop();
1092  1143  1143 
1093     } 1144     } 1144     }
1094  1145  1145 
1095  1146  1146 
1096 } 1147 } 1147 }