1 |
| |
2 |
| |
3 |
| |
4 |
| |
5 |
| |
6 |
| |
7 |
| |
8 |
| |
9 |
| |
10 |
| |
11 |
| |
12 |
| |
13 |
| |
14 |
| |
15 |
| |
16 |
| |
17 |
| |
18 |
| |
19 |
| |
20 |
| |
21 |
| |
22 |
| |
23 |
| |
24 |
| |
25 |
| |
26 |
| |
27 |
| |
28 |
| |
29 |
| |
30 |
| |
31 |
| |
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<Node> coverage = new HashSet<Node>(); |
43 |
| private LinkedList<Collection<? extends Node>> selections = new LinkedList<Collection<? extends Node>>(); |
44 |
| private LinkedList<Collection<? extends Node>> layers = new LinkedList<Collection<? extends Node>>(); |
45 |
| |
46 |
18
| public TransitiveClosureEngine(Collection<? extends Node> packages, SelectionCriteria startCriteria, SelectionCriteria stopCriteria, ClosureLayerSelector layerSelector) {
|
47 |
18
| this(new NodeFactory(), packages, startCriteria, stopCriteria, layerSelector);
|
48 |
| } |
49 |
| |
50 |
81
| public TransitiveClosureEngine(NodeFactory factory, Collection<? extends Node> packages, SelectionCriteria startCriteria, SelectionCriteria stopCriteria, ClosureLayerSelector layerSelector) {
|
51 |
81
| this.factory = factory;
|
52 |
| |
53 |
81
| this.layerSelector = layerSelector;
|
54 |
81
| this.layerSelector.setFactory(factory);
|
55 |
81
| this.layerSelector.setCoverage(coverage);
|
56 |
| |
57 |
81
| this.stopSelector = new ClosureStopSelector(stopCriteria);
|
58 |
| |
59 |
81
| init(packages, startCriteria);
|
60 |
| } |
61 |
| |
62 |
81
| private void init(Collection<? extends Node> packages, SelectionCriteria startCriteria) {
|
63 |
81
| ClosureStartSelector startSelector = new ClosureStartSelector(factory, startCriteria);
|
64 |
81
| startSelector.traverseNodes(packages);
|
65 |
81
| stopSelector.traverseNodes(startSelector.getCopiedNodes());
|
66 |
81
| gatherResults(startSelector);
|
67 |
| } |
68 |
| |
69 |
180
| public NodeFactory getFactory() {
|
70 |
180
| return factory;
|
71 |
| } |
72 |
| |
73 |
18
| public int getNbLayers() {
|
74 |
18
| return layers.size();
|
75 |
| } |
76 |
| |
77 |
70
| public Collection getLayer(int i) {
|
78 |
70
| return layers.get(i);
|
79 |
| } |
80 |
| |
81 |
38
| public void computeAllLayers() {
|
82 |
38
| while (!stopSelector.isDone()) {
|
83 |
86
| computeNextLayer();
|
84 |
| } |
85 |
| } |
86 |
| |
87 |
32
| public void computeLayers(long nbLayers) {
|
88 |
32
| for (long i=0; !stopSelector.isDone() && i<nbLayers; i++) {
|
89 |
32
| computeNextLayer();
|
90 |
| } |
91 |
| } |
92 |
| |
93 |
142
| public void computeNextLayer() {
|
94 |
142
| if (!stopSelector.isDone()) {
|
95 |
137
| layerSelector.reset();
|
96 |
137
| layerSelector.traverseNodes(selections.getLast());
|
97 |
| |
98 |
137
| stopSelector.traverseNodes(layerSelector.getCopiedNodes());
|
99 |
137
| if (!layerSelector.getCopiedNodes().isEmpty()) {
|
100 |
106
| gatherResults(layerSelector);
|
101 |
| } |
102 |
| } |
103 |
| } |
104 |
| |
105 |
187
| private void gatherResults(ClosureSelector selector) {
|
106 |
187
| coverage.addAll(selector.getSelectedNodes());
|
107 |
187
| selections.add(selector.getSelectedNodes());
|
108 |
187
| layers.add(selector.getCopiedNodes());
|
109 |
| } |
110 |
| } |