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);
}
}
}