001: // Copyright (c) 2002-2005 Canoo Engineering AG, Switzerland.
002: package com.canoo.webtest.reporting;
003:
004: import java.io.BufferedWriter;
005: import java.io.File;
006: import java.io.FileOutputStream;
007: import java.io.IOException;
008: import java.io.OutputStreamWriter;
009: import java.io.Writer;
010:
011: import javax.xml.parsers.DocumentBuilder;
012: import javax.xml.parsers.DocumentBuilderFactory;
013: import javax.xml.parsers.ParserConfigurationException;
014:
015: import org.apache.log4j.Logger;
016: import org.apache.xml.serialize.OutputFormat;
017: import org.apache.xml.serialize.XMLSerializer;
018: import org.w3c.dom.Document;
019: import org.w3c.dom.Element;
020:
021: import com.canoo.webtest.boundary.PackageBoundary;
022:
023: /**
024: * @author unknown
025: * @author Marc Guillemot
026: */
027: public class XmlReporter implements IResultReporter {
028: private static final Logger LOG = Logger
029: .getLogger(XmlReporter.class);
030: public static final String ROOT_ELEMENT = "summary";
031:
032: protected Document readXmlFile(final File file) throws Exception {
033: final DocumentBuilderFactory factory = DocumentBuilderFactory
034: .newInstance();
035: LOG.debug("Reading file " + file.getPath());
036: final DocumentBuilder builder = factory.newDocumentBuilder();
037: final Document doc = builder.parse(file);
038:
039: // basic check that the file "is" a webtest report
040: if (!ROOT_ELEMENT.equals(doc.getFirstChild().getNodeName())) {
041: throw new ReportCreationException(
042: "Another root already exists: "
043: + doc.getFirstChild().getNodeName() + "!");
044: }
045:
046: return doc;
047: }
048:
049: protected void writeXmlFile(final Document doc, final File outfile)
050: throws Exception {
051: LOG.info("Writing report to " + outfile);
052: final BufferedWriter writer = new BufferedWriter(
053: new OutputStreamWriter(new FileOutputStream(outfile),
054: getEncoding()));
055: writeXmlFile(doc, writer);
056: }
057:
058: /**
059: * Gets the encoding used to write the xml report file
060: * @return "UTF-8"
061: */
062: protected String getEncoding() {
063: return "UTF-8";
064: }
065:
066: protected void writeXmlFile(final Document doc, final Writer writer)
067: throws IOException {
068: final OutputFormat format = new OutputFormat(doc);
069: format.setIndenting(true);
070: format.setEncoding(getEncoding());
071: format.setLineWidth(100);
072:
073: final XMLSerializer serializer = new XMLSerializer(writer,
074: format);
075: serializer.asDOMSerializer();
076: serializer.serialize(doc.getDocumentElement());
077: writer.close();
078: }
079:
080: public void generateReport(final RootStepResult result)
081: throws Exception {
082: final File resultFile = getResultFile(result);
083: final Document doc = getDocument(resultFile);
084: new XmlResultConverter(result).addToDocument(doc);
085: writeXmlFile(doc, resultFile);
086: }
087:
088: protected File getResultFile(final RootStepResult result) {
089: return result.getConfig().getSummaryFile();
090: }
091:
092: private Document getDocument(final File file) throws Exception {
093: if (file.exists()) {
094: return readXmlFile(file);
095: }
096: return createNewDocument();
097: }
098:
099: /**
100: * Creates a new document with the basic structure
101: * @return the new document
102: * @throws ParserConfigurationException if document factory doesn't work
103: */
104: protected Document createNewDocument()
105: throws ParserConfigurationException {
106: final DocumentBuilder builder = DocumentBuilderFactory
107: .newInstance().newDocumentBuilder();
108: final Document doc = builder.newDocument();
109:
110: final Element rootElement = doc.createElement(ROOT_ELEMENT);
111: doc.appendChild(rootElement);
112: addSummaryAttribute(rootElement);
113:
114: return doc;
115: }
116:
117: private void addSummaryAttribute(final Element element) {
118: element.setAttribute("Implementation-Title", PackageBoundary
119: .getImplementationTitle());
120: element.setAttribute("Implementation-Version", PackageBoundary
121: .getImplementationVersion());
122: }
123:
124: }
|