예제 #1
0
  /**
   * 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);
    }
  }
예제 #2
0
  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;
  }