public String[] getChildrenProperties(String parent) {
        String[] propName = parsePropertyName(parent);

        final Lock readLock = readWriteLock.readLock();
        readLock.lock();
        try {
            // Search for this property by traversing down the XML hierarchy.
            Element element = document.getRootElement();
            for (String aPropName : propName) {
                element = element.element(aPropName);
                if (element == null) {
                    // This node doesn't match this part of the property name which
                    // indicates this property doesn't exist so return empty array.
                    return new String[]{};
                }
            }
            // We found matching property, return names of children.
            return element.elements().stream()
                .map(Node::getName)
                .toArray(String[]::new);
        } finally {
            readLock.unlock();
        }
    }
Return all children property names of a parent property as a String array,
or an empty array if the if there are no children. For example, given
the properties {@code X.Y.A}, {@code X.Y.B}, and {@code X.Y.C}, then
the child properties of {@code X.Y} are {@code A}, {@code B}, and
{@code C}.

@param parent the name of the parent property.
@return all child property values for the given parent.
xmppserver/src/main/java/org/jivesoftware/util/XMLProperties.java