@Override
    public AbstractTreeModel<K> clone() {
        try {
            final AbstractTreeModel<K> treeModel = (AbstractTreeModel<K>) super.clone();
            treeModel.keyToNodeMap = new HashMap<>(this.keyToNodeMap);
            treeModel.childKeyToParentNodeMap = new HashMap<>(this.childKeyToParentNodeMap);
            treeModel.parentKeyToChildNodesMap = new HashMap<>(this.parentKeyToChildNodesMap.size());
            this.parentKeyToChildNodesMap.forEach((key, childNodes) ->
                    treeModel.parentKeyToChildNodesMap.put(key, new LinkedHashSet<>(childNodes)));
            return treeModel;
        } catch (CloneNotSupportedException e) {
            throw new RuntimeException(e);
        }
    }
@param nodeDecorator Returns a decorated copy of the node passed to it. It MUST have the
                     same node key as the node passed in. Will be called for each node in
                     a depth first way, with siblings processed in no specific order.
stroom-explorer/stroom-explorer-impl/src/main/java/stroom/explorer/impl/AbstractTreeModel.java