1 32 33 package com.jeantessier.dependency; 34 35 import java.util.*; 36 37 public class TransitiveClosureEngine { 38 private NodeFactory factory; 39 private ClosureLayerSelector layerSelector; 40 private ClosureStopSelector stopSelector; 41 42 private Collection coverage = new HashSet(); 43 private LinkedList selections = new LinkedList(); 44 private LinkedList layers = new LinkedList(); 45 46 public TransitiveClosureEngine(Collection packages, SelectionCriteria startCriteria, SelectionCriteria stopCriteria, ClosureLayerSelector layerSelector) { 47 this(new NodeFactory(), packages, startCriteria, stopCriteria, layerSelector); 48 } 49 50 public TransitiveClosureEngine(NodeFactory factory, Collection packages, SelectionCriteria startCriteria, SelectionCriteria stopCriteria, ClosureLayerSelector layerSelector) { 51 this.factory = factory; 52 53 this.layerSelector = layerSelector; 54 this.layerSelector.setFactory(factory); 55 this.layerSelector.setCoverage(coverage); 56 57 this.stopSelector = new ClosureStopSelector(stopCriteria); 58 59 init(packages, startCriteria); 60 } 61 62 private void init(Collection packages, SelectionCriteria startCriteria) { 63 ClosureStartSelector startSelector = new ClosureStartSelector(factory, startCriteria); 64 startSelector.traverseNodes(packages); 65 stopSelector.traverseNodes(startSelector.getCopiedNodes()); 66 gatherResults(startSelector); 67 } 68 69 public NodeFactory getFactory() { 70 return factory; 71 } 72 73 public int getNbLayers() { 74 return layers.size(); 75 } 76 77 public Collection getLayer(int i) { 78 return (Collection) layers.get(i); 79 } 80 81 public void computeAllLayers() { 82 while (!stopSelector.isDone()) { 83 computeNextLayer(); 84 } 85 } 86 87 public void computeLayers(long nbLayers) { 88 for (long i=0; !stopSelector.isDone() && i<nbLayers; i++) { 89 computeNextLayer(); 90 } 91 } 92 93 public void computeNextLayer() { 94 if (!stopSelector.isDone()) { 95 layerSelector.reset(); 96 layerSelector.traverseNodes((Collection) selections.getLast()); 97 98 stopSelector.traverseNodes(layerSelector.getCopiedNodes()); 99 if (!layerSelector.getCopiedNodes().isEmpty()) { 100 gatherResults(layerSelector); 101 } 102 } 103 } 104 105 private void gatherResults(ClosureSelector selector) { 106 coverage.addAll(selector.getSelectedNodes()); 107 selections.add(selector.getSelectedNodes()); 108 layers.add(selector.getCopiedNodes()); 109 } 110 } 111 | Popular Tags |