package cmu.jetty;
/**
* Customize a server and run it on top of VarexJ
* @author: chupanw
*/
import gov.nasa.jpf.annotation.Conditional;
import org.eclipse.jetty.server.Connector;
import org.eclipse.jetty.server.Handler;
import org.eclipse.jetty.server.Request;
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.server.bio.SocketConnector;
import org.eclipse.jetty.server.handler.*;
import org.eclipse.jetty.util.RolloverFileOutputStream;
import org.eclipse.jetty.util.thread.QueuedThreadPool;
import org.eclipse.jetty.webapp.WebAppContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintStream;
import java.util.TimeZone;
public class JettyHelloWorld extends AbstractHandler {
//========== Server ==========
// @Conditional // Not working, conditional I/O
public static boolean sendServerVersion = false;
// @Conditional // Not working, unknown reasons (conditional I/O?)
public static boolean sendDataHeader = false;
// @Conditional // Not working, FIXME: FileOutputStream class def not compatible with JVM
public static boolean Logging = false;
// @Conditional
public static boolean setDumpAfterStart = false;
// @Conditional // Not triggered because I modified jetty to skip the stopping process
public static boolean setDumpBeforeStop = false;
// @Conditional // Not working
public static boolean setUncheckedPrintWriter = false;
@Conditional // Working
public static boolean setStopAtShutdown = false;
//========== end ==========
//========== WebAppContext ==========
@Conditional
public static boolean setAllowDuplicateFragmentNames = false;
@Conditional
public static boolean setConfigurationDiscovered = true;
@Conditional
public static boolean setCopywebDir = false;
// @Conditional // Not working, conditional I/O
public static boolean setCopyWebInfo = false;
@Conditional
public static boolean setDistributuble = false;
// @Conditional // Not working, conditional I/O
public static boolean setExtractWAR = true;
@Conditional
public static boolean setLogUrlOnStart = false;
// @Conditional // Not working
public static boolean setParentLoaderPriority = false;
@Conditional
public static boolean setThrowUnavailableOnStartupException = false;
//========== end ==========
static void configureServer(Server server) {
if (sendServerVersion) {
server.setSendServerVersion(true);
}
else{
server.setSendServerVersion(false);
}
if (sendDataHeader) {
server.setSendDateHeader(true);
}
else{
server.setSendDateHeader(false);
}
if (setDumpAfterStart) {
server.setDumpAfterStart(true);
}
else {
server.setDumpAfterStart(false);
}
if (setDumpBeforeStop) {
server.setDumpBeforeStop(true);
}
else{
server.setDumpBeforeStop(false);
}
if (setUncheckedPrintWriter) {
server.setUncheckedPrintWriter(true);
}
else {
server.setUncheckedPrintWriter(false);
}
if (setStopAtShutdown) {
server.setStopAtShutdown(true);
}
else{
server.setStopAtShutdown(false);
}
}
static void configureLogging() {
if (Logging) {
try {
setLogging();
} catch (IOException e) {
e.printStackTrace();
}
}
}
@SuppressWarnings("deprecation")
private static void setLogging() throws IOException {
RolloverFileOutputStream outputStream = new RolloverFileOutputStream("./jetty-resources/logs/stderrout.log", false, 90, TimeZone.getTimeZone("GMT"));
String serverLogName = outputStream.getDatedFilename();
PrintStream serverLog = new PrintStream(outputStream);
org.eclipse.jetty.util.log.Log.info("Redirecting stderr/stdout to " + serverLogName);
System.setErr(serverLog);
System.setOut(serverLog);
}
static void configureWebAppContext(WebAppContext webAppContext) {
if (setAllowDuplicateFragmentNames) {
webAppContext.setAllowDuplicateFragmentNames(true);
}
else {
webAppContext.setAllowDuplicateFragmentNames(false);
}
if (setConfigurationDiscovered) {
webAppContext.setConfigurationDiscovered(true);
}
else {
webAppContext.setConfigurationDiscovered(false);
}
if (setCopywebDir) {
webAppContext.setCopyWebDir(true);
}
else {
webAppContext.setCopyWebDir(false);
}
if (setCopyWebInfo) {
webAppContext.setCopyWebInf(true);
}
else{
webAppContext.setCopyWebInf(false);
}
if (setDistributuble) {
webAppContext.setDistributable(true);
}
else {
webAppContext.setDistributable(false);
}
if (setExtractWAR) {
webAppContext.setExtractWAR(true);
}
else{
webAppContext.setExtractWAR(false);
}
if (setLogUrlOnStart) {
webAppContext.setLogUrlOnStart(true);
}
else {
webAppContext.setLogUrlOnStart(false);
}
if (setParentLoaderPriority) {
webAppContext.setParentLoaderPriority(true);
}
else {
webAppContext.setParentLoaderPriority(false);
}
if (setThrowUnavailableOnStartupException) {
webAppContext.setThrowUnavailableOnStartupException(true);
}
else{
webAppContext.setThrowUnavailableOnStartupException(false);
}
}
public void handle(String target,
Request baseRequest,
HttpServletRequest request,
HttpServletResponse response)
throws IOException, ServletException
{
response.setContentType("text/html;charset=utf-8");
response.setStatus(HttpServletResponse.SC_OK);
baseRequest.setHandled(true);
response.getWriter().println("<h1>Surprise! I'm working!</h1>");
}
public static void main(String[] args) throws Exception
{
Server server = new Server(8080);
// ThreadPool
QueuedThreadPool threadPool = new QueuedThreadPool();
threadPool.setMinThreads(1);
threadPool.setMaxThreads(3);
threadPool.setDetailedDump(false);
server.setThreadPool(threadPool);
// Connector
Connector connector = new SocketConnector();
connector.setPort(8080);
server.setConnectors(new Connector[]{connector});
// Web app handler
WebAppContext webapp = new WebAppContext();
webapp.setContextPath("/");
webapp.setWar("jetty-resources/webapps/test.war");
HandlerCollection handlers = new HandlerCollection();
Handler[] handlerArray = {
webapp,
// new JettyHelloWorld()
};
handlers.setHandlers(handlerArray);
server.setHandler(handlers);
// Additional configuration
configureServer(server);
// configureLogging();
configureWebAppContext(webapp);
// Start the server
server.start();
server.join();
}
}