package hudson.plugins.promoted_builds.conditions; import hudson.Extension; import hudson.model.AbstractBuild; import hudson.model.AbstractProject; import hudson.plugins.promoted_builds.PromotedBuildAction; import hudson.plugins.promoted_builds.PromotionBadge; import hudson.plugins.promoted_builds.PromotionCondition; import hudson.plugins.promoted_builds.PromotionConditionDescriptor; import hudson.plugins.promoted_builds.PromotionProcess; import hudson.plugins.promoted_builds.Status; import net.sf.json.JSONObject; import org.kohsuke.stapler.StaplerRequest; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.HashSet; import java.util.List; import java.util.Set; import org.kohsuke.stapler.export.Exported; /** * {@link PromotionCondition} that tests if 1 or more upstream promotions have * occurred. * * @author Peter Hayes */ public class UpstreamPromotionCondition extends PromotionCondition { /** * List of upstream promotions that are used as the promotion criteria. */ private final String requiredPromotionNames; public UpstreamPromotionCondition(String requiredPromotionNames) { this.requiredPromotionNames = requiredPromotionNames; } public String getRequiredPromotionNames() { return requiredPromotionNames; } public Set<String> getRequiredPromotionNamesAsSet() { if (requiredPromotionNames == null) { return Collections.emptySet(); } return new HashSet<String>(Arrays.asList(requiredPromotionNames.split(","))); } @Override public PromotionBadge isMet(PromotionProcess promotionProcess, AbstractBuild<?,?> build) { Badge badge = new Badge(); Set<String> requiredPromotions = getRequiredPromotionNamesAsSet(); if (requiredPromotions.isEmpty()) { return badge; } PromotedBuildAction pba = build.getAction(PromotedBuildAction.class); if (pba == null) { return null; } for (Status status : pba.getPromotions()) { if (status.isPromotionSuccessful()) { requiredPromotions.remove(status.getName()); badge.add(status.getName()); // short circuit for loop if if (requiredPromotions.isEmpty()) break; } } return requiredPromotions.isEmpty() ? badge : null; } public static final class Badge extends PromotionBadge { @Exported public final List<String> promotions = new ArrayList<String>(3); public void add(String promotion) { promotions.add(promotion); } } @Extension public static final class DescriptorImpl extends PromotionConditionDescriptor { public boolean isApplicable(AbstractProject<?,?> item) { return true; } public String getDisplayName() { return Messages.UpstreamPromotionCondition_DisplayName(); } public PromotionCondition newInstance(StaplerRequest req, JSONObject formData) throws FormException { return new UpstreamPromotionCondition( formData.getString("promotions")); } } }