/**
   * Removes a {@link ResourceFolder} associated with the specified {@link IAbstractFolder}.
   *
   * @param type The type of the folder
   * @param removedFolder the IAbstractFolder object.
   * @param context the scanning context
   * @return the {@link ResourceFolder} that was removed, or null if no matches were found.
   */
  @Nullable
  public ResourceFolder removeFolder(
      @NonNull ResourceFolderType type,
      @NonNull IAbstractFolder removedFolder,
      @Nullable ScanningContext context) {
    ensureInitialized();

    // get the list of folders for the resource type.
    List<ResourceFolder> list = mFolderMap.get(type);

    if (list != null) {
      int count = list.size();
      for (int i = 0; i < count; i++) {
        ResourceFolder resFolder = list.get(i);
        IAbstractFolder folder = resFolder.getFolder();
        if (removedFolder.equals(folder)) {
          // we found the matching ResourceFolder. we need to remove it.
          list.remove(i);

          // remove its content
          resFolder.dispose(context);

          return resFolder;
        }
      }
    }

    return null;
  }
  /**
   * Returns the {@link ResourceFolder} associated with a {@link IAbstractFolder}.
   *
   * @param folder The {@link IAbstractFolder} object.
   * @return the {@link ResourceFolder} or null if it was not found.
   */
  @Nullable
  public ResourceFolder getResourceFolder(@NonNull IAbstractFolder folder) {
    ensureInitialized();

    Collection<List<ResourceFolder>> values = mFolderMap.values();

    for (List<ResourceFolder> list : values) {
      for (ResourceFolder resFolder : list) {
        IAbstractFolder wrapper = resFolder.getFolder();
        if (wrapper.equals(folder)) {
          return resFolder;
        }
      }
    }

    return null;
  }