1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package org.apache.maven.model.plugin;
20
21 import java.util.ArrayList;
22 import java.util.Collection;
23 import java.util.Collections;
24 import java.util.LinkedHashMap;
25 import java.util.List;
26 import java.util.Map;
27
28 import org.apache.maven.lifecycle.LifeCyclePluginAnalyzer;
29 import org.apache.maven.model.Build;
30 import org.apache.maven.model.Model;
31 import org.apache.maven.model.Plugin;
32 import org.apache.maven.model.PluginContainer;
33 import org.apache.maven.model.PluginExecution;
34 import org.apache.maven.model.PluginManagement;
35 import org.apache.maven.model.building.ModelBuildingRequest;
36 import org.apache.maven.model.building.ModelProblem.Severity;
37 import org.apache.maven.model.building.ModelProblem.Version;
38 import org.apache.maven.model.building.ModelProblemCollector;
39 import org.apache.maven.model.building.ModelProblemCollectorRequest;
40 import org.apache.maven.model.merge.MavenModelMerger;
41 import org.codehaus.plexus.component.annotations.Component;
42 import org.codehaus.plexus.component.annotations.Requirement;
43
44
45
46
47
48
49 @Component(role = LifecycleBindingsInjector.class)
50 public class DefaultLifecycleBindingsInjector implements LifecycleBindingsInjector {
51
52 private LifecycleBindingsMerger merger = new LifecycleBindingsMerger();
53
54 @Requirement
55 private LifeCyclePluginAnalyzer lifecycle;
56
57 public void injectLifecycleBindings(Model model, ModelBuildingRequest request, ModelProblemCollector problems) {
58 String packaging = model.getPackaging();
59
60 Collection<Plugin> defaultPlugins = lifecycle.getPluginsBoundByDefaultToAllLifecycles(packaging);
61
62 if (defaultPlugins == null) {
63 problems.add(new ModelProblemCollectorRequest(Severity.ERROR, Version.BASE)
64 .setMessage("Unknown packaging: " + packaging)
65 .setLocation(model.getLocation("packaging")));
66 } else if (!defaultPlugins.isEmpty()) {
67 Model lifecycleModel = new Model();
68 lifecycleModel.setBuild(new Build());
69 lifecycleModel.getBuild().getPlugins().addAll(defaultPlugins);
70
71 merger.merge(model, lifecycleModel);
72 }
73 }
74
75
76
77
78 protected static class LifecycleBindingsMerger extends MavenModelMerger {
79
80 private static final String PLUGIN_MANAGEMENT = "plugin-management";
81
82 public void merge(Model target, Model source) {
83 if (target.getBuild() == null) {
84 target.setBuild(new Build());
85 }
86
87 Map<Object, Object> context = Collections.<Object, Object>singletonMap(
88 PLUGIN_MANAGEMENT, target.getBuild().getPluginManagement());
89
90 mergePluginContainer_Plugins(target.getBuild(), source.getBuild(), false, context);
91 }
92
93 @SuppressWarnings({"checkstyle:methodname"})
94 @Override
95 protected void mergePluginContainer_Plugins(
96 PluginContainer target, PluginContainer source, boolean sourceDominant, Map<Object, Object> context) {
97 List<Plugin> src = source.getPlugins();
98 if (!src.isEmpty()) {
99 List<Plugin> tgt = target.getPlugins();
100
101 Map<Object, Plugin> merged = new LinkedHashMap<>((src.size() + tgt.size()) * 2);
102
103 for (Plugin element : tgt) {
104 Object key = getPluginKey(element);
105 merged.put(key, element);
106 }
107
108 Map<Object, Plugin> added = new LinkedHashMap<>();
109
110 for (Plugin element : src) {
111 Object key = getPluginKey(element);
112 Plugin existing = merged.get(key);
113 if (existing != null) {
114 mergePlugin(existing, element, sourceDominant, context);
115 } else {
116 merged.put(key, element);
117 added.put(key, element);
118 }
119 }
120
121 if (!added.isEmpty()) {
122 PluginManagement pluginMgmt = (PluginManagement) context.get(PLUGIN_MANAGEMENT);
123 if (pluginMgmt != null) {
124 for (Plugin managedPlugin : pluginMgmt.getPlugins()) {
125 Object key = getPluginKey(managedPlugin);
126 Plugin addedPlugin = added.get(key);
127 if (addedPlugin != null) {
128 Plugin plugin = managedPlugin.clone();
129 mergePlugin(plugin, addedPlugin, sourceDominant, Collections.emptyMap());
130 merged.put(key, plugin);
131 }
132 }
133 }
134 }
135
136 List<Plugin> result = new ArrayList<>(merged.values());
137
138 target.setPlugins(result);
139 }
140 }
141
142 @Override
143 protected void mergePluginExecution(
144 PluginExecution target, PluginExecution source, boolean sourceDominant, Map<Object, Object> context) {
145 super.mergePluginExecution(target, source, sourceDominant, context);
146
147 target.setPriority(Math.min(target.getPriority(), source.getPriority()));
148 }
149 }
150 }