in src/main/java/com/netflix/imflibrary/utils/DOMNodeObjectModel.java [431:507]
public DOMNodeObjectModel removeNodes(Object other){
if(other == null
|| this.getClass() != other.getClass()){
return createDOMNodeObjectModelIgnoreSet(this, new HashSet<>());
}
DOMNodeObjectModel otherDOMNodeObjectModel = (DOMNodeObjectModel) other;
if(!this.localName.equals(otherDOMNodeObjectModel.localName)) {
return createDOMNodeObjectModelIgnoreSet(this, new HashSet<>());
}
Map<DOMNodeElementTuple, Map<String, Integer>> thisFields = new HashMap<>();
thisFields.putAll(this.fields);
thisFields.entrySet().removeAll(otherDOMNodeObjectModel.fields.entrySet());
Map<DOMNodeObjectModel, Integer> thisChildrenDOMNodes = new HashMap<>();
Map<DOMNodeObjectModel, Integer> outChildrenDOMNodes = new HashMap<>();
Map<DOMNodeObjectModel, Integer> otherChildrenDOMNodes = new HashMap<>();
thisChildrenDOMNodes.putAll(this.childrenDOMNodes);
thisChildrenDOMNodes.entrySet().removeAll(otherDOMNodeObjectModel.childrenDOMNodes.entrySet());
otherChildrenDOMNodes.putAll(otherDOMNodeObjectModel.childrenDOMNodes);
otherChildrenDOMNodes.entrySet().removeAll(this.childrenDOMNodes.entrySet());
while(!thisChildrenDOMNodes.isEmpty()) {
Map.Entry<DOMNodeObjectModel, Integer> entry = thisChildrenDOMNodes.entrySet().iterator().next();
Integer minDiffCount = entry.getKey().getFieldCount();
Map.Entry<DOMNodeObjectModel, Integer> matchingEntry = null;
for(Map.Entry<DOMNodeObjectModel, Integer> otherEntry: otherChildrenDOMNodes.entrySet()) {
DOMNodeObjectModel diffDOMNodeObjectModel = entry.getKey().removeNodes(otherEntry.getKey());
if(diffDOMNodeObjectModel.getFieldCount() < minDiffCount) {
matchingEntry = otherEntry;
minDiffCount = diffDOMNodeObjectModel.getFieldCount();
}
}
if(matchingEntry != null) {
Integer remaining = entry.getValue() - matchingEntry.getValue();
Integer count = remaining >= 0 ? matchingEntry.getValue() : entry.getValue();
if(remaining == 0) {
otherChildrenDOMNodes.remove(matchingEntry.getKey());
thisChildrenDOMNodes.remove(entry.getKey());
}
else if(remaining > 0) {
otherChildrenDOMNodes.remove(matchingEntry.getKey());
thisChildrenDOMNodes.put(entry.getKey(), remaining);
} else {
otherChildrenDOMNodes.put(matchingEntry.getKey(), -remaining);
thisChildrenDOMNodes.remove(entry.getKey());
}
if(!entry.getKey().equals(matchingEntry.getKey())) {
DOMNodeObjectModel diffDOMNodeObjectModel = entry.getKey().removeNodes(matchingEntry.getKey());
if(outChildrenDOMNodes.containsKey(diffDOMNodeObjectModel)) {
count += outChildrenDOMNodes.get(diffDOMNodeObjectModel);
}
outChildrenDOMNodes.put(diffDOMNodeObjectModel, count);
}
} else {
Integer count = entry.getValue();
if(outChildrenDOMNodes.containsKey(entry.getKey())) {
count += outChildrenDOMNodes.get(entry.getKey());
}
outChildrenDOMNodes.put(entry.getKey(), count);
thisChildrenDOMNodes.remove(entry.getKey());
}
}
return new DOMNodeObjectModel(this.getNode(), this.getLocalName(), this.getLocalNamespaceURI(),
this.getNodeType(), Collections.unmodifiableMap(outChildrenDOMNodes), Collections.unmodifiableMap
(thisFields), Collections.unmodifiableMap(this.fieldsLocalNameMap));
}