17. Araxis Merge File Comparison Report

Produced by Araxis Merge on 2016-08-05 09:21:33 +0000. See www.araxis.com for information about Merge. This report uses XHTML and CSS2, and is best viewed with a modern standards-compliant browser. For optimum results when printing this report, use landscape orientation and enable printing of background images and colours in your browser.

17.1 Files compared

#LocationFileLast Modified
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
Note: Merge considers the second file to be the common ancestor of the others.

17.2 Comparison summary

DescriptionBetween
Files 1 and 2
Between
Files 2 and 3
Relative to
Common Ancestor
Text BlocksLinesText BlocksLinesText BlocksLines
Unchanged11217612294
Changed54600546
Inserted5210000
Removed0000521
Note: An automatic merge would leave 0 conflict(s).

17.3 Comparison options

WhitespaceDifferences in whitespace are significant
Character caseDifferences in character case are significant
Line endingsDifferences in line endings (CR and LF characters) are significant
CR/LF charactersNot shown in the comparison detail

17.4 Active regular expressions

No regular expressions were active.

17.5 Comparison detail

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 }