1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package org.apache.maven.lifecycle.internal;
20
21 import javax.inject.Inject;
22 import javax.inject.Named;
23 import javax.inject.Singleton;
24
25 import java.util.ArrayList;
26 import java.util.LinkedHashMap;
27 import java.util.List;
28 import java.util.Map;
29 import java.util.TreeMap;
30
31 import org.apache.maven.execution.MavenSession;
32 import org.apache.maven.lifecycle.Lifecycle;
33 import org.apache.maven.lifecycle.LifecycleMappingDelegate;
34 import org.apache.maven.model.Plugin;
35 import org.apache.maven.model.PluginExecution;
36 import org.apache.maven.plugin.BuildPluginManager;
37 import org.apache.maven.plugin.InvalidPluginDescriptorException;
38 import org.apache.maven.plugin.MojoExecution;
39 import org.apache.maven.plugin.MojoNotFoundException;
40 import org.apache.maven.plugin.PluginDescriptorParsingException;
41 import org.apache.maven.plugin.PluginNotFoundException;
42 import org.apache.maven.plugin.PluginResolutionException;
43 import org.apache.maven.plugin.descriptor.MojoDescriptor;
44 import org.apache.maven.project.MavenProject;
45
46
47
48
49
50
51 @Named(DefaultLifecycleMappingDelegate.HINT)
52 @Singleton
53 public class DefaultLifecycleMappingDelegate implements LifecycleMappingDelegate {
54 public static final String HINT = "default";
55
56 private final BuildPluginManager pluginManager;
57
58 @Inject
59 public DefaultLifecycleMappingDelegate(BuildPluginManager pluginManager) {
60 this.pluginManager = pluginManager;
61 }
62
63 public Map<String, List<MojoExecution>> calculateLifecycleMappings(
64 MavenSession session, MavenProject project, Lifecycle lifecycle, String lifecyclePhase)
65 throws PluginNotFoundException, PluginResolutionException, PluginDescriptorParsingException,
66 MojoNotFoundException, InvalidPluginDescriptorException {
67
68
69
70
71
72 Map<String, Map<Integer, List<MojoExecution>>> mappings = new LinkedHashMap<>();
73
74 for (String phase : lifecycle.getPhases()) {
75 Map<Integer, List<MojoExecution>> phaseBindings = new TreeMap<>();
76
77 mappings.put(phase, phaseBindings);
78
79 if (phase.equals(lifecyclePhase)) {
80 break;
81 }
82 }
83
84
85
86
87
88
89
90
91 for (Plugin plugin : project.getBuild().getPlugins()) {
92 for (PluginExecution execution : plugin.getExecutions()) {
93
94
95 if (execution.getPhase() != null) {
96 Map<Integer, List<MojoExecution>> phaseBindings = mappings.get(execution.getPhase());
97 if (phaseBindings != null) {
98 for (String goal : execution.getGoals()) {
99 MojoExecution mojoExecution = new MojoExecution(plugin, goal, execution.getId());
100 mojoExecution.setLifecyclePhase(execution.getPhase());
101 addMojoExecution(phaseBindings, mojoExecution, execution.getPriority());
102 }
103 }
104 }
105
106 else {
107 for (String goal : execution.getGoals()) {
108 MojoDescriptor mojoDescriptor = pluginManager.getMojoDescriptor(
109 plugin, goal, project.getRemotePluginRepositories(), session.getRepositorySession());
110
111 Map<Integer, List<MojoExecution>> phaseBindings = mappings.get(mojoDescriptor.getPhase());
112 if (phaseBindings != null) {
113 MojoExecution mojoExecution = new MojoExecution(mojoDescriptor, execution.getId());
114 mojoExecution.setLifecyclePhase(mojoDescriptor.getPhase());
115 addMojoExecution(phaseBindings, mojoExecution, execution.getPriority());
116 }
117 }
118 }
119 }
120 }
121
122 Map<String, List<MojoExecution>> lifecycleMappings = new LinkedHashMap<>();
123
124 for (Map.Entry<String, Map<Integer, List<MojoExecution>>> entry : mappings.entrySet()) {
125 List<MojoExecution> mojoExecutions = new ArrayList<>();
126
127 for (List<MojoExecution> executions : entry.getValue().values()) {
128 mojoExecutions.addAll(executions);
129 }
130
131 lifecycleMappings.put(entry.getKey(), mojoExecutions);
132 }
133
134 return lifecycleMappings;
135 }
136
137 private void addMojoExecution(
138 Map<Integer, List<MojoExecution>> phaseBindings, MojoExecution mojoExecution, int priority) {
139 List<MojoExecution> mojoExecutions = phaseBindings.computeIfAbsent(priority, k -> new ArrayList<>());
140
141 mojoExecutions.add(mojoExecution);
142 }
143 }