package codeine.nodes; import java.util.List; import java.util.Map; import java.util.Set; import org.apache.log4j.Logger; import codeine.api.NodeInfo; import codeine.executer.PeriodicExecuter; import com.google.common.collect.Lists; import com.google.common.collect.Maps; import com.google.common.collect.Sets; public class NodesSelector { private static final Logger log = Logger.getLogger(NodesSelector.class); private Map<NodeInfo, PeriodicExecuter> runningNodes; private List<NodeInfo> newNodes; public NodesSelector(Map<NodeInfo, PeriodicExecuter> runningNodes, List<NodeInfo> newNodes) { this.runningNodes = runningNodes; this.newNodes = newNodes; } public SelectedNodes selectStartStop() { log.debug("runningNodes " + runningNodes); Map<NodeInfo, PeriodicExecuter> existingProjectExecutors = Maps.newHashMap(); List<NodeInfo> nodesToStart = Lists.newArrayList(); Map<NodeInfo, PeriodicExecuter> nodesToStop = Maps.newHashMap(); Set<NodeInfo> newAndCuerrentNodes = getNewAndCuerrentNodes(); log.debug("newAndCuerrentNodes " + newAndCuerrentNodes); for (NodeInfo node : newAndCuerrentNodes) { if (shouldContinueRun(node)) { if (!runningNodes.containsKey(node)) { nodesToStart.add(getNode(node)); } else { existingProjectExecutors.put(node, runningNodes.get(node)); } } else { //should not run nodesToStop.put(node, runningNodes.get(node)); } } SelectedNodes $ = new SelectedNodes(nodesToStop, nodesToStart, existingProjectExecutors); log.info("returning " + $); return $; } private boolean shouldContinueRun(NodeInfo node) { for (NodeInfo n : newNodes) { if (n.equals(node)) { return true; } } return false; } private NodeInfo getNode(NodeInfo node) { for (NodeInfo n : newNodes) { if (n.equals(node)) { return n; } } throw new RuntimeException("error getting node name " + node); } private Set<NodeInfo> getNewAndCuerrentNodes() { Set<NodeInfo> $ = Sets.newHashSet(runningNodes.keySet()); for (NodeInfo n : newNodes) { $.add(n); } return $; } @Override public String toString() { return "NodesSelector [runningNodes=" + runningNodes + ", newNodes=" + newNodes + "]"; } }