Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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;
}
}
Expand Down Expand Up @@ -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());
Expand Down Expand Up @@ -371,6 +370,36 @@ public static XmlNode merge(XmlNode dominant, XmlNode recessive, Boolean childMe
return dominant;
}

private static String getChildCombinationMode(Map<String, String> 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.
Expand Down
Loading