1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package org.apache.maven.lifecycle;
20
21 import java.util.ArrayList;
22 import java.util.HashMap;
23 import java.util.HashSet;
24 import java.util.Iterator;
25 import java.util.LinkedHashMap;
26 import java.util.LinkedHashSet;
27 import java.util.List;
28 import java.util.Map;
29 import java.util.Set;
30
31 import org.apache.maven.lifecycle.internal.ExecutionPlanItem;
32 import org.apache.maven.model.Plugin;
33 import org.apache.maven.plugin.MojoExecution;
34 import org.apache.maven.plugin.descriptor.MojoDescriptor;
35
36
37
38
39
40
41
42
43
44
45
46
47 public class MavenExecutionPlan implements Iterable<ExecutionPlanItem> {
48
49
50
51
52
53
54
55
56
57
58 private final List<ExecutionPlanItem> planItem;
59
60 private final Map<String, ExecutionPlanItem> lastMojoExecutionForAllPhases;
61
62 final List<String> phasesInExecutionPlan;
63
64 public MavenExecutionPlan(List<ExecutionPlanItem> planItem, DefaultLifecycles defaultLifecycles) {
65 this.planItem = planItem;
66
67 lastMojoExecutionForAllPhases = new LinkedHashMap<>();
68
69 LinkedHashSet<String> totalPhaseSet = new LinkedHashSet<>();
70 if (defaultLifecycles != null) {
71 for (String phase : getDistinctPhasesInOrderOfExecutionPlanAppearance(planItem)) {
72 final Lifecycle lifecycle = defaultLifecycles.get(phase);
73 if (lifecycle != null) {
74 totalPhaseSet.addAll(lifecycle.getPhases());
75 }
76 }
77 }
78 this.phasesInExecutionPlan = new ArrayList<>(totalPhaseSet);
79
80 Map<String, ExecutionPlanItem> lastInExistingPhases = new HashMap<>();
81 for (ExecutionPlanItem executionPlanItem : getExecutionPlanItems()) {
82 lastInExistingPhases.put(executionPlanItem.getLifecyclePhase(), executionPlanItem);
83 }
84
85 ExecutionPlanItem lastSeenExecutionPlanItem = null;
86
87 for (String phase : totalPhaseSet) {
88 ExecutionPlanItem forThisPhase = lastInExistingPhases.get(phase);
89 if (forThisPhase != null) {
90 lastSeenExecutionPlanItem = forThisPhase;
91 }
92
93 lastMojoExecutionForAllPhases.put(phase, lastSeenExecutionPlanItem);
94 }
95 }
96
97 public Iterator<ExecutionPlanItem> iterator() {
98 return getExecutionPlanItems().iterator();
99 }
100
101
102
103
104
105
106
107
108
109 public ExecutionPlanItem findLastInPhase(String requestedPhase) {
110 return lastMojoExecutionForAllPhases.get(requestedPhase);
111 }
112
113 private List<ExecutionPlanItem> getExecutionPlanItems() {
114 return planItem;
115 }
116
117 private static Iterable<String> getDistinctPhasesInOrderOfExecutionPlanAppearance(
118 List<ExecutionPlanItem> planItems) {
119 LinkedHashSet<String> result = new LinkedHashSet<>();
120 for (ExecutionPlanItem executionPlanItem : planItems) {
121 result.add(executionPlanItem.getLifecyclePhase());
122 }
123 return result;
124 }
125
126 public List<MojoExecution> getMojoExecutions() {
127 List<MojoExecution> result = new ArrayList<>();
128 for (ExecutionPlanItem executionPlanItem : planItem) {
129 result.add(executionPlanItem.getMojoExecution());
130 }
131 return result;
132 }
133
134
135
136
137
138
139 public Set<Plugin> getNonThreadSafePlugins() {
140 Set<Plugin> plugins = new HashSet<>();
141 for (ExecutionPlanItem executionPlanItem : planItem) {
142 final MojoExecution mojoExecution = executionPlanItem.getMojoExecution();
143 if (!mojoExecution.getMojoDescriptor().isThreadSafe()) {
144 plugins.add(mojoExecution.getPlugin());
145 }
146 }
147 return plugins;
148 }
149
150
151
152
153
154
155 public Set<MojoDescriptor> getNonThreadSafeMojos() {
156 Set<MojoDescriptor> mojos = new HashSet<>();
157 for (ExecutionPlanItem executionPlanItem : planItem) {
158 final MojoExecution mojoExecution = executionPlanItem.getMojoExecution();
159 if (!mojoExecution.getMojoDescriptor().isThreadSafe()) {
160 mojos.add(mojoExecution.getMojoDescriptor());
161 }
162 }
163 return mojos;
164 }
165
166
167 @Deprecated
168 public List<MojoExecution> getExecutions() {
169 return getMojoExecutions();
170 }
171
172 public int size() {
173 return planItem.size();
174 }
175 }