private void updateDataTreeNode(
      final StorableNode parent,
      final String renamedNodeNewPath,
      final Iterator<TreeNode<?>> children) {
    if (!children.hasNext()) {
      eventBus.fireEvent(NodeChangedEvent.createNodeRenamedEvent(parent.getParent()));
      return;
    }

    TreeNode treeNode = children.next();

    if (treeNode instanceof UpdateTreeNodeDataIterable && treeNode instanceof StorableNode) {
      String newPath = solveNewPath(renamedNodeNewPath, ((StorableNode) treeNode).getPath());

      if (treeNode.equals(parent)) {
        newPath = renamedNodeNewPath;
      }

      ((UpdateTreeNodeDataIterable) treeNode)
          .updateData(
              new AsyncCallback<Void>() {
                @Override
                public void onSuccess(Void aVoid) {
                  updateDataTreeNode(parent, renamedNodeNewPath, children);
                }

                @Override
                public void onFailure(Throwable throwable) {
                  Log.error(getClass(), "Error update treeNode data " + throwable);
                  //                    eventBus.fireEvent(new RefreshProjectTreeEvent());
                }
              },
              newPath);
      return;
    }

    updateDataTreeNode(parent, renamedNodeNewPath, children);
  }