package ro.isdc.wro.extensions.support.lint;
import static org.apache.commons.lang3.Validate.notNull;
import java.io.OutputStream;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.w3c.dom.Document;
import ro.isdc.wro.WroRuntimeException;
import ro.isdc.wro.extensions.processor.support.linter.LinterError;
/**
* Builds an XML report for lint errors based on provided collection of {@link LinterError}'s.
*
* @author Alex Objelean
* @since 1.5.0
* @created 15 Sep 2012
*/
public abstract class AbstractReportXmlFormatter<T> {
private Document doc;
private LintReport<T> lintReport;
/**
* @param lintReport
* a not null collection of {@link LinterError} used to build an XML report from.
*/
protected AbstractReportXmlFormatter(final LintReport<T> lintReport) {
notNull(lintReport);
this.lintReport = lintReport;
initDocument();
}
private void initDocument() {
try {
final DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
final DocumentBuilder docBuilder = docFactory.newDocumentBuilder();
this.doc = docBuilder.newDocument();
} catch (ParserConfigurationException e) {
throw new WroRuntimeException("Unexpected problem while XML Document", e);
}
}
/**
* @param outputStream
* the {@link OutputStream} where the xml representation of the report is written.
*/
public final void write(final OutputStream outputStream) {
buildDocument();
writeReport(outputStream);
}
/**
* Populates document with required DOM elements.
*/
protected abstract void buildDocument();
/**
* @return {@link LintReport} used to build the xml lint report from.
*/
protected final LintReport<T> getLintReport() {
return this.lintReport;
}
/**
* @return the {@link Document} used to build xml report.
*/
protected final Document getDocument() {
return doc;
}
/**
* write the content to the {@link OutputStream}
*/
private void writeReport(final OutputStream outputStream) {
Transformer transformer;
try {
transformer = TransformerFactory.newInstance().newTransformer();
transformer.transform(new DOMSource(doc), new StreamResult(outputStream));
} catch (Exception e) {
throw WroRuntimeException.wrap(e, "Problem during Document transformation").logError();
}
}
}