1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package org.apache.maven.model.profile;
20
21 import javax.inject.Named;
22 import javax.inject.Singleton;
23
24 import java.util.ArrayList;
25 import java.util.Collections;
26 import java.util.LinkedHashMap;
27 import java.util.List;
28 import java.util.Map;
29
30 import org.apache.maven.model.Build;
31 import org.apache.maven.model.BuildBase;
32 import org.apache.maven.model.Model;
33 import org.apache.maven.model.ModelBase;
34 import org.apache.maven.model.Plugin;
35 import org.apache.maven.model.PluginContainer;
36 import org.apache.maven.model.PluginExecution;
37 import org.apache.maven.model.Profile;
38 import org.apache.maven.model.ReportPlugin;
39 import org.apache.maven.model.ReportSet;
40 import org.apache.maven.model.Reporting;
41 import org.apache.maven.model.building.ModelBuildingRequest;
42 import org.apache.maven.model.building.ModelProblemCollector;
43 import org.apache.maven.model.merge.MavenModelMerger;
44
45
46
47
48
49
50 @Named
51 @Singleton
52 @Deprecated(since = "4.0.0")
53 @SuppressWarnings({"checkstyle:methodname"})
54 public class DefaultProfileInjector implements ProfileInjector {
55
56 private ProfileModelMerger merger = new ProfileModelMerger();
57
58 @Override
59 public void injectProfile(
60 Model model, Profile profile, ModelBuildingRequest request, ModelProblemCollector problems) {
61 if (profile != null) {
62 merger.mergeModelBase(model, profile);
63
64 if (profile.getBuild() != null) {
65 if (model.getBuild() == null) {
66 model.setBuild(new Build());
67 }
68 merger.mergeBuildBase(model.getBuild(), profile.getBuild());
69 }
70 }
71 }
72
73
74
75
76 protected static class ProfileModelMerger extends MavenModelMerger {
77
78 public void mergeModelBase(ModelBase target, ModelBase source) {
79 mergeModelBase(target, source, true, Collections.emptyMap());
80 }
81
82 public void mergeBuildBase(BuildBase target, BuildBase source) {
83 mergeBuildBase(target, source, true, Collections.emptyMap());
84 }
85
86 @Override
87 protected void mergePluginContainer_Plugins(
88 PluginContainer target, PluginContainer source, boolean sourceDominant, Map<Object, Object> context) {
89 List<Plugin> src = source.getPlugins();
90 if (!src.isEmpty()) {
91 List<Plugin> tgt = target.getPlugins();
92 Map<Object, Plugin> master = new LinkedHashMap<>(tgt.size() * 2);
93
94 for (Plugin element : tgt) {
95 Object key = getPluginKey(element);
96 master.put(key, element);
97 }
98
99 Map<Object, List<Plugin>> predecessors = new LinkedHashMap<>();
100 List<Plugin> pending = new ArrayList<>();
101 for (Plugin element : src) {
102 Object key = getPluginKey(element);
103 Plugin existing = master.get(key);
104 if (existing != null) {
105 mergePlugin(existing, element, sourceDominant, context);
106
107 if (!pending.isEmpty()) {
108 predecessors.put(key, pending);
109 pending = new ArrayList<>();
110 }
111 } else {
112 pending.add(element.clone());
113 }
114 }
115
116 List<Plugin> result = new ArrayList<>(src.size() + tgt.size());
117 for (Map.Entry<Object, Plugin> entry : master.entrySet()) {
118 List<Plugin> pre = predecessors.get(entry.getKey());
119 if (pre != null) {
120 result.addAll(pre);
121 }
122 result.add(entry.getValue());
123 }
124 result.addAll(pending);
125
126 target.setPlugins(result);
127 }
128 }
129
130 @Override
131 protected void mergePlugin_Executions(
132 Plugin target, Plugin source, boolean sourceDominant, Map<Object, Object> context) {
133 List<PluginExecution> src = source.getExecutions();
134 if (!src.isEmpty()) {
135 List<PluginExecution> tgt = target.getExecutions();
136 Map<Object, PluginExecution> merged = new LinkedHashMap<>((src.size() + tgt.size()) * 2);
137
138 for (PluginExecution element : tgt) {
139 Object key = getPluginExecutionKey(element);
140 merged.put(key, element);
141 }
142
143 for (PluginExecution element : src) {
144 Object key = getPluginExecutionKey(element);
145 PluginExecution existing = merged.get(key);
146 if (existing != null) {
147 mergePluginExecution(existing, element, sourceDominant, context);
148 } else {
149 merged.put(key, element.clone());
150 }
151 }
152
153 target.setExecutions(new ArrayList<>(merged.values()));
154 }
155 }
156
157 @Override
158 protected void mergeReporting_Plugins(
159 Reporting target, Reporting source, boolean sourceDominant, Map<Object, Object> context) {
160 List<ReportPlugin> src = source.getPlugins();
161 if (!src.isEmpty()) {
162 List<ReportPlugin> tgt = target.getPlugins();
163 Map<Object, ReportPlugin> merged = new LinkedHashMap<>((src.size() + tgt.size()) * 2);
164
165 for (ReportPlugin element : tgt) {
166 Object key = getReportPluginKey(element);
167 merged.put(key, element);
168 }
169
170 for (ReportPlugin element : src) {
171 Object key = getReportPluginKey(element);
172 ReportPlugin existing = merged.get(key);
173 if (existing == null) {
174 merged.put(key, element.clone());
175 } else {
176 mergeReportPlugin(existing, element, sourceDominant, context);
177 }
178 }
179
180 target.setPlugins(new ArrayList<>(merged.values()));
181 }
182 }
183
184 @Override
185 protected void mergeReportPlugin_ReportSets(
186 ReportPlugin target, ReportPlugin source, boolean sourceDominant, Map<Object, Object> context) {
187 List<ReportSet> src = source.getReportSets();
188 if (!src.isEmpty()) {
189 List<ReportSet> tgt = target.getReportSets();
190 Map<Object, ReportSet> merged = new LinkedHashMap<>((src.size() + tgt.size()) * 2);
191
192 for (ReportSet element : tgt) {
193 Object key = getReportSetKey(element);
194 merged.put(key, element);
195 }
196
197 for (ReportSet element : src) {
198 Object key = getReportSetKey(element);
199 ReportSet existing = merged.get(key);
200 if (existing != null) {
201 mergeReportSet(existing, element, sourceDominant, context);
202 } else {
203 merged.put(key, element.clone());
204 }
205 }
206
207 target.setReportSets(new ArrayList<>(merged.values()));
208 }
209 }
210 }
211 }