void (final JTree tree, final CustomActionsSchema schema) { //noinspection HardCodedStringLiteral @SuppressWarnings("DialogTitleCapitalization") Group rootGroup = new Group("root"); DefaultMutableTreeNode root = new DefaultMutableTreeNode(rootGroup); root.removeAllChildren(); schema.fillActionGroups(root); final JTree defaultTree = new Tree(new DefaultTreeModel(root)); final List<ActionUrl> actions = new ArrayList<>(); TreeUtil.treeNodeTraverser((TreeNode)tree.getModel().getRoot()).traverse(TreeTraversal.PRE_ORDER_DFS).processEach(node -> { DefaultMutableTreeNode treeNode = (DefaultMutableTreeNode)node; Group group = getGroupForNode(treeNode); if (treeNode.isLeaf() && group == null) { return true; } ActionUrl url = getActionUrl(new TreePath(treeNode.getPath()), 0); String groupName = group.getName(); url.getGroupPath().add(groupName); final TreePath treePath = getTreePath(defaultTree, url); if (treePath != null) { final DefaultMutableTreeNode visited = (DefaultMutableTreeNode)treePath.getLastPathComponent(); final ActionUrl[] defaultUserObjects = getChildUserObjects(visited, url); final ActionUrl[] currentUserObjects = getChildUserObjects(treeNode, url); computeDiff(defaultUserObjects, currentUserObjects, actions); } else { //customizations at the new place url.getGroupPath().remove(url.getParentGroup()); if (actions.contains(url)) { url.getGroupPath().add(groupName); actions.addAll(schema.getChildActions(url)); } } return true; }); schema.setActions(actions); }