/** * Hudson Serenitec plugin * * @author Georges Bossert <gbossert@gmail.com> * @version $Revision: 1.8 $ * @since $Date: 2008/07/24 09:44:13 ${date} * @copyright Universit� de Rennes 1 */ package hudson.plugins.serenitec; import hudson.Extension; import hudson.model.AbstractBuild; import hudson.model.AbstractProject; import hudson.model.Action; import hudson.model.Result; import hudson.plugins.serenitec.parseur.Gettingxml; import hudson.plugins.serenitec.parseur.ReportEntry; import hudson.plugins.serenitec.parseur.ReportFile; import hudson.plugins.serenitec.util.HealthAwarePublisher; import hudson.plugins.serenitec.util.HealthReportBuilder; import hudson.plugins.serenitec.util.Project; import java.io.File; import java.io.IOException; import java.io.PrintStream; import java.util.ArrayList; import org.kohsuke.stapler.DataBoundConstructor; /** * The class SerenitecPublisher declares the methods SerenitecPublisher * * @author $Author: georges $ * @version $Revision: 1.8 $ * @since $Date: 2008/07/24 09:44:13 ${date} * @copyright Silicomp AQL 2007-2008 */ public class SerenitecPublisher extends HealthAwarePublisher { /* * Descriptor de notre plugin */ @Extension public static final SerenitecDescriptor SERENITEC_DESCRIPTOR = new SerenitecDescriptor(); /** * Creates a new instance of <code>WarningPublisher</code>. * * @param threshold * Entries threshold to be reached if a build should be considered as unstable. * @param healthy * Report health as 100% when the number of entries is less than this value * @param unHealthy * Report health as 0% when the number of entries is greater than this value * @param height * the height of the trend graph */ @DataBoundConstructor public SerenitecPublisher(final String threshold, final String healthy, final String unHealthy, final String height) { super(threshold, healthy, unHealthy, height, "Serenitec Hudson Plugin"); } @Override protected boolean canContinue(final Result result) { return result != Result.ABORTED; } @Override public Action getProjectAction(final AbstractProject<?, ?> project) { return new SerenitecProjectAction(project, getTrendHeight()); } @Override protected Project perform(final AbstractBuild<?, ?> build, final PrintStream logger) throws InterruptedException, IOException { /** * Creating the project */ Project projet = new Project(); /** * Scanning for the report */ String uri_report = build.getRootDir().getParentFile().getParentFile().getAbsolutePath() + "\\" + "serenitec-report.xml"; log(logger, "Scanning for the report in " + uri_report); final File report = new File(uri_report); if (!report.exists() || !report.canRead()) { log(logger, "Error : Unable to read xml event report."); build.setResult(Result.FAILURE); } else { /** * We parse the report */ log(logger, "Opening report file and parsing results :"); final Gettingxml parseur = new Gettingxml(report.getAbsolutePath()); try { parseur.parse(); } catch (final Exception e) { log(logger, "Error on parsing results : " + e.getLocalizedMessage()); build.setResult(Result.FAILURE); } ArrayList<ReportEntry> xml = parseur.result(); ArrayList<ReportFile> xml_fichier = parseur.resultFiles(); projet.addEntries(xml, build); System.out.println("Appel de projet.addFiles avec " + xml_fichier.size() + "fichiers."); projet.addFiles(xml_fichier); log(logger, "-Repository-------------------------------------"); log(logger, " Number of Rules : " + projet.getNumberOfRules()); log(logger, " Number of Errors : " + projet.getNumberOfEntry()); log(logger, " Number of Patterns : " + projet.getNumberOfPointeurs()); log(logger, " Number of Fixed errors : " + projet.getNumberOfFixedEntry()); log(logger, " Number of Unfixed errors : " + projet.getNumberOfNotFixedEntry()); log(logger, " Number of Scanned files : " + projet.getNumberOfFiles()); log(logger, "------------------------------------------------"); /** * Implementing the Result Builder */ final SerenitecResult resultat = new SerenitecResultBuilder().build(build, projet); /** * Implementing the HealthReportBuilder */ final HealthReportBuilder healthReportBuilder = createHealthReporter("Serenitec Reports : 1 open task found.", "Serenitec Reports : {\"%d\"} open tasks found."); log(logger, "Adding new Serenitec Result Action into the build"); build.getActions().add(new SerenitecResultAction(build, healthReportBuilder, resultat)); } return projet; } }