// Copyright (c) 2002-2005 Canoo Engineering AG, Switzerland.
package com.canoo.webtest.reporting;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.Writer;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import org.apache.log4j.Logger;
import org.apache.xml.serialize.OutputFormat;
import org.apache.xml.serialize.XMLSerializer;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import com.canoo.webtest.boundary.PackageBoundary;
/**
* @author unknown
* @author Marc Guillemot
*/
public class XmlReporter implements IResultReporter
{
private static final Logger LOG = Logger.getLogger(XmlReporter.class);
public static final String ROOT_ELEMENT = "summary";
protected Document readXmlFile(final File file) throws Exception {
final DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
LOG.debug("Reading file " + file.getPath());
final DocumentBuilder builder = factory.newDocumentBuilder();
final Document doc = builder.parse(file);
// basic check that the file "is" a webtest report
if (!ROOT_ELEMENT.equals(doc.getFirstChild().getNodeName()))
{
throw new ReportCreationException("Another root already exists: "
+ doc.getFirstChild().getNodeName() + "!");
}
return doc;
}
protected void writeXmlFile(final Document doc, final File outfile) throws Exception {
LOG.info("Writing report to " + outfile);
final BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outfile), getEncoding()));
writeXmlFile(doc, writer);
}
/**
* Gets the encoding used to write the xml report file
* @return "UTF-8"
*/
protected String getEncoding()
{
return "UTF-8";
}
protected void writeXmlFile(final Document doc, final Writer writer) throws IOException {
final OutputFormat format = new OutputFormat(doc);
format.setIndenting(true);
format.setEncoding(getEncoding());
format.setLineWidth(100);
final XMLSerializer serializer = new XMLSerializer(writer, format);
serializer.asDOMSerializer();
serializer.serialize(doc.getDocumentElement());
writer.close();
}
public void generateReport(final RootStepResult result) throws Exception {
final File resultFile = getResultFile(result);
final Document doc = getDocument(resultFile);
new XmlResultConverter(result).addToDocument(doc);
writeXmlFile(doc, resultFile);
}
protected File getResultFile(final RootStepResult result)
{
return result.getConfig().getSummaryFile();
}
private Document getDocument(final File file) throws Exception {
if (file.exists()) {
return readXmlFile(file);
}
return createNewDocument();
}
/**
* Creates a new document with the basic structure
* @return the new document
* @throws ParserConfigurationException if document factory doesn't work
*/
protected Document createNewDocument() throws ParserConfigurationException {
final DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
final Document doc = builder.newDocument();
final Element rootElement = doc.createElement(ROOT_ELEMENT);
doc.appendChild(rootElement);
addSummaryAttribute(rootElement);
return doc;
}
private void addSummaryAttribute(final Element element) {
element.setAttribute("Implementation-Title", PackageBoundary.getImplementationTitle());
element.setAttribute("Implementation-Version", PackageBoundary.getImplementationVersion());
}
}