View Javadoc
1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one
3    * or more contributor license agreements.  See the NOTICE file
4    * distributed with this work for additional information
5    * regarding copyright ownership.  The ASF licenses this file
6    * to you under the Apache License, Version 2.0 (the
7    * "License"); you may not use this file except in compliance
8    * with the License.  You may obtain a copy of the License at
9    *
10   *   http://www.apache.org/licenses/LICENSE-2.0
11   *
12   * Unless required by applicable law or agreed to in writing,
13   * software distributed under the License is distributed on an
14   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15   * KIND, either express or implied.  See the License for the
16   * specific language governing permissions and limitations
17   * under the License.
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   * Handles profile injection into the model.
47   *
48   * @deprecated use {@code org.apache.maven.api.services.ModelBuilder} instead
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       * ProfileModelMerger
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 }