/** * Adds a path to this ParentOMatic and marks it. This might result in changes in tree that * actually tries to "optimize" the markings, and it may result in tree where the currently added * and marked path is not marked, but it's some parent is. */ public void addAndMarkPath(final String path) { final Node<Payload> currentNode = addPath(path, false); // rule A: unmark children if any if (applyRuleA) { applyRecursively( currentNode, new Function<Node<Payload>, Node<Payload>>() { @Override public Node<Payload> apply(Node<Payload> input) { input.getPayload().setMarked(false); return input; } }); } currentNode.getPayload().setMarked(true); // reorganize if needed final Node<Payload> flippedNode = reorganizeForRecursion(currentNode); // optimize tree size if asked for if (keepMarkedNodesOnly) { optimizeTreeSize(flippedNode); } }
protected Node<Payload> addPath(final String path, final boolean optimize) { final List<String> pathElems = getPathElements(Preconditions.checkNotNull(path)); final List<String> actualPathElems = Lists.newArrayList(); Node<Payload> currentNode = ROOT; for (String pathElem : pathElems) { actualPathElems.add(pathElem); final Node<Payload> node = currentNode.getChildByLabel(pathElem); if (node == null) { currentNode = currentNode.addChild(pathElem, new Payload()); } else { currentNode = node; } } if (optimize) { optimizeTreeSize(currentNode); } return currentNode; }