package hudson.plugins.rubyMetrics; import hudson.model.AbstractBuild; import hudson.model.AbstractProject; import hudson.model.Actionable; import hudson.model.ProminentProjectAction; import hudson.model.Result; import java.io.IOException; import org.kohsuke.stapler.StaplerRequest; import org.kohsuke.stapler.StaplerResponse; @SuppressWarnings("unchecked") public abstract class AbstractRubyMetricsProjectAction<T extends AbstractRubyMetricsBuildAction> extends Actionable implements ProminentProjectAction { protected final AbstractProject<?, ?> project; public AbstractRubyMetricsProjectAction(AbstractProject<?, ?> project) { this.project = project; } public AbstractProject<?, ?> getProject() { return project; } public String getIconFileName() { return "graph.gif"; } public String getSearchUrl() { return getUrlName(); } protected abstract Class<T> getBuildActionClass(); public void doGraph(StaplerRequest req, StaplerResponse rsp) throws IOException { if (getLastResult() != null) { getLastResult().doGraph(req, rsp); } } public void doIndex(StaplerRequest req, StaplerResponse rsp) throws IOException { Integer buildNumber = getLastResultBuild(); if (buildNumber == null) { rsp.sendRedirect2("nodata"); } else { rsp.sendRedirect2("../" + buildNumber + "/" + getUrlName()); } } public T getLastResult() { for (AbstractBuild<?, ?> b = project.getLastStableBuild(); b != null; b = b.getPreviousNotFailedBuild()) { if (b.getResult() == Result.FAILURE) continue; T r = b.getAction(getBuildActionClass()); if (r != null) return r; } return null; } public Integer getLastResultBuild() { for (AbstractBuild<?, ?> b = project.getLastStableBuild(); b != null; b = b.getPreviousNotFailedBuild()) { if (b.getResult() == Result.FAILURE) continue; T r = b.getAction(getBuildActionClass()); if (r != null) return b.getNumber(); } return null; } }