com.liferay.document.library.internal.repository.capabilities.LiferayTrashCapability.java Source code

Java tutorial

Introduction

Here is the source code for com.liferay.document.library.internal.repository.capabilities.LiferayTrashCapability.java

Source

/**
 * Copyright (c) 2000-present Liferay, Inc. All rights reserved.
 *
 * This library is free software; you can redistribute it and/or modify it under
 * the terms of the GNU Lesser General Public License as published by the Free
 * Software Foundation; either version 2.1 of the License, or (at your option)
 * any later version.
 *
 * This library is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
 * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
 * details.
 */

package com.liferay.document.library.internal.repository.capabilities;

import com.liferay.document.library.kernel.model.DLFileEntry;
import com.liferay.document.library.kernel.model.DLFileEntryConstants;
import com.liferay.document.library.kernel.model.DLFileVersion;
import com.liferay.document.library.kernel.model.DLFolder;
import com.liferay.document.library.kernel.model.DLFolderConstants;
import com.liferay.document.library.kernel.service.DLAppHelperLocalService;
import com.liferay.portal.kernel.dao.orm.QueryDefinition;
import com.liferay.portal.kernel.dao.orm.QueryUtil;
import com.liferay.portal.kernel.exception.PortalException;
import com.liferay.portal.kernel.model.Repository;
import com.liferay.portal.kernel.repository.LocalRepository;
import com.liferay.portal.kernel.repository.capabilities.TrashCapability;
import com.liferay.portal.kernel.repository.event.RepositoryEventAware;
import com.liferay.portal.kernel.repository.event.RepositoryEventListener;
import com.liferay.portal.kernel.repository.event.RepositoryEventType;
import com.liferay.portal.kernel.repository.model.FileEntry;
import com.liferay.portal.kernel.repository.model.FileShortcut;
import com.liferay.portal.kernel.repository.model.Folder;
import com.liferay.portal.kernel.repository.registry.RepositoryEventRegistry;
import com.liferay.portal.kernel.service.ServiceContext;
import com.liferay.portal.kernel.workflow.WorkflowConstants;
import com.liferay.portal.repository.capabilities.util.DLAppServiceAdapter;
import com.liferay.portal.repository.capabilities.util.DLFileEntryServiceAdapter;
import com.liferay.portal.repository.capabilities.util.DLFolderServiceAdapter;
import com.liferay.portal.repository.capabilities.util.RepositoryServiceAdapter;
import com.liferay.portal.repository.liferayrepository.model.LiferayFileEntry;
import com.liferay.trash.model.TrashEntry;
import com.liferay.trash.service.TrashEntryLocalService;
import com.liferay.trash.service.TrashVersionLocalService;

import java.util.List;

/**
 * @author Adolfo Prez
 */
public class LiferayTrashCapability implements RepositoryEventAware, TrashCapability {

    public LiferayTrashCapability(DLAppHelperLocalService dlAppHelperLocalService,
            DLAppServiceAdapter dlAppServiceAdapter, DLFileEntryServiceAdapter dlFileEntryServiceAdapter,
            DLFolderServiceAdapter dlFolderServiceAdapter, RepositoryServiceAdapter repositoryServiceAdapter,
            TrashEntryLocalService trashEntryLocalService, TrashVersionLocalService trashVersionLocalService) {

        _dlAppHelperLocalService = dlAppHelperLocalService;
        _dlAppServiceAdapter = dlAppServiceAdapter;
        _dlFileEntryServiceAdapter = dlFileEntryServiceAdapter;
        _dlFolderServiceAdapter = dlFolderServiceAdapter;
        _repositoryServiceAdapter = repositoryServiceAdapter;
        _trashEntryLocalService = trashEntryLocalService;
        _trashVersionLocalService = trashVersionLocalService;
    }

    @Override
    public void deleteFileEntry(FileEntry fileEntry) throws PortalException {
        deleteTrashEntry(fileEntry);

        _dlAppServiceAdapter.deleteFileEntry(fileEntry.getFileEntryId());
    }

    @Override
    public void deleteFolder(Folder folder) throws PortalException {
        List<DLFileEntry> dlFileEntries = _dlFileEntryServiceAdapter.getGroupFileEntries(folder.getGroupId(), 0,
                folder.getRepositoryId(), folder.getFolderId(), QueryUtil.ALL_POS, QueryUtil.ALL_POS, null);

        for (DLFileEntry dlFileEntry : dlFileEntries) {
            FileEntry fileEntry = new LiferayFileEntry(dlFileEntry);

            _dlAppHelperLocalService.deleteFileEntry(fileEntry);

            deleteTrashEntry(fileEntry);
        }

        _dlAppHelperLocalService.deleteFolder(folder);

        deleteTrashEntry(folder);

        _dlFolderServiceAdapter.deleteFolder(folder.getFolderId(), false);
    }

    @Override
    public boolean isInTrash(Folder folder) {
        DLFolder dlFolder = (DLFolder) folder.getModel();

        return dlFolder.isInTrash();
    }

    @Override
    public FileEntry moveFileEntryFromTrash(long userId, FileEntry fileEntry, Folder newFolder,
            ServiceContext serviceContext) throws PortalException {

        long newFolderId = DLFolderConstants.DEFAULT_PARENT_FOLDER_ID;

        if (newFolder != null) {
            newFolderId = newFolder.getFolderId();
        }

        return _dlAppHelperLocalService.moveFileEntryFromTrash(userId, fileEntry, newFolderId, serviceContext);
    }

    @Override
    public FileEntry moveFileEntryToTrash(long userId, FileEntry fileEntry) throws PortalException {

        return _dlAppHelperLocalService.moveFileEntryToTrash(userId, fileEntry);
    }

    @Override
    public FileShortcut moveFileShortcutFromTrash(long userId, FileShortcut fileShortcut, Folder newFolder,
            ServiceContext serviceContext) throws PortalException {

        long newFolderId = DLFolderConstants.DEFAULT_PARENT_FOLDER_ID;

        if (newFolder != null) {
            newFolderId = newFolder.getFolderId();
        }

        return _dlAppHelperLocalService.moveFileShortcutFromTrash(userId, fileShortcut, newFolderId,
                serviceContext);
    }

    @Override
    public FileShortcut moveFileShortcutToTrash(long userId, FileShortcut fileShortcut) throws PortalException {

        return _dlAppHelperLocalService.moveFileShortcutToTrash(userId, fileShortcut);
    }

    @Override
    public Folder moveFolderFromTrash(long userId, Folder folder, Folder destinationFolder,
            ServiceContext serviceContext) throws PortalException {

        long destinationFolderId = DLFolderConstants.DEFAULT_PARENT_FOLDER_ID;

        if (destinationFolder != null) {
            destinationFolderId = destinationFolder.getFolderId();
        }

        return _dlAppHelperLocalService.moveFolderFromTrash(userId, folder, destinationFolderId, serviceContext);
    }

    @Override
    public Folder moveFolderToTrash(long userId, Folder folder) throws PortalException {

        return _dlAppHelperLocalService.moveFolderToTrash(userId, folder);
    }

    @Override
    public void registerRepositoryEventListeners(RepositoryEventRegistry repositoryEventRegistry) {

        repositoryEventRegistry.registerRepositoryEventListener(RepositoryEventType.Delete.class, FileEntry.class,
                new DeleteFileEntryRepositoryEventListener());
        repositoryEventRegistry.registerRepositoryEventListener(RepositoryEventType.Delete.class, Folder.class,
                new DeleteFolderRepositoryEventListener());
        repositoryEventRegistry.registerRepositoryEventListener(RepositoryEventType.Delete.class,
                LocalRepository.class, new DeleteLocalRepositoryEventListener());
    }

    @Override
    public void restoreFileEntryFromTrash(long userId, FileEntry fileEntry) throws PortalException {

        _dlAppHelperLocalService.restoreFileEntryFromTrash(userId, fileEntry);
    }

    @Override
    public void restoreFileShortcutFromTrash(long userId, FileShortcut fileShortcut) throws PortalException {

        _dlAppHelperLocalService.restoreFileShortcutFromTrash(userId, fileShortcut);
    }

    @Override
    public void restoreFolderFromTrash(long userId, Folder folder) throws PortalException {

        _dlAppHelperLocalService.restoreFolderFromTrash(userId, folder);
    }

    protected void deleteRepositoryTrashEntries(long repositoryId, String className) {

        List<TrashEntry> trashEntries = _trashEntryLocalService.getEntries(repositoryId, className);

        for (TrashEntry trashEntry : trashEntries) {
            _trashEntryLocalService.deleteTrashEntry(trashEntry);
        }
    }

    protected void deleteTrashEntries(long repositoryId) throws PortalException {

        Repository repository = _repositoryServiceAdapter.fetchRepository(repositoryId);

        if (repository == null) {
            deleteRepositoryTrashEntries(repositoryId, DLFileEntry.class.getName());
            deleteRepositoryTrashEntries(repositoryId, DLFolder.class.getName());
        } else {
            deleteTrashEntries(repository.getGroupId(), repository.getDlFolderId());
        }
    }

    protected void deleteTrashEntries(long groupId, long dlFolderId) throws PortalException {

        QueryDefinition<Object> queryDefinition = new QueryDefinition<>();

        queryDefinition.setStatus(WorkflowConstants.STATUS_ANY);

        List<Object> foldersAndFileEntriesAndFileShortcuts = _dlFolderServiceAdapter
                .getFoldersAndFileEntriesAndFileShortcuts(groupId, dlFolderId, null, true, queryDefinition);

        for (Object folderFileEntryOrFileShortcut : foldersAndFileEntriesAndFileShortcuts) {

            if (folderFileEntryOrFileShortcut instanceof DLFileEntry) {
                deleteTrashEntry((DLFileEntry) folderFileEntryOrFileShortcut);
            } else if (folderFileEntryOrFileShortcut instanceof DLFolder) {
                DLFolder dlFolder = (DLFolder) folderFileEntryOrFileShortcut;

                deleteTrashEntries(dlFolder.getGroupId(), dlFolder.getFolderId());

                deleteTrashEntry(dlFolder);
            }
        }
    }

    protected void deleteTrashEntry(DLFileEntry dlFileEntry) {
        if (!dlFileEntry.isInTrash()) {
            return;
        }

        if (dlFileEntry.isInTrashExplicitly()) {
            _trashEntryLocalService.deleteEntry(DLFileEntryConstants.getClassName(), dlFileEntry.getFileEntryId());
        } else {
            List<DLFileVersion> dlFileVersions = dlFileEntry.getFileVersions(WorkflowConstants.STATUS_ANY);

            for (DLFileVersion dlFileVersion : dlFileVersions) {
                _trashVersionLocalService.deleteTrashVersion(DLFileVersion.class.getName(),
                        dlFileVersion.getFileVersionId());
            }
        }
    }

    protected void deleteTrashEntry(DLFolder dlFolder) {
        if (!dlFolder.isInTrash()) {
            return;
        }

        if (dlFolder.isInTrashExplicitly()) {
            _trashEntryLocalService.deleteEntry(DLFolderConstants.getClassName(), dlFolder.getFolderId());
        } else {
            _trashVersionLocalService.deleteTrashVersion(DLFolderConstants.getClassName(), dlFolder.getFolderId());
        }
    }

    protected void deleteTrashEntry(FileEntry fileEntry) {
        deleteTrashEntry((DLFileEntry) fileEntry.getModel());
    }

    protected void deleteTrashEntry(Folder folder) {
        deleteTrashEntry((DLFolder) folder.getModel());
    }

    private final DLAppHelperLocalService _dlAppHelperLocalService;
    private final DLAppServiceAdapter _dlAppServiceAdapter;
    private final DLFileEntryServiceAdapter _dlFileEntryServiceAdapter;
    private final DLFolderServiceAdapter _dlFolderServiceAdapter;
    private final RepositoryServiceAdapter _repositoryServiceAdapter;
    private final TrashEntryLocalService _trashEntryLocalService;
    private final TrashVersionLocalService _trashVersionLocalService;

    private class DeleteFileEntryRepositoryEventListener
            implements RepositoryEventListener<RepositoryEventType.Delete, FileEntry> {

        @Override
        public void execute(FileEntry fileEntry) {
            LiferayTrashCapability.this.deleteTrashEntry(fileEntry);
        }

    }

    private class DeleteFolderRepositoryEventListener
            implements RepositoryEventListener<RepositoryEventType.Delete, Folder> {

        @Override
        public void execute(Folder folder) {
            LiferayTrashCapability.this.deleteTrashEntry(folder);
        }

    }

    private class DeleteLocalRepositoryEventListener
            implements RepositoryEventListener<RepositoryEventType.Delete, LocalRepository> {

        @Override
        public void execute(LocalRepository localRepository) throws PortalException {

            LiferayTrashCapability.this.deleteTrashEntries(localRepository.getRepositoryId());
        }

    }

}