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; import java.util.logging.Logger; public class BrowserResultBuilder { private Logger logger = Logger.getLogger("net.jsunit"); private BrowserSource browserSource; public BrowserResultBuilder(BrowserSource browserSource) { this.browserSource = browserSource; } public BrowserResult build(File file) { try { Document document = new SAXBuilder().build(file); return build(document); } catch (Exception e) { logger.severe("Failed to read file " + file + ": " + e.getMessage()); e.printStackTrace(); return null; } } 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(); if (failedToLaunch(root)) result.setFailedToLaunch(); else if (timedOut(root)) result.setTimedOut(); else if (externallyShutDown(root)) result.setExternallyShutDown(); updateWithHeaders(result, root); updateWithProperties(root.getChild(BrowserResultWriter.PROPERTIES), result); Element testCasesElement = root.getChild(BrowserResultWriter.TEST_CASES); if (testCasesElement != null) { List children = testCasesElement.getChildren(TestCaseResultWriter.TEST_CASE); updateWithTestCaseResults(children, result); } return result; } private boolean failedToLaunch(Element root) { Attribute failedToLaunchAttribute = root.getAttribute(BrowserResultWriter.FAILED_TO_LAUNCH); return failedToLaunchAttribute != null && failedToLaunchAttribute.getValue().equals(String.valueOf(true)); } private boolean timedOut(Element root) { Attribute timedOutAttribute = root.getAttribute(BrowserResultWriter.TIMED_OUT); return timedOutAttribute != null && timedOutAttribute.getValue().equals(String.valueOf(true)); } private boolean externallyShutDown(Element root) { Attribute externallyShutDownAttribute = root.getAttribute(BrowserResultWriter.EXTERNALLY_SHUT_DOWN); return externallyShutDownAttribute != null && externallyShutDownAttribute.getValue().equals(String.valueOf(true)); } 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) { 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.BROWSER_ID.equals(key)) { int browserId = Integer.valueOf(value); Browser browser = browserSource.getBrowserById(browserId); result.setBrowser(browser); } 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.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)); } } }