All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.apache.maven.model.v4.MavenMerger Maven / Gradle / Ivy

// =================== DO NOT EDIT THIS FILE ====================
//  Generated by Modello Velocity from merger.vm
//  template, any modifications will be overwritten.
// ==============================================================
package org.apache.maven.model.v4;

import java.io.ObjectStreamException;
import java.util.AbstractList;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.function.BinaryOperator;
import java.util.function.Function;
import java.util.stream.Collectors;

import org.apache.maven.api.annotations.Generated;
import org.apache.maven.api.xml.XmlNode;
import org.apache.maven.api.model.Model;
import org.apache.maven.api.model.ModelBase;
import org.apache.maven.api.model.PluginContainer;
import org.apache.maven.api.model.PluginConfiguration;
import org.apache.maven.api.model.BuildBase;
import org.apache.maven.api.model.Build;
import org.apache.maven.api.model.CiManagement;
import org.apache.maven.api.model.Notifier;
import org.apache.maven.api.model.Contributor;
import org.apache.maven.api.model.Dependency;
import org.apache.maven.api.model.Developer;
import org.apache.maven.api.model.Exclusion;
import org.apache.maven.api.model.IssueManagement;
import org.apache.maven.api.model.DistributionManagement;
import org.apache.maven.api.model.License;
import org.apache.maven.api.model.MailingList;
import org.apache.maven.api.model.Organization;
import org.apache.maven.api.model.PatternSet;
import org.apache.maven.api.model.Parent;
import org.apache.maven.api.model.Scm;
import org.apache.maven.api.model.FileSet;
import org.apache.maven.api.model.Resource;
import org.apache.maven.api.model.RepositoryBase;
import org.apache.maven.api.model.Repository;
import org.apache.maven.api.model.DeploymentRepository;
import org.apache.maven.api.model.RepositoryPolicy;
import org.apache.maven.api.model.Site;
import org.apache.maven.api.model.ConfigurationContainer;
import org.apache.maven.api.model.Plugin;
import org.apache.maven.api.model.PluginExecution;
import org.apache.maven.api.model.DependencyManagement;
import org.apache.maven.api.model.PluginManagement;
import org.apache.maven.api.model.Reporting;
import org.apache.maven.api.model.Profile;
import org.apache.maven.api.model.Activation;
import org.apache.maven.api.model.ActivationProperty;
import org.apache.maven.api.model.ActivationOS;
import org.apache.maven.api.model.ActivationFile;
import org.apache.maven.api.model.ReportPlugin;
import org.apache.maven.api.model.ReportSet;
import org.apache.maven.api.model.Prerequisites;
import org.apache.maven.api.model.Relocation;
import org.apache.maven.api.model.Extension;
import org.apache.maven.api.model.InputLocation;
import org.apache.maven.api.model.InputSource;

@Generated
public class MavenMerger {

    private final boolean deepMerge;

    public MavenMerger() {
        this(true);
    }

    public MavenMerger(boolean deepMerge) {
        this.deepMerge = deepMerge;
    }

    /**
     * Merges the specified source object into the given target object.
     *
     * @param target The target object whose existing contents should be merged with the source, must not be
     *            null.
     * @param source The (read-only) source object that should be merged into the target object, may be
     *            null.
     * @param sourceDominant A flag indicating whether either the target object or the source object provides the
     *            dominant data.
     * @param hints A set of key-value pairs that customized merger implementations can use to carry domain-specific
     *            information along, may be null.
     */
    public Model merge(Model target, Model source, boolean sourceDominant, Map hints) {
        Objects.requireNonNull(target, "target cannot be null");
        if (source == null) {
            return target;
        }
        Map context = new HashMap<>();
        if (hints != null) {
            context.putAll(hints);
        }
        return mergeModel(target, source, sourceDominant, context);
    }

    protected Model mergeModel(Model target, Model source, boolean sourceDominant, Map context) {
        Model.Builder builder = Model.newBuilder(target);
        mergeModel(builder, target, source, sourceDominant, context);
        return builder.build();
    }

    protected void mergeModel(Model.Builder builder, Model target, Model source, boolean sourceDominant, Map context) {
        mergeModelBase(builder, target, source, sourceDominant, context);
        mergeModel_PomFile(builder, target, source, sourceDominant, context);
        mergeModel_ModelVersion(builder, target, source, sourceDominant, context);
        mergeModel_Parent(builder, target, source, sourceDominant, context);
        mergeModel_GroupId(builder, target, source, sourceDominant, context);
        mergeModel_ArtifactId(builder, target, source, sourceDominant, context);
        mergeModel_Version(builder, target, source, sourceDominant, context);
        mergeModel_Packaging(builder, target, source, sourceDominant, context);
        mergeModel_Name(builder, target, source, sourceDominant, context);
        mergeModel_Description(builder, target, source, sourceDominant, context);
        mergeModel_Url(builder, target, source, sourceDominant, context);
        mergeModel_ChildProjectUrlInheritAppendPath(builder, target, source, sourceDominant, context);
        mergeModel_Root(builder, target, source, sourceDominant, context);
        mergeModel_PreserveModelVersion(builder, target, source, sourceDominant, context);
        mergeModel_InceptionYear(builder, target, source, sourceDominant, context);
        mergeModel_Organization(builder, target, source, sourceDominant, context);
        mergeModel_Licenses(builder, target, source, sourceDominant, context);
        mergeModel_Developers(builder, target, source, sourceDominant, context);
        mergeModel_Contributors(builder, target, source, sourceDominant, context);
        mergeModel_MailingLists(builder, target, source, sourceDominant, context);
        mergeModel_Prerequisites(builder, target, source, sourceDominant, context);
        mergeModel_Scm(builder, target, source, sourceDominant, context);
        mergeModel_IssueManagement(builder, target, source, sourceDominant, context);
        mergeModel_CiManagement(builder, target, source, sourceDominant, context);
        mergeModel_Build(builder, target, source, sourceDominant, context);
        mergeModel_Profiles(builder, target, source, sourceDominant, context);
    }

    protected void mergeModel_Modules(Model.Builder builder, Model target, Model source, boolean sourceDominant, Map context) {
        builder.modules(merge(target.getModules(), source.getModules(), sourceDominant, e -> e));
    }
    protected void mergeModel_DistributionManagement(Model.Builder builder, Model target, Model source, boolean sourceDominant, Map context) {
        DistributionManagement src = source.getDistributionManagement();
        if (src != null) {
            DistributionManagement tgt = target.getDistributionManagement();
            if (tgt == null) {
                tgt = DistributionManagement.newInstance(false);
            }
            DistributionManagement merged = mergeDistributionManagement(tgt, src, sourceDominant, context);
            builder.distributionManagement(merged);
            if (target.getDistributionManagement() == null) {
                builder.location("distributionManagement", source.getLocation("distributionManagement"));
            } else if (merged != tgt) {
                builder.location("distributionManagement", new InputLocation(-1, -1));
            }
        }
    }
    protected void mergeModel_Properties(Model.Builder builder, Model target, Model source, boolean sourceDominant, Map context) {
        Map src = source.getProperties();
        if (!src.isEmpty()) {
            Map tgt = target.getProperties();
            if (tgt.isEmpty()) {
                builder.properties(src);
                builder.location("properties", source.getLocation("properties"));
            } else {
                Map merged = new HashMap<>();
                merged.putAll(sourceDominant ? target.getProperties() : source.getProperties());
                merged.putAll(sourceDominant ? source.getProperties() : target.getProperties());
                builder.properties(merged);
                builder.location("properties", InputLocation.merge(target.getLocation("properties"), source.getLocation("properties"), sourceDominant));
            }
        }
    }
    protected void mergeModel_DependencyManagement(Model.Builder builder, Model target, Model source, boolean sourceDominant, Map context) {
        DependencyManagement src = source.getDependencyManagement();
        if (src != null) {
            DependencyManagement tgt = target.getDependencyManagement();
            if (tgt == null) {
                tgt = DependencyManagement.newInstance(false);
            }
            DependencyManagement merged = mergeDependencyManagement(tgt, src, sourceDominant, context);
            builder.dependencyManagement(merged);
            if (target.getDependencyManagement() == null) {
                builder.location("dependencyManagement", source.getLocation("dependencyManagement"));
            } else if (merged != tgt) {
                builder.location("dependencyManagement", new InputLocation(-1, -1));
            }
        }
    }
    protected void mergeModel_Dependencies(Model.Builder builder, Model target, Model source, boolean sourceDominant, Map context) {
        if (deepMerge) {
            builder.dependencies(merge(target.getDependencies(), source.getDependencies(), getDependencyKey(),
                    (t, s) -> mergeDependency(t, s, sourceDominant, context)));
        } else {
            builder.dependencies(merge(target.getDependencies(), source.getDependencies(), sourceDominant, getDependencyKey()));
        }
    }
    protected void mergeModel_Repositories(Model.Builder builder, Model target, Model source, boolean sourceDominant, Map context) {
        if (deepMerge) {
            builder.repositories(merge(target.getRepositories(), source.getRepositories(), getRepositoryKey(),
                    (t, s) -> mergeRepository(t, s, sourceDominant, context)));
        } else {
            builder.repositories(merge(target.getRepositories(), source.getRepositories(), sourceDominant, getRepositoryKey()));
        }
    }
    protected void mergeModel_PluginRepositories(Model.Builder builder, Model target, Model source, boolean sourceDominant, Map context) {
        if (deepMerge) {
            builder.pluginRepositories(merge(target.getPluginRepositories(), source.getPluginRepositories(), getRepositoryKey(),
                    (t, s) -> mergeRepository(t, s, sourceDominant, context)));
        } else {
            builder.pluginRepositories(merge(target.getPluginRepositories(), source.getPluginRepositories(), sourceDominant, getRepositoryKey()));
        }
    }
    protected void mergeModel_Reporting(Model.Builder builder, Model target, Model source, boolean sourceDominant, Map context) {
        Reporting src = source.getReporting();
        if (src != null) {
            Reporting tgt = target.getReporting();
            if (tgt == null) {
                tgt = Reporting.newInstance(false);
            }
            Reporting merged = mergeReporting(tgt, src, sourceDominant, context);
            builder.reporting(merged);
            if (target.getReporting() == null) {
                builder.location("reporting", source.getLocation("reporting"));
            } else if (merged != tgt) {
                builder.location("reporting", new InputLocation(-1, -1));
            }
        }
    }
    protected void mergeModel_PomFile(Model.Builder builder, Model target, Model source, boolean sourceDominant, Map context) {
        if (sourceDominant) {
            builder.pomFile(source.getPomFile());
        }
    }
    protected void mergeModel_ModelVersion(Model.Builder builder, Model target, Model source, boolean sourceDominant, Map context) {
        String src = source.getModelVersion();
        String tgt = target.getModelVersion();
        if (src != null && (sourceDominant || tgt == null)) {
            builder.modelVersion(src);
            builder.location("modelVersion", source.getLocation("modelVersion"));
        }
    }
    protected void mergeModel_Parent(Model.Builder builder, Model target, Model source, boolean sourceDominant, Map context) {
        Parent src = source.getParent();
        if (src != null) {
            Parent tgt = target.getParent();
            if (tgt == null) {
                tgt = Parent.newInstance(false);
            }
            Parent merged = mergeParent(tgt, src, sourceDominant, context);
            builder.parent(merged);
            if (target.getParent() == null) {
                builder.location("parent", source.getLocation("parent"));
            } else if (merged != tgt) {
                builder.location("parent", new InputLocation(-1, -1));
            }
        }
    }
    protected void mergeModel_GroupId(Model.Builder builder, Model target, Model source, boolean sourceDominant, Map context) {
        String src = source.getGroupId();
        String tgt = target.getGroupId();
        if (src != null && (sourceDominant || tgt == null)) {
            builder.groupId(src);
            builder.location("groupId", source.getLocation("groupId"));
        }
    }
    protected void mergeModel_ArtifactId(Model.Builder builder, Model target, Model source, boolean sourceDominant, Map context) {
        String src = source.getArtifactId();
        String tgt = target.getArtifactId();
        if (src != null && (sourceDominant || tgt == null)) {
            builder.artifactId(src);
            builder.location("artifactId", source.getLocation("artifactId"));
        }
    }
    protected void mergeModel_Version(Model.Builder builder, Model target, Model source, boolean sourceDominant, Map context) {
        String src = source.getVersion();
        String tgt = target.getVersion();
        if (src != null && (sourceDominant || tgt == null)) {
            builder.version(src);
            builder.location("version", source.getLocation("version"));
        }
    }
    protected void mergeModel_Packaging(Model.Builder builder, Model target, Model source, boolean sourceDominant, Map context) {
        String src = source.getPackaging();
        String tgt = target.getPackaging();
        if (src != null && (sourceDominant || tgt == null)) {
            builder.packaging(src);
            builder.location("packaging", source.getLocation("packaging"));
        }
    }
    protected void mergeModel_Name(Model.Builder builder, Model target, Model source, boolean sourceDominant, Map context) {
        String src = source.getName();
        String tgt = target.getName();
        if (src != null && (sourceDominant || tgt == null)) {
            builder.name(src);
            builder.location("name", source.getLocation("name"));
        }
    }
    protected void mergeModel_Description(Model.Builder builder, Model target, Model source, boolean sourceDominant, Map context) {
        String src = source.getDescription();
        String tgt = target.getDescription();
        if (src != null && (sourceDominant || tgt == null)) {
            builder.description(src);
            builder.location("description", source.getLocation("description"));
        }
    }
    protected void mergeModel_Url(Model.Builder builder, Model target, Model source, boolean sourceDominant, Map context) {
        String src = source.getUrl();
        String tgt = target.getUrl();
        if (src != null && (sourceDominant || tgt == null)) {
            builder.url(src);
            builder.location("url", source.getLocation("url"));
        }
    }
    protected void mergeModel_ChildProjectUrlInheritAppendPath(Model.Builder builder, Model target, Model source, boolean sourceDominant, Map context) {
        String src = source.getChildProjectUrlInheritAppendPath();
        String tgt = target.getChildProjectUrlInheritAppendPath();
        if (src != null && (sourceDominant || tgt == null)) {
            builder.childProjectUrlInheritAppendPath(src);
            builder.location("childProjectUrlInheritAppendPath", source.getLocation("childProjectUrlInheritAppendPath"));
        }
    }
    protected void mergeModel_Root(Model.Builder builder, Model target, Model source, boolean sourceDominant, Map context) {
        if (sourceDominant) {
            builder.root(source.isRoot());
        }
    }
    protected void mergeModel_PreserveModelVersion(Model.Builder builder, Model target, Model source, boolean sourceDominant, Map context) {
        if (sourceDominant) {
            builder.preserveModelVersion(source.isPreserveModelVersion());
        }
    }
    protected void mergeModel_InceptionYear(Model.Builder builder, Model target, Model source, boolean sourceDominant, Map context) {
        String src = source.getInceptionYear();
        String tgt = target.getInceptionYear();
        if (src != null && (sourceDominant || tgt == null)) {
            builder.inceptionYear(src);
            builder.location("inceptionYear", source.getLocation("inceptionYear"));
        }
    }
    protected void mergeModel_Organization(Model.Builder builder, Model target, Model source, boolean sourceDominant, Map context) {
        Organization src = source.getOrganization();
        if (src != null) {
            Organization tgt = target.getOrganization();
            if (tgt == null) {
                tgt = Organization.newInstance(false);
            }
            Organization merged = mergeOrganization(tgt, src, sourceDominant, context);
            builder.organization(merged);
            if (target.getOrganization() == null) {
                builder.location("organization", source.getLocation("organization"));
            } else if (merged != tgt) {
                builder.location("organization", new InputLocation(-1, -1));
            }
        }
    }
    protected void mergeModel_Licenses(Model.Builder builder, Model target, Model source, boolean sourceDominant, Map context) {
        if (deepMerge) {
            builder.licenses(merge(target.getLicenses(), source.getLicenses(), getLicenseKey(),
                    (t, s) -> mergeLicense(t, s, sourceDominant, context)));
        } else {
            builder.licenses(merge(target.getLicenses(), source.getLicenses(), sourceDominant, getLicenseKey()));
        }
    }
    protected void mergeModel_Developers(Model.Builder builder, Model target, Model source, boolean sourceDominant, Map context) {
        if (deepMerge) {
            builder.developers(merge(target.getDevelopers(), source.getDevelopers(), getDeveloperKey(),
                    (t, s) -> mergeDeveloper(t, s, sourceDominant, context)));
        } else {
            builder.developers(merge(target.getDevelopers(), source.getDevelopers(), sourceDominant, getDeveloperKey()));
        }
    }
    protected void mergeModel_Contributors(Model.Builder builder, Model target, Model source, boolean sourceDominant, Map context) {
        if (deepMerge) {
            builder.contributors(merge(target.getContributors(), source.getContributors(), getContributorKey(),
                    (t, s) -> mergeContributor(t, s, sourceDominant, context)));
        } else {
            builder.contributors(merge(target.getContributors(), source.getContributors(), sourceDominant, getContributorKey()));
        }
    }
    protected void mergeModel_MailingLists(Model.Builder builder, Model target, Model source, boolean sourceDominant, Map context) {
        if (deepMerge) {
            builder.mailingLists(merge(target.getMailingLists(), source.getMailingLists(), getMailingListKey(),
                    (t, s) -> mergeMailingList(t, s, sourceDominant, context)));
        } else {
            builder.mailingLists(merge(target.getMailingLists(), source.getMailingLists(), sourceDominant, getMailingListKey()));
        }
    }
    protected void mergeModel_Prerequisites(Model.Builder builder, Model target, Model source, boolean sourceDominant, Map context) {
        Prerequisites src = source.getPrerequisites();
        if (src != null) {
            Prerequisites tgt = target.getPrerequisites();
            if (tgt == null) {
                tgt = Prerequisites.newInstance(false);
            }
            Prerequisites merged = mergePrerequisites(tgt, src, sourceDominant, context);
            builder.prerequisites(merged);
            if (target.getPrerequisites() == null) {
                builder.location("prerequisites", source.getLocation("prerequisites"));
            } else if (merged != tgt) {
                builder.location("prerequisites", new InputLocation(-1, -1));
            }
        }
    }
    protected void mergeModel_Scm(Model.Builder builder, Model target, Model source, boolean sourceDominant, Map context) {
        Scm src = source.getScm();
        if (src != null) {
            Scm tgt = target.getScm();
            if (tgt == null) {
                tgt = Scm.newInstance(false);
            }
            Scm merged = mergeScm(tgt, src, sourceDominant, context);
            builder.scm(merged);
            if (target.getScm() == null) {
                builder.location("scm", source.getLocation("scm"));
            } else if (merged != tgt) {
                builder.location("scm", new InputLocation(-1, -1));
            }
        }
    }
    protected void mergeModel_IssueManagement(Model.Builder builder, Model target, Model source, boolean sourceDominant, Map context) {
        IssueManagement src = source.getIssueManagement();
        if (src != null) {
            IssueManagement tgt = target.getIssueManagement();
            if (tgt == null) {
                tgt = IssueManagement.newInstance(false);
            }
            IssueManagement merged = mergeIssueManagement(tgt, src, sourceDominant, context);
            builder.issueManagement(merged);
            if (target.getIssueManagement() == null) {
                builder.location("issueManagement", source.getLocation("issueManagement"));
            } else if (merged != tgt) {
                builder.location("issueManagement", new InputLocation(-1, -1));
            }
        }
    }
    protected void mergeModel_CiManagement(Model.Builder builder, Model target, Model source, boolean sourceDominant, Map context) {
        CiManagement src = source.getCiManagement();
        if (src != null) {
            CiManagement tgt = target.getCiManagement();
            if (tgt == null) {
                tgt = CiManagement.newInstance(false);
            }
            CiManagement merged = mergeCiManagement(tgt, src, sourceDominant, context);
            builder.ciManagement(merged);
            if (target.getCiManagement() == null) {
                builder.location("ciManagement", source.getLocation("ciManagement"));
            } else if (merged != tgt) {
                builder.location("ciManagement", new InputLocation(-1, -1));
            }
        }
    }
    protected void mergeModel_Build(Model.Builder builder, Model target, Model source, boolean sourceDominant, Map context) {
        Build src = source.getBuild();
        if (src != null) {
            Build tgt = target.getBuild();
            if (tgt == null) {
                tgt = Build.newInstance(false);
            }
            Build merged = mergeBuild(tgt, src, sourceDominant, context);
            builder.build(merged);
            if (target.getBuild() == null) {
                builder.location("build", source.getLocation("build"));
            } else if (merged != tgt) {
                builder.location("build", new InputLocation(-1, -1));
            }
        }
    }
    protected void mergeModel_Profiles(Model.Builder builder, Model target, Model source, boolean sourceDominant, Map context) {
        if (deepMerge) {
            builder.profiles(merge(target.getProfiles(), source.getProfiles(), getProfileKey(),
                    (t, s) -> mergeProfile(t, s, sourceDominant, context)));
        } else {
            builder.profiles(merge(target.getProfiles(), source.getProfiles(), sourceDominant, getProfileKey()));
        }
    }

    protected ModelBase mergeModelBase(ModelBase target, ModelBase source, boolean sourceDominant, Map context) {
        ModelBase.Builder builder = ModelBase.newBuilder(target);
        mergeModelBase(builder, target, source, sourceDominant, context);
        return builder.build();
    }

    protected void mergeModelBase(ModelBase.Builder builder, ModelBase target, ModelBase source, boolean sourceDominant, Map context) {
        mergeModelBase_Modules(builder, target, source, sourceDominant, context);
        mergeModelBase_DistributionManagement(builder, target, source, sourceDominant, context);
        mergeModelBase_Properties(builder, target, source, sourceDominant, context);
        mergeModelBase_DependencyManagement(builder, target, source, sourceDominant, context);
        mergeModelBase_Dependencies(builder, target, source, sourceDominant, context);
        mergeModelBase_Repositories(builder, target, source, sourceDominant, context);
        mergeModelBase_PluginRepositories(builder, target, source, sourceDominant, context);
        mergeModelBase_Reporting(builder, target, source, sourceDominant, context);
    }

    protected void mergeModelBase_Modules(ModelBase.Builder builder, ModelBase target, ModelBase source, boolean sourceDominant, Map context) {
        builder.modules(merge(target.getModules(), source.getModules(), sourceDominant, e -> e));
    }
    protected void mergeModelBase_DistributionManagement(ModelBase.Builder builder, ModelBase target, ModelBase source, boolean sourceDominant, Map context) {
        DistributionManagement src = source.getDistributionManagement();
        if (src != null) {
            DistributionManagement tgt = target.getDistributionManagement();
            if (tgt == null) {
                tgt = DistributionManagement.newInstance(false);
            }
            DistributionManagement merged = mergeDistributionManagement(tgt, src, sourceDominant, context);
            builder.distributionManagement(merged);
            if (target.getDistributionManagement() == null) {
                builder.location("distributionManagement", source.getLocation("distributionManagement"));
            } else if (merged != tgt) {
                builder.location("distributionManagement", new InputLocation(-1, -1));
            }
        }
    }
    protected void mergeModelBase_Properties(ModelBase.Builder builder, ModelBase target, ModelBase source, boolean sourceDominant, Map context) {
        Map src = source.getProperties();
        if (!src.isEmpty()) {
            Map tgt = target.getProperties();
            if (tgt.isEmpty()) {
                builder.properties(src);
                builder.location("properties", source.getLocation("properties"));
            } else {
                Map merged = new HashMap<>();
                merged.putAll(sourceDominant ? target.getProperties() : source.getProperties());
                merged.putAll(sourceDominant ? source.getProperties() : target.getProperties());
                builder.properties(merged);
                builder.location("properties", InputLocation.merge(target.getLocation("properties"), source.getLocation("properties"), sourceDominant));
            }
        }
    }
    protected void mergeModelBase_DependencyManagement(ModelBase.Builder builder, ModelBase target, ModelBase source, boolean sourceDominant, Map context) {
        DependencyManagement src = source.getDependencyManagement();
        if (src != null) {
            DependencyManagement tgt = target.getDependencyManagement();
            if (tgt == null) {
                tgt = DependencyManagement.newInstance(false);
            }
            DependencyManagement merged = mergeDependencyManagement(tgt, src, sourceDominant, context);
            builder.dependencyManagement(merged);
            if (target.getDependencyManagement() == null) {
                builder.location("dependencyManagement", source.getLocation("dependencyManagement"));
            } else if (merged != tgt) {
                builder.location("dependencyManagement", new InputLocation(-1, -1));
            }
        }
    }
    protected void mergeModelBase_Dependencies(ModelBase.Builder builder, ModelBase target, ModelBase source, boolean sourceDominant, Map context) {
        if (deepMerge) {
            builder.dependencies(merge(target.getDependencies(), source.getDependencies(), getDependencyKey(),
                    (t, s) -> mergeDependency(t, s, sourceDominant, context)));
        } else {
            builder.dependencies(merge(target.getDependencies(), source.getDependencies(), sourceDominant, getDependencyKey()));
        }
    }
    protected void mergeModelBase_Repositories(ModelBase.Builder builder, ModelBase target, ModelBase source, boolean sourceDominant, Map context) {
        if (deepMerge) {
            builder.repositories(merge(target.getRepositories(), source.getRepositories(), getRepositoryKey(),
                    (t, s) -> mergeRepository(t, s, sourceDominant, context)));
        } else {
            builder.repositories(merge(target.getRepositories(), source.getRepositories(), sourceDominant, getRepositoryKey()));
        }
    }
    protected void mergeModelBase_PluginRepositories(ModelBase.Builder builder, ModelBase target, ModelBase source, boolean sourceDominant, Map context) {
        if (deepMerge) {
            builder.pluginRepositories(merge(target.getPluginRepositories(), source.getPluginRepositories(), getRepositoryKey(),
                    (t, s) -> mergeRepository(t, s, sourceDominant, context)));
        } else {
            builder.pluginRepositories(merge(target.getPluginRepositories(), source.getPluginRepositories(), sourceDominant, getRepositoryKey()));
        }
    }
    protected void mergeModelBase_Reporting(ModelBase.Builder builder, ModelBase target, ModelBase source, boolean sourceDominant, Map context) {
        Reporting src = source.getReporting();
        if (src != null) {
            Reporting tgt = target.getReporting();
            if (tgt == null) {
                tgt = Reporting.newInstance(false);
            }
            Reporting merged = mergeReporting(tgt, src, sourceDominant, context);
            builder.reporting(merged);
            if (target.getReporting() == null) {
                builder.location("reporting", source.getLocation("reporting"));
            } else if (merged != tgt) {
                builder.location("reporting", new InputLocation(-1, -1));
            }
        }
    }

    protected PluginContainer mergePluginContainer(PluginContainer target, PluginContainer source, boolean sourceDominant, Map context) {
        PluginContainer.Builder builder = PluginContainer.newBuilder(target);
        mergePluginContainer(builder, target, source, sourceDominant, context);
        return builder.build();
    }

    protected void mergePluginContainer(PluginContainer.Builder builder, PluginContainer target, PluginContainer source, boolean sourceDominant, Map context) {
        mergePluginContainer_Plugins(builder, target, source, sourceDominant, context);
    }

    protected void mergePluginContainer_Plugins(PluginContainer.Builder builder, PluginContainer target, PluginContainer source, boolean sourceDominant, Map context) {
        if (deepMerge) {
            builder.plugins(merge(target.getPlugins(), source.getPlugins(), getPluginKey(),
                    (t, s) -> mergePlugin(t, s, sourceDominant, context)));
        } else {
            builder.plugins(merge(target.getPlugins(), source.getPlugins(), sourceDominant, getPluginKey()));
        }
    }

    protected PluginConfiguration mergePluginConfiguration(PluginConfiguration target, PluginConfiguration source, boolean sourceDominant, Map context) {
        PluginConfiguration.Builder builder = PluginConfiguration.newBuilder(target);
        mergePluginConfiguration(builder, target, source, sourceDominant, context);
        return builder.build();
    }

    protected void mergePluginConfiguration(PluginConfiguration.Builder builder, PluginConfiguration target, PluginConfiguration source, boolean sourceDominant, Map context) {
        mergePluginContainer(builder, target, source, sourceDominant, context);
        mergePluginConfiguration_PluginManagement(builder, target, source, sourceDominant, context);
    }

    protected void mergePluginConfiguration_Plugins(PluginConfiguration.Builder builder, PluginConfiguration target, PluginConfiguration source, boolean sourceDominant, Map context) {
        if (deepMerge) {
            builder.plugins(merge(target.getPlugins(), source.getPlugins(), getPluginKey(),
                    (t, s) -> mergePlugin(t, s, sourceDominant, context)));
        } else {
            builder.plugins(merge(target.getPlugins(), source.getPlugins(), sourceDominant, getPluginKey()));
        }
    }
    protected void mergePluginConfiguration_PluginManagement(PluginConfiguration.Builder builder, PluginConfiguration target, PluginConfiguration source, boolean sourceDominant, Map context) {
        PluginManagement src = source.getPluginManagement();
        if (src != null) {
            PluginManagement tgt = target.getPluginManagement();
            if (tgt == null) {
                tgt = PluginManagement.newInstance(false);
            }
            PluginManagement merged = mergePluginManagement(tgt, src, sourceDominant, context);
            builder.pluginManagement(merged);
            if (target.getPluginManagement() == null) {
                builder.location("pluginManagement", source.getLocation("pluginManagement"));
            } else if (merged != tgt) {
                builder.location("pluginManagement", new InputLocation(-1, -1));
            }
        }
    }

    protected BuildBase mergeBuildBase(BuildBase target, BuildBase source, boolean sourceDominant, Map context) {
        BuildBase.Builder builder = BuildBase.newBuilder(target);
        mergeBuildBase(builder, target, source, sourceDominant, context);
        return builder.build();
    }

    protected void mergeBuildBase(BuildBase.Builder builder, BuildBase target, BuildBase source, boolean sourceDominant, Map context) {
        mergePluginConfiguration(builder, target, source, sourceDominant, context);
        mergeBuildBase_DefaultGoal(builder, target, source, sourceDominant, context);
        mergeBuildBase_Resources(builder, target, source, sourceDominant, context);
        mergeBuildBase_TestResources(builder, target, source, sourceDominant, context);
        mergeBuildBase_Directory(builder, target, source, sourceDominant, context);
        mergeBuildBase_FinalName(builder, target, source, sourceDominant, context);
        mergeBuildBase_Filters(builder, target, source, sourceDominant, context);
    }

    protected void mergeBuildBase_Plugins(BuildBase.Builder builder, BuildBase target, BuildBase source, boolean sourceDominant, Map context) {
        if (deepMerge) {
            builder.plugins(merge(target.getPlugins(), source.getPlugins(), getPluginKey(),
                    (t, s) -> mergePlugin(t, s, sourceDominant, context)));
        } else {
            builder.plugins(merge(target.getPlugins(), source.getPlugins(), sourceDominant, getPluginKey()));
        }
    }
    protected void mergeBuildBase_PluginManagement(BuildBase.Builder builder, BuildBase target, BuildBase source, boolean sourceDominant, Map context) {
        PluginManagement src = source.getPluginManagement();
        if (src != null) {
            PluginManagement tgt = target.getPluginManagement();
            if (tgt == null) {
                tgt = PluginManagement.newInstance(false);
            }
            PluginManagement merged = mergePluginManagement(tgt, src, sourceDominant, context);
            builder.pluginManagement(merged);
            if (target.getPluginManagement() == null) {
                builder.location("pluginManagement", source.getLocation("pluginManagement"));
            } else if (merged != tgt) {
                builder.location("pluginManagement", new InputLocation(-1, -1));
            }
        }
    }
    protected void mergeBuildBase_DefaultGoal(BuildBase.Builder builder, BuildBase target, BuildBase source, boolean sourceDominant, Map context) {
        String src = source.getDefaultGoal();
        String tgt = target.getDefaultGoal();
        if (src != null && (sourceDominant || tgt == null)) {
            builder.defaultGoal(src);
            builder.location("defaultGoal", source.getLocation("defaultGoal"));
        }
    }
    protected void mergeBuildBase_Resources(BuildBase.Builder builder, BuildBase target, BuildBase source, boolean sourceDominant, Map context) {
        if (deepMerge) {
            builder.resources(merge(target.getResources(), source.getResources(), getResourceKey(),
                    (t, s) -> mergeResource(t, s, sourceDominant, context)));
        } else {
            builder.resources(merge(target.getResources(), source.getResources(), sourceDominant, getResourceKey()));
        }
    }
    protected void mergeBuildBase_TestResources(BuildBase.Builder builder, BuildBase target, BuildBase source, boolean sourceDominant, Map context) {
        if (deepMerge) {
            builder.testResources(merge(target.getTestResources(), source.getTestResources(), getResourceKey(),
                    (t, s) -> mergeResource(t, s, sourceDominant, context)));
        } else {
            builder.testResources(merge(target.getTestResources(), source.getTestResources(), sourceDominant, getResourceKey()));
        }
    }
    protected void mergeBuildBase_Directory(BuildBase.Builder builder, BuildBase target, BuildBase source, boolean sourceDominant, Map context) {
        String src = source.getDirectory();
        String tgt = target.getDirectory();
        if (src != null && (sourceDominant || tgt == null)) {
            builder.directory(src);
            builder.location("directory", source.getLocation("directory"));
        }
    }
    protected void mergeBuildBase_FinalName(BuildBase.Builder builder, BuildBase target, BuildBase source, boolean sourceDominant, Map context) {
        String src = source.getFinalName();
        String tgt = target.getFinalName();
        if (src != null && (sourceDominant || tgt == null)) {
            builder.finalName(src);
            builder.location("finalName", source.getLocation("finalName"));
        }
    }
    protected void mergeBuildBase_Filters(BuildBase.Builder builder, BuildBase target, BuildBase source, boolean sourceDominant, Map context) {
        builder.filters(merge(target.getFilters(), source.getFilters(), sourceDominant, e -> e));
    }

    protected Build mergeBuild(Build target, Build source, boolean sourceDominant, Map context) {
        Build.Builder builder = Build.newBuilder(target);
        mergeBuild(builder, target, source, sourceDominant, context);
        return builder.build();
    }

    protected void mergeBuild(Build.Builder builder, Build target, Build source, boolean sourceDominant, Map context) {
        mergeBuildBase(builder, target, source, sourceDominant, context);
        mergeBuild_SourceDirectory(builder, target, source, sourceDominant, context);
        mergeBuild_ScriptSourceDirectory(builder, target, source, sourceDominant, context);
        mergeBuild_TestSourceDirectory(builder, target, source, sourceDominant, context);
        mergeBuild_OutputDirectory(builder, target, source, sourceDominant, context);
        mergeBuild_TestOutputDirectory(builder, target, source, sourceDominant, context);
        mergeBuild_Extensions(builder, target, source, sourceDominant, context);
    }

    protected void mergeBuild_Plugins(Build.Builder builder, Build target, Build source, boolean sourceDominant, Map context) {
        if (deepMerge) {
            builder.plugins(merge(target.getPlugins(), source.getPlugins(), getPluginKey(),
                    (t, s) -> mergePlugin(t, s, sourceDominant, context)));
        } else {
            builder.plugins(merge(target.getPlugins(), source.getPlugins(), sourceDominant, getPluginKey()));
        }
    }
    protected void mergeBuild_PluginManagement(Build.Builder builder, Build target, Build source, boolean sourceDominant, Map context) {
        PluginManagement src = source.getPluginManagement();
        if (src != null) {
            PluginManagement tgt = target.getPluginManagement();
            if (tgt == null) {
                tgt = PluginManagement.newInstance(false);
            }
            PluginManagement merged = mergePluginManagement(tgt, src, sourceDominant, context);
            builder.pluginManagement(merged);
            if (target.getPluginManagement() == null) {
                builder.location("pluginManagement", source.getLocation("pluginManagement"));
            } else if (merged != tgt) {
                builder.location("pluginManagement", new InputLocation(-1, -1));
            }
        }
    }
    protected void mergeBuild_DefaultGoal(Build.Builder builder, Build target, Build source, boolean sourceDominant, Map context) {
        String src = source.getDefaultGoal();
        String tgt = target.getDefaultGoal();
        if (src != null && (sourceDominant || tgt == null)) {
            builder.defaultGoal(src);
            builder.location("defaultGoal", source.getLocation("defaultGoal"));
        }
    }
    protected void mergeBuild_Resources(Build.Builder builder, Build target, Build source, boolean sourceDominant, Map context) {
        if (deepMerge) {
            builder.resources(merge(target.getResources(), source.getResources(), getResourceKey(),
                    (t, s) -> mergeResource(t, s, sourceDominant, context)));
        } else {
            builder.resources(merge(target.getResources(), source.getResources(), sourceDominant, getResourceKey()));
        }
    }
    protected void mergeBuild_TestResources(Build.Builder builder, Build target, Build source, boolean sourceDominant, Map context) {
        if (deepMerge) {
            builder.testResources(merge(target.getTestResources(), source.getTestResources(), getResourceKey(),
                    (t, s) -> mergeResource(t, s, sourceDominant, context)));
        } else {
            builder.testResources(merge(target.getTestResources(), source.getTestResources(), sourceDominant, getResourceKey()));
        }
    }
    protected void mergeBuild_Directory(Build.Builder builder, Build target, Build source, boolean sourceDominant, Map context) {
        String src = source.getDirectory();
        String tgt = target.getDirectory();
        if (src != null && (sourceDominant || tgt == null)) {
            builder.directory(src);
            builder.location("directory", source.getLocation("directory"));
        }
    }
    protected void mergeBuild_FinalName(Build.Builder builder, Build target, Build source, boolean sourceDominant, Map context) {
        String src = source.getFinalName();
        String tgt = target.getFinalName();
        if (src != null && (sourceDominant || tgt == null)) {
            builder.finalName(src);
            builder.location("finalName", source.getLocation("finalName"));
        }
    }
    protected void mergeBuild_Filters(Build.Builder builder, Build target, Build source, boolean sourceDominant, Map context) {
        builder.filters(merge(target.getFilters(), source.getFilters(), sourceDominant, e -> e));
    }
    protected void mergeBuild_SourceDirectory(Build.Builder builder, Build target, Build source, boolean sourceDominant, Map context) {
        String src = source.getSourceDirectory();
        String tgt = target.getSourceDirectory();
        if (src != null && (sourceDominant || tgt == null)) {
            builder.sourceDirectory(src);
            builder.location("sourceDirectory", source.getLocation("sourceDirectory"));
        }
    }
    protected void mergeBuild_ScriptSourceDirectory(Build.Builder builder, Build target, Build source, boolean sourceDominant, Map context) {
        String src = source.getScriptSourceDirectory();
        String tgt = target.getScriptSourceDirectory();
        if (src != null && (sourceDominant || tgt == null)) {
            builder.scriptSourceDirectory(src);
            builder.location("scriptSourceDirectory", source.getLocation("scriptSourceDirectory"));
        }
    }
    protected void mergeBuild_TestSourceDirectory(Build.Builder builder, Build target, Build source, boolean sourceDominant, Map context) {
        String src = source.getTestSourceDirectory();
        String tgt = target.getTestSourceDirectory();
        if (src != null && (sourceDominant || tgt == null)) {
            builder.testSourceDirectory(src);
            builder.location("testSourceDirectory", source.getLocation("testSourceDirectory"));
        }
    }
    protected void mergeBuild_OutputDirectory(Build.Builder builder, Build target, Build source, boolean sourceDominant, Map context) {
        String src = source.getOutputDirectory();
        String tgt = target.getOutputDirectory();
        if (src != null && (sourceDominant || tgt == null)) {
            builder.outputDirectory(src);
            builder.location("outputDirectory", source.getLocation("outputDirectory"));
        }
    }
    protected void mergeBuild_TestOutputDirectory(Build.Builder builder, Build target, Build source, boolean sourceDominant, Map context) {
        String src = source.getTestOutputDirectory();
        String tgt = target.getTestOutputDirectory();
        if (src != null && (sourceDominant || tgt == null)) {
            builder.testOutputDirectory(src);
            builder.location("testOutputDirectory", source.getLocation("testOutputDirectory"));
        }
    }
    protected void mergeBuild_Extensions(Build.Builder builder, Build target, Build source, boolean sourceDominant, Map context) {
        if (deepMerge) {
            builder.extensions(merge(target.getExtensions(), source.getExtensions(), getExtensionKey(),
                    (t, s) -> mergeExtension(t, s, sourceDominant, context)));
        } else {
            builder.extensions(merge(target.getExtensions(), source.getExtensions(), sourceDominant, getExtensionKey()));
        }
    }

    protected CiManagement mergeCiManagement(CiManagement target, CiManagement source, boolean sourceDominant, Map context) {
        CiManagement.Builder builder = CiManagement.newBuilder(target);
        mergeCiManagement(builder, target, source, sourceDominant, context);
        return builder.build();
    }

    protected void mergeCiManagement(CiManagement.Builder builder, CiManagement target, CiManagement source, boolean sourceDominant, Map context) {
        mergeCiManagement_System(builder, target, source, sourceDominant, context);
        mergeCiManagement_Url(builder, target, source, sourceDominant, context);
        mergeCiManagement_Notifiers(builder, target, source, sourceDominant, context);
    }

    protected void mergeCiManagement_System(CiManagement.Builder builder, CiManagement target, CiManagement source, boolean sourceDominant, Map context) {
        String src = source.getSystem();
        String tgt = target.getSystem();
        if (src != null && (sourceDominant || tgt == null)) {
            builder.system(src);
            builder.location("system", source.getLocation("system"));
        }
    }
    protected void mergeCiManagement_Url(CiManagement.Builder builder, CiManagement target, CiManagement source, boolean sourceDominant, Map context) {
        String src = source.getUrl();
        String tgt = target.getUrl();
        if (src != null && (sourceDominant || tgt == null)) {
            builder.url(src);
            builder.location("url", source.getLocation("url"));
        }
    }
    protected void mergeCiManagement_Notifiers(CiManagement.Builder builder, CiManagement target, CiManagement source, boolean sourceDominant, Map context) {
        if (deepMerge) {
            builder.notifiers(merge(target.getNotifiers(), source.getNotifiers(), getNotifierKey(),
                    (t, s) -> mergeNotifier(t, s, sourceDominant, context)));
        } else {
            builder.notifiers(merge(target.getNotifiers(), source.getNotifiers(), sourceDominant, getNotifierKey()));
        }
    }

    protected Notifier mergeNotifier(Notifier target, Notifier source, boolean sourceDominant, Map context) {
        Notifier.Builder builder = Notifier.newBuilder(target);
        mergeNotifier(builder, target, source, sourceDominant, context);
        return builder.build();
    }

    protected void mergeNotifier(Notifier.Builder builder, Notifier target, Notifier source, boolean sourceDominant, Map context) {
        mergeNotifier_Type(builder, target, source, sourceDominant, context);
        mergeNotifier_SendOnError(builder, target, source, sourceDominant, context);
        mergeNotifier_SendOnFailure(builder, target, source, sourceDominant, context);
        mergeNotifier_SendOnSuccess(builder, target, source, sourceDominant, context);
        mergeNotifier_SendOnWarning(builder, target, source, sourceDominant, context);
        mergeNotifier_Address(builder, target, source, sourceDominant, context);
        mergeNotifier_Configuration(builder, target, source, sourceDominant, context);
    }

    protected void mergeNotifier_Type(Notifier.Builder builder, Notifier target, Notifier source, boolean sourceDominant, Map context) {
        String src = source.getType();
        String tgt = target.getType();
        if (src != null && (sourceDominant || tgt == null)) {
            builder.type(src);
            builder.location("type", source.getLocation("type"));
        }
    }
    protected void mergeNotifier_SendOnError(Notifier.Builder builder, Notifier target, Notifier source, boolean sourceDominant, Map context) {
        if (sourceDominant) {
            builder.sendOnError(source.isSendOnError());
        }
    }
    protected void mergeNotifier_SendOnFailure(Notifier.Builder builder, Notifier target, Notifier source, boolean sourceDominant, Map context) {
        if (sourceDominant) {
            builder.sendOnFailure(source.isSendOnFailure());
        }
    }
    protected void mergeNotifier_SendOnSuccess(Notifier.Builder builder, Notifier target, Notifier source, boolean sourceDominant, Map context) {
        if (sourceDominant) {
            builder.sendOnSuccess(source.isSendOnSuccess());
        }
    }
    protected void mergeNotifier_SendOnWarning(Notifier.Builder builder, Notifier target, Notifier source, boolean sourceDominant, Map context) {
        if (sourceDominant) {
            builder.sendOnWarning(source.isSendOnWarning());
        }
    }
    protected void mergeNotifier_Address(Notifier.Builder builder, Notifier target, Notifier source, boolean sourceDominant, Map context) {
        String src = source.getAddress();
        String tgt = target.getAddress();
        if (src != null && (sourceDominant || tgt == null)) {
            builder.address(src);
            builder.location("address", source.getLocation("address"));
        }
    }
    protected void mergeNotifier_Configuration(Notifier.Builder builder, Notifier target, Notifier source, boolean sourceDominant, Map context) {
        Map src = source.getConfiguration();
        if (!src.isEmpty()) {
            Map tgt = target.getConfiguration();
            if (tgt.isEmpty()) {
                builder.configuration(src);
                builder.location("configuration", source.getLocation("configuration"));
            } else {
                Map merged = new HashMap<>();
                merged.putAll(sourceDominant ? target.getConfiguration() : source.getConfiguration());
                merged.putAll(sourceDominant ? source.getConfiguration() : target.getConfiguration());
                builder.configuration(merged);
                builder.location("configuration", InputLocation.merge(target.getLocation("configuration"), source.getLocation("configuration"), sourceDominant));
            }
        }
    }

    protected Contributor mergeContributor(Contributor target, Contributor source, boolean sourceDominant, Map context) {
        Contributor.Builder builder = Contributor.newBuilder(target);
        mergeContributor(builder, target, source, sourceDominant, context);
        return builder.build();
    }

    protected void mergeContributor(Contributor.Builder builder, Contributor target, Contributor source, boolean sourceDominant, Map context) {
        mergeContributor_Name(builder, target, source, sourceDominant, context);
        mergeContributor_Email(builder, target, source, sourceDominant, context);
        mergeContributor_Url(builder, target, source, sourceDominant, context);
        mergeContributor_Organization(builder, target, source, sourceDominant, context);
        mergeContributor_OrganizationUrl(builder, target, source, sourceDominant, context);
        mergeContributor_Roles(builder, target, source, sourceDominant, context);
        mergeContributor_Timezone(builder, target, source, sourceDominant, context);
        mergeContributor_Properties(builder, target, source, sourceDominant, context);
    }

    protected void mergeContributor_Name(Contributor.Builder builder, Contributor target, Contributor source, boolean sourceDominant, Map context) {
        String src = source.getName();
        String tgt = target.getName();
        if (src != null && (sourceDominant || tgt == null)) {
            builder.name(src);
            builder.location("name", source.getLocation("name"));
        }
    }
    protected void mergeContributor_Email(Contributor.Builder builder, Contributor target, Contributor source, boolean sourceDominant, Map context) {
        String src = source.getEmail();
        String tgt = target.getEmail();
        if (src != null && (sourceDominant || tgt == null)) {
            builder.email(src);
            builder.location("email", source.getLocation("email"));
        }
    }
    protected void mergeContributor_Url(Contributor.Builder builder, Contributor target, Contributor source, boolean sourceDominant, Map context) {
        String src = source.getUrl();
        String tgt = target.getUrl();
        if (src != null && (sourceDominant || tgt == null)) {
            builder.url(src);
            builder.location("url", source.getLocation("url"));
        }
    }
    protected void mergeContributor_Organization(Contributor.Builder builder, Contributor target, Contributor source, boolean sourceDominant, Map context) {
        String src = source.getOrganization();
        String tgt = target.getOrganization();
        if (src != null && (sourceDominant || tgt == null)) {
            builder.organization(src);
            builder.location("organization", source.getLocation("organization"));
        }
    }
    protected void mergeContributor_OrganizationUrl(Contributor.Builder builder, Contributor target, Contributor source, boolean sourceDominant, Map context) {
        String src = source.getOrganizationUrl();
        String tgt = target.getOrganizationUrl();
        if (src != null && (sourceDominant || tgt == null)) {
            builder.organizationUrl(src);
            builder.location("organizationUrl", source.getLocation("organizationUrl"));
        }
    }
    protected void mergeContributor_Roles(Contributor.Builder builder, Contributor target, Contributor source, boolean sourceDominant, Map context) {
        builder.roles(merge(target.getRoles(), source.getRoles(), sourceDominant, e -> e));
    }
    protected void mergeContributor_Timezone(Contributor.Builder builder, Contributor target, Contributor source, boolean sourceDominant, Map context) {
        String src = source.getTimezone();
        String tgt = target.getTimezone();
        if (src != null && (sourceDominant || tgt == null)) {
            builder.timezone(src);
            builder.location("timezone", source.getLocation("timezone"));
        }
    }
    protected void mergeContributor_Properties(Contributor.Builder builder, Contributor target, Contributor source, boolean sourceDominant, Map context) {
        Map src = source.getProperties();
        if (!src.isEmpty()) {
            Map tgt = target.getProperties();
            if (tgt.isEmpty()) {
                builder.properties(src);
                builder.location("properties", source.getLocation("properties"));
            } else {
                Map merged = new HashMap<>();
                merged.putAll(sourceDominant ? target.getProperties() : source.getProperties());
                merged.putAll(sourceDominant ? source.getProperties() : target.getProperties());
                builder.properties(merged);
                builder.location("properties", InputLocation.merge(target.getLocation("properties"), source.getLocation("properties"), sourceDominant));
            }
        }
    }

    protected Dependency mergeDependency(Dependency target, Dependency source, boolean sourceDominant, Map context) {
        Dependency.Builder builder = Dependency.newBuilder(target);
        mergeDependency(builder, target, source, sourceDominant, context);
        return builder.build();
    }

    protected void mergeDependency(Dependency.Builder builder, Dependency target, Dependency source, boolean sourceDominant, Map context) {
        mergeDependency_GroupId(builder, target, source, sourceDominant, context);
        mergeDependency_ArtifactId(builder, target, source, sourceDominant, context);
        mergeDependency_Version(builder, target, source, sourceDominant, context);
        mergeDependency_Type(builder, target, source, sourceDominant, context);
        mergeDependency_Classifier(builder, target, source, sourceDominant, context);
        mergeDependency_Scope(builder, target, source, sourceDominant, context);
        mergeDependency_SystemPath(builder, target, source, sourceDominant, context);
        mergeDependency_Exclusions(builder, target, source, sourceDominant, context);
        mergeDependency_Optional(builder, target, source, sourceDominant, context);
    }

    protected void mergeDependency_GroupId(Dependency.Builder builder, Dependency target, Dependency source, boolean sourceDominant, Map context) {
        String src = source.getGroupId();
        String tgt = target.getGroupId();
        if (src != null && (sourceDominant || tgt == null)) {
            builder.groupId(src);
            builder.location("groupId", source.getLocation("groupId"));
        }
    }
    protected void mergeDependency_ArtifactId(Dependency.Builder builder, Dependency target, Dependency source, boolean sourceDominant, Map context) {
        String src = source.getArtifactId();
        String tgt = target.getArtifactId();
        if (src != null && (sourceDominant || tgt == null)) {
            builder.artifactId(src);
            builder.location("artifactId", source.getLocation("artifactId"));
        }
    }
    protected void mergeDependency_Version(Dependency.Builder builder, Dependency target, Dependency source, boolean sourceDominant, Map context) {
        String src = source.getVersion();
        String tgt = target.getVersion();
        if (src != null && (sourceDominant || tgt == null)) {
            builder.version(src);
            builder.location("version", source.getLocation("version"));
        }
    }
    protected void mergeDependency_Type(Dependency.Builder builder, Dependency target, Dependency source, boolean sourceDominant, Map context) {
        String src = source.getType();
        String tgt = target.getType();
        if (src != null && (sourceDominant || tgt == null)) {
            builder.type(src);
            builder.location("type", source.getLocation("type"));
        }
    }
    protected void mergeDependency_Classifier(Dependency.Builder builder, Dependency target, Dependency source, boolean sourceDominant, Map context) {
        String src = source.getClassifier();
        String tgt = target.getClassifier();
        if (src != null && (sourceDominant || tgt == null)) {
            builder.classifier(src);
            builder.location("classifier", source.getLocation("classifier"));
        }
    }
    protected void mergeDependency_Scope(Dependency.Builder builder, Dependency target, Dependency source, boolean sourceDominant, Map context) {
        String src = source.getScope();
        String tgt = target.getScope();
        if (src != null && (sourceDominant || tgt == null)) {
            builder.scope(src);
            builder.location("scope", source.getLocation("scope"));
        }
    }
    protected void mergeDependency_SystemPath(Dependency.Builder builder, Dependency target, Dependency source, boolean sourceDominant, Map context) {
        String src = source.getSystemPath();
        String tgt = target.getSystemPath();
        if (src != null && (sourceDominant || tgt == null)) {
            builder.systemPath(src);
            builder.location("systemPath", source.getLocation("systemPath"));
        }
    }
    protected void mergeDependency_Exclusions(Dependency.Builder builder, Dependency target, Dependency source, boolean sourceDominant, Map context) {
        if (deepMerge) {
            builder.exclusions(merge(target.getExclusions(), source.getExclusions(), getExclusionKey(),
                    (t, s) -> mergeExclusion(t, s, sourceDominant, context)));
        } else {
            builder.exclusions(merge(target.getExclusions(), source.getExclusions(), sourceDominant, getExclusionKey()));
        }
    }
    protected void mergeDependency_Optional(Dependency.Builder builder, Dependency target, Dependency source, boolean sourceDominant, Map context) {
        String src = source.getOptional();
        String tgt = target.getOptional();
        if (src != null && (sourceDominant || tgt == null)) {
            builder.optional(src);
            builder.location("optional", source.getLocation("optional"));
        }
    }

    protected Developer mergeDeveloper(Developer target, Developer source, boolean sourceDominant, Map context) {
        Developer.Builder builder = Developer.newBuilder(target);
        mergeDeveloper(builder, target, source, sourceDominant, context);
        return builder.build();
    }

    protected void mergeDeveloper(Developer.Builder builder, Developer target, Developer source, boolean sourceDominant, Map context) {
        mergeContributor(builder, target, source, sourceDominant, context);
        mergeDeveloper_Id(builder, target, source, sourceDominant, context);
    }

    protected void mergeDeveloper_Name(Developer.Builder builder, Developer target, Developer source, boolean sourceDominant, Map context) {
        String src = source.getName();
        String tgt = target.getName();
        if (src != null && (sourceDominant || tgt == null)) {
            builder.name(src);
            builder.location("name", source.getLocation("name"));
        }
    }
    protected void mergeDeveloper_Email(Developer.Builder builder, Developer target, Developer source, boolean sourceDominant, Map context) {
        String src = source.getEmail();
        String tgt = target.getEmail();
        if (src != null && (sourceDominant || tgt == null)) {
            builder.email(src);
            builder.location("email", source.getLocation("email"));
        }
    }
    protected void mergeDeveloper_Url(Developer.Builder builder, Developer target, Developer source, boolean sourceDominant, Map context) {
        String src = source.getUrl();
        String tgt = target.getUrl();
        if (src != null && (sourceDominant || tgt == null)) {
            builder.url(src);
            builder.location("url", source.getLocation("url"));
        }
    }
    protected void mergeDeveloper_Organization(Developer.Builder builder, Developer target, Developer source, boolean sourceDominant, Map context) {
        String src = source.getOrganization();
        String tgt = target.getOrganization();
        if (src != null && (sourceDominant || tgt == null)) {
            builder.organization(src);
            builder.location("organization", source.getLocation("organization"));
        }
    }
    protected void mergeDeveloper_OrganizationUrl(Developer.Builder builder, Developer target, Developer source, boolean sourceDominant, Map context) {
        String src = source.getOrganizationUrl();
        String tgt = target.getOrganizationUrl();
        if (src != null && (sourceDominant || tgt == null)) {
            builder.organizationUrl(src);
            builder.location("organizationUrl", source.getLocation("organizationUrl"));
        }
    }
    protected void mergeDeveloper_Roles(Developer.Builder builder, Developer target, Developer source, boolean sourceDominant, Map context) {
        builder.roles(merge(target.getRoles(), source.getRoles(), sourceDominant, e -> e));
    }
    protected void mergeDeveloper_Timezone(Developer.Builder builder, Developer target, Developer source, boolean sourceDominant, Map context) {
        String src = source.getTimezone();
        String tgt = target.getTimezone();
        if (src != null && (sourceDominant || tgt == null)) {
            builder.timezone(src);
            builder.location("timezone", source.getLocation("timezone"));
        }
    }
    protected void mergeDeveloper_Properties(Developer.Builder builder, Developer target, Developer source, boolean sourceDominant, Map context) {
        Map src = source.getProperties();
        if (!src.isEmpty()) {
            Map tgt = target.getProperties();
            if (tgt.isEmpty()) {
                builder.properties(src);
                builder.location("properties", source.getLocation("properties"));
            } else {
                Map merged = new HashMap<>();
                merged.putAll(sourceDominant ? target.getProperties() : source.getProperties());
                merged.putAll(sourceDominant ? source.getProperties() : target.getProperties());
                builder.properties(merged);
                builder.location("properties", InputLocation.merge(target.getLocation("properties"), source.getLocation("properties"), sourceDominant));
            }
        }
    }
    protected void mergeDeveloper_Id(Developer.Builder builder, Developer target, Developer source, boolean sourceDominant, Map context) {
        String src = source.getId();
        String tgt = target.getId();
        if (src != null && (sourceDominant || tgt == null)) {
            builder.id(src);
            builder.location("id", source.getLocation("id"));
        }
    }

    protected Exclusion mergeExclusion(Exclusion target, Exclusion source, boolean sourceDominant, Map context) {
        Exclusion.Builder builder = Exclusion.newBuilder(target);
        mergeExclusion(builder, target, source, sourceDominant, context);
        return builder.build();
    }

    protected void mergeExclusion(Exclusion.Builder builder, Exclusion target, Exclusion source, boolean sourceDominant, Map context) {
        mergeExclusion_GroupId(builder, target, source, sourceDominant, context);
        mergeExclusion_ArtifactId(builder, target, source, sourceDominant, context);
    }

    protected void mergeExclusion_GroupId(Exclusion.Builder builder, Exclusion target, Exclusion source, boolean sourceDominant, Map context) {
        String src = source.getGroupId();
        String tgt = target.getGroupId();
        if (src != null && (sourceDominant || tgt == null)) {
            builder.groupId(src);
            builder.location("groupId", source.getLocation("groupId"));
        }
    }
    protected void mergeExclusion_ArtifactId(Exclusion.Builder builder, Exclusion target, Exclusion source, boolean sourceDominant, Map context) {
        String src = source.getArtifactId();
        String tgt = target.getArtifactId();
        if (src != null && (sourceDominant || tgt == null)) {
            builder.artifactId(src);
            builder.location("artifactId", source.getLocation("artifactId"));
        }
    }

    protected IssueManagement mergeIssueManagement(IssueManagement target, IssueManagement source, boolean sourceDominant, Map context) {
        IssueManagement.Builder builder = IssueManagement.newBuilder(target);
        mergeIssueManagement(builder, target, source, sourceDominant, context);
        return builder.build();
    }

    protected void mergeIssueManagement(IssueManagement.Builder builder, IssueManagement target, IssueManagement source, boolean sourceDominant, Map context) {
        mergeIssueManagement_System(builder, target, source, sourceDominant, context);
        mergeIssueManagement_Url(builder, target, source, sourceDominant, context);
    }

    protected void mergeIssueManagement_System(IssueManagement.Builder builder, IssueManagement target, IssueManagement source, boolean sourceDominant, Map context) {
        String src = source.getSystem();
        String tgt = target.getSystem();
        if (src != null && (sourceDominant || tgt == null)) {
            builder.system(src);
            builder.location("system", source.getLocation("system"));
        }
    }
    protected void mergeIssueManagement_Url(IssueManagement.Builder builder, IssueManagement target, IssueManagement source, boolean sourceDominant, Map context) {
        String src = source.getUrl();
        String tgt = target.getUrl();
        if (src != null && (sourceDominant || tgt == null)) {
            builder.url(src);
            builder.location("url", source.getLocation("url"));
        }
    }

    protected DistributionManagement mergeDistributionManagement(DistributionManagement target, DistributionManagement source, boolean sourceDominant, Map context) {
        DistributionManagement.Builder builder = DistributionManagement.newBuilder(target);
        mergeDistributionManagement(builder, target, source, sourceDominant, context);
        return builder.build();
    }

    protected void mergeDistributionManagement(DistributionManagement.Builder builder, DistributionManagement target, DistributionManagement source, boolean sourceDominant, Map context) {
        mergeDistributionManagement_Repository(builder, target, source, sourceDominant, context);
        mergeDistributionManagement_SnapshotRepository(builder, target, source, sourceDominant, context);
        mergeDistributionManagement_Site(builder, target, source, sourceDominant, context);
        mergeDistributionManagement_DownloadUrl(builder, target, source, sourceDominant, context);
        mergeDistributionManagement_Relocation(builder, target, source, sourceDominant, context);
        mergeDistributionManagement_Status(builder, target, source, sourceDominant, context);
    }

    protected void mergeDistributionManagement_Repository(DistributionManagement.Builder builder, DistributionManagement target, DistributionManagement source, boolean sourceDominant, Map context) {
        DeploymentRepository src = source.getRepository();
        if (src != null) {
            DeploymentRepository tgt = target.getRepository();
            if (tgt == null) {
                tgt = DeploymentRepository.newInstance(false);
            }
            DeploymentRepository merged = mergeDeploymentRepository(tgt, src, sourceDominant, context);
            builder.repository(merged);
            if (target.getRepository() == null) {
                builder.location("repository", source.getLocation("repository"));
            } else if (merged != tgt) {
                builder.location("repository", new InputLocation(-1, -1));
            }
        }
    }
    protected void mergeDistributionManagement_SnapshotRepository(DistributionManagement.Builder builder, DistributionManagement target, DistributionManagement source, boolean sourceDominant, Map context) {
        DeploymentRepository src = source.getSnapshotRepository();
        if (src != null) {
            DeploymentRepository tgt = target.getSnapshotRepository();
            if (tgt == null) {
                tgt = DeploymentRepository.newInstance(false);
            }
            DeploymentRepository merged = mergeDeploymentRepository(tgt, src, sourceDominant, context);
            builder.snapshotRepository(merged);
            if (target.getSnapshotRepository() == null) {
                builder.location("snapshotRepository", source.getLocation("snapshotRepository"));
            } else if (merged != tgt) {
                builder.location("snapshotRepository", new InputLocation(-1, -1));
            }
        }
    }
    protected void mergeDistributionManagement_Site(DistributionManagement.Builder builder, DistributionManagement target, DistributionManagement source, boolean sourceDominant, Map context) {
        Site src = source.getSite();
        if (src != null) {
            Site tgt = target.getSite();
            if (tgt == null) {
                tgt = Site.newInstance(false);
            }
            Site merged = mergeSite(tgt, src, sourceDominant, context);
            builder.site(merged);
            if (target.getSite() == null) {
                builder.location("site", source.getLocation("site"));
            } else if (merged != tgt) {
                builder.location("site", new InputLocation(-1, -1));
            }
        }
    }
    protected void mergeDistributionManagement_DownloadUrl(DistributionManagement.Builder builder, DistributionManagement target, DistributionManagement source, boolean sourceDominant, Map context) {
        String src = source.getDownloadUrl();
        String tgt = target.getDownloadUrl();
        if (src != null && (sourceDominant || tgt == null)) {
            builder.downloadUrl(src);
            builder.location("downloadUrl", source.getLocation("downloadUrl"));
        }
    }
    protected void mergeDistributionManagement_Relocation(DistributionManagement.Builder builder, DistributionManagement target, DistributionManagement source, boolean sourceDominant, Map context) {
        Relocation src = source.getRelocation();
        if (src != null) {
            Relocation tgt = target.getRelocation();
            if (tgt == null) {
                tgt = Relocation.newInstance(false);
            }
            Relocation merged = mergeRelocation(tgt, src, sourceDominant, context);
            builder.relocation(merged);
            if (target.getRelocation() == null) {
                builder.location("relocation", source.getLocation("relocation"));
            } else if (merged != tgt) {
                builder.location("relocation", new InputLocation(-1, -1));
            }
        }
    }
    protected void mergeDistributionManagement_Status(DistributionManagement.Builder builder, DistributionManagement target, DistributionManagement source, boolean sourceDominant, Map context) {
        String src = source.getStatus();
        String tgt = target.getStatus();
        if (src != null && (sourceDominant || tgt == null)) {
            builder.status(src);
            builder.location("status", source.getLocation("status"));
        }
    }

    protected License mergeLicense(License target, License source, boolean sourceDominant, Map context) {
        License.Builder builder = License.newBuilder(target);
        mergeLicense(builder, target, source, sourceDominant, context);
        return builder.build();
    }

    protected void mergeLicense(License.Builder builder, License target, License source, boolean sourceDominant, Map context) {
        mergeLicense_Name(builder, target, source, sourceDominant, context);
        mergeLicense_Url(builder, target, source, sourceDominant, context);
        mergeLicense_Distribution(builder, target, source, sourceDominant, context);
        mergeLicense_Comments(builder, target, source, sourceDominant, context);
    }

    protected void mergeLicense_Name(License.Builder builder, License target, License source, boolean sourceDominant, Map context) {
        String src = source.getName();
        String tgt = target.getName();
        if (src != null && (sourceDominant || tgt == null)) {
            builder.name(src);
            builder.location("name", source.getLocation("name"));
        }
    }
    protected void mergeLicense_Url(License.Builder builder, License target, License source, boolean sourceDominant, Map context) {
        String src = source.getUrl();
        String tgt = target.getUrl();
        if (src != null && (sourceDominant || tgt == null)) {
            builder.url(src);
            builder.location("url", source.getLocation("url"));
        }
    }
    protected void mergeLicense_Distribution(License.Builder builder, License target, License source, boolean sourceDominant, Map context) {
        String src = source.getDistribution();
        String tgt = target.getDistribution();
        if (src != null && (sourceDominant || tgt == null)) {
            builder.distribution(src);
            builder.location("distribution", source.getLocation("distribution"));
        }
    }
    protected void mergeLicense_Comments(License.Builder builder, License target, License source, boolean sourceDominant, Map context) {
        String src = source.getComments();
        String tgt = target.getComments();
        if (src != null && (sourceDominant || tgt == null)) {
            builder.comments(src);
            builder.location("comments", source.getLocation("comments"));
        }
    }

    protected MailingList mergeMailingList(MailingList target, MailingList source, boolean sourceDominant, Map context) {
        MailingList.Builder builder = MailingList.newBuilder(target);
        mergeMailingList(builder, target, source, sourceDominant, context);
        return builder.build();
    }

    protected void mergeMailingList(MailingList.Builder builder, MailingList target, MailingList source, boolean sourceDominant, Map context) {
        mergeMailingList_Name(builder, target, source, sourceDominant, context);
        mergeMailingList_Subscribe(builder, target, source, sourceDominant, context);
        mergeMailingList_Unsubscribe(builder, target, source, sourceDominant, context);
        mergeMailingList_Post(builder, target, source, sourceDominant, context);
        mergeMailingList_Archive(builder, target, source, sourceDominant, context);
        mergeMailingList_OtherArchives(builder, target, source, sourceDominant, context);
    }

    protected void mergeMailingList_Name(MailingList.Builder builder, MailingList target, MailingList source, boolean sourceDominant, Map context) {
        String src = source.getName();
        String tgt = target.getName();
        if (src != null && (sourceDominant || tgt == null)) {
            builder.name(src);
            builder.location("name", source.getLocation("name"));
        }
    }
    protected void mergeMailingList_Subscribe(MailingList.Builder builder, MailingList target, MailingList source, boolean sourceDominant, Map context) {
        String src = source.getSubscribe();
        String tgt = target.getSubscribe();
        if (src != null && (sourceDominant || tgt == null)) {
            builder.subscribe(src);
            builder.location("subscribe", source.getLocation("subscribe"));
        }
    }
    protected void mergeMailingList_Unsubscribe(MailingList.Builder builder, MailingList target, MailingList source, boolean sourceDominant, Map context) {
        String src = source.getUnsubscribe();
        String tgt = target.getUnsubscribe();
        if (src != null && (sourceDominant || tgt == null)) {
            builder.unsubscribe(src);
            builder.location("unsubscribe", source.getLocation("unsubscribe"));
        }
    }
    protected void mergeMailingList_Post(MailingList.Builder builder, MailingList target, MailingList source, boolean sourceDominant, Map context) {
        String src = source.getPost();
        String tgt = target.getPost();
        if (src != null && (sourceDominant || tgt == null)) {
            builder.post(src);
            builder.location("post", source.getLocation("post"));
        }
    }
    protected void mergeMailingList_Archive(MailingList.Builder builder, MailingList target, MailingList source, boolean sourceDominant, Map context) {
        String src = source.getArchive();
        String tgt = target.getArchive();
        if (src != null && (sourceDominant || tgt == null)) {
            builder.archive(src);
            builder.location("archive", source.getLocation("archive"));
        }
    }
    protected void mergeMailingList_OtherArchives(MailingList.Builder builder, MailingList target, MailingList source, boolean sourceDominant, Map context) {
        builder.otherArchives(merge(target.getOtherArchives(), source.getOtherArchives(), sourceDominant, e -> e));
    }

    protected Organization mergeOrganization(Organization target, Organization source, boolean sourceDominant, Map context) {
        Organization.Builder builder = Organization.newBuilder(target);
        mergeOrganization(builder, target, source, sourceDominant, context);
        return builder.build();
    }

    protected void mergeOrganization(Organization.Builder builder, Organization target, Organization source, boolean sourceDominant, Map context) {
        mergeOrganization_Name(builder, target, source, sourceDominant, context);
        mergeOrganization_Url(builder, target, source, sourceDominant, context);
    }

    protected void mergeOrganization_Name(Organization.Builder builder, Organization target, Organization source, boolean sourceDominant, Map context) {
        String src = source.getName();
        String tgt = target.getName();
        if (src != null && (sourceDominant || tgt == null)) {
            builder.name(src);
            builder.location("name", source.getLocation("name"));
        }
    }
    protected void mergeOrganization_Url(Organization.Builder builder, Organization target, Organization source, boolean sourceDominant, Map context) {
        String src = source.getUrl();
        String tgt = target.getUrl();
        if (src != null && (sourceDominant || tgt == null)) {
            builder.url(src);
            builder.location("url", source.getLocation("url"));
        }
    }

    protected PatternSet mergePatternSet(PatternSet target, PatternSet source, boolean sourceDominant, Map context) {
        PatternSet.Builder builder = PatternSet.newBuilder(target);
        mergePatternSet(builder, target, source, sourceDominant, context);
        return builder.build();
    }

    protected void mergePatternSet(PatternSet.Builder builder, PatternSet target, PatternSet source, boolean sourceDominant, Map context) {
        mergePatternSet_Includes(builder, target, source, sourceDominant, context);
        mergePatternSet_Excludes(builder, target, source, sourceDominant, context);
    }

    protected void mergePatternSet_Includes(PatternSet.Builder builder, PatternSet target, PatternSet source, boolean sourceDominant, Map context) {
        builder.includes(merge(target.getIncludes(), source.getIncludes(), sourceDominant, e -> e));
    }
    protected void mergePatternSet_Excludes(PatternSet.Builder builder, PatternSet target, PatternSet source, boolean sourceDominant, Map context) {
        builder.excludes(merge(target.getExcludes(), source.getExcludes(), sourceDominant, e -> e));
    }

    protected Parent mergeParent(Parent target, Parent source, boolean sourceDominant, Map context) {
        Parent.Builder builder = Parent.newBuilder(target);
        mergeParent(builder, target, source, sourceDominant, context);
        return builder.build();
    }

    protected void mergeParent(Parent.Builder builder, Parent target, Parent source, boolean sourceDominant, Map context) {
        mergeParent_GroupId(builder, target, source, sourceDominant, context);
        mergeParent_ArtifactId(builder, target, source, sourceDominant, context);
        mergeParent_Version(builder, target, source, sourceDominant, context);
        mergeParent_RelativePath(builder, target, source, sourceDominant, context);
    }

    protected void mergeParent_GroupId(Parent.Builder builder, Parent target, Parent source, boolean sourceDominant, Map context) {
        String src = source.getGroupId();
        String tgt = target.getGroupId();
        if (src != null && (sourceDominant || tgt == null)) {
            builder.groupId(src);
            builder.location("groupId", source.getLocation("groupId"));
        }
    }
    protected void mergeParent_ArtifactId(Parent.Builder builder, Parent target, Parent source, boolean sourceDominant, Map context) {
        String src = source.getArtifactId();
        String tgt = target.getArtifactId();
        if (src != null && (sourceDominant || tgt == null)) {
            builder.artifactId(src);
            builder.location("artifactId", source.getLocation("artifactId"));
        }
    }
    protected void mergeParent_Version(Parent.Builder builder, Parent target, Parent source, boolean sourceDominant, Map context) {
        String src = source.getVersion();
        String tgt = target.getVersion();
        if (src != null && (sourceDominant || tgt == null)) {
            builder.version(src);
            builder.location("version", source.getLocation("version"));
        }
    }
    protected void mergeParent_RelativePath(Parent.Builder builder, Parent target, Parent source, boolean sourceDominant, Map context) {
        String src = source.getRelativePath();
        String tgt = target.getRelativePath();
        if (src != null && (sourceDominant || tgt == null)) {
            builder.relativePath(src);
            builder.location("relativePath", source.getLocation("relativePath"));
        }
    }

    protected Scm mergeScm(Scm target, Scm source, boolean sourceDominant, Map context) {
        Scm.Builder builder = Scm.newBuilder(target);
        mergeScm(builder, target, source, sourceDominant, context);
        return builder.build();
    }

    protected void mergeScm(Scm.Builder builder, Scm target, Scm source, boolean sourceDominant, Map context) {
        mergeScm_Connection(builder, target, source, sourceDominant, context);
        mergeScm_DeveloperConnection(builder, target, source, sourceDominant, context);
        mergeScm_Tag(builder, target, source, sourceDominant, context);
        mergeScm_Url(builder, target, source, sourceDominant, context);
        mergeScm_ChildScmConnectionInheritAppendPath(builder, target, source, sourceDominant, context);
        mergeScm_ChildScmDeveloperConnectionInheritAppendPath(builder, target, source, sourceDominant, context);
        mergeScm_ChildScmUrlInheritAppendPath(builder, target, source, sourceDominant, context);
    }

    protected void mergeScm_Connection(Scm.Builder builder, Scm target, Scm source, boolean sourceDominant, Map context) {
        String src = source.getConnection();
        String tgt = target.getConnection();
        if (src != null && (sourceDominant || tgt == null)) {
            builder.connection(src);
            builder.location("connection", source.getLocation("connection"));
        }
    }
    protected void mergeScm_DeveloperConnection(Scm.Builder builder, Scm target, Scm source, boolean sourceDominant, Map context) {
        String src = source.getDeveloperConnection();
        String tgt = target.getDeveloperConnection();
        if (src != null && (sourceDominant || tgt == null)) {
            builder.developerConnection(src);
            builder.location("developerConnection", source.getLocation("developerConnection"));
        }
    }
    protected void mergeScm_Tag(Scm.Builder builder, Scm target, Scm source, boolean sourceDominant, Map context) {
        String src = source.getTag();
        String tgt = target.getTag();
        if (src != null && (sourceDominant || tgt == null)) {
            builder.tag(src);
            builder.location("tag", source.getLocation("tag"));
        }
    }
    protected void mergeScm_Url(Scm.Builder builder, Scm target, Scm source, boolean sourceDominant, Map context) {
        String src = source.getUrl();
        String tgt = target.getUrl();
        if (src != null && (sourceDominant || tgt == null)) {
            builder.url(src);
            builder.location("url", source.getLocation("url"));
        }
    }
    protected void mergeScm_ChildScmConnectionInheritAppendPath(Scm.Builder builder, Scm target, Scm source, boolean sourceDominant, Map context) {
        String src = source.getChildScmConnectionInheritAppendPath();
        String tgt = target.getChildScmConnectionInheritAppendPath();
        if (src != null && (sourceDominant || tgt == null)) {
            builder.childScmConnectionInheritAppendPath(src);
            builder.location("childScmConnectionInheritAppendPath", source.getLocation("childScmConnectionInheritAppendPath"));
        }
    }
    protected void mergeScm_ChildScmDeveloperConnectionInheritAppendPath(Scm.Builder builder, Scm target, Scm source, boolean sourceDominant, Map context) {
        String src = source.getChildScmDeveloperConnectionInheritAppendPath();
        String tgt = target.getChildScmDeveloperConnectionInheritAppendPath();
        if (src != null && (sourceDominant || tgt == null)) {
            builder.childScmDeveloperConnectionInheritAppendPath(src);
            builder.location("childScmDeveloperConnectionInheritAppendPath", source.getLocation("childScmDeveloperConnectionInheritAppendPath"));
        }
    }
    protected void mergeScm_ChildScmUrlInheritAppendPath(Scm.Builder builder, Scm target, Scm source, boolean sourceDominant, Map context) {
        String src = source.getChildScmUrlInheritAppendPath();
        String tgt = target.getChildScmUrlInheritAppendPath();
        if (src != null && (sourceDominant || tgt == null)) {
            builder.childScmUrlInheritAppendPath(src);
            builder.location("childScmUrlInheritAppendPath", source.getLocation("childScmUrlInheritAppendPath"));
        }
    }

    protected FileSet mergeFileSet(FileSet target, FileSet source, boolean sourceDominant, Map context) {
        FileSet.Builder builder = FileSet.newBuilder(target);
        mergeFileSet(builder, target, source, sourceDominant, context);
        return builder.build();
    }

    protected void mergeFileSet(FileSet.Builder builder, FileSet target, FileSet source, boolean sourceDominant, Map context) {
        mergePatternSet(builder, target, source, sourceDominant, context);
        mergeFileSet_Directory(builder, target, source, sourceDominant, context);
    }

    protected void mergeFileSet_Includes(FileSet.Builder builder, FileSet target, FileSet source, boolean sourceDominant, Map context) {
        builder.includes(merge(target.getIncludes(), source.getIncludes(), sourceDominant, e -> e));
    }
    protected void mergeFileSet_Excludes(FileSet.Builder builder, FileSet target, FileSet source, boolean sourceDominant, Map context) {
        builder.excludes(merge(target.getExcludes(), source.getExcludes(), sourceDominant, e -> e));
    }
    protected void mergeFileSet_Directory(FileSet.Builder builder, FileSet target, FileSet source, boolean sourceDominant, Map context) {
        String src = source.getDirectory();
        String tgt = target.getDirectory();
        if (src != null && (sourceDominant || tgt == null)) {
            builder.directory(src);
            builder.location("directory", source.getLocation("directory"));
        }
    }

    protected Resource mergeResource(Resource target, Resource source, boolean sourceDominant, Map context) {
        Resource.Builder builder = Resource.newBuilder(target);
        mergeResource(builder, target, source, sourceDominant, context);
        return builder.build();
    }

    protected void mergeResource(Resource.Builder builder, Resource target, Resource source, boolean sourceDominant, Map context) {
        mergeFileSet(builder, target, source, sourceDominant, context);
        mergeResource_TargetPath(builder, target, source, sourceDominant, context);
        mergeResource_Filtering(builder, target, source, sourceDominant, context);
        mergeResource_MergeId(builder, target, source, sourceDominant, context);
    }

    protected void mergeResource_Includes(Resource.Builder builder, Resource target, Resource source, boolean sourceDominant, Map context) {
        builder.includes(merge(target.getIncludes(), source.getIncludes(), sourceDominant, e -> e));
    }
    protected void mergeResource_Excludes(Resource.Builder builder, Resource target, Resource source, boolean sourceDominant, Map context) {
        builder.excludes(merge(target.getExcludes(), source.getExcludes(), sourceDominant, e -> e));
    }
    protected void mergeResource_Directory(Resource.Builder builder, Resource target, Resource source, boolean sourceDominant, Map context) {
        String src = source.getDirectory();
        String tgt = target.getDirectory();
        if (src != null && (sourceDominant || tgt == null)) {
            builder.directory(src);
            builder.location("directory", source.getLocation("directory"));
        }
    }
    protected void mergeResource_TargetPath(Resource.Builder builder, Resource target, Resource source, boolean sourceDominant, Map context) {
        String src = source.getTargetPath();
        String tgt = target.getTargetPath();
        if (src != null && (sourceDominant || tgt == null)) {
            builder.targetPath(src);
            builder.location("targetPath", source.getLocation("targetPath"));
        }
    }
    protected void mergeResource_Filtering(Resource.Builder builder, Resource target, Resource source, boolean sourceDominant, Map context) {
        String src = source.getFiltering();
        String tgt = target.getFiltering();
        if (src != null && (sourceDominant || tgt == null)) {
            builder.filtering(src);
            builder.location("filtering", source.getLocation("filtering"));
        }
    }
    protected void mergeResource_MergeId(Resource.Builder builder, Resource target, Resource source, boolean sourceDominant, Map context) {
        String src = source.getMergeId();
        String tgt = target.getMergeId();
        if (src != null && (sourceDominant || tgt == null)) {
            builder.mergeId(src);
            builder.location("mergeId", source.getLocation("mergeId"));
        }
    }

    protected RepositoryBase mergeRepositoryBase(RepositoryBase target, RepositoryBase source, boolean sourceDominant, Map context) {
        RepositoryBase.Builder builder = RepositoryBase.newBuilder(target);
        mergeRepositoryBase(builder, target, source, sourceDominant, context);
        return builder.build();
    }

    protected void mergeRepositoryBase(RepositoryBase.Builder builder, RepositoryBase target, RepositoryBase source, boolean sourceDominant, Map context) {
        mergeRepositoryBase_Id(builder, target, source, sourceDominant, context);
        mergeRepositoryBase_Name(builder, target, source, sourceDominant, context);
        mergeRepositoryBase_Url(builder, target, source, sourceDominant, context);
        mergeRepositoryBase_Layout(builder, target, source, sourceDominant, context);
    }

    protected void mergeRepositoryBase_Id(RepositoryBase.Builder builder, RepositoryBase target, RepositoryBase source, boolean sourceDominant, Map context) {
        String src = source.getId();
        String tgt = target.getId();
        if (src != null && (sourceDominant || tgt == null)) {
            builder.id(src);
            builder.location("id", source.getLocation("id"));
        }
    }
    protected void mergeRepositoryBase_Name(RepositoryBase.Builder builder, RepositoryBase target, RepositoryBase source, boolean sourceDominant, Map context) {
        String src = source.getName();
        String tgt = target.getName();
        if (src != null && (sourceDominant || tgt == null)) {
            builder.name(src);
            builder.location("name", source.getLocation("name"));
        }
    }
    protected void mergeRepositoryBase_Url(RepositoryBase.Builder builder, RepositoryBase target, RepositoryBase source, boolean sourceDominant, Map context) {
        String src = source.getUrl();
        String tgt = target.getUrl();
        if (src != null && (sourceDominant || tgt == null)) {
            builder.url(src);
            builder.location("url", source.getLocation("url"));
        }
    }
    protected void mergeRepositoryBase_Layout(RepositoryBase.Builder builder, RepositoryBase target, RepositoryBase source, boolean sourceDominant, Map context) {
        String src = source.getLayout();
        String tgt = target.getLayout();
        if (src != null && (sourceDominant || tgt == null)) {
            builder.layout(src);
            builder.location("layout", source.getLocation("layout"));
        }
    }

    protected Repository mergeRepository(Repository target, Repository source, boolean sourceDominant, Map context) {
        Repository.Builder builder = Repository.newBuilder(target);
        mergeRepository(builder, target, source, sourceDominant, context);
        return builder.build();
    }

    protected void mergeRepository(Repository.Builder builder, Repository target, Repository source, boolean sourceDominant, Map context) {
        mergeRepositoryBase(builder, target, source, sourceDominant, context);
        mergeRepository_Releases(builder, target, source, sourceDominant, context);
        mergeRepository_Snapshots(builder, target, source, sourceDominant, context);
    }

    protected void mergeRepository_Id(Repository.Builder builder, Repository target, Repository source, boolean sourceDominant, Map context) {
        String src = source.getId();
        String tgt = target.getId();
        if (src != null && (sourceDominant || tgt == null)) {
            builder.id(src);
            builder.location("id", source.getLocation("id"));
        }
    }
    protected void mergeRepository_Name(Repository.Builder builder, Repository target, Repository source, boolean sourceDominant, Map context) {
        String src = source.getName();
        String tgt = target.getName();
        if (src != null && (sourceDominant || tgt == null)) {
            builder.name(src);
            builder.location("name", source.getLocation("name"));
        }
    }
    protected void mergeRepository_Url(Repository.Builder builder, Repository target, Repository source, boolean sourceDominant, Map context) {
        String src = source.getUrl();
        String tgt = target.getUrl();
        if (src != null && (sourceDominant || tgt == null)) {
            builder.url(src);
            builder.location("url", source.getLocation("url"));
        }
    }
    protected void mergeRepository_Layout(Repository.Builder builder, Repository target, Repository source, boolean sourceDominant, Map context) {
        String src = source.getLayout();
        String tgt = target.getLayout();
        if (src != null && (sourceDominant || tgt == null)) {
            builder.layout(src);
            builder.location("layout", source.getLocation("layout"));
        }
    }
    protected void mergeRepository_Releases(Repository.Builder builder, Repository target, Repository source, boolean sourceDominant, Map context) {
        RepositoryPolicy src = source.getReleases();
        if (src != null) {
            RepositoryPolicy tgt = target.getReleases();
            if (tgt == null) {
                tgt = RepositoryPolicy.newInstance(false);
            }
            RepositoryPolicy merged = mergeRepositoryPolicy(tgt, src, sourceDominant, context);
            builder.releases(merged);
            if (target.getReleases() == null) {
                builder.location("releases", source.getLocation("releases"));
            } else if (merged != tgt) {
                builder.location("releases", new InputLocation(-1, -1));
            }
        }
    }
    protected void mergeRepository_Snapshots(Repository.Builder builder, Repository target, Repository source, boolean sourceDominant, Map context) {
        RepositoryPolicy src = source.getSnapshots();
        if (src != null) {
            RepositoryPolicy tgt = target.getSnapshots();
            if (tgt == null) {
                tgt = RepositoryPolicy.newInstance(false);
            }
            RepositoryPolicy merged = mergeRepositoryPolicy(tgt, src, sourceDominant, context);
            builder.snapshots(merged);
            if (target.getSnapshots() == null) {
                builder.location("snapshots", source.getLocation("snapshots"));
            } else if (merged != tgt) {
                builder.location("snapshots", new InputLocation(-1, -1));
            }
        }
    }

    protected DeploymentRepository mergeDeploymentRepository(DeploymentRepository target, DeploymentRepository source, boolean sourceDominant, Map context) {
        DeploymentRepository.Builder builder = DeploymentRepository.newBuilder(target);
        mergeDeploymentRepository(builder, target, source, sourceDominant, context);
        return builder.build();
    }

    protected void mergeDeploymentRepository(DeploymentRepository.Builder builder, DeploymentRepository target, DeploymentRepository source, boolean sourceDominant, Map context) {
        mergeRepository(builder, target, source, sourceDominant, context);
        mergeDeploymentRepository_UniqueVersion(builder, target, source, sourceDominant, context);
    }

    protected void mergeDeploymentRepository_Id(DeploymentRepository.Builder builder, DeploymentRepository target, DeploymentRepository source, boolean sourceDominant, Map context) {
        String src = source.getId();
        String tgt = target.getId();
        if (src != null && (sourceDominant || tgt == null)) {
            builder.id(src);
            builder.location("id", source.getLocation("id"));
        }
    }
    protected void mergeDeploymentRepository_Name(DeploymentRepository.Builder builder, DeploymentRepository target, DeploymentRepository source, boolean sourceDominant, Map context) {
        String src = source.getName();
        String tgt = target.getName();
        if (src != null && (sourceDominant || tgt == null)) {
            builder.name(src);
            builder.location("name", source.getLocation("name"));
        }
    }
    protected void mergeDeploymentRepository_Url(DeploymentRepository.Builder builder, DeploymentRepository target, DeploymentRepository source, boolean sourceDominant, Map context) {
        String src = source.getUrl();
        String tgt = target.getUrl();
        if (src != null && (sourceDominant || tgt == null)) {
            builder.url(src);
            builder.location("url", source.getLocation("url"));
        }
    }
    protected void mergeDeploymentRepository_Layout(DeploymentRepository.Builder builder, DeploymentRepository target, DeploymentRepository source, boolean sourceDominant, Map context) {
        String src = source.getLayout();
        String tgt = target.getLayout();
        if (src != null && (sourceDominant || tgt == null)) {
            builder.layout(src);
            builder.location("layout", source.getLocation("layout"));
        }
    }
    protected void mergeDeploymentRepository_Releases(DeploymentRepository.Builder builder, DeploymentRepository target, DeploymentRepository source, boolean sourceDominant, Map context) {
        RepositoryPolicy src = source.getReleases();
        if (src != null) {
            RepositoryPolicy tgt = target.getReleases();
            if (tgt == null) {
                tgt = RepositoryPolicy.newInstance(false);
            }
            RepositoryPolicy merged = mergeRepositoryPolicy(tgt, src, sourceDominant, context);
            builder.releases(merged);
            if (target.getReleases() == null) {
                builder.location("releases", source.getLocation("releases"));
            } else if (merged != tgt) {
                builder.location("releases", new InputLocation(-1, -1));
            }
        }
    }
    protected void mergeDeploymentRepository_Snapshots(DeploymentRepository.Builder builder, DeploymentRepository target, DeploymentRepository source, boolean sourceDominant, Map context) {
        RepositoryPolicy src = source.getSnapshots();
        if (src != null) {
            RepositoryPolicy tgt = target.getSnapshots();
            if (tgt == null) {
                tgt = RepositoryPolicy.newInstance(false);
            }
            RepositoryPolicy merged = mergeRepositoryPolicy(tgt, src, sourceDominant, context);
            builder.snapshots(merged);
            if (target.getSnapshots() == null) {
                builder.location("snapshots", source.getLocation("snapshots"));
            } else if (merged != tgt) {
                builder.location("snapshots", new InputLocation(-1, -1));
            }
        }
    }
    protected void mergeDeploymentRepository_UniqueVersion(DeploymentRepository.Builder builder, DeploymentRepository target, DeploymentRepository source, boolean sourceDominant, Map context) {
        if (sourceDominant) {
            builder.uniqueVersion(source.isUniqueVersion());
        }
    }

    protected RepositoryPolicy mergeRepositoryPolicy(RepositoryPolicy target, RepositoryPolicy source, boolean sourceDominant, Map context) {
        RepositoryPolicy.Builder builder = RepositoryPolicy.newBuilder(target);
        mergeRepositoryPolicy(builder, target, source, sourceDominant, context);
        return builder.build();
    }

    protected void mergeRepositoryPolicy(RepositoryPolicy.Builder builder, RepositoryPolicy target, RepositoryPolicy source, boolean sourceDominant, Map context) {
        mergeRepositoryPolicy_Enabled(builder, target, source, sourceDominant, context);
        mergeRepositoryPolicy_UpdatePolicy(builder, target, source, sourceDominant, context);
        mergeRepositoryPolicy_ChecksumPolicy(builder, target, source, sourceDominant, context);
    }

    protected void mergeRepositoryPolicy_Enabled(RepositoryPolicy.Builder builder, RepositoryPolicy target, RepositoryPolicy source, boolean sourceDominant, Map context) {
        String src = source.getEnabled();
        String tgt = target.getEnabled();
        if (src != null && (sourceDominant || tgt == null)) {
            builder.enabled(src);
            builder.location("enabled", source.getLocation("enabled"));
        }
    }
    protected void mergeRepositoryPolicy_UpdatePolicy(RepositoryPolicy.Builder builder, RepositoryPolicy target, RepositoryPolicy source, boolean sourceDominant, Map context) {
        String src = source.getUpdatePolicy();
        String tgt = target.getUpdatePolicy();
        if (src != null && (sourceDominant || tgt == null)) {
            builder.updatePolicy(src);
            builder.location("updatePolicy", source.getLocation("updatePolicy"));
        }
    }
    protected void mergeRepositoryPolicy_ChecksumPolicy(RepositoryPolicy.Builder builder, RepositoryPolicy target, RepositoryPolicy source, boolean sourceDominant, Map context) {
        String src = source.getChecksumPolicy();
        String tgt = target.getChecksumPolicy();
        if (src != null && (sourceDominant || tgt == null)) {
            builder.checksumPolicy(src);
            builder.location("checksumPolicy", source.getLocation("checksumPolicy"));
        }
    }

    protected Site mergeSite(Site target, Site source, boolean sourceDominant, Map context) {
        Site.Builder builder = Site.newBuilder(target);
        mergeSite(builder, target, source, sourceDominant, context);
        return builder.build();
    }

    protected void mergeSite(Site.Builder builder, Site target, Site source, boolean sourceDominant, Map context) {
        mergeSite_Id(builder, target, source, sourceDominant, context);
        mergeSite_Name(builder, target, source, sourceDominant, context);
        mergeSite_Url(builder, target, source, sourceDominant, context);
        mergeSite_ChildSiteUrlInheritAppendPath(builder, target, source, sourceDominant, context);
    }

    protected void mergeSite_Id(Site.Builder builder, Site target, Site source, boolean sourceDominant, Map context) {
        String src = source.getId();
        String tgt = target.getId();
        if (src != null && (sourceDominant || tgt == null)) {
            builder.id(src);
            builder.location("id", source.getLocation("id"));
        }
    }
    protected void mergeSite_Name(Site.Builder builder, Site target, Site source, boolean sourceDominant, Map context) {
        String src = source.getName();
        String tgt = target.getName();
        if (src != null && (sourceDominant || tgt == null)) {
            builder.name(src);
            builder.location("name", source.getLocation("name"));
        }
    }
    protected void mergeSite_Url(Site.Builder builder, Site target, Site source, boolean sourceDominant, Map context) {
        String src = source.getUrl();
        String tgt = target.getUrl();
        if (src != null && (sourceDominant || tgt == null)) {
            builder.url(src);
            builder.location("url", source.getLocation("url"));
        }
    }
    protected void mergeSite_ChildSiteUrlInheritAppendPath(Site.Builder builder, Site target, Site source, boolean sourceDominant, Map context) {
        String src = source.getChildSiteUrlInheritAppendPath();
        String tgt = target.getChildSiteUrlInheritAppendPath();
        if (src != null && (sourceDominant || tgt == null)) {
            builder.childSiteUrlInheritAppendPath(src);
            builder.location("childSiteUrlInheritAppendPath", source.getLocation("childSiteUrlInheritAppendPath"));
        }
    }

    protected ConfigurationContainer mergeConfigurationContainer(ConfigurationContainer target, ConfigurationContainer source, boolean sourceDominant, Map context) {
        ConfigurationContainer.Builder builder = ConfigurationContainer.newBuilder(target);
        mergeConfigurationContainer(builder, target, source, sourceDominant, context);
        return builder.build();
    }

    protected void mergeConfigurationContainer(ConfigurationContainer.Builder builder, ConfigurationContainer target, ConfigurationContainer source, boolean sourceDominant, Map context) {
        mergeConfigurationContainer_Inherited(builder, target, source, sourceDominant, context);
        mergeConfigurationContainer_Configuration(builder, target, source, sourceDominant, context);
    }

    protected void mergeConfigurationContainer_Inherited(ConfigurationContainer.Builder builder, ConfigurationContainer target, ConfigurationContainer source, boolean sourceDominant, Map context) {
        String src = source.getInherited();
        String tgt = target.getInherited();
        if (src != null && (sourceDominant || tgt == null)) {
            builder.inherited(src);
            builder.location("inherited", source.getLocation("inherited"));
        }
    }
    protected void mergeConfigurationContainer_Configuration(ConfigurationContainer.Builder builder, ConfigurationContainer target, ConfigurationContainer source, boolean sourceDominant, Map context) {
        XmlNode src = source.getConfiguration();
        if (src != null) {
            XmlNode tgt = target.getConfiguration();
            if (tgt == null) {
                builder.configuration(src);
                builder.location("configuration", source.getLocation("configuration"));
            } else if (sourceDominant) {
                builder.configuration(src.merge(tgt));
                builder.location("configuration", target.getLocation("configuration"));
            } else {
                builder.configuration(tgt.merge(src));
                builder.location("configuration", null);
            }
        }
    }

    protected Plugin mergePlugin(Plugin target, Plugin source, boolean sourceDominant, Map context) {
        Plugin.Builder builder = Plugin.newBuilder(target);
        mergePlugin(builder, target, source, sourceDominant, context);
        return builder.build();
    }

    protected void mergePlugin(Plugin.Builder builder, Plugin target, Plugin source, boolean sourceDominant, Map context) {
        mergeConfigurationContainer(builder, target, source, sourceDominant, context);
        mergePlugin_GroupId(builder, target, source, sourceDominant, context);
        mergePlugin_ArtifactId(builder, target, source, sourceDominant, context);
        mergePlugin_Version(builder, target, source, sourceDominant, context);
        mergePlugin_Extensions(builder, target, source, sourceDominant, context);
        mergePlugin_Executions(builder, target, source, sourceDominant, context);
        mergePlugin_Dependencies(builder, target, source, sourceDominant, context);
    }

    protected void mergePlugin_Inherited(Plugin.Builder builder, Plugin target, Plugin source, boolean sourceDominant, Map context) {
        String src = source.getInherited();
        String tgt = target.getInherited();
        if (src != null && (sourceDominant || tgt == null)) {
            builder.inherited(src);
            builder.location("inherited", source.getLocation("inherited"));
        }
    }
    protected void mergePlugin_Configuration(Plugin.Builder builder, Plugin target, Plugin source, boolean sourceDominant, Map context) {
        XmlNode src = source.getConfiguration();
        if (src != null) {
            XmlNode tgt = target.getConfiguration();
            if (tgt == null) {
                builder.configuration(src);
                builder.location("configuration", source.getLocation("configuration"));
            } else if (sourceDominant) {
                builder.configuration(src.merge(tgt));
                builder.location("configuration", target.getLocation("configuration"));
            } else {
                builder.configuration(tgt.merge(src));
                builder.location("configuration", null);
            }
        }
    }
    protected void mergePlugin_GroupId(Plugin.Builder builder, Plugin target, Plugin source, boolean sourceDominant, Map context) {
        String src = source.getGroupId();
        String tgt = target.getGroupId();
        if (src != null && (sourceDominant || tgt == null)) {
            builder.groupId(src);
            builder.location("groupId", source.getLocation("groupId"));
        }
    }
    protected void mergePlugin_ArtifactId(Plugin.Builder builder, Plugin target, Plugin source, boolean sourceDominant, Map context) {
        String src = source.getArtifactId();
        String tgt = target.getArtifactId();
        if (src != null && (sourceDominant || tgt == null)) {
            builder.artifactId(src);
            builder.location("artifactId", source.getLocation("artifactId"));
        }
    }
    protected void mergePlugin_Version(Plugin.Builder builder, Plugin target, Plugin source, boolean sourceDominant, Map context) {
        String src = source.getVersion();
        String tgt = target.getVersion();
        if (src != null && (sourceDominant || tgt == null)) {
            builder.version(src);
            builder.location("version", source.getLocation("version"));
        }
    }
    protected void mergePlugin_Extensions(Plugin.Builder builder, Plugin target, Plugin source, boolean sourceDominant, Map context) {
        String src = source.getExtensions();
        String tgt = target.getExtensions();
        if (src != null && (sourceDominant || tgt == null)) {
            builder.extensions(src);
            builder.location("extensions", source.getLocation("extensions"));
        }
    }
    protected void mergePlugin_Executions(Plugin.Builder builder, Plugin target, Plugin source, boolean sourceDominant, Map context) {
        if (deepMerge) {
            builder.executions(merge(target.getExecutions(), source.getExecutions(), getPluginExecutionKey(),
                    (t, s) -> mergePluginExecution(t, s, sourceDominant, context)));
        } else {
            builder.executions(merge(target.getExecutions(), source.getExecutions(), sourceDominant, getPluginExecutionKey()));
        }
    }
    protected void mergePlugin_Dependencies(Plugin.Builder builder, Plugin target, Plugin source, boolean sourceDominant, Map context) {
        if (deepMerge) {
            builder.dependencies(merge(target.getDependencies(), source.getDependencies(), getDependencyKey(),
                    (t, s) -> mergeDependency(t, s, sourceDominant, context)));
        } else {
            builder.dependencies(merge(target.getDependencies(), source.getDependencies(), sourceDominant, getDependencyKey()));
        }
    }

    protected PluginExecution mergePluginExecution(PluginExecution target, PluginExecution source, boolean sourceDominant, Map context) {
        PluginExecution.Builder builder = PluginExecution.newBuilder(target);
        mergePluginExecution(builder, target, source, sourceDominant, context);
        return builder.build();
    }

    protected void mergePluginExecution(PluginExecution.Builder builder, PluginExecution target, PluginExecution source, boolean sourceDominant, Map context) {
        mergeConfigurationContainer(builder, target, source, sourceDominant, context);
        mergePluginExecution_Id(builder, target, source, sourceDominant, context);
        mergePluginExecution_Phase(builder, target, source, sourceDominant, context);
        mergePluginExecution_Priority(builder, target, source, sourceDominant, context);
        mergePluginExecution_Goals(builder, target, source, sourceDominant, context);
    }

    protected void mergePluginExecution_Inherited(PluginExecution.Builder builder, PluginExecution target, PluginExecution source, boolean sourceDominant, Map context) {
        String src = source.getInherited();
        String tgt = target.getInherited();
        if (src != null && (sourceDominant || tgt == null)) {
            builder.inherited(src);
            builder.location("inherited", source.getLocation("inherited"));
        }
    }
    protected void mergePluginExecution_Configuration(PluginExecution.Builder builder, PluginExecution target, PluginExecution source, boolean sourceDominant, Map context) {
        XmlNode src = source.getConfiguration();
        if (src != null) {
            XmlNode tgt = target.getConfiguration();
            if (tgt == null) {
                builder.configuration(src);
                builder.location("configuration", source.getLocation("configuration"));
            } else if (sourceDominant) {
                builder.configuration(src.merge(tgt));
                builder.location("configuration", target.getLocation("configuration"));
            } else {
                builder.configuration(tgt.merge(src));
                builder.location("configuration", null);
            }
        }
    }
    protected void mergePluginExecution_Id(PluginExecution.Builder builder, PluginExecution target, PluginExecution source, boolean sourceDominant, Map context) {
        String src = source.getId();
        String tgt = target.getId();
        if (src != null && (sourceDominant || tgt == null)) {
            builder.id(src);
            builder.location("id", source.getLocation("id"));
        }
    }
    protected void mergePluginExecution_Phase(PluginExecution.Builder builder, PluginExecution target, PluginExecution source, boolean sourceDominant, Map context) {
        String src = source.getPhase();
        String tgt = target.getPhase();
        if (src != null && (sourceDominant || tgt == null)) {
            builder.phase(src);
            builder.location("phase", source.getLocation("phase"));
        }
    }
    protected void mergePluginExecution_Priority(PluginExecution.Builder builder, PluginExecution target, PluginExecution source, boolean sourceDominant, Map context) {
        if (sourceDominant) {
            builder.priority(source.getPriority());
        }
    }
    protected void mergePluginExecution_Goals(PluginExecution.Builder builder, PluginExecution target, PluginExecution source, boolean sourceDominant, Map context) {
        builder.goals(merge(target.getGoals(), source.getGoals(), sourceDominant, e -> e));
    }

    protected DependencyManagement mergeDependencyManagement(DependencyManagement target, DependencyManagement source, boolean sourceDominant, Map context) {
        DependencyManagement.Builder builder = DependencyManagement.newBuilder(target);
        mergeDependencyManagement(builder, target, source, sourceDominant, context);
        return builder.build();
    }

    protected void mergeDependencyManagement(DependencyManagement.Builder builder, DependencyManagement target, DependencyManagement source, boolean sourceDominant, Map context) {
        mergeDependencyManagement_Dependencies(builder, target, source, sourceDominant, context);
    }

    protected void mergeDependencyManagement_Dependencies(DependencyManagement.Builder builder, DependencyManagement target, DependencyManagement source, boolean sourceDominant, Map context) {
        if (deepMerge) {
            builder.dependencies(merge(target.getDependencies(), source.getDependencies(), getDependencyKey(),
                    (t, s) -> mergeDependency(t, s, sourceDominant, context)));
        } else {
            builder.dependencies(merge(target.getDependencies(), source.getDependencies(), sourceDominant, getDependencyKey()));
        }
    }

    protected PluginManagement mergePluginManagement(PluginManagement target, PluginManagement source, boolean sourceDominant, Map context) {
        PluginManagement.Builder builder = PluginManagement.newBuilder(target);
        mergePluginManagement(builder, target, source, sourceDominant, context);
        return builder.build();
    }

    protected void mergePluginManagement(PluginManagement.Builder builder, PluginManagement target, PluginManagement source, boolean sourceDominant, Map context) {
        mergePluginContainer(builder, target, source, sourceDominant, context);
    }

    protected void mergePluginManagement_Plugins(PluginManagement.Builder builder, PluginManagement target, PluginManagement source, boolean sourceDominant, Map context) {
        if (deepMerge) {
            builder.plugins(merge(target.getPlugins(), source.getPlugins(), getPluginKey(),
                    (t, s) -> mergePlugin(t, s, sourceDominant, context)));
        } else {
            builder.plugins(merge(target.getPlugins(), source.getPlugins(), sourceDominant, getPluginKey()));
        }
    }

    protected Reporting mergeReporting(Reporting target, Reporting source, boolean sourceDominant, Map context) {
        Reporting.Builder builder = Reporting.newBuilder(target);
        mergeReporting(builder, target, source, sourceDominant, context);
        return builder.build();
    }

    protected void mergeReporting(Reporting.Builder builder, Reporting target, Reporting source, boolean sourceDominant, Map context) {
        mergeReporting_ExcludeDefaults(builder, target, source, sourceDominant, context);
        mergeReporting_OutputDirectory(builder, target, source, sourceDominant, context);
        mergeReporting_Plugins(builder, target, source, sourceDominant, context);
    }

    protected void mergeReporting_ExcludeDefaults(Reporting.Builder builder, Reporting target, Reporting source, boolean sourceDominant, Map context) {
        String src = source.getExcludeDefaults();
        String tgt = target.getExcludeDefaults();
        if (src != null && (sourceDominant || tgt == null)) {
            builder.excludeDefaults(src);
            builder.location("excludeDefaults", source.getLocation("excludeDefaults"));
        }
    }
    protected void mergeReporting_OutputDirectory(Reporting.Builder builder, Reporting target, Reporting source, boolean sourceDominant, Map context) {
        String src = source.getOutputDirectory();
        String tgt = target.getOutputDirectory();
        if (src != null && (sourceDominant || tgt == null)) {
            builder.outputDirectory(src);
            builder.location("outputDirectory", source.getLocation("outputDirectory"));
        }
    }
    protected void mergeReporting_Plugins(Reporting.Builder builder, Reporting target, Reporting source, boolean sourceDominant, Map context) {
        if (deepMerge) {
            builder.plugins(merge(target.getPlugins(), source.getPlugins(), getReportPluginKey(),
                    (t, s) -> mergeReportPlugin(t, s, sourceDominant, context)));
        } else {
            builder.plugins(merge(target.getPlugins(), source.getPlugins(), sourceDominant, getReportPluginKey()));
        }
    }

    protected Profile mergeProfile(Profile target, Profile source, boolean sourceDominant, Map context) {
        Profile.Builder builder = Profile.newBuilder(target);
        mergeProfile(builder, target, source, sourceDominant, context);
        return builder.build();
    }

    protected void mergeProfile(Profile.Builder builder, Profile target, Profile source, boolean sourceDominant, Map context) {
        mergeModelBase(builder, target, source, sourceDominant, context);
        mergeProfile_Id(builder, target, source, sourceDominant, context);
        mergeProfile_Activation(builder, target, source, sourceDominant, context);
        mergeProfile_Build(builder, target, source, sourceDominant, context);
    }

    protected void mergeProfile_Modules(Profile.Builder builder, Profile target, Profile source, boolean sourceDominant, Map context) {
        builder.modules(merge(target.getModules(), source.getModules(), sourceDominant, e -> e));
    }
    protected void mergeProfile_DistributionManagement(Profile.Builder builder, Profile target, Profile source, boolean sourceDominant, Map context) {
        DistributionManagement src = source.getDistributionManagement();
        if (src != null) {
            DistributionManagement tgt = target.getDistributionManagement();
            if (tgt == null) {
                tgt = DistributionManagement.newInstance(false);
            }
            DistributionManagement merged = mergeDistributionManagement(tgt, src, sourceDominant, context);
            builder.distributionManagement(merged);
            if (target.getDistributionManagement() == null) {
                builder.location("distributionManagement", source.getLocation("distributionManagement"));
            } else if (merged != tgt) {
                builder.location("distributionManagement", new InputLocation(-1, -1));
            }
        }
    }
    protected void mergeProfile_Properties(Profile.Builder builder, Profile target, Profile source, boolean sourceDominant, Map context) {
        Map src = source.getProperties();
        if (!src.isEmpty()) {
            Map tgt = target.getProperties();
            if (tgt.isEmpty()) {
                builder.properties(src);
                builder.location("properties", source.getLocation("properties"));
            } else {
                Map merged = new HashMap<>();
                merged.putAll(sourceDominant ? target.getProperties() : source.getProperties());
                merged.putAll(sourceDominant ? source.getProperties() : target.getProperties());
                builder.properties(merged);
                builder.location("properties", InputLocation.merge(target.getLocation("properties"), source.getLocation("properties"), sourceDominant));
            }
        }
    }
    protected void mergeProfile_DependencyManagement(Profile.Builder builder, Profile target, Profile source, boolean sourceDominant, Map context) {
        DependencyManagement src = source.getDependencyManagement();
        if (src != null) {
            DependencyManagement tgt = target.getDependencyManagement();
            if (tgt == null) {
                tgt = DependencyManagement.newInstance(false);
            }
            DependencyManagement merged = mergeDependencyManagement(tgt, src, sourceDominant, context);
            builder.dependencyManagement(merged);
            if (target.getDependencyManagement() == null) {
                builder.location("dependencyManagement", source.getLocation("dependencyManagement"));
            } else if (merged != tgt) {
                builder.location("dependencyManagement", new InputLocation(-1, -1));
            }
        }
    }
    protected void mergeProfile_Dependencies(Profile.Builder builder, Profile target, Profile source, boolean sourceDominant, Map context) {
        if (deepMerge) {
            builder.dependencies(merge(target.getDependencies(), source.getDependencies(), getDependencyKey(),
                    (t, s) -> mergeDependency(t, s, sourceDominant, context)));
        } else {
            builder.dependencies(merge(target.getDependencies(), source.getDependencies(), sourceDominant, getDependencyKey()));
        }
    }
    protected void mergeProfile_Repositories(Profile.Builder builder, Profile target, Profile source, boolean sourceDominant, Map context) {
        if (deepMerge) {
            builder.repositories(merge(target.getRepositories(), source.getRepositories(), getRepositoryKey(),
                    (t, s) -> mergeRepository(t, s, sourceDominant, context)));
        } else {
            builder.repositories(merge(target.getRepositories(), source.getRepositories(), sourceDominant, getRepositoryKey()));
        }
    }
    protected void mergeProfile_PluginRepositories(Profile.Builder builder, Profile target, Profile source, boolean sourceDominant, Map context) {
        if (deepMerge) {
            builder.pluginRepositories(merge(target.getPluginRepositories(), source.getPluginRepositories(), getRepositoryKey(),
                    (t, s) -> mergeRepository(t, s, sourceDominant, context)));
        } else {
            builder.pluginRepositories(merge(target.getPluginRepositories(), source.getPluginRepositories(), sourceDominant, getRepositoryKey()));
        }
    }
    protected void mergeProfile_Reporting(Profile.Builder builder, Profile target, Profile source, boolean sourceDominant, Map context) {
        Reporting src = source.getReporting();
        if (src != null) {
            Reporting tgt = target.getReporting();
            if (tgt == null) {
                tgt = Reporting.newInstance(false);
            }
            Reporting merged = mergeReporting(tgt, src, sourceDominant, context);
            builder.reporting(merged);
            if (target.getReporting() == null) {
                builder.location("reporting", source.getLocation("reporting"));
            } else if (merged != tgt) {
                builder.location("reporting", new InputLocation(-1, -1));
            }
        }
    }
    protected void mergeProfile_Id(Profile.Builder builder, Profile target, Profile source, boolean sourceDominant, Map context) {
        String src = source.getId();
        String tgt = target.getId();
        if (src != null && (sourceDominant || tgt == null)) {
            builder.id(src);
            builder.location("id", source.getLocation("id"));
        }
    }
    protected void mergeProfile_Activation(Profile.Builder builder, Profile target, Profile source, boolean sourceDominant, Map context) {
        Activation src = source.getActivation();
        if (src != null) {
            Activation tgt = target.getActivation();
            if (tgt == null) {
                tgt = Activation.newInstance(false);
            }
            Activation merged = mergeActivation(tgt, src, sourceDominant, context);
            builder.activation(merged);
            if (target.getActivation() == null) {
                builder.location("activation", source.getLocation("activation"));
            } else if (merged != tgt) {
                builder.location("activation", new InputLocation(-1, -1));
            }
        }
    }
    protected void mergeProfile_Build(Profile.Builder builder, Profile target, Profile source, boolean sourceDominant, Map context) {
        BuildBase src = source.getBuild();
        if (src != null) {
            BuildBase tgt = target.getBuild();
            if (tgt == null) {
                tgt = BuildBase.newInstance(false);
            }
            BuildBase merged = mergeBuildBase(tgt, src, sourceDominant, context);
            builder.build(merged);
            if (target.getBuild() == null) {
                builder.location("build", source.getLocation("build"));
            } else if (merged != tgt) {
                builder.location("build", new InputLocation(-1, -1));
            }
        }
    }

    protected Activation mergeActivation(Activation target, Activation source, boolean sourceDominant, Map context) {
        Activation.Builder builder = Activation.newBuilder(target);
        mergeActivation(builder, target, source, sourceDominant, context);
        return builder.build();
    }

    protected void mergeActivation(Activation.Builder builder, Activation target, Activation source, boolean sourceDominant, Map context) {
        mergeActivation_ActiveByDefault(builder, target, source, sourceDominant, context);
        mergeActivation_Jdk(builder, target, source, sourceDominant, context);
        mergeActivation_Os(builder, target, source, sourceDominant, context);
        mergeActivation_Property(builder, target, source, sourceDominant, context);
        mergeActivation_File(builder, target, source, sourceDominant, context);
    }

    protected void mergeActivation_ActiveByDefault(Activation.Builder builder, Activation target, Activation source, boolean sourceDominant, Map context) {
        if (sourceDominant) {
            builder.activeByDefault(source.isActiveByDefault());
        }
    }
    protected void mergeActivation_Jdk(Activation.Builder builder, Activation target, Activation source, boolean sourceDominant, Map context) {
        String src = source.getJdk();
        String tgt = target.getJdk();
        if (src != null && (sourceDominant || tgt == null)) {
            builder.jdk(src);
            builder.location("jdk", source.getLocation("jdk"));
        }
    }
    protected void mergeActivation_Os(Activation.Builder builder, Activation target, Activation source, boolean sourceDominant, Map context) {
        ActivationOS src = source.getOs();
        if (src != null) {
            ActivationOS tgt = target.getOs();
            if (tgt == null) {
                tgt = ActivationOS.newInstance(false);
            }
            ActivationOS merged = mergeActivationOS(tgt, src, sourceDominant, context);
            builder.os(merged);
            if (target.getOs() == null) {
                builder.location("os", source.getLocation("os"));
            } else if (merged != tgt) {
                builder.location("os", new InputLocation(-1, -1));
            }
        }
    }
    protected void mergeActivation_Property(Activation.Builder builder, Activation target, Activation source, boolean sourceDominant, Map context) {
        ActivationProperty src = source.getProperty();
        if (src != null) {
            ActivationProperty tgt = target.getProperty();
            if (tgt == null) {
                tgt = ActivationProperty.newInstance(false);
            }
            ActivationProperty merged = mergeActivationProperty(tgt, src, sourceDominant, context);
            builder.property(merged);
            if (target.getProperty() == null) {
                builder.location("property", source.getLocation("property"));
            } else if (merged != tgt) {
                builder.location("property", new InputLocation(-1, -1));
            }
        }
    }
    protected void mergeActivation_File(Activation.Builder builder, Activation target, Activation source, boolean sourceDominant, Map context) {
        ActivationFile src = source.getFile();
        if (src != null) {
            ActivationFile tgt = target.getFile();
            if (tgt == null) {
                tgt = ActivationFile.newInstance(false);
            }
            ActivationFile merged = mergeActivationFile(tgt, src, sourceDominant, context);
            builder.file(merged);
            if (target.getFile() == null) {
                builder.location("file", source.getLocation("file"));
            } else if (merged != tgt) {
                builder.location("file", new InputLocation(-1, -1));
            }
        }
    }

    protected ActivationProperty mergeActivationProperty(ActivationProperty target, ActivationProperty source, boolean sourceDominant, Map context) {
        ActivationProperty.Builder builder = ActivationProperty.newBuilder(target);
        mergeActivationProperty(builder, target, source, sourceDominant, context);
        return builder.build();
    }

    protected void mergeActivationProperty(ActivationProperty.Builder builder, ActivationProperty target, ActivationProperty source, boolean sourceDominant, Map context) {
        mergeActivationProperty_Name(builder, target, source, sourceDominant, context);
        mergeActivationProperty_Value(builder, target, source, sourceDominant, context);
    }

    protected void mergeActivationProperty_Name(ActivationProperty.Builder builder, ActivationProperty target, ActivationProperty source, boolean sourceDominant, Map context) {
        String src = source.getName();
        String tgt = target.getName();
        if (src != null && (sourceDominant || tgt == null)) {
            builder.name(src);
            builder.location("name", source.getLocation("name"));
        }
    }
    protected void mergeActivationProperty_Value(ActivationProperty.Builder builder, ActivationProperty target, ActivationProperty source, boolean sourceDominant, Map context) {
        String src = source.getValue();
        String tgt = target.getValue();
        if (src != null && (sourceDominant || tgt == null)) {
            builder.value(src);
            builder.location("value", source.getLocation("value"));
        }
    }

    protected ActivationOS mergeActivationOS(ActivationOS target, ActivationOS source, boolean sourceDominant, Map context) {
        ActivationOS.Builder builder = ActivationOS.newBuilder(target);
        mergeActivationOS(builder, target, source, sourceDominant, context);
        return builder.build();
    }

    protected void mergeActivationOS(ActivationOS.Builder builder, ActivationOS target, ActivationOS source, boolean sourceDominant, Map context) {
        mergeActivationOS_Name(builder, target, source, sourceDominant, context);
        mergeActivationOS_Family(builder, target, source, sourceDominant, context);
        mergeActivationOS_Arch(builder, target, source, sourceDominant, context);
        mergeActivationOS_Version(builder, target, source, sourceDominant, context);
    }

    protected void mergeActivationOS_Name(ActivationOS.Builder builder, ActivationOS target, ActivationOS source, boolean sourceDominant, Map context) {
        String src = source.getName();
        String tgt = target.getName();
        if (src != null && (sourceDominant || tgt == null)) {
            builder.name(src);
            builder.location("name", source.getLocation("name"));
        }
    }
    protected void mergeActivationOS_Family(ActivationOS.Builder builder, ActivationOS target, ActivationOS source, boolean sourceDominant, Map context) {
        String src = source.getFamily();
        String tgt = target.getFamily();
        if (src != null && (sourceDominant || tgt == null)) {
            builder.family(src);
            builder.location("family", source.getLocation("family"));
        }
    }
    protected void mergeActivationOS_Arch(ActivationOS.Builder builder, ActivationOS target, ActivationOS source, boolean sourceDominant, Map context) {
        String src = source.getArch();
        String tgt = target.getArch();
        if (src != null && (sourceDominant || tgt == null)) {
            builder.arch(src);
            builder.location("arch", source.getLocation("arch"));
        }
    }
    protected void mergeActivationOS_Version(ActivationOS.Builder builder, ActivationOS target, ActivationOS source, boolean sourceDominant, Map context) {
        String src = source.getVersion();
        String tgt = target.getVersion();
        if (src != null && (sourceDominant || tgt == null)) {
            builder.version(src);
            builder.location("version", source.getLocation("version"));
        }
    }

    protected ActivationFile mergeActivationFile(ActivationFile target, ActivationFile source, boolean sourceDominant, Map context) {
        ActivationFile.Builder builder = ActivationFile.newBuilder(target);
        mergeActivationFile(builder, target, source, sourceDominant, context);
        return builder.build();
    }

    protected void mergeActivationFile(ActivationFile.Builder builder, ActivationFile target, ActivationFile source, boolean sourceDominant, Map context) {
        mergeActivationFile_Missing(builder, target, source, sourceDominant, context);
        mergeActivationFile_Exists(builder, target, source, sourceDominant, context);
    }

    protected void mergeActivationFile_Missing(ActivationFile.Builder builder, ActivationFile target, ActivationFile source, boolean sourceDominant, Map context) {
        String src = source.getMissing();
        String tgt = target.getMissing();
        if (src != null && (sourceDominant || tgt == null)) {
            builder.missing(src);
            builder.location("missing", source.getLocation("missing"));
        }
    }
    protected void mergeActivationFile_Exists(ActivationFile.Builder builder, ActivationFile target, ActivationFile source, boolean sourceDominant, Map context) {
        String src = source.getExists();
        String tgt = target.getExists();
        if (src != null && (sourceDominant || tgt == null)) {
            builder.exists(src);
            builder.location("exists", source.getLocation("exists"));
        }
    }

    protected ReportPlugin mergeReportPlugin(ReportPlugin target, ReportPlugin source, boolean sourceDominant, Map context) {
        ReportPlugin.Builder builder = ReportPlugin.newBuilder(target);
        mergeReportPlugin(builder, target, source, sourceDominant, context);
        return builder.build();
    }

    protected void mergeReportPlugin(ReportPlugin.Builder builder, ReportPlugin target, ReportPlugin source, boolean sourceDominant, Map context) {
        mergeConfigurationContainer(builder, target, source, sourceDominant, context);
        mergeReportPlugin_GroupId(builder, target, source, sourceDominant, context);
        mergeReportPlugin_ArtifactId(builder, target, source, sourceDominant, context);
        mergeReportPlugin_Version(builder, target, source, sourceDominant, context);
        mergeReportPlugin_ReportSets(builder, target, source, sourceDominant, context);
    }

    protected void mergeReportPlugin_Inherited(ReportPlugin.Builder builder, ReportPlugin target, ReportPlugin source, boolean sourceDominant, Map context) {
        String src = source.getInherited();
        String tgt = target.getInherited();
        if (src != null && (sourceDominant || tgt == null)) {
            builder.inherited(src);
            builder.location("inherited", source.getLocation("inherited"));
        }
    }
    protected void mergeReportPlugin_Configuration(ReportPlugin.Builder builder, ReportPlugin target, ReportPlugin source, boolean sourceDominant, Map context) {
        XmlNode src = source.getConfiguration();
        if (src != null) {
            XmlNode tgt = target.getConfiguration();
            if (tgt == null) {
                builder.configuration(src);
                builder.location("configuration", source.getLocation("configuration"));
            } else if (sourceDominant) {
                builder.configuration(src.merge(tgt));
                builder.location("configuration", target.getLocation("configuration"));
            } else {
                builder.configuration(tgt.merge(src));
                builder.location("configuration", null);
            }
        }
    }
    protected void mergeReportPlugin_GroupId(ReportPlugin.Builder builder, ReportPlugin target, ReportPlugin source, boolean sourceDominant, Map context) {
        String src = source.getGroupId();
        String tgt = target.getGroupId();
        if (src != null && (sourceDominant || tgt == null)) {
            builder.groupId(src);
            builder.location("groupId", source.getLocation("groupId"));
        }
    }
    protected void mergeReportPlugin_ArtifactId(ReportPlugin.Builder builder, ReportPlugin target, ReportPlugin source, boolean sourceDominant, Map context) {
        String src = source.getArtifactId();
        String tgt = target.getArtifactId();
        if (src != null && (sourceDominant || tgt == null)) {
            builder.artifactId(src);
            builder.location("artifactId", source.getLocation("artifactId"));
        }
    }
    protected void mergeReportPlugin_Version(ReportPlugin.Builder builder, ReportPlugin target, ReportPlugin source, boolean sourceDominant, Map context) {
        String src = source.getVersion();
        String tgt = target.getVersion();
        if (src != null && (sourceDominant || tgt == null)) {
            builder.version(src);
            builder.location("version", source.getLocation("version"));
        }
    }
    protected void mergeReportPlugin_ReportSets(ReportPlugin.Builder builder, ReportPlugin target, ReportPlugin source, boolean sourceDominant, Map context) {
        if (deepMerge) {
            builder.reportSets(merge(target.getReportSets(), source.getReportSets(), getReportSetKey(),
                    (t, s) -> mergeReportSet(t, s, sourceDominant, context)));
        } else {
            builder.reportSets(merge(target.getReportSets(), source.getReportSets(), sourceDominant, getReportSetKey()));
        }
    }

    protected ReportSet mergeReportSet(ReportSet target, ReportSet source, boolean sourceDominant, Map context) {
        ReportSet.Builder builder = ReportSet.newBuilder(target);
        mergeReportSet(builder, target, source, sourceDominant, context);
        return builder.build();
    }

    protected void mergeReportSet(ReportSet.Builder builder, ReportSet target, ReportSet source, boolean sourceDominant, Map context) {
        mergeConfigurationContainer(builder, target, source, sourceDominant, context);
        mergeReportSet_Id(builder, target, source, sourceDominant, context);
        mergeReportSet_Reports(builder, target, source, sourceDominant, context);
    }

    protected void mergeReportSet_Inherited(ReportSet.Builder builder, ReportSet target, ReportSet source, boolean sourceDominant, Map context) {
        String src = source.getInherited();
        String tgt = target.getInherited();
        if (src != null && (sourceDominant || tgt == null)) {
            builder.inherited(src);
            builder.location("inherited", source.getLocation("inherited"));
        }
    }
    protected void mergeReportSet_Configuration(ReportSet.Builder builder, ReportSet target, ReportSet source, boolean sourceDominant, Map context) {
        XmlNode src = source.getConfiguration();
        if (src != null) {
            XmlNode tgt = target.getConfiguration();
            if (tgt == null) {
                builder.configuration(src);
                builder.location("configuration", source.getLocation("configuration"));
            } else if (sourceDominant) {
                builder.configuration(src.merge(tgt));
                builder.location("configuration", target.getLocation("configuration"));
            } else {
                builder.configuration(tgt.merge(src));
                builder.location("configuration", null);
            }
        }
    }
    protected void mergeReportSet_Id(ReportSet.Builder builder, ReportSet target, ReportSet source, boolean sourceDominant, Map context) {
        String src = source.getId();
        String tgt = target.getId();
        if (src != null && (sourceDominant || tgt == null)) {
            builder.id(src);
            builder.location("id", source.getLocation("id"));
        }
    }
    protected void mergeReportSet_Reports(ReportSet.Builder builder, ReportSet target, ReportSet source, boolean sourceDominant, Map context) {
        builder.reports(merge(target.getReports(), source.getReports(), sourceDominant, e -> e));
    }

    protected Prerequisites mergePrerequisites(Prerequisites target, Prerequisites source, boolean sourceDominant, Map context) {
        Prerequisites.Builder builder = Prerequisites.newBuilder(target);
        mergePrerequisites(builder, target, source, sourceDominant, context);
        return builder.build();
    }

    protected void mergePrerequisites(Prerequisites.Builder builder, Prerequisites target, Prerequisites source, boolean sourceDominant, Map context) {
        mergePrerequisites_Maven(builder, target, source, sourceDominant, context);
    }

    protected void mergePrerequisites_Maven(Prerequisites.Builder builder, Prerequisites target, Prerequisites source, boolean sourceDominant, Map context) {
        String src = source.getMaven();
        String tgt = target.getMaven();
        if (src != null && (sourceDominant || tgt == null)) {
            builder.maven(src);
            builder.location("maven", source.getLocation("maven"));
        }
    }

    protected Relocation mergeRelocation(Relocation target, Relocation source, boolean sourceDominant, Map context) {
        Relocation.Builder builder = Relocation.newBuilder(target);
        mergeRelocation(builder, target, source, sourceDominant, context);
        return builder.build();
    }

    protected void mergeRelocation(Relocation.Builder builder, Relocation target, Relocation source, boolean sourceDominant, Map context) {
        mergeRelocation_GroupId(builder, target, source, sourceDominant, context);
        mergeRelocation_ArtifactId(builder, target, source, sourceDominant, context);
        mergeRelocation_Version(builder, target, source, sourceDominant, context);
        mergeRelocation_Message(builder, target, source, sourceDominant, context);
    }

    protected void mergeRelocation_GroupId(Relocation.Builder builder, Relocation target, Relocation source, boolean sourceDominant, Map context) {
        String src = source.getGroupId();
        String tgt = target.getGroupId();
        if (src != null && (sourceDominant || tgt == null)) {
            builder.groupId(src);
            builder.location("groupId", source.getLocation("groupId"));
        }
    }
    protected void mergeRelocation_ArtifactId(Relocation.Builder builder, Relocation target, Relocation source, boolean sourceDominant, Map context) {
        String src = source.getArtifactId();
        String tgt = target.getArtifactId();
        if (src != null && (sourceDominant || tgt == null)) {
            builder.artifactId(src);
            builder.location("artifactId", source.getLocation("artifactId"));
        }
    }
    protected void mergeRelocation_Version(Relocation.Builder builder, Relocation target, Relocation source, boolean sourceDominant, Map context) {
        String src = source.getVersion();
        String tgt = target.getVersion();
        if (src != null && (sourceDominant || tgt == null)) {
            builder.version(src);
            builder.location("version", source.getLocation("version"));
        }
    }
    protected void mergeRelocation_Message(Relocation.Builder builder, Relocation target, Relocation source, boolean sourceDominant, Map context) {
        String src = source.getMessage();
        String tgt = target.getMessage();
        if (src != null && (sourceDominant || tgt == null)) {
            builder.message(src);
            builder.location("message", source.getLocation("message"));
        }
    }

    protected Extension mergeExtension(Extension target, Extension source, boolean sourceDominant, Map context) {
        Extension.Builder builder = Extension.newBuilder(target);
        mergeExtension(builder, target, source, sourceDominant, context);
        return builder.build();
    }

    protected void mergeExtension(Extension.Builder builder, Extension target, Extension source, boolean sourceDominant, Map context) {
        mergeExtension_GroupId(builder, target, source, sourceDominant, context);
        mergeExtension_ArtifactId(builder, target, source, sourceDominant, context);
        mergeExtension_Version(builder, target, source, sourceDominant, context);
        mergeExtension_Configuration(builder, target, source, sourceDominant, context);
    }

    protected void mergeExtension_GroupId(Extension.Builder builder, Extension target, Extension source, boolean sourceDominant, Map context) {
        String src = source.getGroupId();
        String tgt = target.getGroupId();
        if (src != null && (sourceDominant || tgt == null)) {
            builder.groupId(src);
            builder.location("groupId", source.getLocation("groupId"));
        }
    }
    protected void mergeExtension_ArtifactId(Extension.Builder builder, Extension target, Extension source, boolean sourceDominant, Map context) {
        String src = source.getArtifactId();
        String tgt = target.getArtifactId();
        if (src != null && (sourceDominant || tgt == null)) {
            builder.artifactId(src);
            builder.location("artifactId", source.getLocation("artifactId"));
        }
    }
    protected void mergeExtension_Version(Extension.Builder builder, Extension target, Extension source, boolean sourceDominant, Map context) {
        String src = source.getVersion();
        String tgt = target.getVersion();
        if (src != null && (sourceDominant || tgt == null)) {
            builder.version(src);
            builder.location("version", source.getLocation("version"));
        }
    }
    protected void mergeExtension_Configuration(Extension.Builder builder, Extension target, Extension source, boolean sourceDominant, Map context) {
        XmlNode src = source.getConfiguration();
        if (src != null) {
            XmlNode tgt = target.getConfiguration();
            if (tgt == null) {
                builder.configuration(src);
                builder.location("configuration", source.getLocation("configuration"));
            } else if (sourceDominant) {
                builder.configuration(src.merge(tgt));
                builder.location("configuration", target.getLocation("configuration"));
            } else {
                builder.configuration(tgt.merge(src));
                builder.location("configuration", null);
            }
        }
    }


    protected KeyComputer getModelKey() {
        return v -> v;
    }
    protected KeyComputer getModelBaseKey() {
        return v -> v;
    }
    protected KeyComputer getPluginContainerKey() {
        return v -> v;
    }
    protected KeyComputer getPluginConfigurationKey() {
        return v -> v;
    }
    protected KeyComputer getBuildBaseKey() {
        return v -> v;
    }
    protected KeyComputer getBuildKey() {
        return v -> v;
    }
    protected KeyComputer getCiManagementKey() {
        return v -> v;
    }
    protected KeyComputer getNotifierKey() {
        return v -> v;
    }
    protected KeyComputer getContributorKey() {
        return v -> v;
    }
    protected KeyComputer getDependencyKey() {
        return v -> v;
    }
    protected KeyComputer getDeveloperKey() {
        return v -> v;
    }
    protected KeyComputer getExclusionKey() {
        return v -> v;
    }
    protected KeyComputer getIssueManagementKey() {
        return v -> v;
    }
    protected KeyComputer getDistributionManagementKey() {
        return v -> v;
    }
    protected KeyComputer getLicenseKey() {
        return v -> v;
    }
    protected KeyComputer getMailingListKey() {
        return v -> v;
    }
    protected KeyComputer getOrganizationKey() {
        return v -> v;
    }
    protected KeyComputer getPatternSetKey() {
        return v -> v;
    }
    protected KeyComputer getParentKey() {
        return v -> v;
    }
    protected KeyComputer getScmKey() {
        return v -> v;
    }
    protected KeyComputer getFileSetKey() {
        return v -> v;
    }
    protected KeyComputer getResourceKey() {
        return v -> v;
    }
    protected KeyComputer getRepositoryBaseKey() {
        return v -> v;
    }
    protected KeyComputer getRepositoryKey() {
        return v -> v;
    }
    protected KeyComputer getDeploymentRepositoryKey() {
        return v -> v;
    }
    protected KeyComputer getRepositoryPolicyKey() {
        return v -> v;
    }
    protected KeyComputer getSiteKey() {
        return v -> v;
    }
    protected KeyComputer getConfigurationContainerKey() {
        return v -> v;
    }
    protected KeyComputer getPluginKey() {
        return v -> v;
    }
    protected KeyComputer getPluginExecutionKey() {
        return v -> v;
    }
    protected KeyComputer getDependencyManagementKey() {
        return v -> v;
    }
    protected KeyComputer getPluginManagementKey() {
        return v -> v;
    }
    protected KeyComputer getReportingKey() {
        return v -> v;
    }
    protected KeyComputer getProfileKey() {
        return v -> v;
    }
    protected KeyComputer getActivationKey() {
        return v -> v;
    }
    protected KeyComputer getActivationPropertyKey() {
        return v -> v;
    }
    protected KeyComputer getActivationOSKey() {
        return v -> v;
    }
    protected KeyComputer getActivationFileKey() {
        return v -> v;
    }
    protected KeyComputer getReportPluginKey() {
        return v -> v;
    }
    protected KeyComputer getReportSetKey() {
        return v -> v;
    }
    protected KeyComputer getPrerequisitesKey() {
        return v -> v;
    }
    protected KeyComputer getRelocationKey() {
        return v -> v;
    }
    protected KeyComputer getExtensionKey() {
        return v -> v;
    }

    /**
     * Use to compute keys for data structures
     * @param  the data structure type
     */
    @FunctionalInterface
    public interface KeyComputer extends Function {
    }

    /**
     * Merge two lists
     */
    public static  List merge(List tgt, List src, boolean sourceDominant, KeyComputer computer) {
        return merge(tgt, src, computer, (t, s) -> sourceDominant ? s : t);
    }

    public static  List merge(List tgt, List src, KeyComputer computer, BinaryOperator remapping) {
        if (src.isEmpty()) {
            return tgt;
        }

        MergingList list;
        if (tgt instanceof MergingList) {
            list = (MergingList) tgt;
        } else {
            list = new MergingList<>(computer, src.size() + tgt.size());
            list.mergeAll(tgt, (t, s) -> s);
        }

        list.mergeAll(src, remapping);
        return list;
    }

    /**
     * Merging list
     * @param 
     */
    private static class MergingList extends AbstractList implements java.io.Serializable {

        private final KeyComputer keyComputer;
        private Map map;
        private List list;

        MergingList(KeyComputer keyComputer, int initialCapacity) {
            this.map = new LinkedHashMap<>(initialCapacity);
            this.keyComputer = keyComputer;
        }

        Object writeReplace() throws ObjectStreamException {
            return new ArrayList<>(this);
        }

        @Override
        public Iterator iterator() {
            if (map != null) {
                return map.values().iterator();
            } else {
                return list.iterator();
            }
        }

        void mergeAll(Collection vs, BinaryOperator remapping) {
            if (map == null) {
                map = list.stream().collect(Collectors.toMap(keyComputer,
                    Function.identity(),
                    null,
                    LinkedHashMap::new));
                list = null;
            }

            if (vs instanceof MergingList && ((MergingList) vs).map != null) {
                for (Map.Entry e : ((MergingList) vs).map.entrySet()) {
                    Object key = e.getKey();
                    V v = e.getValue();
                    map.merge(key, v, remapping);
                }
            } else {
                for (V v : vs) {
                    Object key = keyComputer.apply(v);
                    map.merge(key, v, remapping);
                }
            }
        }

        @Override
        public boolean contains(Object o) {
            if (map != null) {
                return map.containsValue(o);
            } else {
                return list.contains(o);
            }
        }

        private List asList() {
            if (list == null) {
                list = new ArrayList<>(map.values());
                map = null;
            }
            return list;
        }

        @Override
        public void add(int index, V element) {
            asList().add(index, element);
        }

        @Override
        public V remove(int index) {
            return asList().remove(index);
        }

        @Override
        public V get(int index) {
            return asList().get(index);
        }

        @Override
        public int size() {
            if (map != null) {
                return map.size();
            } else {
                return list.size();
            }
        }
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy