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