001: /*
002: * ChainBuilder ESB
003: * Visual Enterprise Integration
004: *
005: * Copyright (C) 2007 Bostech Corporation
006: *
007: * This program is free software; you can redistribute it and/or modify it
008: * under the terms of the GNU General Public License as published by the
009: * Free Software Foundation; either version 2 of the License, or (at your option)
010: * any later version.
011: *
012: * This program is distributed in the hope that it will be useful,
013: * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
014: * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
015: * for more details.
016: *
017: * You should have received a copy of the GNU General Public License along with
018: * this program; if not, write to the Free Software Foundation, Inc.,
019: * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
020: *
021: *
022: * $Id: HttpServer.java 11886 2008-02-05 20:37:17Z mpreston $
023: */
024: package com.bostechcorp.cbesb.runtime.component.http.server;
025:
026: import java.util.HashMap;
027:
028: import org.apache.commons.logging.Log;
029: import org.apache.commons.logging.LogFactory;
030: import org.mortbay.jetty.Connector;
031: import org.mortbay.jetty.Server;
032: import org.mortbay.jetty.handler.ContextHandlerCollection;
033: import org.mortbay.jetty.nio.SelectChannelConnector;
034: import org.mortbay.jetty.security.SslSelectChannelConnector;
035:
036: public class HttpServer {
037:
038: protected final transient Log logger = LogFactory
039: .getLog(getClass());
040:
041: protected HttpServerConfig config;
042: protected Server server;
043: protected Connector connector;
044: protected ContextHandlerCollection contexts;
045: protected int refCount = 0;
046:
047: private static HashMap<String, HttpServer> serverMap = new HashMap<String, HttpServer>();
048:
049: public static HttpServer getInstance(HttpServerConfig serverConfig) {
050: HttpServer server = serverMap.get(serverConfig.getHost() + ":"
051: + serverConfig.getPort());
052: if (server == null) {
053: //Create a new server instance
054: server = new HttpServer(serverConfig);
055: serverMap.put(serverConfig.getHost() + ":"
056: + serverConfig.getPort(), server);
057: } else {
058: //Check settings
059: if (!serverConfig.equals(server.getConfig())) {
060: Log logger = LogFactory.getLog(HttpServer.class);
061: logger
062: .warn("Warning - Server already listening on requested port with different settings:");
063: logger.warn("Existing Server Config: "
064: + server.getConfig().toString());
065: logger.warn("Requested Server Config: "
066: + serverConfig.toString());
067: }
068: }
069: server.incrRefCount();
070: return server;
071: }
072:
073: private HttpServer() {
074: }
075:
076: private HttpServer(HttpServerConfig config) {
077: this .config = config;
078: server = new Server();
079: // server.setGracefulShutdown(20000);
080: initConnector();
081: server.addConnector(connector);
082: contexts = new ContextHandlerCollection();
083: server.setHandler(contexts);
084:
085: }
086:
087: public void release() {
088: logger.debug("Releasing HttpServer - refCount = " + refCount);
089: decrRefCount();
090: logger.debug("InUse = " + inUse());
091: if (!inUse()) {
092: try {
093: logger.debug("Stopping Jetty on " + config.getHost()
094: + ":" + config.getPort());
095: server.stop();
096: server.destroy();
097: } catch (Exception e) {
098: logger.error("Exception while stopping Jetty Server.",
099: e);
100: }
101: serverMap.remove(config.getHost() + ":" + config.getPort());
102: }
103: }
104:
105: public String getName() {
106: return config.getHost() + ":" + config.getPort();
107: }
108:
109: private void incrRefCount() {
110: refCount++;
111: }
112:
113: private void decrRefCount() {
114: refCount--;
115: }
116:
117: private boolean inUse() {
118: return refCount > 0;
119: }
120:
121: /**
122: * @return the config
123: */
124: public HttpServerConfig getConfig() {
125: return config;
126: }
127:
128: public boolean isRunning() {
129: return server.isRunning();
130: }
131:
132: public void start() throws Exception {
133: server.start();
134: }
135:
136: public void stop() throws Exception {
137: server.stop();
138: }
139:
140: protected void initConnector() {
141: if (config.isSsl()) {
142: SslSelectChannelConnector sslConnector = new SslSelectChannelConnector();
143: sslConnector.setProtocol(config.getSslProtocol());
144: sslConnector.setTruststore(config.getTrustStoreFile());
145: if (config.getTrustStorePassword() != null
146: && config.getTrustStorePassword().length() > 0) {
147: sslConnector.setTrustPassword(config
148: .getTrustStorePassword());
149: }
150: sslConnector.setKeystore(config.getKeyStoreFile());
151: if (config.getKeyStorePassword() != null
152: && config.getKeyStorePassword().length() > 0) {
153: sslConnector.setPassword(config.getKeyStorePassword());
154: // sslConnector.setKeyPassword(config.getKeyStorePassword());
155: }
156: sslConnector.setNeedClientAuth(config
157: .isAuthenticateClient());
158: connector = sslConnector;
159: } else {
160: connector = new SelectChannelConnector();
161: }
162: connector.setHost(config.getHost());
163: connector.setPort(config.getPort());
164: }
165:
166: }
|