package hudson.plugins.clover; import hudson.FilePath; import hudson.model.Project; import hudson.model.ProminentProjectAction; import hudson.model.Build; import hudson.model.Result; import hudson.model.DirectoryBrowserSupport; import hudson.model.Actionable; import org.kohsuke.stapler.StaplerRequest; import org.kohsuke.stapler.StaplerResponse; import javax.servlet.ServletException; import java.io.File; import java.io.IOException; /** * Project level action. * * TODO: refactor this action in a similar manner to JavadocArchiver and BaseJavadocAction etc to avoid duplication. * * @author Stephen Connolly */ public class CloverProjectAction extends Actionable implements ProminentProjectAction { static final String ICON = "/plugin/clover/clover_48x48.png"; private final Project<?, ?> project; public CloverProjectAction(Project project) { this.project = project; } public String getIconFileName() { final File reportDir = getLastBuildReportDir(); if (reportDir != null && (new File(reportDir, "index.html").exists() || new File(reportDir, "clover.pdf").exists() || new File(reportDir, "clover.xml").exists())) { return ICON; } else { return null; } } private File getLastBuildReportDir() { if (project.getLastBuild() == null) { // no clover report links, until there is at least one build return null; } final File reportDir = project.getLastBuild().getRootDir(); return reportDir; } public String getDisplayName() { final File reportDir = getLastBuildReportDir(); if (reportDir == null) return null; if (new File(reportDir, "index.html").exists()) return "Clover HTML Coverage Report"; if (new File(reportDir, "clover.pdf").exists()) return "Clover PDF Coverage"; if (new File(reportDir, "clover.xml").exists()) return "Coverage Report"; return null; } public String getUrlName() { return "clover"; } /** * Returns the last Result that was successful. * * WARNING: this method is invoked dynamically from CloverProjectAction/floatingBox.jelly * @return the last successful build result */ public CloverBuildAction getLastSuccessfulResult() { for (Build<?, ?> b = project.getLastBuild(); b != null; b = b.getPreviousBuild()) { if (b.getResult() == Result.FAILURE) continue; CloverBuildAction r = b.getAction(CloverBuildAction.class); if (r != null) return r; } return null; } public void doGraph(StaplerRequest req, StaplerResponse rsp) throws IOException { if (getLastSuccessfulResult() != null) { getLastSuccessfulResult().getResult().doGraph(req, rsp); } } public DirectoryBrowserSupport doDynamic(StaplerRequest req, StaplerResponse rsp) throws IOException, ServletException, InterruptedException { // there is a report if there was a build already, and there is a report if (project.getLastBuild() != null && getDisplayName() != null) { return new DirectoryBrowserSupport(this, new FilePath(project.getLastBuild().getRootDir()),"Clover Html Report", "/clover/clover.gif", false); } else { return null; } } public String getSearchUrl() { return getUrlName(); } }