package proj.zoie.server;
import java.io.File;
import java.io.FileFilter;
import java.io.FileInputStream;
import java.util.Properties;
import org.apache.log4j.Logger;
import org.mortbay.jetty.Server;
import org.mortbay.jetty.nio.SelectChannelConnector;
import org.mortbay.jetty.webapp.WebAppContext;
import org.mortbay.thread.QueuedThreadPool;
public class ZoieServer {
private static final Logger log = Logger.getLogger(ZoieServer.class);
/**
* @param args
*/
@SuppressWarnings("unchecked")
public static void main(String[] args) throws Exception {
String confDirName=System.getProperty("conf.dir");
File confDir = null;
if (confDirName == null)
{
confDir = new File("conf");
}
else
{
confDir = new File(confDirName);
}
System.out.println("using config dir: "+confDir.getAbsolutePath());
Properties props = new Properties();
File serverPropFile = new File(confDir,"server.properties");
if (confDir.exists() && serverPropFile.exists())
{
FileInputStream fin =null;
try
{
fin = new FileInputStream(serverPropFile);
props.load(fin);
}
catch(Exception e)
{
log.error("propblem loading conf file, using default settings...");
}
finally
{
if (fin!=null)
{
fin.close();
}
}
}
log.info("loaded properties: "+props);
String warDirName = props.getProperty("war.dir");
if (warDirName == null) throw new IllegalArgumentException("war.dir property not specified");
File warDir = new File(warDirName);
int minThread;
try
{
minThread=Integer.parseInt(props.getProperty("min.thread"));
}
catch(Exception e)
{
log.error("defaulting min.thread to 50");
minThread=50;
}
int maxThread;
try
{
maxThread=Integer.parseInt(props.getProperty("max.thread"));
}
catch(Exception e)
{
log.error("defaulting max.thread to 75");
maxThread=75;
}
int maxIdleTime;
try
{
maxIdleTime=Integer.parseInt(props.getProperty("max.ideltime"));
}
catch(Exception e)
{
log.error("defaulting max.ideltime to 2000");
maxIdleTime=2000;
}
QueuedThreadPool threadPool = new QueuedThreadPool();
threadPool.setName("server(jetty) threads");
threadPool.setMinThreads(minThread);
threadPool.setMaxThreads(maxThread);
threadPool.setMaxIdleTimeMs(maxIdleTime);
threadPool.start();
log.info("request threadpool started.");
final Server server = new Server();
server.setThreadPool(threadPool);
log.info("loading properties: "+props);
System.getProperties().putAll(props);
String indexDir = props.getProperty("index.directory");
SelectChannelConnector connector = new SelectChannelConnector();
int serverPort;
try
{
serverPort = Integer.parseInt(props.getProperty("server.port"));
}
catch(Exception e)
{
log.warn("server port defaulting to 8888");
serverPort=8888;
}
connector.setPort(serverPort);
server.addConnector(connector);
File[] warFiles = warDir.listFiles(new FileFilter(){
public boolean accept(File pathname) {
if (pathname.isDirectory()) return true;
String name = pathname.getName();
return name.endsWith(".war");
}
});
log.info("loading wars...");
for (File warFile : warFiles)
{
try
{
WebAppContext web = new WebAppContext();
String fileName=warFile.getName();
log.info("loading war: "+fileName);
if (!warFile.isDirectory()){
int index = fileName.lastIndexOf(".war");
fileName = fileName.substring(0, index);
web.setExtractWAR(true);
}
web.setContextPath("/"+fileName);
log.info("context path: /"+fileName);
web.setWar(warFile.getAbsolutePath());
if (indexDir!=null)
{
web.setAttribute("index.directory", indexDir);
}
server.addHandler(web);
}
catch(Exception e)
{
log.error("Problem deploying application: "+warFile,e);
}
}
log.info("finished loading wars.");
Runtime.getRuntime().addShutdownHook(new Thread(){
public void run()
{
log.info("shutting down...");
try {
server.stop();
} catch (Exception e) {
log.error(e.getMessage(),e);
}
finally
{
server.destroy();
log.info("shutdown successful");
}
}
});
try {
log.info("starting server ... ");
server.start();
log.info("server started.");
} catch (Exception e) {
log.error(e.getMessage(),e);
}
try
{
server.join();
}
catch(Exception e)
{
System.exit(100);
}
}
}