protected void deleteFolders(ActionRequest actionRequest, boolean moveToTrash) throws Exception {

    long[] deleteFolderIds = null;

    long folderId = ParamUtil.getLong(actionRequest, "folderId");

    if (folderId > 0) {
      deleteFolderIds = new long[] {folderId};
    } else {
      deleteFolderIds = StringUtil.split(ParamUtil.getString(actionRequest, "folderIds"), 0L);
    }

    List<TrashedModel> trashedModels = new ArrayList<>();

    for (long deleteFolderId : deleteFolderIds) {
      if (moveToTrash) {
        BookmarksFolder folder = _bookmarksFolderService.moveFolderToTrash(deleteFolderId);

        trashedModels.add(folder);
      } else {
        _bookmarksFolderService.deleteFolder(deleteFolderId);
      }
    }

    if (moveToTrash && !trashedModels.isEmpty()) {
      TrashUtil.addTrashSessionMessages(actionRequest, trashedModels);

      hideDefaultSuccessMessage(actionRequest);
    }
  }
  protected void deleteCategories(ActionRequest actionRequest, boolean moveToTrash)
      throws Exception {

    ThemeDisplay themeDisplay = (ThemeDisplay) actionRequest.getAttribute(WebKeys.THEME_DISPLAY);

    long[] deleteCategoryIds = null;

    long categoryId = ParamUtil.getLong(actionRequest, "mbCategoryId");

    if (categoryId > 0) {
      deleteCategoryIds = new long[] {categoryId};
    } else {
      deleteCategoryIds =
          StringUtil.split(ParamUtil.getString(actionRequest, "deleteCategoryIds"), 0L);
    }

    List<TrashedModel> trashedModels = new ArrayList<>();

    for (long deleteCategoryId : deleteCategoryIds) {
      if (moveToTrash) {
        MBCategory category = _mbCategoryService.moveCategoryToTrash(deleteCategoryId);

        trashedModels.add(category);
      } else {
        _mbCategoryService.deleteCategory(themeDisplay.getScopeGroupId(), deleteCategoryId);
      }
    }

    if (moveToTrash && !trashedModels.isEmpty()) {
      TrashUtil.addTrashSessionMessages(actionRequest, trashedModels);

      hideDefaultSuccessMessage(actionRequest);
    }
  }
  protected void deleteEntries(ActionRequest actionRequest, boolean moveToTrash) throws Exception {

    long[] deleteFolderIds = ParamUtil.getLongValues(actionRequest, "rowIdsFolder");

    List<TrashedModel> trashedModels = new ArrayList<>();

    for (int i = 0; i < deleteFolderIds.length; i++) {
      long deleteFolderId = deleteFolderIds[i];

      if (moveToTrash) {
        Folder folder = _dlTrashService.moveFolderToTrash(deleteFolderId);

        if (folder.getModel() instanceof TrashedModel) {
          trashedModels.add((TrashedModel) folder.getModel());
        }
      } else {
        _dlAppService.deleteFolder(deleteFolderId);
      }
    }

    // Delete file shortcuts before file entries. See LPS-21348.

    long[] deleteFileShortcutIds = ParamUtil.getLongValues(actionRequest, "rowIdsDLFileShortcut");

    for (int i = 0; i < deleteFileShortcutIds.length; i++) {
      long deleteFileShortcutId = deleteFileShortcutIds[i];

      if (moveToTrash) {
        FileShortcut fileShortcut = _dlTrashService.moveFileShortcutToTrash(deleteFileShortcutId);

        if (fileShortcut.getModel() instanceof TrashedModel) {
          trashedModels.add((TrashedModel) fileShortcut.getModel());
        }
      } else {
        _dlAppService.deleteFileShortcut(deleteFileShortcutId);
      }
    }

    long[] deleteFileEntryIds = ParamUtil.getLongValues(actionRequest, "rowIdsFileEntry");

    for (long deleteFileEntryId : deleteFileEntryIds) {
      if (moveToTrash) {
        FileEntry fileEntry = _dlTrashService.moveFileEntryToTrash(deleteFileEntryId);

        if (fileEntry.getModel() instanceof TrashedModel) {
          trashedModels.add((TrashedModel) fileEntry.getModel());
        }
      } else {
        _dlAppService.deleteFileEntry(deleteFileEntryId);
      }
    }

    if (moveToTrash && !trashedModels.isEmpty()) {
      TrashUtil.addTrashSessionMessages(actionRequest, trashedModels);

      hideDefaultSuccessMessage(actionRequest);
    }
  }
  @Override
  public void deleteEntriesAttachments(
      long companyId, long repositoryId, Date date, String[] attachmentFileNames) {

    for (String attachmentFileName : attachmentFileNames) {
      String trashTime = TrashUtil.getTrashTime(attachmentFileName, TRASH_TIME_SEPARATOR);

      long timestamp = GetterUtil.getLong(trashTime);

      if (timestamp < date.getTime()) {
        DLStoreUtil.deleteDirectory(companyId, repositoryId, attachmentFileName);
      }
    }
  }
  protected void addBreadcrumbEntries(
      HttpServletRequest request,
      LiferayPortletResponse liferayPortletResponse,
      String className,
      long classPK,
      String paramName,
      PortletURL containerModelURL,
      boolean checkInTrashContainers)
      throws PortalException, PortletException {

    ThemeDisplay themeDisplay = (ThemeDisplay) request.getAttribute(WebKeys.THEME_DISPLAY);

    PortletURL portletURL = PortletURLUtil.clone(containerModelURL, liferayPortletResponse);

    TrashHandler trashHandler = TrashHandlerRegistryUtil.getTrashHandler(className);

    List<ContainerModel> containerModels = trashHandler.getParentContainerModels(classPK);

    Collections.reverse(containerModels);

    for (ContainerModel containerModel : containerModels) {
      TrashHandler containerModelTrashHandler =
          TrashHandlerRegistryUtil.getTrashHandler(containerModel.getModelClassName());

      if (checkInTrashContainers
          && !containerModelTrashHandler.isInTrash(containerModel.getContainerModelId())) {

        continue;
      }

      portletURL.setParameter(paramName, String.valueOf(containerModel.getContainerModelId()));

      String name = containerModel.getContainerModelName();

      if (containerModelTrashHandler.isInTrash(containerModel.getContainerModelId())) {

        name = TrashUtil.getOriginalTitle(name);
      }

      PortalUtil.addPortletBreadcrumbEntry(request, name, portletURL.toString());
    }

    TrashRenderer trashRenderer = trashHandler.getTrashRenderer(classPK);

    PortalUtil.addPortletBreadcrumbEntry(
        request, trashRenderer.getTitle(themeDisplay.getLocale()), null);
  }
  @Override
  protected Document doGetDocument(JournalArticle journalArticle) throws Exception {

    Document document = getBaseModelDocument(CLASS_NAME, journalArticle);

    long classPK = journalArticle.getId();

    if (!isIndexAllArticleVersions()) {
      classPK = journalArticle.getResourcePrimKey();
    }

    document.addUID(CLASS_NAME, classPK);

    String articleDefaultLanguageId =
        LocalizationUtil.getDefaultLanguageId(journalArticle.getDocument());

    String[] languageIds = LocalizationUtil.getAvailableLanguageIds(journalArticle.getDocument());

    for (String languageId : languageIds) {
      String content = extractDDMContent(journalArticle, languageId);

      String description = journalArticle.getDescription(languageId);

      String title = journalArticle.getTitle(languageId);

      if (languageId.equals(articleDefaultLanguageId)) {
        document.addText(Field.CONTENT, content);
        document.addText(Field.DESCRIPTION, description);
        document.addText("defaultLanguageId", languageId);
      }

      document.addText(LocalizationUtil.getLocalizedName(Field.CONTENT, languageId), content);
      document.addText(
          LocalizationUtil.getLocalizedName(Field.DESCRIPTION, languageId), description);
      document.addText(LocalizationUtil.getLocalizedName(Field.TITLE, languageId), title);
    }

    document.addKeyword(Field.FOLDER_ID, journalArticle.getFolderId());

    String articleId = journalArticle.getArticleId();

    if (journalArticle.isInTrash()) {
      articleId = TrashUtil.getOriginalTitle(articleId);
    }

    document.addKeyword(Field.ARTICLE_ID, articleId);

    document.addKeyword(Field.LAYOUT_UUID, journalArticle.getLayoutUuid());
    document.addKeyword(
        Field.TREE_PATH, StringUtil.split(journalArticle.getTreePath(), CharPool.SLASH));
    document.addKeyword(Field.VERSION, journalArticle.getVersion());

    document.addKeyword("ddmStructureKey", journalArticle.getDDMStructureKey());
    document.addKeyword("ddmTemplateKey", journalArticle.getDDMTemplateKey());
    document.addDate("displayDate", journalArticle.getDisplayDate());
    document.addKeyword("head", JournalUtil.isHead(journalArticle));

    boolean headListable = JournalUtil.isHeadListable(journalArticle);

    document.addKeyword("headListable", headListable);

    // Scheduled listable articles should be visible in asset browser

    if (journalArticle.isScheduled() && headListable) {
      boolean visible = GetterUtil.getBoolean(document.get("visible"));

      if (!visible) {
        document.addKeyword("visible", true);
      }
    }

    addDDMStructureAttributes(document, journalArticle);

    return document;
  }