001 /*
002 * Licensed to the Apache Software Foundation (ASF) under one
003 * or more contributor license agreements. See the NOTICE file
004 * distributed with this work for additional information
005 * regarding copyright ownership. The ASF licenses this file
006 * to you under the Apache License, Version 2.0 (the
007 * "License"); you may not use this file except in compliance
008 * with the License. You may obtain a copy of the License at
009 *
010 * http://www.apache.org/licenses/LICENSE-2.0
011 *
012 * Unless required by applicable law or agreed to in writing,
013 * software distributed under the License is distributed on an
014 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
015 * KIND, either express or implied. See the License for the
016 * specific language governing permissions and limitations
017 * under the License.
018 */
019 package org.apache.geronimo.tomcat.connector;
020
021 import java.net.InetAddress;
022 import java.net.InetSocketAddress;
023 import java.net.UnknownHostException;
024 import java.util.Map;
025
026 import javax.management.j2ee.statistics.Stats;
027 import javax.net.ssl.KeyManagerFactory;
028
029 import org.apache.geronimo.gbean.GBeanInfo;
030 import org.apache.geronimo.gbean.GBeanInfoBuilder;
031 import org.apache.geronimo.management.StatisticsProvider;
032 import org.apache.geronimo.system.serverinfo.ServerInfo;
033 import org.apache.geronimo.tomcat.TomcatContainer;
034 import org.apache.geronimo.tomcat.stats.ConnectorStats;
035
036 public abstract class BaseHttp11ConnectorGBean extends ConnectorGBean implements BaseHttp11Protocol, StatisticsProvider {
037
038 protected String connectHost;
039
040 // JSR77 stats
041 private ConnectorStats connStatsProvider = new ConnectorStats();
042
043 private boolean reset = true;
044
045 public BaseHttp11ConnectorGBean(String name, Map initParams, String tomcatProtocol, String host, int port, TomcatContainer container, ServerInfo serverInfo) throws Exception {
046 super(name, initParams, tomcatProtocol, container, serverInfo);
047
048 // Default the host to listen on all address is one was not specified
049 if (host == null) {
050 host = "0.0.0.0";
051 }
052
053 // Must have a port
054 if (port == 0) {
055 throw new IllegalArgumentException("Must declare a port.");
056 }
057
058 connector.setAttribute("address", host);
059 connector.setPort(port);
060
061 }
062
063 protected void initProtocol() {}
064
065 public String getConnectUrl() {
066 if(connectHost == null) {
067 String host = getAddress();
068 if(host == null || host.equals("0.0.0.0") || host.equals("0:0:0:0:0:0:0:1")) {
069 InetAddress address = null;
070 try {
071 address = InetAddress.getLocalHost();
072 } catch (UnknownHostException e) {
073 host = "unknown-host";
074 }
075 if(address != null) {
076 host = address.getCanonicalHostName();
077 if(host == null || host.equals("")) {
078 host = address.getHostAddress();
079 }
080 }
081 }
082 // this host address could be in IPv6 format,
083 // which means we need to wrap it in brackets
084 if (host.indexOf(":") >= 0) {
085 host = "[" + host + "]";
086 }
087 connectHost = host;
088 }
089 return getScheme().toLowerCase()+"://"+connectHost+(getPort() == getDefaultPort() ? "" : ":"+getPort());
090 }
091
092 public abstract int getDefaultPort();
093
094
095 // Generic HTTP
096 public int getAcceptCount() {
097 Object value = connector.getAttribute("acceptCount");
098 return value == null ? 10 : Integer.parseInt(value.toString());
099 }
100
101 public String getAddress() {
102 Object value = connector.getAttribute("address");
103 if (value == null) {
104 return "0.0.0.0";
105 } else if (value instanceof InetAddress) {
106 return ((InetAddress) value).getHostAddress();
107 } else
108 return value.toString();
109 }
110
111 public int getBufferSize() {
112 Object value = connector.getAttribute("bufferSize");
113 return value == null ? 2048 : Integer.parseInt(value.toString());
114 }
115
116 public String getCompressableMimeType() {
117 return (String) connector.getAttribute("compressableMimeType");
118 }
119
120 public String getCompression() {
121 return (String) connector.getAttribute("compression");
122 }
123
124 public int getConnectionLinger() {
125 Object value = connector.getAttribute("connectionLinger");
126 return value == null ? -1 : Integer.parseInt(value.toString());
127 }
128
129 public int getConnectionTimeout() {
130 Object value = connector.getAttribute("connectionTimeout");
131 return value == null ? 60000 : Integer.parseInt(value.toString());
132 }
133
134 public boolean getDisableUploadTimeout() {
135 Object value = connector.getAttribute("disableUploadTimeout");
136 return value == null ? true : new Boolean(value.toString()).booleanValue();
137 }
138
139 public String getExecutor() {
140 Object value = connector.getAttribute("executor");
141 if (value == null)
142 return null;
143
144 if (value instanceof String)
145 return (String)value;
146
147 return (String) value.getClass().getName();
148 }
149
150 public String getHost() {
151 return getAddress();
152 }
153
154 public InetSocketAddress getListenAddress() {
155 return new InetSocketAddress(getHost(), getPort());
156 }
157
158 public int getKeepAliveTimeout() {
159 Object value = connector.getAttribute("keepAliveTimeout");
160 return value == null ? getConnectionTimeout() : Integer.parseInt(value.toString());
161 }
162
163 public int getMaxHttpHeaderSize() {
164 Object value = connector.getAttribute("maxHttpHeaderSize");
165 return value == null ? 4096 : Integer.parseInt(value.toString());
166 }
167
168 public int getMaxKeepAliveRequests() {
169 Object value = connector.getAttribute("maxKeepAliveRequests");
170 return value == null ? 100 : Integer.parseInt(value.toString());
171 }
172
173 public int getMaxThreads() {
174 Object value = connector.getAttribute("maxThreads");
175 return value == null ? 200 : Integer.parseInt(value.toString());
176 }
177
178 public int getMaxSpareThreads() {
179 Object value = connector.getAttribute("maxSpareThreads");
180 return value == null ? 100 : Integer.parseInt(value.toString());
181 }
182
183 public int getMinSpareThreads() {
184 Object value = connector.getAttribute("minSpareThreads");
185 return value == null ? 10 : Integer.parseInt(value.toString());
186 }
187
188 public String getNoCompressionUserAgents() {
189 return (String) connector.getAttribute("noCompressionUserAgents");
190 }
191
192 public int getPort() {
193 return connector.getPort();
194 }
195
196 public String getRestrictedUserAgents() {
197 return (String) connector.getAttribute("restrictedUserAgents");
198 }
199
200 public String getServer() {
201 return (String) connector.getAttribute("server");
202 }
203
204 public int getSocketBuffer() {
205 Object value = connector.getAttribute("socketBuffer");
206 return value == null ? 9000 : Integer.parseInt(value.toString());
207 }
208
209 public boolean getTcpNoDelay() {
210 Object value = connector.getAttribute("tcpNoDelay");
211 return value == null ? true : new Boolean(value.toString()).booleanValue();
212 }
213
214 public int getThreadPriority() {
215 Object value = connector.getAttribute("threadPriority");
216 return value == null ? Thread.NORM_PRIORITY : Integer.parseInt(value.toString());
217 }
218
219 public void setAcceptCount(int acceptCount) {
220 connector.setAttribute("acceptCount", new Integer(acceptCount));
221 }
222
223 public void setAddress(String address) {
224 connector.setAttribute("address", address);
225 }
226
227 public void setBufferSize(int bufferSize) {
228 connector.setAttribute("bufferSize", new Integer(bufferSize));
229 }
230
231 public void setCompressableMimeType(String compressableMimeType) {
232 connector.setAttribute("compressableMimeType", compressableMimeType);
233 }
234
235 public void setCompression(String compression) {
236 connector.setAttribute("compression", compression);
237 }
238
239 public void setConnectionLinger(int connectionLinger) {
240 connector.setAttribute("connectionLinger", new Integer(connectionLinger));
241 }
242
243 public void setConnectionTimeout(int connectionTimeout) {
244 connector.setAttribute("connectionTimeout", new Integer(connectionTimeout));
245 }
246
247 public void setDisableUploadTimeout(boolean disableUploadTimeout) {
248 connector.setAttribute("disableUploadTimeout", new Boolean(disableUploadTimeout));
249 }
250
251 public void setExecutor(String executor) {
252 connector.setAttribute("executor", executor);
253 }
254
255 public void setHost(String host) {
256 setAddress(host);
257 }
258
259 public void setKeepAliveTimeout(int keepAliveTimeout) {
260 connector.setAttribute("keepAliveTimeout", keepAliveTimeout);
261 }
262
263 public void setMaxHttpHeaderSize(int maxHttpHeaderSize) {
264 connector.setAttribute("maxHttpHeaderSize", new Integer(maxHttpHeaderSize));
265 }
266
267 public void setMaxKeepAliveRequests(int maxKeepAliveRequests) {
268 connector.setAttribute("maxKeepAliveRequests", new Integer(maxKeepAliveRequests));
269 }
270
271 public void setMaxThreads(int maxThreads) {
272 connector.setAttribute("maxThreads", new Integer(maxThreads));
273 }
274
275 public void setMaxSpareThreads(int maxSpareThreads) {
276 connector.setAttribute("maxSpareThreads", new Integer(maxSpareThreads));
277 }
278
279 public void setMinSpareThreads(int minSpareThreads) {
280 connector.setAttribute("minSpareThreads", new Integer(minSpareThreads));
281 }
282
283 public void setNoCompressionUserAgents(String noCompressionUserAgents) {
284 connector.setAttribute("noCompressionUserAgents", noCompressionUserAgents);
285 }
286
287 public void setPort(int port) {
288 connector.setPort(port);
289 }
290
291 public void setRestrictedUserAgents(String restrictedUserAgents) {
292 connector.setAttribute("restrictedUserAgents", restrictedUserAgents);
293 }
294
295 public void setServer(String server) {
296 if (server.equals(""))
297 server = null;
298 connector.setAttribute("server", server);
299 }
300
301 public void setSocketBuffer(int socketBuffer) {
302 connector.setAttribute("socketBuffer", new Integer(socketBuffer));
303 }
304
305 public void setTcpNoDelay(boolean tcpNoDelay) {
306 connector.setAttribute("tcpNoDelay", new Boolean(tcpNoDelay));
307 }
308
309 public void setThreadPriority(int threadPriority) {
310 connector.setAttribute("threadPriority", new Integer(threadPriority));
311 }
312
313 // Statistics Provider
314
315 public boolean isStatisticsProvider() {
316 return true;
317 }
318
319 public Stats getStats() {
320 String port = String.valueOf(getPort());
321 if (reset) {
322 reset = false;
323 return connStatsProvider.getStats(port);
324 } else
325 return connStatsProvider.updateStats(port);
326 }
327
328 public void resetStats() {
329 reset = true;
330 }
331
332 public static final GBeanInfo GBEAN_INFO;
333
334 static {
335 GBeanInfoBuilder infoFactory = GBeanInfoBuilder.createStatic("Tomcat Connector", BaseHttp11ConnectorGBean.class, ConnectorGBean.GBEAN_INFO);
336 infoFactory.addInterface(BaseHttp11Protocol.class,
337 new String[] {
338 //HTTP Attributes
339 "acceptCount",
340 "address",
341 "bufferSize",
342 "compressableMimeType",
343 "compression",
344 "connectionLinger",
345 "connectionTimeout",
346 "executor",
347 "host",
348 "keepAliveTimeout",
349 "disableUploadTimeout",
350 "maxHttpHeaderSize",
351 "maxKeepAliveRequests",
352 "maxThreads",
353 "maxSpareThreads",
354 "minSpareThreads",
355 "noCompressionUserAgents",
356 "port",
357 "restrictedUserAgents",
358 "server",
359 "socketBuffer",
360 "tcpNoDelay",
361 "threadPriority",
362 //SSL Attributes
363 "algorithm",
364 "clientAuth",
365 "keystoreFile",
366 "keystorePass",
367 "keystoreType",
368 "sslProtocol",
369 "ciphers",
370 "keyAlias",
371 "truststoreFile",
372 "truststorePass",
373 "truststoreType"
374 },
375 new String[] {
376 //HTTP Attributes
377 "acceptCount",
378 "address",
379 "bufferSize",
380 "compressableMimeType",
381 "compression",
382 "connectionLinger",
383 "connectionTimeout",
384 "executor",
385 "host",
386 "keepAliveTimeout",
387 "disableUploadTimeout",
388 "maxHttpHeaderSize",
389 "maxKeepAliveRequests",
390 "maxThreads",
391 "maxSpareThreads",
392 "minSpareThreads",
393 "noCompressionUserAgents",
394 "port",
395 "restrictedUserAgents",
396 "server",
397 "socketBuffer",
398 "tcpNoDelay",
399 "threadPriority",
400 //SSL Attributes
401 "algorithm",
402 "clientAuth",
403 "keystoreFile",
404 "keystorePass",
405 "keystoreType",
406 "sslProtocol",
407 "ciphers",
408 "keyAlias",
409 "truststoreFile",
410 "truststorePass",
411 "truststoreType"
412 }
413 );
414 infoFactory.setConstructor(new String[] { "name", "initParams", "protocol", "host", "port", "TomcatContainer", "ServerInfo"});
415 GBEAN_INFO = infoFactory.getBeanInfo();
416 }
417
418 public static GBeanInfo getGBeanInfo() {
419 return GBEAN_INFO;
420 }
421
422 }