package net.jsunit;
import com.opensymphony.webwork.dispatcher.ServletDispatcher;
import com.opensymphony.xwork.config.ConfigurationManager;
import com.opensymphony.xwork.config.ConfigurationProvider;
import net.jsunit.configuration.ServerConfiguration;
import net.jsunit.configuration.ServerType;
import net.jsunit.utility.XmlUtility;
import org.jdom.Element;
import org.mortbay.http.SocketListener;
import org.mortbay.http.handler.ResourceHandler;
import org.mortbay.jetty.Server;
import org.mortbay.jetty.servlet.ServletHttpContext;
import org.mortbay.start.Monitor;
import org.mortbay.util.FileResource;
import java.util.List;
import java.util.logging.Logger;
public abstract class AbstractJsUnitServer {
protected Server httpServer;
protected Logger logger = Logger.getLogger("net.jsunit");
protected ServerConfiguration configuration;
private Object originalActionExtension;
private static final String WEBWORK_ACTION_EXTENSION = "webwork.action.extension";
protected AbstractJsUnitServer(ServerConfiguration configuration) {
setConfiguration(configuration);
}
private void setConfiguration(ServerConfiguration configuration) {
this.configuration = configuration;
}
public void start() throws Exception {
preStart();
setUpHttpServer();
logger.info(startingServerStatusMessage());
httpServer.start();
postStart();
}
protected void preStart() {
originalActionExtension = com.opensymphony.webwork.config.Configuration.get(WEBWORK_ACTION_EXTENSION);
com.opensymphony.webwork.config.Configuration.set(WEBWORK_ACTION_EXTENSION, "");
}
protected void postStart() {
}
private String startingServerStatusMessage() {
return "Starting " +
serverTypeName() +
" Server with configuration:\r\n" +
XmlUtility.asPrettyString(configuration.asXml());
}
protected String serverTypeName() {
return configuration.getServerType().getDisplayName();
}
protected void setUpHttpServer() throws Exception {
FileResource.setCheckAliases(false);
httpServer = new Server();
setUpSocketListener();
addServerContext();
setUpConfigurationProvider();
setUpMonitor();
}
private void setUpMonitor() {
if (Monitor.activeCount() == 0)
Monitor.monitor();
}
private void setUpConfigurationProvider() {
ConfigurationProvider provider = createConfigurationProvider();
ConfigurationManager.destroyConfiguration();
//noinspection unchecked
ConfigurationManager.getConfigurationProviders().set(0, provider);
}
protected abstract ConfigurationProvider createConfigurationProvider();
protected void addServerContext() throws Exception {
ServletHttpContext jsunitContext = new ServletHttpContext();
jsunitContext.setContextPath("jsunit");
jsunitContext.setResourceBase(resourceBase());
ResourceHandler resourceHandler = new ResourceHandler();
resourceHandler.setDirAllowed(false);
jsunitContext.addHandler(resourceHandler);
for (String servletName : servletNames())
jsunitContext.addServlet("webwork", "/" + servletName, ServletDispatcher.class.getName());
httpServer.addContext(jsunitContext);
}
protected abstract String resourceBase();
protected abstract List<String> servletNames();
private void setUpSocketListener() {
SocketListener listener = new SocketListener();
listener.setPort(configuration.getPort());
httpServer.addListener(listener);
}
public Element asXml() {
return configuration.asXml();
}
public void finalize() throws Throwable {
super.finalize();
dispose();
}
public void dispose() {
com.opensymphony.webwork.config.Configuration.set(WEBWORK_ACTION_EXTENSION, originalActionExtension);
logger.info("Stopping JsUnit Server");
try {
if (httpServer != null)
httpServer.stop();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public boolean isAlive() {
return httpServer != null && httpServer.isStarted();
}
public ServerType serverType() {
return configuration.getServerType();
}
public ServerConfiguration getConfiguration() {
return configuration;
}
}