public static boolean contains(
      PermissionChecker permissionChecker, BookmarksFolder folder, String actionId)
      throws PortalException {

    if (actionId.equals(ActionKeys.ADD_FOLDER)) {
      actionId = ActionKeys.ADD_SUBFOLDER;
    }

    Boolean hasPermission =
        StagingPermissionUtil.hasPermission(
            permissionChecker,
            folder.getGroupId(),
            BookmarksFolder.class.getName(),
            folder.getFolderId(),
            PortletKeys.BOOKMARKS,
            actionId);

    if (hasPermission != null) {
      return hasPermission.booleanValue();
    }

    if (actionId.equals(ActionKeys.VIEW) && PropsValues.PERMISSIONS_VIEW_DYNAMIC_INHERITANCE) {

      try {
        long folderId = folder.getFolderId();

        while (folderId != BookmarksFolderConstants.DEFAULT_PARENT_FOLDER_ID) {

          folder = BookmarksFolderLocalServiceUtil.getFolder(folderId);

          if (!_hasPermission(permissionChecker, folder, actionId)) {
            return false;
          }

          folderId = folder.getParentFolderId();
        }
      } catch (NoSuchFolderException nsfe) {
        if (!folder.isInTrash()) {
          throw nsfe;
        }
      }

      return BookmarksPermission.contains(permissionChecker, folder.getGroupId(), actionId);
    }

    return _hasPermission(permissionChecker, folder, actionId);
  }