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 @Override
60 public int compare(ModuleDefinition def1, ModuleDefinition def2) {
61
62
63 if ("core".equals(def1.getName())) {
64 return -1;
65 } else if ("core".equals(def2.getName())) {
66 return 1;
67 }
68
69
70 if ("webapp".equals(def1.getName())) {
71 return 1;
72 } else if ("webapp".equals(def2.getName())) {
73 return -1;
74 }
75
76 int level1 = calcDependencyDepth(def1);
77 int level2 = calcDependencyDepth(def2);
78
79
80 int dif = level1 - level2;
81 if (dif != 0) {
82 return dif;
83 }
84
85
86 return def1.getName().compareTo(def2.getName());
87
88 }
89
90
91
92
93
94
95
96
97
98 protected int calcDependencyDepth(ModuleDefinition def) {
99 if (def.getDependencies() == null || def.getDependencies().size() == 0) {
100 return 0;
101 }
102 final List<Integer> dependencyLevels = new ArrayList<Integer>();
103 for (final DependencyDefinition dep : def.getDependencies()) {
104 final ModuleDefinition depDef = allKnownModulesDefinitions.get(dep.getName());
105 if (depDef == null && !dep.isOptional()) {
106 throw new RuntimeException("Missing definition for module:" + dep.getName());
107 } else if (depDef != null) {
108 dependencyLevels.add(Integer.valueOf(calcDependencyDepth(depDef)));
109 } else {
110
111 dependencyLevels.add(-1);
112 }
113 }
114 return (Collections.max(dependencyLevels)).intValue() + 1;
115 }
116
117
118
119
120 protected int calcDependencyLevel(ModuleDefinition def) {
121 return calcDependencyDepth(def);
122 }
123
124 }