diff --git a/impl/maven-xml/src/main/java/org/apache/maven/internal/xml/XmlNodeImpl.java b/impl/maven-xml/src/main/java/org/apache/maven/internal/xml/XmlNodeImpl.java index f553b87f508e..4d49b20e5d11 100644 --- a/impl/maven-xml/src/main/java/org/apache/maven/internal/xml/XmlNodeImpl.java +++ b/impl/maven-xml/src/main/java/org/apache/maven/internal/xml/XmlNodeImpl.java @@ -224,7 +224,7 @@ public static XmlNode merge(XmlNode dominant, XmlNode recessive, Boolean childMe boolean mergeSelf = true; - String selfMergeMode = dominant.getAttribute(SELF_COMBINATION_MODE_ATTRIBUTE); + String selfMergeMode = getSelfCombinationMode(dominant); if (SELF_COMBINATION_OVERRIDE.equals(selfMergeMode)) { mergeSelf = false; @@ -252,8 +252,8 @@ public static XmlNode merge(XmlNode dominant, XmlNode recessive, Boolean childMe if (childMergeOverride != null) { mergeChildren = childMergeOverride; } else { - String childMergeMode = attrs.get(CHILDREN_COMBINATION_MODE_ATTRIBUTE); - if (CHILDREN_COMBINATION_APPEND.equals(childMergeMode)) { + String childCombinationMode = getChildCombinationMode(attrs); + if (CHILDREN_COMBINATION_APPEND.equals(childCombinationMode)) { mergeChildren = false; } } @@ -324,8 +324,7 @@ public static XmlNode merge(XmlNode dominant, XmlNode recessive, Boolean childMe } else if (it.hasNext()) { XmlNode dominantChild = it.next(); - String dominantChildCombinationMode = - dominantChild.getAttribute(SELF_COMBINATION_MODE_ATTRIBUTE); + String dominantChildCombinationMode = getSelfCombinationMode(dominantChild); if (SELF_COMBINATION_REMOVE.equals(dominantChildCombinationMode)) { if (children == null) { children = new ArrayList<>(dominant.getChildren()); @@ -371,6 +370,36 @@ public static XmlNode merge(XmlNode dominant, XmlNode recessive, Boolean childMe return dominant; } + private static String getChildCombinationMode(Map attrs) { + String attribute = attrs.get(CHILDREN_COMBINATION_MODE_ATTRIBUTE); + if (attribute == null) { + return DEFAULT_CHILDREN_COMBINATION_MODE; + } + if (CHILDREN_COMBINATION_APPEND.equals(attribute) || CHILDREN_COMBINATION_MERGE.equals(attribute)) { + return attribute; + } + throw new IllegalArgumentException("Unsupported value '" + attribute + "' for " + + CHILDREN_COMBINATION_MODE_ATTRIBUTE + " attribute. " + "Valid values are: " + + CHILDREN_COMBINATION_APPEND + ", and " + CHILDREN_COMBINATION_MERGE + + " (default is: " + DEFAULT_SELF_COMBINATION_MODE + ")"); + } + + private static String getSelfCombinationMode(XmlNode node) { + String attribute = node.getAttribute(SELF_COMBINATION_MODE_ATTRIBUTE); + if (attribute == null) { + return DEFAULT_SELF_COMBINATION_MODE; + } + if (SELF_COMBINATION_OVERRIDE.equals(attribute) + || SELF_COMBINATION_MERGE.equals(attribute) + || SELF_COMBINATION_REMOVE.equals(attribute)) { + return attribute; + } + throw new IllegalArgumentException("Unsupported value '" + attribute + "' for " + + SELF_COMBINATION_MODE_ATTRIBUTE + " attribute. " + "Valid values are: " + + SELF_COMBINATION_OVERRIDE + ", " + SELF_COMBINATION_MERGE + ", and " + SELF_COMBINATION_REMOVE + + " (default is: " + DEFAULT_SELF_COMBINATION_MODE + ")"); + } + /** * Merge two DOMs, with one having dominance in the case of collision. Merge mechanisms (vs. override for nodes, or * vs. append for children) is determined by attributes of the dominant root node.