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