public static void mergePluginDefinitions()

in src/main/java/org/apache/maven/plugin/resources/remote/ModelUtils.java [165:236]


    public static void mergePluginDefinitions(Plugin child, Plugin parent, boolean handleAsInheritance) {
        if ((child == null) || (parent == null)) {
            // nothing to do.
            return;
        }

        if (parent.isExtensions()) {
            child.setExtensions(true);
        }

        if ((child.getVersion() == null) && (parent.getVersion() != null)) {
            child.setVersion(parent.getVersion());
        }

        Xpp3Dom childConfiguration = (Xpp3Dom) child.getConfiguration();
        Xpp3Dom parentConfiguration = (Xpp3Dom) parent.getConfiguration();

        childConfiguration = Xpp3Dom.mergeXpp3Dom(childConfiguration, parentConfiguration);

        child.setConfiguration(childConfiguration);

        child.setDependencies(mergeDependencyList(child.getDependencies(), parent.getDependencies()));

        // from here to the end of the method is dealing with merging of the <executions/> section.
        String parentInherited = parent.getInherited();

        boolean parentIsInherited = (parentInherited == null) || Boolean.parseBoolean(parentInherited);

        List<PluginExecution> parentExecutions = parent.getExecutions();

        if ((parentExecutions != null) && !parentExecutions.isEmpty()) {
            List<PluginExecution> mergedExecutions = new ArrayList<>();

            Map<String, PluginExecution> assembledExecutions = new TreeMap<>();

            Map<String, PluginExecution> childExecutions = child.getExecutionsAsMap();

            for (PluginExecution parentExecution : parentExecutions) {
                String inherited = parentExecution.getInherited();

                boolean parentExecInherited =
                        parentIsInherited && ((inherited == null) || Boolean.parseBoolean(inherited));

                if (!handleAsInheritance || parentExecInherited) {
                    PluginExecution assembled = parentExecution;

                    PluginExecution childExecution = childExecutions.get(parentExecution.getId());

                    if (childExecution != null) {
                        mergePluginExecutionDefinitions(childExecution, parentExecution);

                        assembled = childExecution;
                    } else if (handleAsInheritance && (parentInherited == null)) {
                        parentExecution.unsetInheritanceApplied();
                    }

                    assembledExecutions.put(assembled.getId(), assembled);
                    mergedExecutions.add(assembled);
                }
            }

            for (PluginExecution childExecution : child.getExecutions()) {
                if (!assembledExecutions.containsKey(childExecution.getId())) {
                    mergedExecutions.add(childExecution);
                }
            }

            child.setExecutions(mergedExecutions);

            child.flushExecutionMap();
        }
    }