package hudson.plugins.emma; import hudson.model.AbstractBuild; import hudson.util.IOException2; import org.apache.commons.digester.Digester; import org.xml.sax.SAXException; import java.io.File; import java.io.IOException; import java.io.InputStream; /** * Root object of the coverage report. * * @author Kohsuke Kawaguchi */ public final class CoverageReport extends AggregatedReport<CoverageReport/*dummy*/,CoverageReport,PackageReport> { private final EmmaBuildAction action; private CoverageReport(EmmaBuildAction action) { this.action = action; setName("Emma"); } public CoverageReport(EmmaBuildAction action, InputStream... xmlReports) throws IOException { this(action); for (InputStream is: xmlReports) { try { createDigester().parse(is); } catch (SAXException e) { throw new IOException2("Failed to parse XML",e); } } setParent(null); } public CoverageReport(EmmaBuildAction action, File xmlReport) throws IOException { this(action); try { createDigester().parse(xmlReport); } catch (SAXException e) { throw new IOException2("Failed to parse "+xmlReport,e); } setParent(null); } @Override public CoverageReport getPreviousResult() { EmmaBuildAction prev = action.getPreviousResult(); if(prev!=null) return prev.getResult(); else return null; } @Override public AbstractBuild<?,?> getBuild() { return action.owner; } /** * Creates a configured {@link Digester} instance for parsing report XML. */ private Digester createDigester() { Digester digester = new Digester(); digester.setClassLoader(getClass().getClassLoader()); digester.push(this); digester.addObjectCreate( "*/package", PackageReport.class); digester.addSetNext( "*/package","add"); digester.addSetProperties("*/package"); digester.addObjectCreate( "*/srcfile", SourceFileReport.class); digester.addSetNext( "*/srcfile","add"); digester.addSetProperties("*/srcfile"); digester.addObjectCreate( "*/class", ClassReport.class); digester.addSetNext( "*/class","add"); digester.addSetProperties("*/class"); digester.addObjectCreate( "*/method", MethodReport.class); digester.addSetNext( "*/method","add"); digester.addSetProperties("*/method"); digester.addObjectCreate("*/coverage", CoverageElement.class); digester.addSetProperties("*/coverage"); digester.addSetNext( "*/coverage","addCoverage"); //digester.addObjectCreate("*/testcase",TestCase.class); //digester.addSetNext("*/testsuite","add"); //digester.addSetNext("*/test","add"); //if(owner.considerTestAsTestObject()) // digester.addCallMethod("*/test", "setconsiderTestAsTestObject"); //digester.addSetNext("*/testcase","add"); // //// common properties applicable to more than one TestObjects. //digester.addBeanPropertySetter("*/id"); //digester.addBeanPropertySetter("*/name"); //digester.addBeanPropertySetter("*/description"); //digester.addSetProperties("*/status","value","statusString"); // set attributes. in particular @revision //digester.addBeanPropertySetter("*/status","statusMessage"); return digester; } }