package net.jsunit.model;
import net.jsunit.utility.XmlUtility;
import org.jdom.Attribute;
import org.jdom.Document;
import org.jdom.Element;
import org.jdom.input.SAXBuilder;
import java.io.File;
import java.util.List;
public class BrowserResultBuilder {
public BrowserResult build(File file) {
try {
Document document = new SAXBuilder().build(file);
return build(document);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
public BrowserResult build(String string) {
Document document = XmlUtility.asXmlDocument(string);
return build(document);
}
@SuppressWarnings("unchecked")
public BrowserResult build(Document document) {
Element root = document.getRootElement();
return build(root);
}
@SuppressWarnings("unchecked")
public BrowserResult build(Element root) {
BrowserResult result = new BrowserResult();
ResultType type = ResultType.valueOf(root.getAttribute("type").getValue());
result._setResultType(type);
updateWithBrowser(result, root.getChild(Browser.BROWSER));
updateWithHeaders(result, root);
updateWithProperties(root.getChild(BrowserResultWriter.PROPERTIES), result);
Element testCasesElement = root.getChild(BrowserResultWriter.TEST_CASE_RESULTS);
if (testCasesElement != null) {
List children = testCasesElement.getChildren(TestCaseResultWriter.TEST_CASE);
updateWithTestCaseResults(children, result);
}
return result;
}
private void updateWithBrowser(BrowserResult result, Element browserElement) {
if (browserElement != null)
result.setBrowser(Browser.buildFrom(browserElement));
}
private boolean failedToLaunch(Element root) {
Attribute type = root.getAttribute("type");
return type.getValue().equals(ResultType.FAILED_TO_LAUNCH.name());
}
private boolean timedOut(Element root) {
Attribute type = root.getAttribute("type");
return type.getValue().equals(ResultType.TIMED_OUT.name());
}
private void updateWithHeaders(BrowserResult result, Element element) {
String id = element.getAttributeValue(BrowserResultWriter.ID);
if (id != null)
result.setId(id);
String time = element.getAttributeValue(BrowserResultWriter.TIME);
if (time != null)
result.setTime(Double.parseDouble(time));
}
private void updateWithProperties(Element element, BrowserResult result) {
Integer browserId = null;
for (Object child : element.getChildren()) {
Element next = (Element) child;
String key = next.getAttributeValue(BrowserResultWriter.PROPERTY_KEY);
String value = next.getAttributeValue(BrowserResultWriter.PROPERTY_VALUE);
if (BrowserResultWriter.JSUNIT_VERSION.equals(key))
result.setJsUnitVersion(value);
else if (BrowserResultWriter.USER_AGENT.equals(key))
result.setUserAgent(value);
else if (BrowserResultWriter.REMOTE_ADDRESS.equals(key))
result.setRemoteAddress(value);
else if (BrowserResultWriter.URL.equals(key))
result.setBaseURL(value);
else if (BrowserResultWriter.USER_PROPERTY.equals(key))
result.setUserProperty(value);
else if (BrowserResultWriter.SERVER_SIDE_EXCEPTION_STACK_TRACE.equals(key)) {
String stackTrace = next.getText();
result.setServerSideExceptionStackTrace(stackTrace);
}
}
}
private void updateWithTestCaseResults(List<Element> testCaseElements, BrowserResult result) {
TestCaseResultBuilder testCaseBuilder = new TestCaseResultBuilder();
for (Element element : testCaseElements) {
result.addTestCaseResult(testCaseBuilder.build(element));
}
}
}