package hudson.plugins.promoted_builds; import hudson.model.AbstractBuild; import hudson.model.AbstractProject; import hudson.model.Api; import hudson.model.PermalinkProjectAction; import hudson.model.ProminentProjectAction; import java.io.IOException; import java.util.ArrayList; import java.util.Collections; import java.util.List; import javax.annotation.CheckForNull; import org.kohsuke.stapler.HttpResponse; import org.kohsuke.stapler.HttpResponses; import org.kohsuke.stapler.QueryParameter; import org.kohsuke.stapler.StaplerRequest; import org.kohsuke.stapler.export.Exported; import org.kohsuke.stapler.export.ExportedBean; import org.kohsuke.stapler.interceptor.RequirePOST; import org.kohsuke.accmod.Restricted; import org.kohsuke.accmod.restrictions.NoExternalUse; /** * For customizing project top-level GUI. * @author Kohsuke Kawaguchi */ @ExportedBean public class PromotedProjectAction implements ProminentProjectAction, PermalinkProjectAction { //TODO externalize to a plugin property? private static final int SUMMARY_SIZE = 10; public final AbstractProject<?,?> owner; private final JobPropertyImpl property; public PromotedProjectAction(AbstractProject<?, ?> owner, JobPropertyImpl property) { this.owner = owner; this.property = property; } public Api getApi() { return new Api(this); } @Exported public List<PromotionProcess> getProcesses() { return property.getActiveItems(); } /** * Get the promotion process by name. * @param name Name of the process * @return Discovered process or {@code null} if it cannot be found */ @CheckForNull public PromotionProcess getProcess(String name) { for (PromotionProcess pp : getProcesses() ){ if(pp.getName().equals(name)) return pp; } return null; } public AbstractBuild<?,?> getLatest(PromotionProcess p) { List<Promotion> list = getPromotions( p ); return list.size() > 0 ? list.get(list.size() - 1) : null; } @Restricted(NoExternalUse.class) public List<PromotionProcess> getPromotionProcesses() { List<PromotionProcess> processes = null; processes = getProcesses(); if (processes == null) { // assert ? // this case should not happen, the action should get deleted // when there is no process; but we're now safe for the UI. processes = new ArrayList<PromotionProcess>(); } return processes; } @Restricted(NoExternalUse.class) public Status getStatus(PromotionProcess process) { List<Promotion> list = getPromotions( process ); Promotion latest = list.size() > 0 ? list.get(list.size() - 1) : null; Status status = latest != null ? latest.getStatus() : null; return status; } /** * Finds the last promoted build under the given criteria. */ public AbstractBuild<?,?> getLatest(String name) { List<Promotion> list = getPromotions( getProcess(name) ); return list.size() > 0 ? list.get(list.size() - 1) : null; } public List<Promotion> getPromotions(PromotionProcess promotionProcess){ List<Promotion> list = new ArrayList<Promotion>(); for( AbstractBuild<?,?> build : owner.getBuilds() ) { PromotedBuildAction a = build.getAction(PromotedBuildAction.class); if(a!=null && a.contains(promotionProcess)) list.addAll( a.getPromotionBuilds(promotionProcess) ); } Collections.sort(list); return list; } /** * returns the summary of the latest promotions for a promotion process. * * @param promotionProcess Name of the promotion process * @return List of latest promotions */ public List<Promotion> getPromotionsSummary(PromotionProcess promotionProcess){ List<Promotion> promotionList = this.getPromotions(promotionProcess); if(promotionList.size() > SUMMARY_SIZE ){ return promotionList.subList(promotionList.size() - SUMMARY_SIZE, promotionList.size()); }else{ return promotionList; } } public List<Permalink> getPermalinks() { List<Permalink> r = new ArrayList<Permalink>(); for (PromotionProcess pp : property.getActiveItems()) r.add(pp.asPermalink()); return r; } @RequirePOST public HttpResponse doCreateProcess(@QueryParameter String name, StaplerRequest req) throws IOException { property.createProcessFromXml(name, req.getInputStream()); return HttpResponses.ok(); } public String getIconFileName() { return "star.png"; } public String getDisplayName() { return "Promotion Status"; } public String getUrlName() { return "promotion"; } }