/**
   * Build a list of blog categories recursively
   *
   * @param blogUser {@link BlogUser}
   * @param blogDepth Depth at which the current iteration is running
   * @param blogDirectoryDepth Depth to which the fetcher should stop looking for categories
   * @param blogDirectory Directory in which the current iteration is running
   * @param categoryList Dynamic list of categories that gets added to as it explores directories
   */
  protected void recursiveCategoryBuilder(
      BlogUser blogUser,
      int blogDepth,
      int blogDirectoryDepth,
      String blogDirectory,
      List categoryList) {
    Blog blog = blogUser.getBlog();
    blogDepth++;
    if (blogDirectoryDepth != BlojsomConstants.INFINITE_BLOG_DEPTH) {
      if (blogDepth == blogDirectoryDepth) {
        return;
      }
    }

    File blogDir = new File(blogDirectory);
    File[] directories;
    if (blog.getBlogDirectoryFilter() == null) {
      directories = blogDir.listFiles(BlojsomUtils.getDirectoryFilter());
    } else {
      directories =
          blogDir.listFiles(BlojsomUtils.getDirectoryFilter(blog.getBlogDirectoryFilter()));
    }

    String categoryKey = BlojsomUtils.getBlogCategory(blog.getBlogHome(), blogDirectory);
    if (!categoryKey.endsWith("/")) {
      categoryKey += "/";
    }

    BlogCategory blogCategory = new FileBackedBlogCategory();
    blogCategory.setParentCategory(this);
    blogCategory.setCategory(categoryKey);
    blogCategory.setCategoryURL(blog.getBlogURL() + BlojsomUtils.removeInitialSlash(categoryKey));

    try {
      blogCategory.load(blogUser);
    } catch (BlojsomException e) {
      _logger.error(e);
    }

    if (blogDepth != 0) {
      categoryList.add(blogCategory);
    }

    if (directories == null) {
      return;
    } else {
      for (int i = 0; i < directories.length; i++) {
        File directory = directories[i];
        recursiveCategoryBuilder(
            blogUser, blogDepth, blogDirectoryDepth, directory.toString(), categoryList);
      }
    }
  }