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