/*
* Copyright (c) Sergiu Giurgiu 2011.
*
* This file is part of TVMan.
*
* TVMan is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* TVMan is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with TVMan. If not, see .
*/
package com.zergiu.tvman;
import org.eclipse.jetty.plus.jndi.Resource;
import org.eclipse.jetty.server.AbstractConnector;
import org.eclipse.jetty.server.Connector;
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.server.bio.SocketConnector;
import org.eclipse.jetty.server.nio.SelectChannelConnector;
import org.eclipse.jetty.server.ssl.SslConnector;
import org.eclipse.jetty.server.ssl.SslSelectChannelConnector;
import org.eclipse.jetty.server.ssl.SslSocketConnector;
import org.eclipse.jetty.util.ssl.SslContextFactory;
import org.eclipse.jetty.util.thread.QueuedThreadPool;
import org.eclipse.jetty.webapp.WebAppContext;
import org.quartz.SchedulerException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.scheduling.quartz.SchedulerFactoryBean;
public class TVManWebServer {
private WebAppContext context;
private Server server;
private String serverUrl;
private boolean showSystemTray = true;
private Resource resource;
private boolean shutdown=true;
private static Logger log=LoggerFactory.getLogger(TVManWebServer.class);
public TVManWebServer() {
}
public void start() throws Exception {
TVManOptions options=TVManOptions.getInstance();
log.debug("starting the server:");
server = new Server();
//if we ever want to run with the non-nio connector, we can
AbstractConnector connector = null;
connector = getJettyConnector();
setupSSLContext(connector);
setJettyConnectorProperties(connector);
server.setConnectors(new Connector[] { connector });
createApplicationContext();
resource = new Resource("jdbc/TVManDataSource",
TVManDatasource.getDatasource(options.getDbLocation()));
server.setHandler(context);
server.start();
boolean ssl=options.isSsl();
String protocol=ssl?"https":"http";
serverUrl = protocol+"://" + options.getHost() + ":" + options.getPort()+ "/";
if (showSystemTray) {
TVDBSystemTray tray = new TVDBSystemTray(this);
tray.showSystemTray();
}
shutdown=false;
log.info("Server started and is listening on "+serverUrl);
server.join();
}
private void createApplicationContext() {
context = new WebAppContext(getClass().getResource(
"/com/zergiu/tvman/web").toExternalForm(), "/");
context.setConfigurationClasses(new String[] {
"org.eclipse.jetty.webapp.WebInfConfiguration",
"org.eclipse.jetty.webapp.WebXmlConfiguration",
// "org.eclipse.jetty.webapp.MetaInfConfiguration",
// "org.eclipse.jetty.webapp.FragmentConfiguration",
// "org.eclipse.jetty.webapp.JettyWebXmlConfiguration",
// This enables the section of web.xml
"org.eclipse.jetty.plus.webapp.EnvConfiguration" });
context.setExtractWAR(false);
}
private void setJettyConnectorProperties(AbstractConnector connector) {
TVManOptions options=TVManOptions.getInstance();
connector.setHost(options.getHost());
connector.setPort(options.getPort());
connector.setThreadPool(new QueuedThreadPool(options.getMaxThreads()));
connector.setMaxIdleTime(options.getMaxIdleTime());
}
private void setupSSLContext(AbstractConnector connector) {
TVManOptions options=TVManOptions.getInstance();
if(options.isSsl() && (connector instanceof SslConnector)){
SslContextFactory factory=((SslConnector)connector).getSslContextFactory();
factory.setKeyStorePath(options.getKeystorePath());
factory.setKeyStorePassword(options.getKeystorePassword());
factory.setKeyManagerPassword(options.getKeystoreManagerPassword());
factory.setTrustStore(options.getTrustStorePath());
factory.setTrustStorePassword(options.getTrustStorePassword());
}
}
private AbstractConnector getJettyConnector() {
AbstractConnector connector;
TVManOptions options=TVManOptions.getInstance();
if (options.isUseIO()) {
if(options.isSsl()){
connector=new SslSocketConnector();
}else{
connector = new SocketConnector();
}
} else {
if(options.isSsl()){
connector=new SslSelectChannelConnector();
}else{
connector = new SelectChannelConnector();
}
}
return connector;
}
public void shutdown() {
if(shutdown){
return;
}
shutdownSchedulerFactory();
shutdownJettyServer();
context = null;
server = null;
resource=null;
ApplicationContextProvider.getInstance().setApplicationContext(null);
shutdown=true;
}
private void shutdownJettyServer() {
context.setShutdown(true);
try{
resource.release();
}catch(Exception e){
e.printStackTrace();
}
try {
server.stop();
} catch (Exception e) {
e.printStackTrace();
}
}
private void shutdownSchedulerFactory() {
SchedulerFactoryBean schedulerFactory=ApplicationContextProvider.getApplicationContext().getBean(SchedulerFactoryBean.class);
if(schedulerFactory!=null){
try {
schedulerFactory.destroy();
} catch (SchedulerException e) {
e.printStackTrace();
}
}
}
public String getServerUrl() {
return serverUrl;
}
public boolean isShowSystemTray() {
return showSystemTray;
}
public void setShowSystemTray(boolean showSystemTray) {
this.showSystemTray = showSystemTray;
}
}