package net.jsunit;
import com.opensymphony.webwork.dispatcher.ServletDispatcher;
import com.opensymphony.xwork.config.ConfigurationManager;
import com.opensymphony.xwork.config.providers.XmlConfigurationProvider;
import net.jsunit.configuration.Configuration;
import net.jsunit.configuration.ConfigurationException;
import net.jsunit.configuration.ConfigurationProperty;
import net.jsunit.configuration.ServerType;
import net.jsunit.utility.XmlUtility;
import net.jsunit.version.VersionChecker;
import org.apache.jasper.servlet.JspServlet;
import org.jdom.Element;
import org.mortbay.http.HttpServer;
import org.mortbay.http.SocketListener;
import org.mortbay.http.handler.ResourceHandler;
import org.mortbay.jetty.servlet.ServletHttpContext;
import org.mortbay.start.Monitor;
import java.util.Date;
import java.util.List;
import java.util.logging.Logger;
public abstract class AbstractJsUnitServer implements JsUnitServer {
private HttpServer server;
private Logger logger = Logger.getLogger("net.jsunit");
protected Configuration configuration;
private final ServerType serverType;
private Date startDate;
protected int testRunCount = 0;
protected AbstractJsUnitServer(Configuration configuration, ServerType type) {
this.configuration = configuration;
this.serverType = type;
ensureConfigurationIsValid();
}
protected void ensureConfigurationIsValid() {
if (!configuration.isValidFor(serverType)) {
ConfigurationProperty property = serverType.getPropertiesInvalidFor(configuration).get(0);
throw new ConfigurationException(property, property.getValueString(configuration));
}
}
public boolean isFarmServer() {
return serverType.isFarm();
}
public boolean isTemporary() {
return serverType.isTemporary();
}
public Configuration getConfiguration() {
return configuration;
}
public void start() throws Exception {
setUpHttpServer();
logStatus(startingServerStatusMessage());
server.start();
startDate = new Date();
if (serverType.shouldPerformUpToDateCheck())
performUpToDateCheck();
}
private void performUpToDateCheck() {
VersionChecker checker = VersionChecker.forDefault();
if (!checker.isUpToDate())
logger.warning(checker.outOfDateString());
}
private String startingServerStatusMessage() {
return "Starting " +
serverTypeName() +
" Server with configuration:\r\n" +
XmlUtility.asPrettyString(configuration.asXml(serverType));
}
protected String serverTypeName() {
return serverType.getDisplayName();
}
private void setUpHttpServer() throws Exception {
server = new HttpServer();
SocketListener listener = new SocketListener();
listener.setPort(configuration.getPort());
server.addListener(listener);
ServletHttpContext servletContext = new ServletHttpContext();
servletContext.setContextPath("jsunit");
servletContext.setResourceBase(configuration.getResourceBase().toString());
servletContext.addServlet("JSP", "*.jsp", JspServlet.class.getName());
servletContext.addHandler(new ResourceHandler());
ConfigurationManager.clearConfigurationProviders();
ConfigurationManager.addConfigurationProvider(new XmlConfigurationProvider(xworkXmlName()));
com.opensymphony.webwork.config.Configuration.set("webwork.action.extension", "");
for (String servletName : servletNames())
addWebworkServlet(servletContext, servletName);
server.addContext(servletContext);
if (Monitor.activeCount() == 0)
Monitor.monitor();
}
protected abstract String xworkXmlName();
protected abstract List<String> servletNames();
private void addWebworkServlet(ServletHttpContext servletContext, String name) throws Exception {
servletContext.addServlet(
"webwork",
"/" + name,
ServletDispatcher.class.getName()
);
}
public void logStatus(String message) {
logger.info(message);
}
public Element asXml() {
return configuration.asXml(serverType);
}
public void finalize() throws Throwable {
super.finalize();
dispose();
}
public void dispose() {
logStatus("Stopping server");
try {
if (server != null)
server.stop();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public boolean isAlive() {
return server != null && server.isStarted();
}
public Logger getLogger() {
return logger;
}
public ServerType serverType() {
return serverType;
}
public Date getStartDate() {
return startDate;
}
public long getTestRunCount() {
return testRunCount;
}
}