package net.jsunit.model;
import org.jdom.CDATA;
import org.jdom.Document;
import org.jdom.Element;
import org.jdom.output.XMLOutputter;
public class BrowserResultWriter {
public static final String
ID = "id",
BROWSER_RESULT = "browserResult",
BROWSER_FILE_NAME = "browserFileName",
BROWSER_ID = "browserId",
USER_AGENT = "userAgent",
TIME = "time",
TEST_CASES = "testCases",
TEST_CASE = "testCase",
TIMED_OUT = "timedOut",
FAILED_TO_LAUNCH = "failedToLaunch",
EXTERNALLY_SHUT_DOWN = "externallyShutDown",
JSUNIT_VERSION = "jsUnitVersion",
REMOTE_ADDRESS = "remoteAddress",
SERVER_SIDE_EXCEPTION_STACK_TRACE = "serverSideExceptionStackTrace",
PROPERTIES = "properties",
PROPERTY = "property",
PROPERTY_KEY = "name",
PROPERTY_VALUE = "value",
URL = "url";
BrowserResult browserResult;
public BrowserResultWriter(BrowserResult result) {
this.browserResult = result;
}
public String writeXml() {
Element root = createRootElement();
Document document = new Document(root);
return new XMLOutputter().outputString(document);
}
public String writeXmlFragment() {
return new XMLOutputter().outputString(createRootElement());
}
private Element createRootElement() {
Element root = new Element(BROWSER_RESULT);
if (browserResult.timedOut())
root.setAttribute(TIMED_OUT, String.valueOf(true));
if (browserResult.failedToLaunch())
root.setAttribute(FAILED_TO_LAUNCH, String.valueOf(true));
if (browserResult.externallyShutDown())
root.setAttribute(EXTERNALLY_SHUT_DOWN, String.valueOf(true));
addPropertiesElementTo(root);
if (browserResult.completedTestRun()) {
root.setAttribute(ID, browserResult.getId());
root.setAttribute(TIME, String.valueOf(browserResult.getTime()));
addTestCasesElementTo(root);
}
return root;
}
private void addPropertiesElementTo(Element element) {
Element properties = new Element(PROPERTIES);
element.addContent(properties);
Browser browser = browserResult.getBrowser();
if (browser != null) {
addProperty(properties, BROWSER_FILE_NAME, browser.getFileName());
addProperty(properties, BROWSER_ID, String.valueOf(browserResult.getBrowser().getId()));
}
if (browserResult.completedTestRun()) {
addProperty(properties, JSUNIT_VERSION, browserResult.getJsUnitVersion());
addProperty(properties, USER_AGENT, browserResult.getUserAgent());
addProperty(properties, REMOTE_ADDRESS, browserResult.getRemoteAddress());
addProperty(properties, URL, browserResult.getBaseURL());
}
if (browserResult.hasServerSideExceptionStackTrace()) {
Element stackTrace = createPropertyElement(SERVER_SIDE_EXCEPTION_STACK_TRACE);
stackTrace.addContent(new CDATA(browserResult.getServerSideExceptionStackTrace()));
properties.addContent(stackTrace);
}
}
private void addProperty(Element parent, String name, String value) {
Element property = createPropertyElement(name);
property.setAttribute(PROPERTY_VALUE, value == null ? "" : value);
parent.addContent(property);
}
private Element createPropertyElement(String name) {
Element property = new Element(PROPERTY);
property.setAttribute(PROPERTY_KEY, name);
return property;
}
private void addTestCasesElementTo(Element element) {
Element testCasesElement = new Element(TEST_CASES);
for (TestCaseResult result : browserResult.getTestCaseResults()) {
new TestCaseResultWriter(result).addXmlTo(testCasesElement);
}
element.addContent(testCasesElement);
}
public String writeProblems() {
StringBuffer buffer = new StringBuffer();
for (TestCaseResult result : browserResult.getTestCaseResults()) {
if (!result.wasSuccessful()) {
if (buffer.length() > 0)
buffer.append("\n");
String problemMessage = result.getProblemSummary();
buffer.append(problemMessage);
}
}
return buffer.toString();
}
public Element asXml() {
return createRootElement();
}
}