View Javadoc

1   package org.apache.maven.model.merge;
2   
3   /*
4    * Licensed to the Apache Software Foundation (ASF) under one
5    * or more contributor license agreements.  See the NOTICE file
6    * distributed with this work for additional information
7    * regarding copyright ownership.  The ASF licenses this file
8    * to you under the Apache License, Version 2.0 (the
9    * "License"); you may not use this file except in compliance
10   * with the License.  You may obtain a copy of the License at
11   *
12   *   http://www.apache.org/licenses/LICENSE-2.0
13   *
14   * Unless required by applicable law or agreed to in writing,
15   * software distributed under the License is distributed on an
16   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
17   * KIND, either express or implied.  See the License for the
18   * specific language governing permissions and limitations
19   * under the License.
20   */
21  
22  import java.util.ArrayList;
23  import java.util.HashMap;
24  import java.util.LinkedHashMap;
25  import java.util.List;
26  import java.util.Map;
27  import java.util.Properties;
28  
29  import org.apache.maven.model.Activation;
30  import org.apache.maven.model.Build;
31  import org.apache.maven.model.BuildBase;
32  import org.apache.maven.model.CiManagement;
33  import org.apache.maven.model.ConfigurationContainer;
34  import org.apache.maven.model.Contributor;
35  import org.apache.maven.model.Dependency;
36  import org.apache.maven.model.DependencyManagement;
37  import org.apache.maven.model.DeploymentRepository;
38  import org.apache.maven.model.Developer;
39  import org.apache.maven.model.DistributionManagement;
40  import org.apache.maven.model.Exclusion;
41  import org.apache.maven.model.Extension;
42  import org.apache.maven.model.FileSet;
43  import org.apache.maven.model.InputLocation;
44  import org.apache.maven.model.IssueManagement;
45  import org.apache.maven.model.License;
46  import org.apache.maven.model.MailingList;
47  import org.apache.maven.model.Model;
48  import org.apache.maven.model.ModelBase;
49  import org.apache.maven.model.Notifier;
50  import org.apache.maven.model.Organization;
51  import org.apache.maven.model.Parent;
52  import org.apache.maven.model.PatternSet;
53  import org.apache.maven.model.Plugin;
54  import org.apache.maven.model.PluginConfiguration;
55  import org.apache.maven.model.PluginContainer;
56  import org.apache.maven.model.PluginExecution;
57  import org.apache.maven.model.PluginManagement;
58  import org.apache.maven.model.Prerequisites;
59  import org.apache.maven.model.Profile;
60  import org.apache.maven.model.Relocation;
61  import org.apache.maven.model.ReportPlugin;
62  import org.apache.maven.model.ReportSet;
63  import org.apache.maven.model.Reporting;
64  import org.apache.maven.model.Repository;
65  import org.apache.maven.model.RepositoryBase;
66  import org.apache.maven.model.RepositoryPolicy;
67  import org.apache.maven.model.Resource;
68  import org.apache.maven.model.Scm;
69  import org.apache.maven.model.Site;
70  import org.codehaus.plexus.util.xml.Xpp3Dom;
71  
72  /**
73   * This is a hand-crafted prototype of the default model merger that should eventually be generated by Modello by a new
74   * Java plugin. Code structure to merge source (read-only) object into the target object is:<ul>
75   * <li><code>merge<i>Classname</i>( <i>Classname</i> target, <i>Classname</i> source, boolean sourceDominant,
76   * Map<Object, Object> context )</code> for each model class</li>
77   * <li><code>merge<i>Classname</i>_<i>FieldName</i>( <i>Classname</i> target, <i>Classname</i> source, boolean
78   * sourceDominant, Map<Object, Object> context )</code> for each field of each model class</li>
79   * <li><code>Object get<i>Classname</i>Key( <i>Classname</i> <i>classname</i> )</code> for each class that is used in a list</li>
80   * </ul>
81   * Code is written like it could be generated, with default behaviour to be overridden when necessary.
82   * This is particularly the case for <code>Object get<i>Classname</i>Key( <i>Classname</i> <i>classname</i> )</code> method,
83   * which by default return the object itself and is expected to be overridden to calculate better suited key value.
84   *
85   * @author Benjamin Bentmann
86   */
87  public class ModelMerger
88  {
89  
90      /**
91       * Merges the specified source object into the given target object.
92       *
93       * @param target The target object whose existing contents should be merged with the source, must not be
94       *            <code>null</code>.
95       * @param source The (read-only) source object that should be merged into the target object, may be
96       *            <code>null</code>.
97       * @param sourceDominant A flag indicating whether either the target object or the source object provides the
98       *            dominant data.
99       * @param hints A set of key-value pairs that customized merger implementations can use to carry domain-specific
100      *            information along, may be <code>null</code>.
101      */
102     public void merge( Model target, Model source, boolean sourceDominant, Map<?, ?> hints )
103     {
104         if ( target == null )
105         {
106             throw new IllegalArgumentException( "target missing" );
107         }
108 
109         if ( source == null )
110         {
111             return;
112         }
113 
114         Map<Object, Object> context = new HashMap<Object, Object>();
115         if ( hints != null )
116         {
117             context.putAll( hints );
118         }
119 
120         mergeModel( target, source, sourceDominant, context );
121     }
122 
123     protected void mergeModel( Model target, Model source, boolean sourceDominant, Map<Object, Object> context )
124     {
125         mergeModelBase( target, source, sourceDominant, context );
126 
127         mergeModel_ModelVersion( target, source, sourceDominant, context );
128         mergeModel_Parent( target, source, sourceDominant, context );
129         mergeModel_GroupId( target, source, sourceDominant, context );
130         mergeModel_ArtifactId( target, source, sourceDominant, context );
131         mergeModel_Version( target, source, sourceDominant, context );
132         mergeModel_Packaging( target, source, sourceDominant, context );
133         mergeModel_Name( target, source, sourceDominant, context );
134         mergeModel_Description( target, source, sourceDominant, context );
135         mergeModel_Url( target, source, sourceDominant, context );
136         mergeModel_InceptionYear( target, source, sourceDominant, context );
137         mergeModel_Organization( target, source, sourceDominant, context );
138         mergeModel_Licenses( target, source, sourceDominant, context );
139         mergeModel_MailingLists( target, source, sourceDominant, context );
140         mergeModel_Developers( target, source, sourceDominant, context );
141         mergeModel_Contributors( target, source, sourceDominant, context );
142         mergeModel_IssueManagement( target, source, sourceDominant, context );
143         mergeModel_Scm( target, source, sourceDominant, context );
144         mergeModel_CiManagement( target, source, sourceDominant, context );
145         mergeModel_Prerequisites( target, source, sourceDominant, context );
146         mergeModel_Build( target, source, sourceDominant, context );
147         mergeModel_Profiles( target, source, sourceDominant, context );
148     }
149 
150     protected void mergeModel_ModelVersion( Model target, Model source, boolean sourceDominant,
151                                             Map<Object, Object> context )
152     {
153         String src = source.getModelVersion();
154         if ( src != null )
155         {
156             if ( sourceDominant || target.getModelVersion() == null )
157             {
158                 target.setModelVersion( src );
159                 target.setLocation( "modelVersion", source.getLocation( "modelVersion" ) );
160             }
161         }
162     }
163 
164     protected void mergeModel_Parent( Model target, Model source, boolean sourceDominant, Map<Object, Object> context )
165     {
166         Parent src = source.getParent();
167         if ( src != null )
168         {
169             Parent tgt = target.getParent();
170             if ( tgt == null )
171             {
172                 tgt = new Parent();
173                 tgt.setRelativePath( null );
174                 target.setParent( tgt );
175             }
176             mergeParent( tgt, src, sourceDominant, context );
177         }
178     }
179 
180     protected void mergeModel_GroupId( Model target, Model source, boolean sourceDominant,
181                                        Map<Object, Object> context )
182     {
183         String src = source.getGroupId();
184         if ( src != null )
185         {
186             if ( sourceDominant || target.getGroupId() == null )
187             {
188                 target.setGroupId( src );
189                 target.setLocation( "groupId", source.getLocation( "groupId" ) );
190             }
191         }
192     }
193 
194     protected void mergeModel_ArtifactId( Model target, Model source, boolean sourceDominant,
195                                           Map<Object, Object> context )
196     {
197         String src = source.getArtifactId();
198         if ( src != null )
199         {
200             if ( sourceDominant || target.getArtifactId() == null )
201             {
202                 target.setArtifactId( src );
203                 target.setLocation( "artifactId", source.getLocation( "artifactId" ) );
204             }
205         }
206     }
207 
208     protected void mergeModel_Version( Model target, Model source, boolean sourceDominant,
209                                        Map<Object, Object> context )
210     {
211         String src = source.getVersion();
212         if ( src != null )
213         {
214             if ( sourceDominant || target.getVersion() == null )
215             {
216                 target.setVersion( src );
217                 target.setLocation( "version", source.getLocation( "version" ) );
218             }
219         }
220     }
221 
222     protected void mergeModel_Packaging( Model target, Model source, boolean sourceDominant,
223                                          Map<Object, Object> context )
224     {
225         String src = source.getPackaging();
226         if ( src != null )
227         {
228             if ( sourceDominant || target.getPackaging() == null )
229             {
230                 target.setPackaging( src );
231                 target.setLocation( "packaging", source.getLocation( "packaging" ) );
232             }
233         }
234     }
235 
236     protected void mergeModel_Name( Model target, Model source, boolean sourceDominant, Map<Object, Object> context )
237     {
238         String src = source.getName();
239         if ( src != null )
240         {
241             if ( sourceDominant || target.getName() == null )
242             {
243                 target.setName( src );
244                 target.setLocation( "name", source.getLocation( "name" ) );
245             }
246         }
247     }
248 
249     protected void mergeModel_Description( Model target, Model source, boolean sourceDominant,
250                                            Map<Object, Object> context )
251     {
252         String src = source.getDescription();
253         if ( src != null )
254         {
255             if ( sourceDominant || target.getDescription() == null )
256             {
257                 target.setDescription( src );
258                 target.setLocation( "description", source.getLocation( "description" ) );
259             }
260         }
261     }
262 
263     protected void mergeModel_Url( Model target, Model source, boolean sourceDominant, Map<Object, Object> context )
264     {
265         String src = source.getUrl();
266         if ( src != null )
267         {
268             if ( sourceDominant || target.getUrl() == null )
269             {
270                 target.setUrl( src );
271                 target.setLocation( "url", source.getLocation( "url" ) );
272             }
273         }
274     }
275 
276     protected void mergeModel_InceptionYear( Model target, Model source, boolean sourceDominant,
277                                              Map<Object, Object> context )
278     {
279         String src = source.getInceptionYear();
280         if ( src != null )
281         {
282             if ( sourceDominant || target.getInceptionYear() == null )
283             {
284                 target.setInceptionYear( src );
285                 target.setLocation( "inceptionYear", source.getLocation( "inceptionYear" ) );
286             }
287         }
288     }
289 
290     protected void mergeModel_Organization( Model target, Model source, boolean sourceDominant,
291                                             Map<Object, Object> context )
292     {
293         Organization src = source.getOrganization();
294         if ( src != null )
295         {
296             Organization tgt = target.getOrganization();
297             if ( tgt == null )
298             {
299                 tgt = new Organization();
300                 target.setOrganization( tgt );
301             }
302             mergeOrganization( tgt, src, sourceDominant, context );
303         }
304     }
305 
306     protected void mergeModel_Licenses( Model target, Model source, boolean sourceDominant,
307                                         Map<Object, Object> context )
308     {
309         List<License> src = source.getLicenses();
310         if ( !src.isEmpty() )
311         {
312             List<License> tgt = target.getLicenses();
313             Map<Object, License> merged = new LinkedHashMap<Object, License>( ( src.size() + tgt.size() ) * 2 );
314 
315             for ( License element : tgt )
316             {
317                 Object key = getLicenseKey( element );
318                 merged.put( key, element );
319             }
320 
321             for ( License element : src )
322             {
323                 Object key = getLicenseKey( element );
324                 if ( sourceDominant || !merged.containsKey( key ) )
325                 {
326                     merged.put( key, element );
327                 }
328             }
329 
330             target.setLicenses( new ArrayList<License>( merged.values() ) );
331         }
332     }
333 
334     protected void mergeModel_MailingLists( Model target, Model source, boolean sourceDominant,
335                                             Map<Object, Object> context )
336     {
337         List<MailingList> src = source.getMailingLists();
338         if ( !src.isEmpty() )
339         {
340             List<MailingList> tgt = target.getMailingLists();
341             Map<Object, MailingList> merged = new LinkedHashMap<Object, MailingList>( ( src.size() + tgt.size() ) * 2 );
342 
343             for ( MailingList element : tgt )
344             {
345                 Object key = getMailingListKey( element );
346                 merged.put( key, element );
347             }
348 
349             for ( MailingList element : src )
350             {
351                 Object key = getMailingListKey( element );
352                 if ( sourceDominant || !merged.containsKey( key ) )
353                 {
354                     merged.put( key, element );
355                 }
356             }
357 
358             target.setMailingLists( new ArrayList<MailingList>( merged.values() ) );
359         }
360     }
361 
362     protected void mergeModel_Developers( Model target, Model source, boolean sourceDominant,
363                                           Map<Object, Object> context )
364     {
365         List<Developer> src = source.getDevelopers();
366         if ( !src.isEmpty() )
367         {
368             List<Developer> tgt = target.getDevelopers();
369             Map<Object, Developer> merged = new LinkedHashMap<Object, Developer>( ( src.size() + tgt.size() ) * 2 );
370 
371             for ( Developer element : tgt )
372             {
373                 Object key = getDeveloperKey( element );
374                 merged.put( key, element );
375             }
376 
377             for ( Developer element : src )
378             {
379                 Object key = getDeveloperKey( element );
380                 if ( sourceDominant || !merged.containsKey( key ) )
381                 {
382                     merged.put( key, element );
383                 }
384             }
385 
386             target.setDevelopers( new ArrayList<Developer>( merged.values() ) );
387         }
388     }
389 
390     protected void mergeModel_Contributors( Model target, Model source, boolean sourceDominant,
391                                             Map<Object, Object> context )
392     {
393         List<Contributor> src = source.getContributors();
394         if ( !src.isEmpty() )
395         {
396             List<Contributor> tgt = target.getContributors();
397             Map<Object, Contributor> merged = new LinkedHashMap<Object, Contributor>( ( src.size() + tgt.size() ) * 2 );
398 
399             for ( Contributor element : tgt )
400             {
401                 Object key = getContributorKey( element );
402                 merged.put( key, element );
403             }
404 
405             for ( Contributor element : src )
406             {
407                 Object key = getContributorKey( element );
408                 if ( sourceDominant || !merged.containsKey( key ) )
409                 {
410                     merged.put( key, element );
411                 }
412             }
413 
414             target.setContributors( new ArrayList<Contributor>( merged.values() ) );
415         }
416     }
417 
418     protected void mergeModel_IssueManagement( Model target, Model source, boolean sourceDominant,
419                                                Map<Object, Object> context )
420     {
421         IssueManagement src = source.getIssueManagement();
422         if ( src != null )
423         {
424             IssueManagement tgt = target.getIssueManagement();
425             if ( tgt == null )
426             {
427                 tgt = new IssueManagement();
428                 target.setIssueManagement( tgt );
429             }
430             mergeIssueManagement( tgt, src, sourceDominant, context );
431         }
432     }
433 
434     protected void mergeModel_Scm( Model target, Model source, boolean sourceDominant, Map<Object, Object> context )
435     {
436         Scm src = source.getScm();
437         if ( src != null )
438         {
439             Scm tgt = target.getScm();
440             if ( tgt == null )
441             {
442                 tgt = new Scm();
443                 tgt.setTag( null );
444                 target.setScm( tgt );
445             }
446             mergeScm( tgt, src, sourceDominant, context );
447         }
448     }
449 
450     protected void mergeModel_CiManagement( Model target, Model source, boolean sourceDominant,
451                                             Map<Object, Object> context )
452     {
453         CiManagement src = source.getCiManagement();
454         if ( src != null )
455         {
456             CiManagement tgt = target.getCiManagement();
457             if ( tgt == null )
458             {
459                 tgt = new CiManagement();
460                 target.setCiManagement( tgt );
461             }
462             mergeCiManagement( tgt, src, sourceDominant, context );
463         }
464     }
465 
466     protected void mergeModel_Prerequisites( Model target, Model source, boolean sourceDominant,
467                                              Map<Object, Object> context )
468     {
469         Prerequisites src = source.getPrerequisites();
470         if ( src != null )
471         {
472             Prerequisites tgt = target.getPrerequisites();
473             if ( tgt == null )
474             {
475                 tgt = new Prerequisites();
476                 tgt.setMaven( null );
477                 target.setPrerequisites( tgt );
478             }
479             mergePrerequisites( tgt, src, sourceDominant, context );
480         }
481     }
482 
483     protected void mergeModel_Build( Model target, Model source, boolean sourceDominant, Map<Object, Object> context )
484     {
485         Build src = source.getBuild();
486         if ( src != null )
487         {
488             Build tgt = target.getBuild();
489             if ( tgt == null )
490             {
491                 tgt = new Build();
492                 target.setBuild( tgt );
493             }
494             mergeBuild( tgt, src, sourceDominant, context );
495         }
496     }
497 
498     protected void mergeModel_Profiles( Model target, Model source, boolean sourceDominant,
499                                         Map<Object, Object> context )
500     {
501         List<Profile> src = source.getProfiles();
502         if ( !src.isEmpty() )
503         {
504             List<Profile> tgt = target.getProfiles();
505             Map<Object, Profile> merged = new LinkedHashMap<Object, Profile>( ( src.size() + tgt.size() ) * 2 );
506 
507             for ( Profile element : tgt )
508             {
509                 Object key = getProfileKey( element );
510                 merged.put( key, element );
511             }
512 
513             for ( Profile element : src )
514             {
515                 Object key = getProfileKey( element );
516                 if ( sourceDominant || !merged.containsKey( key ) )
517                 {
518                     merged.put( key, element );
519                 }
520             }
521 
522             target.setProfiles( new ArrayList<Profile>( merged.values() ) );
523         }
524     }
525 
526     protected void mergeModelBase( ModelBase target, ModelBase source, boolean sourceDominant,
527                                    Map<Object, Object> context )
528     {
529         mergeModelBase_DistributionManagement( target, source, sourceDominant, context );
530         mergeModelBase_Modules( target, source, sourceDominant, context );
531         mergeModelBase_Repositories( target, source, sourceDominant, context );
532         mergeModelBase_PluginRepositories( target, source, sourceDominant, context );
533         mergeModelBase_Dependencies( target, source, sourceDominant, context );
534         mergeModelBase_Reporting( target, source, sourceDominant, context );
535         mergeModelBase_DependencyManagement( target, source, sourceDominant, context );
536         mergeModelBase_Properties( target, source, sourceDominant, context );
537     }
538 
539     protected void mergeModelBase_Modules( ModelBase target, ModelBase source, boolean sourceDominant,
540                                            Map<Object, Object> context )
541     {
542         List<String> src = source.getModules();
543         if ( !src.isEmpty() )
544         {
545             List<String> tgt = target.getModules();
546             List<String> merged = new ArrayList<String>( tgt.size() + src.size() );
547             merged.addAll( tgt );
548             merged.addAll( src );
549             target.setModules( merged );
550         }
551     }
552 
553     protected void mergeModelBase_Dependencies( ModelBase target, ModelBase source, boolean sourceDominant,
554                                                 Map<Object, Object> context )
555     {
556         List<Dependency> src = source.getDependencies();
557         if ( !src.isEmpty() )
558         {
559             List<Dependency> tgt = target.getDependencies();
560             Map<Object, Dependency> merged = new LinkedHashMap<Object, Dependency>( ( src.size() + tgt.size() ) * 2 );
561 
562             for ( Dependency element : tgt )
563             {
564                 Object key = getDependencyKey( element );
565                 merged.put( key, element );
566             }
567 
568             for ( Dependency element : src )
569             {
570                 Object key = getDependencyKey( element );
571                 if ( sourceDominant || !merged.containsKey( key ) )
572                 {
573                     merged.put( key, element );
574                 }
575             }
576 
577             target.setDependencies( new ArrayList<Dependency>( merged.values() ) );
578         }
579     }
580 
581     protected void mergeModelBase_Repositories( ModelBase target, ModelBase source, boolean sourceDominant,
582                                                 Map<Object, Object> context )
583     {
584         List<Repository> src = source.getRepositories();
585         if ( !src.isEmpty() )
586         {
587             List<Repository> tgt = target.getRepositories();
588             Map<Object, Repository> merged = new LinkedHashMap<Object, Repository>( ( src.size() + tgt.size() ) * 2 );
589 
590             for ( Repository element : tgt )
591             {
592                 Object key = getRepositoryKey( element );
593                 merged.put( key, element );
594             }
595 
596             for ( Repository element : src )
597             {
598                 Object key = getRepositoryKey( element );
599                 if ( sourceDominant || !merged.containsKey( key ) )
600                 {
601                     merged.put( key, element );
602                 }
603             }
604 
605             target.setRepositories( new ArrayList<Repository>( merged.values() ) );
606         }
607     }
608 
609     protected void mergeModelBase_PluginRepositories( ModelBase target, ModelBase source, boolean sourceDominant,
610                                                       Map<Object, Object> context )
611     {
612         List<Repository> src = source.getPluginRepositories();
613         if ( !src.isEmpty() )
614         {
615             List<Repository> tgt = target.getPluginRepositories();
616             Map<Object, Repository> merged = new LinkedHashMap<Object, Repository>( ( src.size() + tgt.size() ) * 2 );
617 
618             for ( Repository element : tgt )
619             {
620                 Object key = getRepositoryKey( element );
621                 merged.put( key, element );
622             }
623 
624             for ( Repository element : src )
625             {
626                 Object key = getRepositoryKey( element );
627                 if ( sourceDominant || !merged.containsKey( key ) )
628                 {
629                     merged.put( key, element );
630                 }
631             }
632 
633             target.setPluginRepositories( new ArrayList<Repository>( merged.values() ) );
634         }
635     }
636 
637     protected void mergeModelBase_DistributionManagement( ModelBase target, ModelBase source, boolean sourceDominant,
638                                                           Map<Object, Object> context )
639     {
640         DistributionManagement src = source.getDistributionManagement();
641         if ( src != null )
642         {
643             DistributionManagement tgt = target.getDistributionManagement();
644             if ( tgt == null )
645             {
646                 tgt = new DistributionManagement();
647                 target.setDistributionManagement( tgt );
648             }
649             mergeDistributionManagement( tgt, src, sourceDominant, context );
650         }
651     }
652 
653     protected void mergeModelBase_Reporting( ModelBase target, ModelBase source, boolean sourceDominant,
654                                              Map<Object, Object> context )
655     {
656         Reporting src = source.getReporting();
657         if ( src != null )
658         {
659             Reporting tgt = target.getReporting();
660             if ( tgt == null )
661             {
662                 tgt = new Reporting();
663                 target.setReporting( tgt );
664             }
665             mergeReporting( tgt, src, sourceDominant, context );
666         }
667     }
668 
669     protected void mergeModelBase_DependencyManagement( ModelBase target, ModelBase source, boolean sourceDominant,
670                                                         Map<Object, Object> context )
671     {
672         DependencyManagement src = source.getDependencyManagement();
673         if ( src != null )
674         {
675             DependencyManagement tgt = target.getDependencyManagement();
676             if ( tgt == null )
677             {
678                 tgt = new DependencyManagement();
679                 target.setDependencyManagement( tgt );
680             }
681             mergeDependencyManagement( tgt, src, sourceDominant, context );
682         }
683     }
684 
685     protected void mergeModelBase_Properties( ModelBase target, ModelBase source, boolean sourceDominant,
686                                               Map<Object, Object> context )
687     {
688         Properties merged = new Properties();
689         if ( sourceDominant )
690         {
691             merged.putAll( target.getProperties() );
692             merged.putAll( source.getProperties() );
693         }
694         else
695         {
696             merged.putAll( source.getProperties() );
697             merged.putAll( target.getProperties() );
698         }
699         target.setProperties( merged );
700         target.setLocation( "properties", InputLocation.merge( target.getLocation( "properties" ),
701                                                                source.getLocation( "properties" ), sourceDominant ) );
702     }
703 
704     protected void mergeDistributionManagement( DistributionManagement target, DistributionManagement source,
705                                                 boolean sourceDominant, Map<Object, Object> context )
706     {
707         mergeDistributionManagement_Repository( target, source, sourceDominant, context );
708         mergeDistributionManagement_SnapshotRepository( target, source, sourceDominant, context );
709         mergeDistributionManagement_Site( target, source, sourceDominant, context );
710         mergeDistributionManagement_Status( target, source, sourceDominant, context );
711         mergeDistributionManagement_DownloadUrl( target, source, sourceDominant, context );
712     }
713 
714     protected void mergeDistributionManagement_Repository( DistributionManagement target,
715                                                            DistributionManagement source, boolean sourceDominant,
716                                                            Map<Object, Object> context )
717     {
718         DeploymentRepository src = source.getRepository();
719         if ( src != null )
720         {
721             DeploymentRepository tgt = target.getRepository();
722             if ( tgt == null )
723             {
724                 tgt = new DeploymentRepository();
725                 target.setRepository( tgt );
726             }
727             mergeDeploymentRepository( tgt, src, sourceDominant, context );
728         }
729     }
730 
731     protected void mergeDistributionManagement_SnapshotRepository( DistributionManagement target,
732                                                                    DistributionManagement source,
733                                                                    boolean sourceDominant,
734                                                                    Map<Object, Object> context )
735     {
736         DeploymentRepository src = source.getSnapshotRepository();
737         if ( src != null )
738         {
739             DeploymentRepository tgt = target.getSnapshotRepository();
740             if ( tgt == null )
741             {
742                 tgt = new DeploymentRepository();
743                 target.setSnapshotRepository( tgt );
744             }
745             mergeDeploymentRepository( tgt, src, sourceDominant, context );
746         }
747     }
748 
749     protected void mergeDistributionManagement_Site( DistributionManagement target, DistributionManagement source,
750                                                      boolean sourceDominant, Map<Object, Object> context )
751     {
752         Site src = source.getSite();
753         if ( src != null )
754         {
755             Site tgt = target.getSite();
756             if ( tgt == null )
757             {
758                 tgt = new Site();
759                 target.setSite( tgt );
760             }
761             mergeSite( tgt, src, sourceDominant, context );
762         }
763     }
764 
765     protected void mergeDistributionManagement_Status( DistributionManagement target, DistributionManagement source,
766                                                        boolean sourceDominant, Map<Object, Object> context )
767     {
768         String src = source.getStatus();
769         if ( src != null )
770         {
771             if ( sourceDominant || target.getStatus() == null )
772             {
773                 target.setStatus( src );
774                 target.setLocation( "status", source.getLocation( "status" ) );
775             }
776         }
777     }
778 
779     protected void mergeDistributionManagement_DownloadUrl( DistributionManagement target,
780                                                             DistributionManagement source, boolean sourceDominant,
781                                                             Map<Object, Object> context )
782     {
783         String src = source.getDownloadUrl();
784         if ( src != null )
785         {
786             if ( sourceDominant || target.getDownloadUrl() == null )
787             {
788                 target.setDownloadUrl( src );
789                 target.setLocation( "downloadUrl", source.getLocation( "downloadUrl" ) );
790             }
791         }
792     }
793 
794     protected void mergeRelocation( Relocation target, Relocation source, boolean sourceDominant,
795                                     Map<Object, Object> context )
796     {
797         mergeRelocation_GroupId( target, source, sourceDominant, context );
798         mergeRelocation_ArtifactId( target, source, sourceDominant, context );
799         mergeRelocation_Version( target, source, sourceDominant, context );
800         mergeRelocation_Message( target, source, sourceDominant, context );
801     }
802 
803     protected void mergeRelocation_GroupId( Relocation target, Relocation source, boolean sourceDominant,
804                                             Map<Object, Object> context )
805     {
806         String src = source.getGroupId();
807         if ( src != null )
808         {
809             if ( sourceDominant || target.getGroupId() == null )
810             {
811                 target.setGroupId( src );
812                 target.setLocation( "groupId", source.getLocation( "groupId" ) );
813             }
814         }
815     }
816 
817     protected void mergeRelocation_ArtifactId( Relocation target, Relocation source, boolean sourceDominant,
818                                                Map<Object, Object> context )
819     {
820         String src = source.getArtifactId();
821         if ( src != null )
822         {
823             if ( sourceDominant || target.getArtifactId() == null )
824             {
825                 target.setArtifactId( src );
826                 target.setLocation( "artifactId", source.getLocation( "artifactId" ) );
827             }
828         }
829     }
830 
831     protected void mergeRelocation_Version( Relocation target, Relocation source, boolean sourceDominant,
832                                             Map<Object, Object> context )
833     {
834         String src = source.getVersion();
835         if ( src != null )
836         {
837             if ( sourceDominant || target.getVersion() == null )
838             {
839                 target.setVersion( src );
840                 target.setLocation( "version", source.getLocation( "version" ) );
841             }
842         }
843     }
844 
845     protected void mergeRelocation_Message( Relocation target, Relocation source, boolean sourceDominant,
846                                             Map<Object, Object> context )
847     {
848         String src = source.getMessage();
849         if ( src != null )
850         {
851             if ( sourceDominant || target.getMessage() == null )
852             {
853                 target.setMessage( src );
854                 target.setLocation( "message", source.getLocation( "message" ) );
855             }
856         }
857     }
858 
859     protected void mergeDeploymentRepository( DeploymentRepository target, DeploymentRepository source,
860                                               boolean sourceDominant, Map<Object, Object> context )
861     {
862         mergeRepository( target, source, sourceDominant, context );
863         mergeDeploymentRepository_UniqueVersion( target, source, sourceDominant, context );
864     }
865 
866     protected void mergeDeploymentRepository_UniqueVersion( DeploymentRepository target, DeploymentRepository source,
867                                                             boolean sourceDominant, Map<Object, Object> context )
868     {
869         if ( sourceDominant )
870         {
871             target.setUniqueVersion( source.isUniqueVersion() );
872             target.setLocation( "uniqueVersion", source.getLocation( "uniqueVersion" ) );
873         }
874     }
875 
876     protected void mergeSite( Site target, Site source, boolean sourceDominant, Map<Object, Object> context )
877     {
878         mergeSite_Id( target, source, sourceDominant, context );
879         mergeSite_Name( target, source, sourceDominant, context );
880         mergeSite_Url( target, source, sourceDominant, context );
881     }
882 
883     protected void mergeSite_Id( Site target, Site source, boolean sourceDominant, Map<Object, Object> context )
884     {
885         String src = source.getId();
886         if ( src != null )
887         {
888             if ( sourceDominant || target.getId() == null )
889             {
890                 target.setId( src );
891                 target.setLocation( "id", source.getLocation( "id" ) );
892             }
893         }
894     }
895 
896     protected void mergeSite_Name( Site target, Site source, boolean sourceDominant, Map<Object, Object> context )
897     {
898         String src = source.getName();
899         if ( src != null )
900         {
901             if ( sourceDominant || target.getName() == null )
902             {
903                 target.setName( src );
904                 target.setLocation( "name", source.getLocation( "name" ) );
905             }
906         }
907     }
908 
909     protected void mergeSite_Url( Site target, Site source, boolean sourceDominant, Map<Object, Object> context )
910     {
911         String src = source.getUrl();
912         if ( src != null )
913         {
914             if ( sourceDominant || target.getUrl() == null )
915             {
916                 target.setUrl( src );
917                 target.setLocation( "url", source.getLocation( "url" ) );
918             }
919         }
920     }
921 
922     protected void mergeRepository( Repository target, Repository source, boolean sourceDominant,
923                                     Map<Object, Object> context )
924     {
925         mergeRepositoryBase( target, source, sourceDominant, context );
926         mergeRepository_Releases( target, source, sourceDominant, context );
927         mergeRepository_Snapshots( target, source, sourceDominant, context );
928     }
929 
930     protected void mergeRepository_Releases( Repository target, Repository source, boolean sourceDominant,
931                                              Map<Object, Object> context )
932     {
933         RepositoryPolicy src = source.getReleases();
934         if ( src != null )
935         {
936             RepositoryPolicy tgt = target.getReleases();
937             if ( tgt == null )
938             {
939                 tgt = new RepositoryPolicy();
940                 target.setReleases( tgt );
941             }
942             mergeRepositoryPolicy( tgt, src, sourceDominant, context );
943         }
944     }
945 
946     protected void mergeRepository_Snapshots( Repository target, Repository source, boolean sourceDominant,
947                                               Map<Object, Object> context )
948     {
949         RepositoryPolicy src = source.getSnapshots();
950         if ( src != null )
951         {
952             RepositoryPolicy tgt = target.getSnapshots();
953             if ( tgt == null )
954             {
955                 tgt = new RepositoryPolicy();
956                 target.setSnapshots( tgt );
957             }
958             mergeRepositoryPolicy( tgt, src, sourceDominant, context );
959         }
960     }
961 
962     protected void mergeRepositoryBase( RepositoryBase target, RepositoryBase source, boolean sourceDominant,
963                                         Map<Object, Object> context )
964     {
965         mergeRepositoryBase_Id( target, source, sourceDominant, context );
966         mergeRepositoryBase_Name( target, source, sourceDominant, context );
967         mergeRepositoryBase_Url( target, source, sourceDominant, context );
968         mergeRepositoryBase_Layout( target, source, sourceDominant, context );
969     }
970 
971     protected void mergeRepositoryBase_Id( RepositoryBase target, RepositoryBase source, boolean sourceDominant,
972                                            Map<Object, Object> context )
973     {
974         String src = source.getId();
975         if ( src != null )
976         {
977             if ( sourceDominant || target.getId() == null )
978             {
979                 target.setId( src );
980                 target.setLocation( "id", source.getLocation( "id" ) );
981             }
982         }
983     }
984 
985     protected void mergeRepositoryBase_Url( RepositoryBase target, RepositoryBase source, boolean sourceDominant,
986                                             Map<Object, Object> context )
987     {
988         String src = source.getUrl();
989         if ( src != null )
990         {
991             if ( sourceDominant || target.getUrl() == null )
992             {
993                 target.setUrl( src );
994                 target.setLocation( "url", source.getLocation( "url" ) );
995             }
996         }
997     }
998 
999     protected void mergeRepositoryBase_Name( RepositoryBase target, RepositoryBase source, boolean sourceDominant,
1000                                              Map<Object, Object> context )
1001     {
1002         String src = source.getName();
1003         if ( src != null )
1004         {
1005             if ( sourceDominant || target.getName() == null )
1006             {
1007                 target.setName( src );
1008                 target.setLocation( "name", source.getLocation( "name" ) );
1009             }
1010         }
1011     }
1012 
1013     protected void mergeRepositoryBase_Layout( RepositoryBase target, RepositoryBase source, boolean sourceDominant,
1014                                                Map<Object, Object> context )
1015     {
1016         String src = source.getLayout();
1017         if ( src != null )
1018         {
1019             if ( sourceDominant || target.getLayout() == null )
1020             {
1021                 target.setLayout( src );
1022                 target.setLocation( "layout", source.getLocation( "layout" ) );
1023             }
1024         }
1025     }
1026 
1027     protected void mergeRepositoryPolicy( RepositoryPolicy target, RepositoryPolicy source, boolean sourceDominant,
1028                                           Map<Object, Object> context )
1029     {
1030         mergeRepositoryPolicy_Enabled( target, source, sourceDominant, context );
1031         mergeRepositoryPolicy_UpdatePolicy( target, source, sourceDominant, context );
1032         mergeRepositoryPolicy_ChecksumPolicy( target, source, sourceDominant, context );
1033     }
1034 
1035     protected void mergeRepositoryPolicy_Enabled( RepositoryPolicy target, RepositoryPolicy source,
1036                                                   boolean sourceDominant, Map<Object, Object> context )
1037     {
1038         String src = source.getEnabled();
1039         if ( src != null )
1040         {
1041             if ( sourceDominant || target.getEnabled() == null )
1042             {
1043                 target.setEnabled( src );
1044                 target.setLocation( "enabled", source.getLocation( "enabled" ) );
1045             }
1046         }
1047     }
1048 
1049     protected void mergeRepositoryPolicy_UpdatePolicy( RepositoryPolicy target, RepositoryPolicy source,
1050                                                        boolean sourceDominant, Map<Object, Object> context )
1051     {
1052         String src = source.getUpdatePolicy();
1053         if ( src != null )
1054         {
1055             if ( sourceDominant || target.getUpdatePolicy() == null )
1056             {
1057                 target.setUpdatePolicy( src );
1058                 target.setLocation( "updatePolicy", source.getLocation( "updatePolicy" ) );
1059             }
1060         }
1061     }
1062 
1063     protected void mergeRepositoryPolicy_ChecksumPolicy( RepositoryPolicy target, RepositoryPolicy source,
1064                                                          boolean sourceDominant, Map<Object, Object> context )
1065     {
1066         String src = source.getChecksumPolicy();
1067         if ( src != null )
1068         {
1069             if ( sourceDominant || target.getChecksumPolicy() == null )
1070             {
1071                 target.setChecksumPolicy( src );
1072                 target.setLocation( "checksumPolicy", source.getLocation( "checksumPolicy" ) );
1073             }
1074         }
1075     }
1076 
1077     protected void mergeDependency( Dependency target, Dependency source, boolean sourceDominant,
1078                                     Map<Object, Object> context )
1079     {
1080         mergeDependency_GroupId( target, source, sourceDominant, context );
1081         mergeDependency_ArtifactId( target, source, sourceDominant, context );
1082         mergeDependency_Version( target, source, sourceDominant, context );
1083         mergeDependency_Type( target, source, sourceDominant, context );
1084         mergeDependency_Classifier( target, source, sourceDominant, context );
1085         mergeDependency_Scope( target, source, sourceDominant, context );
1086         mergeDependency_SystemPath( target, source, sourceDominant, context );
1087         mergeDependency_Optional( target, source, sourceDominant, context );
1088         mergeDependency_Exclusions( target, source, sourceDominant, context );
1089     }
1090 
1091     protected void mergeDependency_GroupId( Dependency target, Dependency source, boolean sourceDominant,
1092                                             Map<Object, Object> context )
1093     {
1094         String src = source.getGroupId();
1095         if ( src != null )
1096         {
1097             if ( sourceDominant || target.getGroupId() == null )
1098             {
1099                 target.setGroupId( src );
1100                 target.setLocation( "groupId", source.getLocation( "groupId" ) );
1101             }
1102         }
1103     }
1104 
1105     protected void mergeDependency_ArtifactId( Dependency target, Dependency source, boolean sourceDominant,
1106                                                Map<Object, Object> context )
1107     {
1108         String src = source.getArtifactId();
1109         if ( src != null )
1110         {
1111             if ( sourceDominant || target.getArtifactId() == null )
1112             {
1113                 target.setArtifactId( src );
1114                 target.setLocation( "artifactId", source.getLocation( "artifactId" ) );
1115             }
1116         }
1117     }
1118 
1119     protected void mergeDependency_Version( Dependency target, Dependency source, boolean sourceDominant,
1120                                             Map<Object, Object> context )
1121     {
1122         String src = source.getVersion();
1123         if ( src != null )
1124         {
1125             if ( sourceDominant || target.getVersion() == null )
1126             {
1127                 target.setVersion( src );
1128                 target.setLocation( "version", source.getLocation( "version" ) );
1129             }
1130         }
1131     }
1132 
1133     protected void mergeDependency_Type( Dependency target, Dependency source, boolean sourceDominant,
1134                                          Map<Object, Object> context )
1135     {
1136         String src = source.getType();
1137         if ( src != null )
1138         {
1139             if ( sourceDominant || target.getType() == null )
1140             {
1141                 target.setType( src );
1142                 target.setLocation( "type", source.getLocation( "type" ) );
1143             }
1144         }
1145     }
1146 
1147     protected void mergeDependency_Classifier( Dependency target, Dependency source, boolean sourceDominant,
1148                                                Map<Object, Object> context )
1149     {
1150         String src = source.getClassifier();
1151         if ( src != null )
1152         {
1153             if ( sourceDominant || target.getClassifier() == null )
1154             {
1155                 target.setClassifier( src );
1156                 target.setLocation( "classifier", source.getLocation( "classifier" ) );
1157             }
1158         }
1159     }
1160 
1161     protected void mergeDependency_Scope( Dependency target, Dependency source, boolean sourceDominant,
1162                                           Map<Object, Object> context )
1163     {
1164         String src = source.getScope();
1165         if ( src != null )
1166         {
1167             if ( sourceDominant || target.getScope() == null )
1168             {
1169                 target.setScope( src );
1170                 target.setLocation( "scope", source.getLocation( "scope" ) );
1171             }
1172         }
1173     }
1174 
1175     protected void mergeDependency_SystemPath( Dependency target, Dependency source, boolean sourceDominant,
1176                                                Map<Object, Object> context )
1177     {
1178         String src = source.getSystemPath();
1179         if ( src != null )
1180         {
1181             if ( sourceDominant || target.getSystemPath() == null )
1182             {
1183                 target.setSystemPath( src );
1184                 target.setLocation( "systemPath", source.getLocation( "systemPath" ) );
1185             }
1186         }
1187     }
1188 
1189     protected void mergeDependency_Optional( Dependency target, Dependency source, boolean sourceDominant,
1190                                              Map<Object, Object> context )
1191     {
1192         String src = source.getOptional();
1193         if ( src != null )
1194         {
1195             if ( sourceDominant || target.getOptional() == null )
1196             {
1197                 target.setOptional( src );
1198                 target.setLocation( "optional", source.getLocation( "optional" ) );
1199             }
1200         }
1201     }
1202 
1203     protected void mergeDependency_Exclusions( Dependency target, Dependency source, boolean sourceDominant,
1204                                                Map<Object, Object> context )
1205     {
1206         List<Exclusion> src = source.getExclusions();
1207         if ( !src.isEmpty() )
1208         {
1209             List<Exclusion> tgt = target.getExclusions();
1210 
1211             Map<Object, Exclusion> merged = new LinkedHashMap<Object, Exclusion>( ( src.size() + tgt.size() ) * 2 );
1212 
1213             for ( Exclusion element : tgt )
1214             {
1215                 Object key = getExclusionKey( element );
1216                 merged.put( key, element );
1217             }
1218 
1219             for ( Exclusion element : src )
1220             {
1221                 Object key = getExclusionKey( element );
1222                 if ( sourceDominant || !merged.containsKey( key ) )
1223                 {
1224                     merged.put( key, element );
1225                 }
1226             }
1227 
1228             target.setExclusions( new ArrayList<Exclusion>( merged.values() ) );
1229         }
1230     }
1231 
1232     protected void mergeExclusion( Exclusion target, Exclusion source, boolean sourceDominant,
1233                                    Map<Object, Object> context )
1234     {
1235         mergeExclusion_GroupId( target, source, sourceDominant, context );
1236         mergeExclusion_ArtifactId( target, source, sourceDominant, context );
1237     }
1238 
1239     protected void mergeExclusion_GroupId( Exclusion target, Exclusion source, boolean sourceDominant,
1240                                            Map<Object, Object> context )
1241     {
1242         String src = source.getGroupId();
1243         if ( src != null )
1244         {
1245             if ( sourceDominant || target.getGroupId() == null )
1246             {
1247                 target.setGroupId( src );
1248                 target.setLocation( "groupId", source.getLocation( "groupId" ) );
1249             }
1250         }
1251     }
1252 
1253     protected void mergeExclusion_ArtifactId( Exclusion target, Exclusion source, boolean sourceDominant,
1254                                               Map<Object, Object> context )
1255     {
1256         String src = source.getArtifactId();
1257         if ( src != null )
1258         {
1259             if ( sourceDominant || target.getArtifactId() == null )
1260             {
1261                 target.setArtifactId( src );
1262                 target.setLocation( "artifactId", source.getLocation( "artifactId" ) );
1263             }
1264         }
1265     }
1266 
1267     protected void mergeReporting( Reporting target, Reporting source, boolean sourceDominant,
1268                                    Map<Object, Object> context )
1269     {
1270         mergeReporting_OutputDirectory( target, source, sourceDominant, context );
1271         mergeReporting_ExcludeDefaults( target, source, sourceDominant, context );
1272         mergeReporting_Plugins( target, source, sourceDominant, context );
1273     }
1274 
1275     protected void mergeReporting_OutputDirectory( Reporting target, Reporting source, boolean sourceDominant,
1276                                                    Map<Object, Object> context )
1277     {
1278         String src = source.getOutputDirectory();
1279         if ( src != null )
1280         {
1281             if ( sourceDominant || target.getOutputDirectory() == null )
1282             {
1283                 target.setOutputDirectory( src );
1284                 target.setLocation( "outputDirectory", source.getLocation( "outputDirectory" ) );
1285             }
1286         }
1287     }
1288 
1289     protected void mergeReporting_ExcludeDefaults( Reporting target, Reporting source, boolean sourceDominant,
1290                                                    Map<Object, Object> context )
1291     {
1292         String src = source.getExcludeDefaults();
1293         if ( src != null )
1294         {
1295             if ( sourceDominant || target.getExcludeDefaults() == null )
1296             {
1297                 target.setExcludeDefaults( src );
1298                 target.setLocation( "excludeDefaults", source.getLocation( "excludeDefaults" ) );
1299             }
1300         }
1301     }
1302 
1303     protected void mergeReporting_Plugins( Reporting target, Reporting source, boolean sourceDominant,
1304                                            Map<Object, Object> context )
1305     {
1306         List<ReportPlugin> src = source.getPlugins();
1307         if ( !src.isEmpty() )
1308         {
1309             List<ReportPlugin> tgt = target.getPlugins();
1310             Map<Object, ReportPlugin> merged =
1311                 new LinkedHashMap<Object, ReportPlugin>( ( src.size() + tgt.size() ) * 2 );
1312 
1313             for ( ReportPlugin element : tgt )
1314             {
1315                 Object key = getReportPluginKey( element );
1316                 merged.put( key, element );
1317             }
1318 
1319             for ( ReportPlugin element : src )
1320             {
1321                 Object key = getReportPluginKey( element );
1322                 if ( sourceDominant || !merged.containsKey( key ) )
1323                 {
1324                     merged.put( key, element );
1325                 }
1326             }
1327 
1328             target.setPlugins( new ArrayList<ReportPlugin>( merged.values() ) );
1329         }
1330     }
1331 
1332     protected void mergeReportPlugin( ReportPlugin target, ReportPlugin source, boolean sourceDominant,
1333                                       Map<Object, Object> context )
1334     {
1335         mergeConfigurationContainer( target, source, sourceDominant, context );
1336         mergeReportPlugin_GroupId( target, source, sourceDominant, context );
1337         mergeReportPlugin_ArtifactId( target, source, sourceDominant, context );
1338         mergeReportPlugin_Version( target, source, sourceDominant, context );
1339         mergeReportPlugin_ReportSets( target, source, sourceDominant, context );
1340     }
1341 
1342     protected void mergeReportPlugin_GroupId( ReportPlugin target, ReportPlugin source, boolean sourceDominant,
1343                                               Map<Object, Object> context )
1344     {
1345         String src = source.getGroupId();
1346         if ( src != null )
1347         {
1348             if ( sourceDominant || target.getGroupId() == null )
1349             {
1350                 target.setGroupId( src );
1351                 target.setLocation( "groupId", source.getLocation( "groupId" ) );
1352             }
1353         }
1354     }
1355 
1356     protected void mergeReportPlugin_ArtifactId( ReportPlugin target, ReportPlugin source, boolean sourceDominant,
1357                                                  Map<Object, Object> context )
1358     {
1359         String src = source.getArtifactId();
1360         if ( src != null )
1361         {
1362             if ( sourceDominant || target.getArtifactId() == null )
1363             {
1364                 target.setArtifactId( src );
1365                 target.setLocation( "artifactId", source.getLocation( "artifactId" ) );
1366             }
1367         }
1368     }
1369 
1370     protected void mergeReportPlugin_Version( ReportPlugin target, ReportPlugin source, boolean sourceDominant,
1371                                               Map<Object, Object> context )
1372     {
1373         String src = source.getVersion();
1374         if ( src != null )
1375         {
1376             if ( sourceDominant || target.getVersion() == null )
1377             {
1378                 target.setVersion( src );
1379                 target.setLocation( "version", source.getLocation( "version" ) );
1380             }
1381         }
1382     }
1383 
1384     protected void mergeReportPlugin_ReportSets( ReportPlugin target, ReportPlugin source, boolean sourceDominant,
1385                                                  Map<Object, Object> context )
1386     {
1387         List<ReportSet> src = source.getReportSets();
1388         if ( !src.isEmpty() )
1389         {
1390             List<ReportSet> tgt = target.getReportSets();
1391             Map<Object, ReportSet> merged = new LinkedHashMap<Object, ReportSet>( ( src.size() + tgt.size() ) * 2 );
1392 
1393             for ( ReportSet element : tgt )
1394             {
1395                 Object key = getReportSetKey( element );
1396                 merged.put( key, element );
1397             }
1398 
1399             for ( ReportSet element : src )
1400             {
1401                 Object key = getReportSetKey( element );
1402                 if ( sourceDominant || !merged.containsKey( key ) )
1403                 {
1404                     merged.put( key, element );
1405                 }
1406             }
1407 
1408             target.setReportSets( new ArrayList<ReportSet>( merged.values() ) );
1409         }
1410     }
1411 
1412     protected void mergeReportSet( ReportSet target, ReportSet source, boolean sourceDominant,
1413                                    Map<Object, Object> context )
1414     {
1415         mergeConfigurationContainer( target, source, sourceDominant, context );
1416         mergeReportSet_Id( target, source, sourceDominant, context );
1417         mergeReportSet_Reports( target, source, sourceDominant, context );
1418     }
1419 
1420     protected void mergeReportSet_Id( ReportSet target, ReportSet source, boolean sourceDominant,
1421                                       Map<Object, Object> context )
1422     {
1423         String src = source.getId();
1424         if ( src != null )
1425         {
1426             if ( sourceDominant || target.getId() == null )
1427             {
1428                 target.setId( src );
1429                 target.setLocation( "id", source.getLocation( "id" ) );
1430             }
1431         }
1432     }
1433 
1434     protected void mergeReportSet_Reports( ReportSet target, ReportSet source, boolean sourceDominant,
1435                                            Map<Object, Object> context )
1436     {
1437         List<String> src = source.getReports();
1438         if ( !src.isEmpty() )
1439         {
1440             List<String> tgt = target.getReports();
1441             List<String> merged = new ArrayList<String>( tgt.size() + src.size() );
1442             merged.addAll( tgt );
1443             merged.addAll( src );
1444             target.setReports( merged );
1445         }
1446     }
1447 
1448     protected void mergeDependencyManagement( DependencyManagement target, DependencyManagement source,
1449                                               boolean sourceDominant, Map<Object, Object> context )
1450     {
1451         mergeDependencyManagement_Dependencies( target, source, sourceDominant, context );
1452     }
1453 
1454     protected void mergeDependencyManagement_Dependencies( DependencyManagement target, DependencyManagement source,
1455                                                            boolean sourceDominant, Map<Object, Object> context )
1456     {
1457         List<Dependency> src = source.getDependencies();
1458         if ( !src.isEmpty() )
1459         {
1460             List<Dependency> tgt = target.getDependencies();
1461             Map<Object, Dependency> merged = new LinkedHashMap<Object, Dependency>( ( src.size() + tgt.size() ) * 2 );
1462 
1463             for ( Dependency element : tgt )
1464             {
1465                 Object key = getDependencyKey( element );
1466                 merged.put( key, element );
1467             }
1468 
1469             for ( Dependency element : src )
1470             {
1471                 Object key = getDependencyKey( element );
1472                 if ( sourceDominant || !merged.containsKey( key ) )
1473                 {
1474                     merged.put( key, element );
1475                 }
1476             }
1477 
1478             target.setDependencies( new ArrayList<Dependency>( merged.values() ) );
1479         }
1480     }
1481 
1482     protected void mergeParent( Parent target, Parent source, boolean sourceDominant, Map<Object, Object> context )
1483     {
1484         mergeParent_GroupId( target, source, sourceDominant, context );
1485         mergeParent_ArtifactId( target, source, sourceDominant, context );
1486         mergeParent_Version( target, source, sourceDominant, context );
1487         mergeParent_RelativePath( target, source, sourceDominant, context );
1488     }
1489 
1490     protected void mergeParent_GroupId( Parent target, Parent source, boolean sourceDominant,
1491                                         Map<Object, Object> context )
1492     {
1493         String src = source.getGroupId();
1494         if ( src != null )
1495         {
1496             if ( sourceDominant || target.getGroupId() == null )
1497             {
1498                 target.setGroupId( src );
1499                 target.setLocation( "groupId", source.getLocation( "groupId" ) );
1500             }
1501         }
1502     }
1503 
1504     protected void mergeParent_ArtifactId( Parent target, Parent source, boolean sourceDominant,
1505                                            Map<Object, Object> context )
1506     {
1507         String src = source.getArtifactId();
1508         if ( src != null )
1509         {
1510             if ( sourceDominant || target.getArtifactId() == null )
1511             {
1512                 target.setArtifactId( src );
1513                 target.setLocation( "artifactId", source.getLocation( "artifactId" ) );
1514             }
1515         }
1516     }
1517 
1518     protected void mergeParent_Version( Parent target, Parent source, boolean sourceDominant,
1519                                         Map<Object, Object> context )
1520     {
1521         String src = source.getVersion();
1522         if ( src != null )
1523         {
1524             if ( sourceDominant || target.getVersion() == null )
1525             {
1526                 target.setVersion( src );
1527                 target.setLocation( "version", source.getLocation( "version" ) );
1528             }
1529         }
1530     }
1531 
1532     protected void mergeParent_RelativePath( Parent target, Parent source, boolean sourceDominant,
1533                                              Map<Object, Object> context )
1534     {
1535         String src = source.getRelativePath();
1536         if ( src != null )
1537         {
1538             if ( sourceDominant || target.getRelativePath() == null )
1539             {
1540                 target.setRelativePath( src );
1541                 target.setLocation( "relativePath", source.getLocation( "relativePath" ) );
1542             }
1543         }
1544     }
1545 
1546     protected void mergeOrganization( Organization target, Organization source, boolean sourceDominant,
1547                                       Map<Object, Object> context )
1548     {
1549         mergeOrganization_Name( target, source, sourceDominant, context );
1550         mergeOrganization_Url( target, source, sourceDominant, context );
1551     }
1552 
1553     protected void mergeOrganization_Name( Organization target, Organization source, boolean sourceDominant,
1554                                            Map<Object, Object> context )
1555     {
1556         String src = source.getName();
1557         if ( src != null )
1558         {
1559             if ( sourceDominant || target.getName() == null )
1560             {
1561                 target.setName( src );
1562                 target.setLocation( "name", source.getLocation( "name" ) );
1563             }
1564         }
1565     }
1566 
1567     protected void mergeOrganization_Url( Organization target, Organization source, boolean sourceDominant,
1568                                           Map<Object, Object> context )
1569     {
1570         String src = source.getUrl();
1571         if ( src != null )
1572         {
1573             if ( sourceDominant || target.getUrl() == null )
1574             {
1575                 target.setUrl( src );
1576                 target.setLocation( "url", source.getLocation( "url" ) );
1577             }
1578         }
1579     }
1580 
1581     protected void mergeLicense( License target, License source, boolean sourceDominant, Map<Object, Object> context )
1582     {
1583         mergeLicense_Name( target, source, sourceDominant, context );
1584         mergeLicense_Url( target, source, sourceDominant, context );
1585         mergeLicense_Distribution( target, source, sourceDominant, context );
1586         mergeLicense_Comments( target, source, sourceDominant, context );
1587     }
1588 
1589     protected void mergeLicense_Name( License target, License source, boolean sourceDominant,
1590                                       Map<Object, Object> context )
1591     {
1592         String src = source.getName();
1593         if ( src != null )
1594         {
1595             if ( sourceDominant || target.getName() == null )
1596             {
1597                 target.setName( src );
1598                 target.setLocation( "name", source.getLocation( "name" ) );
1599             }
1600         }
1601     }
1602 
1603     protected void mergeLicense_Url( License target, License source, boolean sourceDominant,
1604                                      Map<Object, Object> context )
1605     {
1606         String src = source.getUrl();
1607         if ( src != null )
1608         {
1609             if ( sourceDominant || target.getUrl() == null )
1610             {
1611                 target.setUrl( src );
1612                 target.setLocation( "url", source.getLocation( "url" ) );
1613             }
1614         }
1615     }
1616 
1617     protected void mergeLicense_Distribution( License target, License source, boolean sourceDominant,
1618                                               Map<Object, Object> context )
1619     {
1620         String src = source.getDistribution();
1621         if ( src != null )
1622         {
1623             if ( sourceDominant || target.getDistribution() == null )
1624             {
1625                 target.setDistribution( src );
1626                 target.setLocation( "distribution", source.getLocation( "distribution" ) );
1627             }
1628         }
1629     }
1630 
1631     protected void mergeLicense_Comments( License target, License source, boolean sourceDominant,
1632                                           Map<Object, Object> context )
1633     {
1634         String src = source.getComments();
1635         if ( src != null )
1636         {
1637             if ( sourceDominant || target.getComments() == null )
1638             {
1639                 target.setComments( src );
1640                 target.setLocation( "comments", source.getLocation( "comments" ) );
1641             }
1642         }
1643     }
1644 
1645     protected void mergeMailingList( MailingList target, MailingList source, boolean sourceDominant,
1646                                      Map<Object, Object> context )
1647     {
1648         mergeMailingList_Name( target, source, sourceDominant, context );
1649         mergeMailingList_Subscribe( target, source, sourceDominant, context );
1650         mergeMailingList_Unsubscribe( target, source, sourceDominant, context );
1651         mergeMailingList_Post( target, source, sourceDominant, context );
1652         mergeMailingList_OtherArchives( target, source, sourceDominant, context );
1653     }
1654 
1655     protected void mergeMailingList_Name( MailingList target, MailingList source, boolean sourceDominant,
1656                                           Map<Object, Object> context )
1657     {
1658         String src = source.getName();
1659         if ( src != null )
1660         {
1661             if ( sourceDominant || target.getName() == null )
1662             {
1663                 target.setName( src );
1664                 target.setLocation( "name", source.getLocation( "name" ) );
1665             }
1666         }
1667     }
1668 
1669     protected void mergeMailingList_Subscribe( MailingList target, MailingList source, boolean sourceDominant,
1670                                                Map<Object, Object> context )
1671     {
1672         String src = source.getSubscribe();
1673         if ( src != null )
1674         {
1675             if ( sourceDominant || target.getSubscribe() == null )
1676             {
1677                 target.setSubscribe( src );
1678                 target.setLocation( "subscribe", source.getLocation( "subscribe" ) );
1679             }
1680         }
1681     }
1682 
1683     protected void mergeMailingList_Unsubscribe( MailingList target, MailingList source, boolean sourceDominant,
1684                                                  Map<Object, Object> context )
1685     {
1686         String src = source.getUnsubscribe();
1687         if ( src != null )
1688         {
1689             if ( sourceDominant || target.getUnsubscribe() == null )
1690             {
1691                 target.setUnsubscribe( src );
1692                 target.setLocation( "unsubscribe", source.getLocation( "unsubscribe" ) );
1693             }
1694         }
1695     }
1696 
1697     protected void mergeMailingList_Post( MailingList target, MailingList source, boolean sourceDominant,
1698                                           Map<Object, Object> context )
1699     {
1700         String src = source.getPost();
1701         if ( src != null )
1702         {
1703             if ( sourceDominant || target.getPost() == null )
1704             {
1705                 target.setPost( src );
1706                 target.setLocation( "post", source.getLocation( "post" ) );
1707             }
1708         }
1709     }
1710 
1711     protected void mergeMailingList_Archive( MailingList target, MailingList source, boolean sourceDominant,
1712                                              Map<Object, Object> context )
1713     {
1714         String src = source.getArchive();
1715         if ( src != null )
1716         {
1717             if ( sourceDominant || target.getArchive() == null )
1718             {
1719                 target.setArchive( src );
1720                 target.setLocation( "archive", source.getLocation( "archive" ) );
1721             }
1722         }
1723     }
1724 
1725     protected void mergeMailingList_OtherArchives( MailingList target, MailingList source, boolean sourceDominant,
1726                                                    Map<Object, Object> context )
1727     {
1728         List<String> src = source.getOtherArchives();
1729         if ( !src.isEmpty() )
1730         {
1731             List<String> tgt = target.getOtherArchives();
1732             List<String> merged = new ArrayList<String>( tgt.size() + src.size() );
1733             merged.addAll( tgt );
1734             merged.addAll( src );
1735             target.setOtherArchives( merged );
1736         }
1737     }
1738 
1739     protected void mergeDeveloper( Developer target, Developer source, boolean sourceDominant,
1740                                    Map<Object, Object> context )
1741     {
1742         mergeContributor( target, source, sourceDominant, context );
1743         mergeDeveloper_Id( target, source, sourceDominant, context );
1744     }
1745 
1746     protected void mergeDeveloper_Id( Developer target, Developer source, boolean sourceDominant,
1747                                       Map<Object, Object> context )
1748     {
1749         String src = source.getId();
1750         if ( src != null )
1751         {
1752             if ( sourceDominant || target.getId() == null )
1753             {
1754                 target.setId( src );
1755                 target.setLocation( "id", source.getLocation( "id" ) );
1756             }
1757         }
1758     }
1759 
1760     protected void mergeContributor( Contributor target, Contributor source, boolean sourceDominant,
1761                                      Map<Object, Object> context )
1762     {
1763         mergeContributor_Name( target, source, sourceDominant, context );
1764         mergeContributor_Email( target, source, sourceDominant, context );
1765         mergeContributor_Url( target, source, sourceDominant, context );
1766         mergeContributor_Organization( target, source, sourceDominant, context );
1767         mergeContributor_OrganizationUrl( target, source, sourceDominant, context );
1768         mergeContributor_Timezone( target, source, sourceDominant, context );
1769         mergeContributor_Roles( target, source, sourceDominant, context );
1770         mergeContributor_Properties( target, source, sourceDominant, context );
1771     }
1772 
1773     protected void mergeContributor_Name( Contributor target, Contributor source, boolean sourceDominant,
1774                                           Map<Object, Object> context )
1775     {
1776         String src = source.getName();
1777         if ( src != null )
1778         {
1779             if ( sourceDominant || target.getName() == null )
1780             {
1781                 target.setName( src );
1782                 target.setLocation( "name", source.getLocation( "name" ) );
1783             }
1784         }
1785     }
1786 
1787     protected void mergeContributor_Email( Contributor target, Contributor source, boolean sourceDominant,
1788                                            Map<Object, Object> context )
1789     {
1790         String src = source.getEmail();
1791         if ( src != null )
1792         {
1793             if ( sourceDominant || target.getEmail() == null )
1794             {
1795                 target.setEmail( src );
1796                 target.setLocation( "email", source.getLocation( "email" ) );
1797             }
1798         }
1799     }
1800 
1801     protected void mergeContributor_Url( Contributor target, Contributor source, boolean sourceDominant,
1802                                          Map<Object, Object> context )
1803     {
1804         String src = source.getUrl();
1805         if ( src != null )
1806         {
1807             if ( sourceDominant || target.getUrl() == null )
1808             {
1809                 target.setUrl( src );
1810                 target.setLocation( "url", source.getLocation( "url" ) );
1811             }
1812         }
1813     }
1814 
1815     protected void mergeContributor_Organization( Contributor target, Contributor source, boolean sourceDominant,
1816                                                   Map<Object, Object> context )
1817     {
1818         String src = source.getOrganization();
1819         if ( src != null )
1820         {
1821             if ( sourceDominant || target.getOrganization() == null )
1822             {
1823                 target.setOrganization( src );
1824                 target.setLocation( "organization", source.getLocation( "organization" ) );
1825             }
1826         }
1827     }
1828 
1829     protected void mergeContributor_OrganizationUrl( Contributor target, Contributor source, boolean sourceDominant,
1830                                                      Map<Object, Object> context )
1831     {
1832         String src = source.getOrganizationUrl();
1833         if ( src != null )
1834         {
1835             if ( sourceDominant || target.getOrganizationUrl() == null )
1836             {
1837                 target.setOrganizationUrl( src );
1838                 target.setLocation( "organizationUrl", source.getLocation( "organizationUrl" ) );
1839             }
1840         }
1841     }
1842 
1843     protected void mergeContributor_Timezone( Contributor target, Contributor source, boolean sourceDominant,
1844                                               Map<Object, Object> context )
1845     {
1846         String src = source.getTimezone();
1847         if ( src != null )
1848         {
1849             if ( sourceDominant || target.getTimezone() == null )
1850             {
1851                 target.setTimezone( src );
1852                 target.setLocation( "timezone", source.getLocation( "timezone" ) );
1853             }
1854         }
1855     }
1856 
1857     protected void mergeContributor_Roles( Contributor target, Contributor source, boolean sourceDominant,
1858                                            Map<Object, Object> context )
1859     {
1860         List<String> src = source.getRoles();
1861         if ( !src.isEmpty() )
1862         {
1863             List<String> tgt = target.getRoles();
1864             List<String> merged = new ArrayList<String>( tgt.size() + src.size() );
1865             merged.addAll( tgt );
1866             merged.addAll( src );
1867             target.setRoles( merged );
1868         }
1869     }
1870 
1871     protected void mergeContributor_Properties( Contributor target, Contributor source, boolean sourceDominant,
1872                                                 Map<Object, Object> context )
1873     {
1874         Properties merged = new Properties();
1875         if ( sourceDominant )
1876         {
1877             merged.putAll( target.getProperties() );
1878             merged.putAll( source.getProperties() );
1879         }
1880         else
1881         {
1882             merged.putAll( source.getProperties() );
1883             merged.putAll( target.getProperties() );
1884         }
1885         target.setProperties( merged );
1886         target.setLocation( "properties", InputLocation.merge( target.getLocation( "properties" ),
1887                                                                source.getLocation( "properties" ), sourceDominant ) );
1888     }
1889 
1890     protected void mergeIssueManagement( IssueManagement target, IssueManagement source, boolean sourceDominant,
1891                                          Map<Object, Object> context )
1892     {
1893         mergeIssueManagement_Url( target, source, sourceDominant, context );
1894         mergeIssueManagement_System( target, source, sourceDominant, context );
1895     }
1896 
1897     protected void mergeIssueManagement_System( IssueManagement target, IssueManagement source, boolean sourceDominant,
1898                                                 Map<Object, Object> context )
1899     {
1900         String src = source.getSystem();
1901         if ( src != null )
1902         {
1903             if ( sourceDominant || target.getSystem() == null )
1904             {
1905                 target.setSystem( src );
1906                 target.setLocation( "system", source.getLocation( "system" ) );
1907             }
1908         }
1909     }
1910 
1911     protected void mergeIssueManagement_Url( IssueManagement target, IssueManagement source, boolean sourceDominant,
1912                                              Map<Object, Object> context )
1913     {
1914         String src = source.getUrl();
1915         if ( src != null )
1916         {
1917             if ( sourceDominant || target.getUrl() == null )
1918             {
1919                 target.setUrl( src );
1920                 target.setLocation( "url", source.getLocation( "url" ) );
1921             }
1922         }
1923     }
1924 
1925     protected void mergeScm( Scm target, Scm source, boolean sourceDominant, Map<Object, Object> context )
1926     {
1927         mergeScm_Url( target, source, sourceDominant, context );
1928         mergeScm_Connection( target, source, sourceDominant, context );
1929         mergeScm_DeveloperConnection( target, source, sourceDominant, context );
1930         mergeScm_Tag( target, source, sourceDominant, context );
1931     }
1932 
1933     protected void mergeScm_Url( Scm target, Scm source, boolean sourceDominant, Map<Object, Object> context )
1934     {
1935         String src = source.getUrl();
1936         if ( src != null )
1937         {
1938             if ( sourceDominant || target.getUrl() == null )
1939             {
1940                 target.setUrl( src );
1941                 target.setLocation( "url", source.getLocation( "url" ) );
1942             }
1943         }
1944     }
1945 
1946     protected void mergeScm_Connection( Scm target, Scm source, boolean sourceDominant, Map<Object, Object> context )
1947     {
1948         String src = source.getConnection();
1949         if ( src != null )
1950         {
1951             if ( sourceDominant || target.getConnection() == null )
1952             {
1953                 target.setConnection( src );
1954                 target.setLocation( "connection", source.getLocation( "connection" ) );
1955             }
1956         }
1957     }
1958 
1959     protected void mergeScm_DeveloperConnection( Scm target, Scm source, boolean sourceDominant,
1960                                                  Map<Object, Object> context )
1961     {
1962         String src = source.getDeveloperConnection();
1963         if ( src != null )
1964         {
1965             if ( sourceDominant || target.getDeveloperConnection() == null )
1966             {
1967                 target.setDeveloperConnection( src );
1968                 target.setLocation( "developerConnection", source.getLocation( "developerConnection" ) );
1969             }
1970         }
1971     }
1972 
1973     protected void mergeScm_Tag( Scm target, Scm source, boolean sourceDominant, Map<Object, Object> context )
1974     {
1975         String src = source.getTag();
1976         if ( src != null )
1977         {
1978             if ( sourceDominant || target.getTag() == null )
1979             {
1980                 target.setTag( src );
1981                 target.setLocation( "tag", source.getLocation( "tag" ) );
1982             }
1983         }
1984     }
1985 
1986     protected void mergeCiManagement( CiManagement target, CiManagement source, boolean sourceDominant,
1987                                       Map<Object, Object> context )
1988     {
1989         mergeCiManagement_System( target, source, sourceDominant, context );
1990         mergeCiManagement_Url( target, source, sourceDominant, context );
1991         mergeCiManagement_Notifiers( target, source, sourceDominant, context );
1992     }
1993 
1994     protected void mergeCiManagement_System( CiManagement target, CiManagement source, boolean sourceDominant,
1995                                              Map<Object, Object> context )
1996     {
1997         String src = source.getSystem();
1998         if ( src != null )
1999         {
2000             if ( sourceDominant || target.getSystem() == null )
2001             {
2002                 target.setSystem( src );
2003                 target.setLocation( "system", source.getLocation( "system" ) );
2004             }
2005         }
2006     }
2007 
2008     protected void mergeCiManagement_Url( CiManagement target, CiManagement source, boolean sourceDominant,
2009                                           Map<Object, Object> context )
2010     {
2011         String src = source.getUrl();
2012         if ( src != null )
2013         {
2014             if ( sourceDominant || target.getUrl() == null )
2015             {
2016                 target.setUrl( src );
2017                 target.setLocation( "url", source.getLocation( "url" ) );
2018             }
2019         }
2020     }
2021 
2022     protected void mergeCiManagement_Notifiers( CiManagement target, CiManagement source, boolean sourceDominant,
2023                                                 Map<Object, Object> context )
2024     {
2025         List<Notifier> src = source.getNotifiers();
2026         if ( !src.isEmpty() )
2027         {
2028             List<Notifier> tgt = target.getNotifiers();
2029             Map<Object, Notifier> merged = new LinkedHashMap<Object, Notifier>( ( src.size() + tgt.size() ) * 2 );
2030 
2031             for ( Notifier element : tgt )
2032             {
2033                 Object key = getNotifierKey( element );
2034                 merged.put( key, element );
2035             }
2036 
2037             for ( Notifier element : src )
2038             {
2039                 Object key = getNotifierKey( element );
2040                 if ( sourceDominant || !merged.containsKey( key ) )
2041                 {
2042                     merged.put( key, element );
2043                 }
2044             }
2045 
2046             target.setNotifiers( new ArrayList<Notifier>( merged.values() ) );
2047         }
2048     }
2049 
2050     protected void mergeNotifier( Notifier target, Notifier source, boolean sourceDominant,
2051                                   Map<Object, Object> context )
2052     {
2053         mergeNotifier_Type( target, source, sourceDominant, context );
2054         mergeNotifier_Address( target, source, sourceDominant, context );
2055         mergeNotifier_Configuration( target, source, sourceDominant, context );
2056         mergeNotifier_SendOnError( target, source, sourceDominant, context );
2057         mergeNotifier_SendOnFailure( target, source, sourceDominant, context );
2058         mergeNotifier_SendOnSuccess( target, source, sourceDominant, context );
2059         mergeNotifier_SendOnWarning( target, source, sourceDominant, context );
2060     }
2061 
2062     protected void mergeNotifier_Type( Notifier target, Notifier source, boolean sourceDominant,
2063                                        Map<Object, Object> context )
2064     {
2065         String src = source.getType();
2066         if ( src != null )
2067         {
2068             if ( sourceDominant || target.getType() == null )
2069             {
2070                 target.setType( src );
2071             }
2072         }
2073     }
2074 
2075     protected void mergeNotifier_Address( Notifier target, Notifier source, boolean sourceDominant,
2076                                           Map<Object, Object> context )
2077     {
2078         String src = source.getAddress();
2079         if ( src != null )
2080         {
2081             if ( sourceDominant || target.getAddress() == null )
2082             {
2083                 target.setAddress( src );
2084             }
2085         }
2086     }
2087 
2088     protected void mergeNotifier_Configuration( Notifier target, Notifier source, boolean sourceDominant,
2089                                                 Map<Object, Object> context )
2090     {
2091         Properties merged = new Properties();
2092         if ( sourceDominant )
2093         {
2094             merged.putAll( target.getConfiguration() );
2095             merged.putAll( source.getConfiguration() );
2096         }
2097         else
2098         {
2099             merged.putAll( source.getConfiguration() );
2100             merged.putAll( target.getConfiguration() );
2101         }
2102         target.setConfiguration( merged );
2103     }
2104 
2105     protected void mergeNotifier_SendOnError( Notifier target, Notifier source, boolean sourceDominant,
2106                                               Map<Object, Object> context )
2107     {
2108         if ( sourceDominant )
2109         {
2110             target.setSendOnError( source.isSendOnError() );
2111         }
2112     }
2113 
2114     protected void mergeNotifier_SendOnFailure( Notifier target, Notifier source, boolean sourceDominant,
2115                                                 Map<Object, Object> context )
2116     {
2117         if ( sourceDominant )
2118         {
2119             target.setSendOnFailure( source.isSendOnFailure() );
2120         }
2121     }
2122 
2123     protected void mergeNotifier_SendOnSuccess( Notifier target, Notifier source, boolean sourceDominant,
2124                                                 Map<Object, Object> context )
2125     {
2126         if ( sourceDominant )
2127         {
2128             target.setSendOnSuccess( source.isSendOnSuccess() );
2129         }
2130     }
2131 
2132     protected void mergeNotifier_SendOnWarning( Notifier target, Notifier source, boolean sourceDominant,
2133                                                 Map<Object, Object> context )
2134     {
2135         if ( sourceDominant )
2136         {
2137             target.setSendOnWarning( source.isSendOnWarning() );
2138         }
2139     }
2140 
2141     protected void mergePrerequisites( Prerequisites target, Prerequisites source, boolean sourceDominant,
2142                                        Map<Object, Object> context )
2143     {
2144         mergePrerequisites_Maven( target, source, sourceDominant, context );
2145     }
2146 
2147     protected void mergePrerequisites_Maven( Prerequisites target, Prerequisites source, boolean sourceDominant,
2148                                              Map<Object, Object> context )
2149     {
2150         String src = source.getMaven();
2151         if ( src != null )
2152         {
2153             if ( sourceDominant || target.getMaven() == null )
2154             {
2155                 target.setMaven( src );
2156                 target.setLocation( "maven", source.getLocation( "maven" ) );
2157             }
2158         }
2159     }
2160 
2161     protected void mergeBuild( Build target, Build source, boolean sourceDominant, Map<Object, Object> context )
2162     {
2163         mergeBuildBase( target, source, sourceDominant, context );
2164         mergeBuild_SourceDirectory( target, source, sourceDominant, context );
2165         mergeBuild_ScriptSourceDirectory( target, source, sourceDominant, context );
2166         mergeBuild_TestSourceDirectory( target, source, sourceDominant, context );
2167         mergeBuild_OutputDirectory( target, source, sourceDominant, context );
2168         mergeBuild_TestOutputDirectory( target, source, sourceDominant, context );
2169         mergeBuild_Extensions( target, source, sourceDominant, context );
2170     }
2171 
2172     protected void mergeBuild_SourceDirectory( Build target, Build source, boolean sourceDominant,
2173                                                Map<Object, Object> context )
2174     {
2175         String src = source.getSourceDirectory();
2176         if ( src != null )
2177         {
2178             if ( sourceDominant || target.getSourceDirectory() == null )
2179             {
2180                 target.setSourceDirectory( src );
2181                 target.setLocation( "sourceDirectory", source.getLocation( "sourceDirectory" ) );
2182             }
2183         }
2184     }
2185 
2186     protected void mergeBuild_ScriptSourceDirectory( Build target, Build source, boolean sourceDominant,
2187                                                      Map<Object, Object> context )
2188     {
2189         String src = source.getScriptSourceDirectory();
2190         if ( src != null )
2191         {
2192             if ( sourceDominant || target.getScriptSourceDirectory() == null )
2193             {
2194                 target.setScriptSourceDirectory( src );
2195                 target.setLocation( "scriptSourceDirectory", source.getLocation( "scriptSourceDirectory" ) );
2196             }
2197         }
2198     }
2199 
2200     protected void mergeBuild_TestSourceDirectory( Build target, Build source, boolean sourceDominant,
2201                                                    Map<Object, Object> context )
2202     {
2203         String src = source.getTestSourceDirectory();
2204         if ( src != null )
2205         {
2206             if ( sourceDominant || target.getTestSourceDirectory() == null )
2207             {
2208                 target.setTestSourceDirectory( src );
2209                 target.setLocation( "testSourceDirectory", source.getLocation( "testSourceDirectory" ) );
2210             }
2211         }
2212     }
2213 
2214     protected void mergeBuild_OutputDirectory( Build target, Build source, boolean sourceDominant,
2215                                                Map<Object, Object> context )
2216     {
2217         String src = source.getOutputDirectory();
2218         if ( src != null )
2219         {
2220             if ( sourceDominant || target.getOutputDirectory() == null )
2221             {
2222                 target.setOutputDirectory( src );
2223                 target.setLocation( "outputDirectory", source.getLocation( "outputDirectory" ) );
2224             }
2225         }
2226     }
2227 
2228     protected void mergeBuild_TestOutputDirectory( Build target, Build source, boolean sourceDominant,
2229                                                    Map<Object, Object> context )
2230     {
2231         String src = source.getTestOutputDirectory();
2232         if ( src != null )
2233         {
2234             if ( sourceDominant || target.getTestOutputDirectory() == null )
2235             {
2236                 target.setTestOutputDirectory( src );
2237                 target.setLocation( "testOutputDirectory", source.getLocation( "testOutputDirectory" ) );
2238             }
2239         }
2240     }
2241 
2242     protected void mergeBuild_Extensions( Build target, Build source, boolean sourceDominant,
2243                                           Map<Object, Object> context )
2244     {
2245         List<Extension> src = source.getExtensions();
2246         if ( !src.isEmpty() )
2247         {
2248             List<Extension> tgt = target.getExtensions();
2249             Map<Object, Extension> merged = new LinkedHashMap<Object, Extension>( ( src.size() + tgt.size() ) * 2 );
2250 
2251             for ( Extension element : tgt )
2252             {
2253                 Object key = getExtensionKey( element );
2254                 merged.put( key, element );
2255             }
2256 
2257             for ( Extension element : src )
2258             {
2259                 Object key = getExtensionKey( element );
2260                 if ( sourceDominant || !merged.containsKey( key ) )
2261                 {
2262                     merged.put( key, element );
2263                 }
2264             }
2265 
2266             target.setExtensions( new ArrayList<Extension>( merged.values() ) );
2267         }
2268     }
2269 
2270     protected void mergeExtension( Extension target, Extension source, boolean sourceDominant,
2271                                    Map<Object, Object> context )
2272     {
2273         mergeExtension_GroupId( target, source, sourceDominant, context );
2274         mergeExtension_ArtifactId( target, source, sourceDominant, context );
2275         mergeExtension_Version( target, source, sourceDominant, context );
2276     }
2277 
2278     protected void mergeExtension_GroupId( Extension target, Extension source, boolean sourceDominant,
2279                                            Map<Object, Object> context )
2280     {
2281         String src = source.getGroupId();
2282         if ( src != null )
2283         {
2284             if ( sourceDominant || target.getGroupId() == null )
2285             {
2286                 target.setGroupId( src );
2287                 target.setLocation( "groupId", source.getLocation( "groupId" ) );
2288             }
2289         }
2290     }
2291 
2292     protected void mergeExtension_ArtifactId( Extension target, Extension source, boolean sourceDominant,
2293                                               Map<Object, Object> context )
2294     {
2295         String src = source.getArtifactId();
2296         if ( src != null )
2297         {
2298             if ( sourceDominant || target.getArtifactId() == null )
2299             {
2300                 target.setArtifactId( src );
2301                 target.setLocation( "artifactId", source.getLocation( "artifactId" ) );
2302             }
2303         }
2304     }
2305 
2306     protected void mergeExtension_Version( Extension target, Extension source, boolean sourceDominant,
2307                                            Map<Object, Object> context )
2308     {
2309         String src = source.getVersion();
2310         if ( src != null )
2311         {
2312             if ( sourceDominant || target.getVersion() == null )
2313             {
2314                 target.setVersion( src );
2315                 target.setLocation( "version", source.getLocation( "version" ) );
2316             }
2317         }
2318     }
2319 
2320     protected void mergeBuildBase( BuildBase target, BuildBase source, boolean sourceDominant,
2321                                    Map<Object, Object> context )
2322     {
2323         mergePluginConfiguration( target, source, sourceDominant, context );
2324         mergeBuildBase_DefaultGoal( target, source, sourceDominant, context );
2325         mergeBuildBase_FinalName( target, source, sourceDominant, context );
2326         mergeBuildBase_Directory( target, source, sourceDominant, context );
2327         mergeBuildBase_Resources( target, source, sourceDominant, context );
2328         mergeBuildBase_TestResources( target, source, sourceDominant, context );
2329         mergeBuildBase_Filters( target, source, sourceDominant, context );
2330     }
2331 
2332     protected void mergeBuildBase_DefaultGoal( BuildBase target, BuildBase source, boolean sourceDominant,
2333                                                Map<Object, Object> context )
2334     {
2335         String src = source.getDefaultGoal();
2336         if ( src != null )
2337         {
2338             if ( sourceDominant || target.getDefaultGoal() == null )
2339             {
2340                 target.setDefaultGoal( src );
2341                 target.setLocation( "defaultGoal", source.getLocation( "defaultGoal" ) );
2342             }
2343         }
2344     }
2345 
2346     protected void mergeBuildBase_Directory( BuildBase target, BuildBase source, boolean sourceDominant,
2347                                              Map<Object, Object> context )
2348     {
2349         String src = source.getDirectory();
2350         if ( src != null )
2351         {
2352             if ( sourceDominant || target.getDirectory() == null )
2353             {
2354                 target.setDirectory( src );
2355                 target.setLocation( "directory", source.getLocation( "directory" ) );
2356             }
2357         }
2358     }
2359 
2360     protected void mergeBuildBase_FinalName( BuildBase target, BuildBase source, boolean sourceDominant,
2361                                              Map<Object, Object> context )
2362     {
2363         String src = source.getFinalName();
2364         if ( src != null )
2365         {
2366             if ( sourceDominant || target.getFinalName() == null )
2367             {
2368                 target.setFinalName( src );
2369                 target.setLocation( "finalName", source.getLocation( "finalName" ) );
2370             }
2371         }
2372     }
2373 
2374     protected void mergeBuildBase_Filters( BuildBase target, BuildBase source, boolean sourceDominant,
2375                                            Map<Object, Object> context )
2376     {
2377         List<String> src = source.getFilters();
2378         if ( !src.isEmpty() )
2379         {
2380             List<String> tgt = target.getFilters();
2381             List<String> merged = new ArrayList<String>( tgt.size() + src.size() );
2382             merged.addAll( tgt );
2383             merged.addAll( src );
2384             target.setFilters( merged );
2385         }
2386     }
2387 
2388     protected void mergeBuildBase_Resources( BuildBase target, BuildBase source, boolean sourceDominant,
2389                                              Map<Object, Object> context )
2390     {
2391         List<Resource> src = source.getResources();
2392         if ( !src.isEmpty() )
2393         {
2394             List<Resource> tgt = target.getResources();
2395             Map<Object, Resource> merged = new LinkedHashMap<Object, Resource>( ( src.size() + tgt.size() ) * 2 );
2396 
2397             for ( Resource element : tgt )
2398             {
2399                 Object key = getResourceKey( element );
2400                 merged.put( key, element );
2401             }
2402 
2403             for ( Resource element : src )
2404             {
2405                 Object key = getResourceKey( element );
2406                 if ( sourceDominant || !merged.containsKey( key ) )
2407                 {
2408                     merged.put( key, element );
2409                 }
2410             }
2411 
2412             target.setResources( new ArrayList<Resource>( merged.values() ) );
2413         }
2414     }
2415 
2416     protected void mergeBuildBase_TestResources( BuildBase target, BuildBase source, boolean sourceDominant,
2417                                                  Map<Object, Object> context )
2418     {
2419         List<Resource> src = source.getTestResources();
2420         if ( !src.isEmpty() )
2421         {
2422             List<Resource> tgt = target.getTestResources();
2423             Map<Object, Resource> merged = new LinkedHashMap<Object, Resource>( ( src.size() + tgt.size() ) * 2 );
2424 
2425             for ( Resource element : tgt )
2426             {
2427                 Object key = getResourceKey( element );
2428                 merged.put( key, element );
2429             }
2430 
2431             for ( Resource element : src )
2432             {
2433                 Object key = getResourceKey( element );
2434                 if ( sourceDominant || !merged.containsKey( key ) )
2435                 {
2436                     merged.put( key, element );
2437                 }
2438             }
2439 
2440             target.setTestResources( new ArrayList<Resource>( merged.values() ) );
2441         }
2442     }
2443 
2444     protected void mergePluginConfiguration( PluginConfiguration target, PluginConfiguration source,
2445                                              boolean sourceDominant, Map<Object, Object> context )
2446     {
2447         mergePluginContainer( target, source, sourceDominant, context );
2448         mergePluginConfiguration_PluginManagement( target, source, sourceDominant, context );
2449     }
2450 
2451     protected void mergePluginConfiguration_PluginManagement( PluginConfiguration target, PluginConfiguration source,
2452                                                               boolean sourceDominant, Map<Object, Object> context )
2453     {
2454         PluginManagement src = source.getPluginManagement();
2455         if ( src != null )
2456         {
2457             PluginManagement tgt = target.getPluginManagement();
2458             if ( tgt == null )
2459             {
2460                 tgt = new PluginManagement();
2461                 target.setPluginManagement( tgt );
2462             }
2463             mergePluginManagement( tgt, src, sourceDominant, context );
2464         }
2465     }
2466 
2467     protected void mergePluginContainer( PluginContainer target, PluginContainer source, boolean sourceDominant,
2468                                          Map<Object, Object> context )
2469     {
2470         mergePluginContainer_Plugins( target, source, sourceDominant, context );
2471     }
2472 
2473     protected void mergePluginContainer_Plugins( PluginContainer target, PluginContainer source,
2474                                                  boolean sourceDominant, Map<Object, Object> context )
2475     {
2476         List<Plugin> src = source.getPlugins();
2477         if ( !src.isEmpty() )
2478         {
2479             List<Plugin> tgt = target.getPlugins();
2480             Map<Object, Plugin> merged = new LinkedHashMap<Object, Plugin>( ( src.size() + tgt.size() ) * 2 );
2481 
2482             for ( Plugin element : tgt )
2483             {
2484                 Object key = getPluginKey( element );
2485                 merged.put( key, element );
2486             }
2487 
2488             for ( Plugin element : src )
2489             {
2490                 Object key = getPluginKey( element );
2491                 if ( sourceDominant || !merged.containsKey( key ) )
2492                 {
2493                     merged.put( key, element );
2494                 }
2495             }
2496 
2497             target.setPlugins( new ArrayList<Plugin>( merged.values() ) );
2498         }
2499     }
2500 
2501     protected void mergePluginManagement( PluginManagement target, PluginManagement source, boolean sourceDominant,
2502                                           Map<Object, Object> context )
2503     {
2504         mergePluginContainer( target, source, sourceDominant, context );
2505     }
2506 
2507     protected void mergePlugin( Plugin target, Plugin source, boolean sourceDominant, Map<Object, Object> context )
2508     {
2509         mergeConfigurationContainer( target, source, sourceDominant, context );
2510         mergePlugin_GroupId( target, source, sourceDominant, context );
2511         mergePlugin_ArtifactId( target, source, sourceDominant, context );
2512         mergePlugin_Version( target, source, sourceDominant, context );
2513         mergePlugin_Extensions( target, source, sourceDominant, context );
2514         mergePlugin_Dependencies( target, source, sourceDominant, context );
2515         mergePlugin_Executions( target, source, sourceDominant, context );
2516     }
2517 
2518     protected void mergePlugin_GroupId( Plugin target, Plugin source, boolean sourceDominant,
2519                                         Map<Object, Object> context )
2520     {
2521         String src = source.getGroupId();
2522         if ( src != null )
2523         {
2524             if ( sourceDominant || target.getGroupId() == null )
2525             {
2526                 target.setGroupId( src );
2527                 target.setLocation( "groupId", source.getLocation( "groupId" ) );
2528             }
2529         }
2530     }
2531 
2532     protected void mergePlugin_ArtifactId( Plugin target, Plugin source, boolean sourceDominant,
2533                                            Map<Object, Object> context )
2534     {
2535         String src = source.getArtifactId();
2536         if ( src != null )
2537         {
2538             if ( sourceDominant || target.getArtifactId() == null )
2539             {
2540                 target.setArtifactId( src );
2541                 target.setLocation( "artifactId", source.getLocation( "artifactId" ) );
2542             }
2543         }
2544     }
2545 
2546     protected void mergePlugin_Version( Plugin target, Plugin source, boolean sourceDominant,
2547                                         Map<Object, Object> context )
2548     {
2549         String src = source.getVersion();
2550         if ( src != null )
2551         {
2552             if ( sourceDominant || target.getVersion() == null )
2553             {
2554                 target.setVersion( src );
2555                 target.setLocation( "version", source.getLocation( "version" ) );
2556             }
2557         }
2558     }
2559 
2560     protected void mergePlugin_Extensions( Plugin target, Plugin source, boolean sourceDominant,
2561                                            Map<Object, Object> context )
2562     {
2563         String src = source.getExtensions();
2564         if ( src != null )
2565         {
2566             if ( sourceDominant || target.getExtensions() == null )
2567             {
2568                 target.setExtensions( src );
2569                 target.setLocation( "extensions", source.getLocation( "extensions" ) );
2570             }
2571         }
2572     }
2573 
2574     protected void mergePlugin_Dependencies( Plugin target, Plugin source, boolean sourceDominant,
2575                                              Map<Object, Object> context )
2576     {
2577         List<Dependency> src = source.getDependencies();
2578         if ( !src.isEmpty() )
2579         {
2580             List<Dependency> tgt = target.getDependencies();
2581             Map<Object, Dependency> merged = new LinkedHashMap<Object, Dependency>( ( src.size() + tgt.size() ) * 2 );
2582 
2583             for ( Dependency element : tgt )
2584             {
2585                 Object key = getDependencyKey( element );
2586                 merged.put( key, element );
2587             }
2588 
2589             for ( Dependency element : src )
2590             {
2591                 Object key = getDependencyKey( element );
2592                 if ( sourceDominant || !merged.containsKey( key ) )
2593                 {
2594                     merged.put( key, element );
2595                 }
2596             }
2597 
2598             target.setDependencies( new ArrayList<Dependency>( merged.values() ) );
2599         }
2600     }
2601 
2602     protected void mergePlugin_Executions( Plugin target, Plugin source, boolean sourceDominant,
2603                                            Map<Object, Object> context )
2604     {
2605         List<PluginExecution> src = source.getExecutions();
2606         if ( !src.isEmpty() )
2607         {
2608             List<PluginExecution> tgt = target.getExecutions();
2609 
2610             Map<Object, PluginExecution> merged =
2611                 new LinkedHashMap<Object, PluginExecution>( ( src.size() + tgt.size() ) * 2 );
2612 
2613             for ( PluginExecution element : tgt )
2614             {
2615                 Object key = getPluginExecutionKey( element );
2616                 merged.put( key, element );
2617             }
2618 
2619             for ( PluginExecution element : src )
2620             {
2621                 Object key = getPluginExecutionKey( element );
2622                 if ( sourceDominant || !merged.containsKey( key ) )
2623                 {
2624                     merged.put( key, element );
2625                 }
2626             }
2627 
2628             target.setExecutions( new ArrayList<PluginExecution>( merged.values() ) );
2629         }
2630     }
2631 
2632     protected void mergeConfigurationContainer( ConfigurationContainer target, ConfigurationContainer source,
2633                                                 boolean sourceDominant, Map<Object, Object> context )
2634     {
2635         mergeConfigurationContainer_Inherited( target, source, sourceDominant, context );
2636         mergeConfigurationContainer_Configuration( target, source, sourceDominant, context );
2637     }
2638 
2639     protected void mergeConfigurationContainer_Inherited( ConfigurationContainer target, ConfigurationContainer source,
2640                                                           boolean sourceDominant, Map<Object, Object> context )
2641     {
2642         String src = source.getInherited();
2643         if ( src != null )
2644         {
2645             if ( sourceDominant || target.getInherited() == null )
2646             {
2647                 target.setInherited( src );
2648                 target.setLocation( "inherited", source.getLocation( "inherited" ) );
2649             }
2650         }
2651     }
2652 
2653     protected void mergeConfigurationContainer_Configuration( ConfigurationContainer target,
2654                                                               ConfigurationContainer source, boolean sourceDominant,
2655                                                               Map<Object, Object> context )
2656     {
2657         Xpp3Dom src = (Xpp3Dom) source.getConfiguration();
2658         if ( src != null )
2659         {
2660             Xpp3Dom tgt = (Xpp3Dom) target.getConfiguration();
2661             if ( sourceDominant || tgt == null )
2662             {
2663                 tgt = Xpp3Dom.mergeXpp3Dom( new Xpp3Dom( src ), tgt );
2664             }
2665             else
2666             {
2667                 tgt = Xpp3Dom.mergeXpp3Dom( tgt, src );
2668             }
2669             target.setConfiguration( tgt );
2670         }
2671     }
2672 
2673     protected void mergePluginExecution( PluginExecution target, PluginExecution source, boolean sourceDominant,
2674                                          Map<Object, Object> context )
2675     {
2676         mergeConfigurationContainer( target, source, sourceDominant, context );
2677         mergePluginExecution_Id( target, source, sourceDominant, context );
2678         mergePluginExecution_Phase( target, source, sourceDominant, context );
2679         mergePluginExecution_Goals( target, source, sourceDominant, context );
2680     }
2681 
2682     protected void mergePluginExecution_Id( PluginExecution target, PluginExecution source, boolean sourceDominant,
2683                                             Map<Object, Object> context )
2684     {
2685         String src = source.getId();
2686         if ( src != null )
2687         {
2688             if ( sourceDominant || target.getId() == null )
2689             {
2690                 target.setId( src );
2691                 target.setLocation( "id", source.getLocation( "id" ) );
2692             }
2693         }
2694     }
2695 
2696     protected void mergePluginExecution_Phase( PluginExecution target, PluginExecution source, boolean sourceDominant,
2697                                                Map<Object, Object> context )
2698     {
2699         String src = source.getPhase();
2700         if ( src != null )
2701         {
2702             if ( sourceDominant || target.getPhase() == null )
2703             {
2704                 target.setPhase( src );
2705                 target.setLocation( "phase", source.getLocation( "phase" ) );
2706             }
2707         }
2708     }
2709 
2710     protected void mergePluginExecution_Goals( PluginExecution target, PluginExecution source, boolean sourceDominant,
2711                                                Map<Object, Object> context )
2712     {
2713         List<String> src = source.getGoals();
2714         if ( !src.isEmpty() )
2715         {
2716             List<String> tgt = target.getGoals();
2717             List<String> merged = new ArrayList<String>( tgt.size() + src.size() );
2718             merged.addAll( tgt );
2719             merged.addAll( src );
2720             target.setGoals( merged );
2721         }
2722     }
2723 
2724     protected void mergeResource( Resource target, Resource source, boolean sourceDominant,
2725                                   Map<Object, Object> context )
2726     {
2727         mergeFileSet( target, source, sourceDominant, context );
2728         mergeResource_TargetPath( target, source, sourceDominant, context );
2729         mergeResource_Filtering( target, source, sourceDominant, context );
2730         mergeResource_MergeId( target, source, sourceDominant, context );
2731     }
2732 
2733     protected void mergeResource_TargetPath( Resource target, Resource source, boolean sourceDominant,
2734                                              Map<Object, Object> context )
2735     {
2736         String src = source.getTargetPath();
2737         if ( src != null )
2738         {
2739             if ( sourceDominant || target.getTargetPath() == null )
2740             {
2741                 target.setTargetPath( src );
2742                 target.setLocation( "targetPath", source.getLocation( "targetPath" ) );
2743             }
2744         }
2745     }
2746 
2747     protected void mergeResource_Filtering( Resource target, Resource source, boolean sourceDominant,
2748                                             Map<Object, Object> context )
2749     {
2750         String src = source.getFiltering();
2751         if ( src != null )
2752         {
2753             if ( sourceDominant || target.getFiltering() == null )
2754             {
2755                 target.setFiltering( src );
2756                 target.setLocation( "filtering", source.getLocation( "filtering" ) );
2757             }
2758         }
2759     }
2760 
2761     protected void mergeResource_MergeId( Resource target, Resource source, boolean sourceDominant,
2762                                           Map<Object, Object> context )
2763     {
2764         String src = source.getMergeId();
2765         if ( src != null )
2766         {
2767             if ( sourceDominant || target.getMergeId() == null )
2768             {
2769                 target.setMergeId( src );
2770             }
2771         }
2772     }
2773 
2774     protected void mergeFileSet( FileSet target, FileSet source, boolean sourceDominant, Map<Object, Object> context )
2775     {
2776         mergePatternSet( target, source, sourceDominant, context );
2777         mergeFileSet_Directory( target, source, sourceDominant, context );
2778     }
2779 
2780     protected void mergeFileSet_Directory( FileSet target, FileSet source, boolean sourceDominant,
2781                                            Map<Object, Object> context )
2782     {
2783         String src = source.getDirectory();
2784         if ( src != null )
2785         {
2786             if ( sourceDominant || target.getDirectory() == null )
2787             {
2788                 target.setDirectory( src );
2789                 target.setLocation( "directory", source.getLocation( "directory" ) );
2790             }
2791         }
2792     }
2793 
2794     protected void mergePatternSet( PatternSet target, PatternSet source, boolean sourceDominant,
2795                                     Map<Object, Object> context )
2796     {
2797         mergePatternSet_Includes( target, source, sourceDominant, context );
2798         mergePatternSet_Excludes( target, source, sourceDominant, context );
2799     }
2800 
2801     protected void mergePatternSet_Includes( PatternSet target, PatternSet source, boolean sourceDominant,
2802                                              Map<Object, Object> context )
2803     {
2804         List<String> src = source.getIncludes();
2805         if ( !src.isEmpty() )
2806         {
2807             List<String> tgt = target.getIncludes();
2808             List<String> merged = new ArrayList<String>( tgt.size() + src.size() );
2809             merged.addAll( tgt );
2810             merged.addAll( src );
2811             target.setIncludes( merged );
2812         }
2813     }
2814 
2815     protected void mergePatternSet_Excludes( PatternSet target, PatternSet source, boolean sourceDominant,
2816                                              Map<Object, Object> context )
2817     {
2818         List<String> src = source.getExcludes();
2819         if ( !src.isEmpty() )
2820         {
2821             List<String> tgt = target.getExcludes();
2822             List<String> merged = new ArrayList<String>( tgt.size() + src.size() );
2823             merged.addAll( tgt );
2824             merged.addAll( src );
2825             target.setExcludes( merged );
2826         }
2827     }
2828 
2829     protected void mergeProfile( Profile target, Profile source, boolean sourceDominant, Map<Object, Object> context )
2830     {
2831         mergeModelBase( target, source, sourceDominant, context );
2832         // TODO
2833     }
2834 
2835     protected void mergeActivation( Activation target, Activation source, boolean sourceDominant,
2836                                     Map<Object, Object> context )
2837     {
2838         // TODO
2839     }
2840 
2841     protected Object getDependencyKey( Dependency dependency )
2842     {
2843         return dependency;
2844     }
2845 
2846     protected Object getPluginKey( Plugin plugin )
2847     {
2848         return plugin;
2849     }
2850 
2851     protected Object getPluginExecutionKey( PluginExecution pluginExecution )
2852     {
2853         return pluginExecution;
2854     }
2855 
2856     protected Object getReportPluginKey( ReportPlugin reportPlugin )
2857     {
2858         return reportPlugin;
2859     }
2860 
2861     protected Object getReportSetKey( ReportSet reportSet )
2862     {
2863         return reportSet;
2864     }
2865 
2866     protected Object getLicenseKey( License license )
2867     {
2868         return license;
2869     }
2870 
2871     protected Object getMailingListKey( MailingList mailingList )
2872     {
2873         return mailingList;
2874     }
2875 
2876     protected Object getDeveloperKey( Developer developer )
2877     {
2878         return developer;
2879     }
2880 
2881     protected Object getContributorKey( Contributor contributor )
2882     {
2883         return contributor;
2884     }
2885 
2886     protected Object getProfileKey( Profile profile )
2887     {
2888         return profile;
2889     }
2890 
2891     protected Object getRepositoryKey( Repository repository )
2892     {
2893         return getRepositoryBaseKey( repository );
2894     }
2895 
2896     protected Object getRepositoryBaseKey( RepositoryBase repositoryBase )
2897     {
2898         return repositoryBase;
2899     }
2900 
2901     protected Object getNotifierKey( Notifier notifier )
2902     {
2903         return notifier;
2904     }
2905 
2906     protected Object getResourceKey( Resource resource )
2907     {
2908         return resource;
2909     }
2910 
2911     protected Object getExtensionKey( Extension extension )
2912     {
2913         return extension;
2914     }
2915 
2916     protected Object getExclusionKey( Exclusion exclusion )
2917     {
2918         return exclusion;
2919     }
2920 
2921 }