public TreeNode[] findNodeInContext(String startCtxPath, @Nullable final String name) {
    final List<TreeNode> out = new ArrayList<TreeNode>();
    root.iterateThruContext(
        startCtxPath,
        new TreeNodeRoot.TreeNodeHandler2() {
          public boolean handleNode(int ctxPathCounter, TreeNode node) {
            if (name == null || node.getName().equalsIgnoreCase(name)) {
              out.add(node);
            }
            return true;
          }
        });

    return out.toArray(new TreeNode[out.size()]);
    /*
            String[] path = startCtxPath.split("/");
            int startWith = ("/" + path[1]).startsWith(ContextPath.FILE_CTX_PRX) ? 2 : 1;

            TreeNode cycled = root;
            for (int i = startWith; i < path.length; i++) {
                String encodedName = "/" + path[i];
                cycled = cycled.findChildByEncodedName(encodedName);
                if (cycled == null) {
                    return new TreeNode[0];
                }
            }

            return cycled.findChildrenBySuffix(name);
    */
  }
  public TreeNode[] findNodeInContext(final String ctxPath, final int[] ctxTypes) {
    //        final List<Integer>  types = primitiveArrayToObjectList(ctxTypes);
    final List<TreeNode> out = new ArrayList<TreeNode>();
    root.iterateThruContext(
        ctxPath,
        new TreeNodeRoot.TreeNodeHandler2() {
          public boolean handleNode(int ctxPathCounter, TreeNode node) {
            if (node.getPath().equals(ctxPath)) {
              out.addAll(Arrays.asList(node.findChildrenByTypes(ctxTypes)));
              return false;
            }
            //                if(types.size() == 0 || types.contains(node.getType())){
            //                    out.add(node);
            //                }
            return true;
          }
        });

    return out.toArray(new TreeNode[out.size()]);
  }