private Map constructHierarchy()

in src/main/java/org/apache/commons/configuration2/XMLConfiguration.java [496:535]


    private Map<String, String> constructHierarchy(final ImmutableNode.Builder node, final MutableObject<String> refValue, final Element element,
        final Map<ImmutableNode, Object> elemRefs, final boolean trim, final int level) {
        final boolean trimFlag = shouldTrim(element, trim);
        final Map<String, String> attributes = processAttributes(element);
        attributes.put(ATTR_SPACE_INTERNAL, String.valueOf(trimFlag));
        final StringBuilder buffer = new StringBuilder();
        final NodeList list = element.getChildNodes();
        boolean hasChildren = false;

        for (int i = 0; i < list.getLength(); i++) {
            final Node w3cNode = list.item(i);
            if (w3cNode instanceof Element) {
                final Element child = (Element) w3cNode;
                final ImmutableNode.Builder childNode = new ImmutableNode.Builder();
                childNode.name(child.getTagName());
                final MutableObject<String> refChildValue = new MutableObject<>();
                final Map<String, String> attrmap = constructHierarchy(childNode, refChildValue, child, elemRefs, trimFlag, level + 1);
                final boolean childTrim = Boolean.parseBoolean(attrmap.remove(ATTR_SPACE_INTERNAL));
                childNode.addAttributes(attrmap);
                final ImmutableNode newChild = createChildNodeWithValue(node, childNode, child, refChildValue.getValue(), childTrim, attrmap, elemRefs);
                if (elemRefs != null && !elemRefs.containsKey(newChild)) {
                    elemRefs.put(newChild, child);
                }
                hasChildren = true;
            } else if (w3cNode instanceof Text) {
                final Text data = (Text) w3cNode;
                buffer.append(data.getData());
            }
        }

        boolean childrenFlag = false;
        if (hasChildren || trimFlag) {
            childrenFlag = hasChildren || attributes.size() > 1;
        }
        final String text = determineValue(buffer.toString(), childrenFlag, trimFlag);
        if (!text.isEmpty() || !childrenFlag && level != 0) {
            refValue.setValue(text);
        }
        return attributes;
    }