package com.smartcodeltd.jenkinsci.plugins.buildmonitor.pipeline; import java.util.ArrayList; import java.util.Collection; import java.util.LinkedList; import java.util.List; import java.util.Queue; public abstract class BreadthFirstNodeTraversal<N> { private final Queue<N> nodesToAccess; private final List<String> stages; public BreadthFirstNodeTraversal() { this.nodesToAccess = new LinkedList<N>(); this.stages = new ArrayList<String>(); } public void start(List<N> nodes) { nodesToAccess.addAll(nodes); while (!nodesToAccess.isEmpty()) { N node = nodesToAccess.remove(); if (isStageStep(node)) { stages.add(getDisplayName(node)); } else { nodesToAccess.addAll(getParents(node)); } } } protected abstract boolean isStageStep(N node); protected abstract String getDisplayName(N node); protected abstract Collection<N> getParents(N node); public List<String> getStages() { return stages; } }