package hudson.plugins.parameterizedtrigger; import hudson.model.AbstractBuild; import hudson.model.AbstractProject; import hudson.model.Action; import hudson.model.DependencyGraph; import hudson.model.DependencyGraph.Dependency; import hudson.model.TaskListener; import java.util.List; /** * Invoke downstream projects with applicable parameters using * DependencyGraph.Dependency interface. * @author Alan Harder */ public class ParameterizedDependency extends Dependency { private BuildTriggerConfig config; public ParameterizedDependency(AbstractProject upstream, AbstractProject downstream, BuildTriggerConfig config) { super(upstream, downstream); this.config = config; } public static void add(AbstractProject upstream, AbstractProject downstream, BuildTriggerConfig config, DependencyGraph graph) { // Keeping graph.addDependency() call in this class so classloader // won't look for DependencyGraph.Dependency when running on older Hudson graph.addDependency(new ParameterizedDependency(upstream, downstream, config)); } @Override public boolean equals(Object obj) { if (obj == null) return false; if (getClass() != obj.getClass()) return false; final ParameterizedDependency that = (ParameterizedDependency) obj; return this.getUpstreamProject() == that.getUpstreamProject() || this.getDownstreamProject() == that.getDownstreamProject() || this.config == that.config; } @Override public int hashCode() { int hash = 7; hash = 23 * hash + this.getUpstreamProject().hashCode(); hash = 23 * hash + this.getDownstreamProject().hashCode(); hash = 23 * hash + this.config.hashCode(); return hash; } @Override public boolean shouldTriggerBuild(AbstractBuild build, TaskListener listener, List<Action> actions) { if (!config.getCondition().isMet(build.getResult())){ return false; } try { List<Action> actionList = config.getBaseActions(build, listener); if (!actionList.isEmpty()) { actions.addAll(config.getBuildActions(actionList, getDownstreamProject())); return true; } if (config.getTriggerWithNoParameters()) { return true; } listener.getLogger().println(Plugin.LOG_TAG + " Downstream builds will not be triggered as no parameter is set."); return false; } catch (AbstractBuildParameters.DontTriggerException ex) { // don't trigger on this configuration return false; } catch (Exception ex) { listener.error("Failed to build parameters to trigger project: " + getDownstreamProject().getName()); ex.printStackTrace(listener.getLogger()); return false; } } }