@Nonnull
public NodeUtil getOrAddTree(String relativePath, String primaryTypeName) {
if (relativePath.indexOf('/') == -1) {
return getOrAddChild(relativePath, primaryTypeName);
} else {
TreeLocation location = LocationUtil.getTreeLocation(tree.getLocation(), relativePath);
if (location.getTree() == null) {
NodeUtil target = this;
for (String segment : Text.explode(relativePath, '/')) {
if (PathUtils.denotesParent(segment)) {
target = target.getParent();
} else if (target.hasChild(segment)) {
target = target.getChild(segment);
} else if (!PathUtils.denotesCurrent(segment)) {
target = target.addChild(segment, primaryTypeName);
}
}
return target;
} else {
return new NodeUtil(location.getTree());
}
}
}