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