package org.jboss.jbossts.xts.servicetests.webbean;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import java.io.IOException;
import java.io.PrintWriter;
import org.jboss.jbossts.xts.servicetests.test.XTSServiceTest;
/**
* a servlet which allows XTS Servcie tests to be run via a web form
*
* this is provided for use during testing. Service tests are normally expected to be run at AS boot
* via XTSServiceTestRunnerBean
*/
public class XTSHTTPServiceTestRunner extends HttpServlet
{
public void init(ServletConfig config) throws ServletException
{
super.init(config);
}
protected String getContentType()
{
return "text/html";
}
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException
{
PrintWriter writer = response.getWriter();
response.setContentType(getContentType());
response.setHeader("Cache-Control", "no-cache");
doStatus(writer, request, response);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException
{
PrintWriter writer = response.getWriter();
response.setContentType(getContentType());
response.setHeader("Cache-Control", "no-cache");
if ((_runnerThread == null) || (! _runnerThread.isAlive()))
{
_testClassName = request.getParameter("TestClassName");
if (_testClassName != null) {
Class testClass;
ClassLoader cl = XTSHTTPServiceTestRunner.class.getClassLoader();
try {
testClass = cl.loadClass(_testClassName);
} catch (ClassNotFoundException cnfe) {
throw new ServletException("XTSHTTPServicetestRunner : cannot find test class " + _testClassName, cnfe);
}
try {
_currentTest = (XTSServiceTest)testClass.newInstance();
} catch (InstantiationException ie) {
throw new ServletException("XTSHTTPServicetestRunner : cannot instantiate test class " + _testClassName, ie);
} catch (IllegalAccessException iae) {
throw new ServletException("XTSHTTPServicetestRunner : cannot access constructor for test class " + _testClassName, iae);
}
// since we are running in the AS startup thread we need a separate thread for the test
_runnerThread = new Thread() {
private XTSServiceTest test = _currentTest;
public void run()
{
_currentTest.run();
}
};
_runnerThread.start();
}
}
doStatus(writer, request, response);
}
public void doStatus(PrintWriter writer, HttpServletRequest request, HttpServletResponse response)
throws ServletException {
writer.println("<HTML>");
writer.println("<HEAD>");
writer.println("<TITLE>Test Runner</TITLE>");
writer.println("</HEAD>");
writer.println("<BODY bgcolor=\"white\" style=\"font-family: Arial, Helvetica, sans-serif\">");
writer.println("<DIV style=\"font-family: Arial, Helvetica, sans-serif; font-size: large\"> <BR>Test Runner: Status<BR> </DIV>");
writer.println("<TABLE width=\"100%\">");
if ((_runnerThread == null) || (! _runnerThread.isAlive()))
{
writer.println("<TR>");
writer.println("<TD style=\"font-family: Arial, Helvetica, sans-serif; font-weight: bold\">Action:</TD>");
writer.print("<TD style=\"font-family: Arial, Helvetica, sans-serif\">");
writer.print("<FORM method=\"POST\" action=\"" + request.getRequestURL() + "\">");
writer.print("<INPUT type=\"button\" value=\"run\" onclick=\"this.form.submit()\">");
writer.print(" : <INPUT type=\"text\" name=\"TestClassName\"maxlength=\"2000\" size=\"60\">");
writer.print("</FORM>");
writer.println("</TD>");
writer.println("</TR>");
if (_runnerThread != null && !_runnerThread.isAlive()) {
if (_currentTest != null)
{
writer.println("<TR>");
writer.println("<TD style=\"font-family: Arial, Helvetica, sans-serif; font-weight: bold\">Current test:</TD>");
writer.print("<TD style=\"font-family: Arial, Helvetica, sans-serif\">");
encode(writer, _testClassName.toString());
writer.println("</TD>");
writer.println("</TR>");
if (_currentTest.isSuccessful()) {
writer.println("<TR>");
writer.println("<TD style=\"font-family: Arial, Helvetica, sans-serif; font-weight: bold\">Status:</TD>");
writer.print("<TD style=\"font-family: Arial, Helvetica, sans-serif\">");
writer.print("success!");
writer.println("</TD>");
writer.println("</TR>");
} else {
writer.println("<TR>");
writer.println("<TD style=\"font-family: Arial, Helvetica, sans-serif; font-weight: bold\">Status:</TD>");
writer.print("<TD style=\"font-family: Arial, Helvetica, sans-serif\">");
writer.print("fail!");
writer.println("</TD>");
writer.println("</TR>");
if (_currentTest.getException() != null) {
writer.println("<TR>");
writer.println("<TD style=\"font-family: Arial, Helvetica, sans-serif; font-weight: bold\">Exception:</TD>");
writer.print("<TD style=\"font-family: Arial, Helvetica, sans-serif\">");
writer.println("Exception:<BR/>");
encode(writer, _currentTest.getException().toString());
writer.println("</TD>");
writer.println("</TR>");
}
}
}
}
}
else
{
writer.println("<TR>");
writer.println("<TD style=\"font-family: Arial, Helvetica, sans-serif; font-weight: bold\">Action:</TD>");
writer.print("<TD style=\"font-family: Arial, Helvetica, sans-serif\">");
writer.print("<FORM method=\"GET\" action=\"" + request.getRequestURL() + "\">");
writer.print("<INPUT type=\"button\" value=\"reload\" onclick=\"this.form.submit()\">");
writer.print("</FORM>");
writer.println("</TD>");
writer.println("</TR>");
if (_runnerThread != null && _currentTest != null)
{
writer.println("<TR>");
writer.println("<TD style=\"font-family: Arial, Helvetica, sans-serif; font-weight: bold\">Current test:</TD>");
writer.print("<TD style=\"font-family: Arial, Helvetica, sans-serif\">");
encode(writer, _testClassName.toString());
writer.println("</TD>");
writer.println("</TR>");
writer.println("<TR>");
writer.println("<TD style=\"font-family: Arial, Helvetica, sans-serif; font-weight: bold\">Status:</TD>");
writer.print("<TD style=\"font-family: Arial, Helvetica, sans-serif\">");
writer.print("running");
writer.println("</TD>");
writer.println("</TR>");
}
}
writer.println("</TABLE>");
writer.println("</BODY>");
writer.println("</HTML>");
}
protected static void encode(PrintWriter writer, String string)
{
if (string != null)
{
char[] chars = string.toCharArray();
for (int index = 0; index < chars.length; index++)
if (chars[index] == '<')
writer.print("<");
else if (chars[index] == '>')
writer.print(">");
else if (chars[index] == '&')
writer.print("&");
else
writer.print(chars[index]);
}
else
writer.print("null");
}
protected XTSServiceTest _currentTest = null;
protected String _testClassName = null;
protected Thread _runnerThread = null;
}