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 final String phase = executionPlanItem.getLifecyclePhase();
122 if (!result.contains(phase)) {
123 result.add(phase);
124 }
125 }
126 return result;
127 }
128
129 public List<MojoExecution> getMojoExecutions() {
130 List<MojoExecution> result = new ArrayList<>();
131 for (ExecutionPlanItem executionPlanItem : planItem) {
132 result.add(executionPlanItem.getMojoExecution());
133 }
134 return result;
135 }
136
137
138
139
140
141
142 public Set<Plugin> getNonThreadSafePlugins() {
143 Set<Plugin> plugins = new HashSet<>();
144 for (ExecutionPlanItem executionPlanItem : planItem) {
145 final MojoExecution mojoExecution = executionPlanItem.getMojoExecution();
146 if (!mojoExecution.getMojoDescriptor().isThreadSafe()) {
147 plugins.add(mojoExecution.getPlugin());
148 }
149 }
150 return plugins;
151 }
152
153
154
155
156
157
158 public Set<MojoDescriptor> getNonThreadSafeMojos() {
159 Set<MojoDescriptor> mojos = new HashSet<>();
160 for (ExecutionPlanItem executionPlanItem : planItem) {
161 final MojoExecution mojoExecution = executionPlanItem.getMojoExecution();
162 if (!mojoExecution.getMojoDescriptor().isThreadSafe()) {
163 mojos.add(mojoExecution.getMojoDescriptor());
164 }
165 }
166 return mojos;
167 }
168
169
170 @Deprecated
171 public List<MojoExecution> getExecutions() {
172 return getMojoExecutions();
173 }
174
175 public int size() {
176 return planItem.size();
177 }
178 }