/*
* Copyright 2009 NCHOVY
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.krakenapps.http.internal;
import java.util.Map;
import org.mortbay.jetty.AbstractConnector;
import org.mortbay.jetty.Connector;
import org.mortbay.jetty.Server;
import org.mortbay.jetty.handler.HandlerList;
import org.mortbay.jetty.nio.SelectChannelConnector;
import org.mortbay.jetty.security.SslSocketConnector;
import org.mortbay.jetty.servlet.Context;
import org.mortbay.jetty.servlet.ServletHolder;
import org.mortbay.thread.QueuedThreadPool;
import org.mortbay.thread.ThreadPool;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
class JettyHttpService {
final Logger logger = LoggerFactory.getLogger(JettyHttpService.class.getName());
private Server server;
private boolean isOpen;
private Map<String, String> configMap;
private DispatcherServlet dispatcher;
private String httpServiceName;
public JettyHttpService(DispatcherServlet dispatcher, HttpConfig httpConfig,
String httpServiceName, Map<String, String> config) {
this.dispatcher = dispatcher;
this.configMap = config;
this.httpServiceName = httpServiceName;
}
public void open() throws Exception {
int port = getIntegerConfig(configMap, "port");
boolean isSsl = Boolean.parseBoolean((String) configMap.get("ssl"));
HandlerList handlers = new HandlerList();
server = new Server(port);
server.setHandler(handlers);
AbstractConnector connector = new SelectChannelConnector();
connector.setPort(port);
ThreadPool threadPool = createThreadPool();
if (isSsl) {
SslSocketConnector sslConnector = new SslSocketConnector();
logger.info("jetty ssl mode: listening {} port", port);
sslConnector.setPort(port);
sslConnector.setKeystore((String) configMap.get("keyStore"));
sslConnector.setPassword((String) configMap.get("password"));
sslConnector.setKeyPassword((String) configMap.get("keyPassword"));
sslConnector.setTruststore((String) configMap.get("trustStore"));
sslConnector.setTrustPassword((String) configMap.get("trustPassword"));
connector = sslConnector;
}
connector.setMaxIdleTime(5000);
// timeout in milliseconds
if (configMap.containsKey("maxIdleTime")) {
connector.setMaxIdleTime(getIntegerConfig(configMap, "maxIdleTime"));
logger.info("max idle time for jetty: {} milliseconds", configMap.get("maxIdleTime"));
}
if (threadPool != null)
connector.setThreadPool(threadPool);
Integer backlog = getBacklogSize();
if (backlog != null) {
connector.setAcceptQueueSize(backlog);
logger.info("backlog for jetty: {}", backlog);
}
server.setConnectors(new Connector[] { connector });
// add dispatcher servlet
Context context = new Context(this.server, "/", Context.SESSIONS);
context.addServlet(new ServletHolder(this.dispatcher), "/*");
context.setAttribute("httpservice.name", httpServiceName);
server.start();
isOpen = true;
}
private Integer getBacklogSize() {
if (configMap.containsKey("backlog"))
return Integer.parseInt(configMap.get("backlog"));
return null;
}
private ThreadPool createThreadPool() {
Integer minThreads = tryParseInt("minThread");
Integer maxThreads = tryParseInt("maxThread");
if (maxThreads == null && minThreads == null)
return null;
logger.info("use queue thread pool for jetty: min [{}] max [{}]", minThreads, maxThreads);
QueuedThreadPool pool = new QueuedThreadPool();
if (minThreads != null)
pool.setMinThreads(minThreads);
if (maxThreads != null)
pool.setMaxThreads(maxThreads);
return pool;
}
private Integer tryParseInt(String key) {
if (configMap.containsKey(key))
return Integer.parseInt(configMap.get(key));
return null;
}
public void close() {
try {
if (server != null)
server.stop();
isOpen = false;
server = null;
} catch (Exception e) {
e.printStackTrace();
}
}
private int getIntegerConfig(Map<String, String> config, String key) throws Exception {
Object value = config.get(key);
if (value == null)
throw new Exception("[" + key + "] configuration not found.");
return Integer.parseInt((String) value);
}
public Map<String, String> getConfig() {
return configMap;
}
public boolean isOpen() {
return isOpen;
}
}