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