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
34 package info.magnolia.module.model.reader;
35
36 import info.magnolia.module.model.DependencyDefinition;
37 import info.magnolia.module.model.ModuleDefinition;
38
39 import java.util.ArrayList;
40 import java.util.Collections;
41 import java.util.Comparator;
42 import java.util.List;
43 import java.util.Map;
44
45
46
47
48
49
50
51
52 class DependencyLevelComparator implements Comparator<ModuleDefinition> {
53 private final Map<String, ModuleDefinition> allKnownModulesDefinitions;
54
55 DependencyLevelComparator(Map<String, ModuleDefinition> allKnownModulesDefinitions) {
56 this.allKnownModulesDefinitions = allKnownModulesDefinitions;
57 }
58
59 public int compare(ModuleDefinition def1, ModuleDefinition def2) {
60
61
62 if ("core".equals(def1.getName())) {
63 return -1;
64 } else if ("core".equals(def2.getName())) {
65 return 1;
66 }
67
68
69 if ("webapp".equals(def1.getName())) {
70 return 1;
71 } else if ("webapp".equals(def2.getName())) {
72 return -1;
73 }
74
75 int level1 = calcDependencyDepth(def1);
76 int level2 = calcDependencyDepth(def2);
77
78
79 int dif = level1 - level2;
80 if (dif != 0) {
81 return dif;
82 }
83
84
85 return def1.getName().compareTo(def2.getName());
86
87 }
88
89
90
91
92
93
94
95
96
97 protected int calcDependencyDepth(ModuleDefinition def) {
98 if (def.getDependencies() == null || def.getDependencies().size() == 0) {
99 return 0;
100 }
101 final List<Integer> dependencyLevels = new ArrayList<Integer>();
102 for (final DependencyDefinition dep : def.getDependencies()) {
103 final ModuleDefinition depDef = allKnownModulesDefinitions.get(dep.getName());
104 if (depDef == null && !dep.isOptional()) {
105 throw new RuntimeException("Missing definition for module:" + dep.getName());
106 } else if (depDef != null) {
107 dependencyLevels.add(new Integer(calcDependencyLevel(depDef)));
108 }
109 }
110 return (Collections.max(dependencyLevels)).intValue() + 1;
111 }
112
113
114
115
116 protected int calcDependencyLevel(ModuleDefinition def) {
117 return calcDependencyDepth(def);
118 }
119
120 }