public DOMNodeObjectModel removeNodes()

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));
    }