/** * 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.portlet.documentlibrary.service.impl; import com.liferay.document.library.kernel.exception.FileEntryLockException; 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.DLFolderConstants; import com.liferay.dynamic.data.mapping.kernel.DDMFormValues; import com.liferay.portal.kernel.dao.orm.QueryDefinition; import com.liferay.portal.kernel.exception.PortalException; import com.liferay.portal.kernel.lock.Lock; import com.liferay.portal.kernel.lock.LockManagerUtil; import com.liferay.portal.kernel.search.Hits; import com.liferay.portal.kernel.security.auth.PrincipalException; import com.liferay.portal.kernel.security.permission.ActionKeys; import com.liferay.portal.kernel.security.permission.PermissionChecker; import com.liferay.portal.kernel.service.ServiceContext; import com.liferay.portal.kernel.util.ArrayUtil; import com.liferay.portal.kernel.util.OrderByComparator; import com.liferay.portal.kernel.workflow.WorkflowConstants; import com.liferay.portal.util.PropsValues; import com.liferay.portlet.documentlibrary.model.impl.DLFileEntryImpl; import com.liferay.portlet.documentlibrary.service.base.DLFileEntryServiceBaseImpl; import com.liferay.portlet.documentlibrary.service.permission.DLFileEntryPermission; import com.liferay.portlet.documentlibrary.service.permission.DLFolderPermission; import java.io.File; import java.io.InputStream; import java.io.Serializable; import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Map; /** * Provides the remote service for accessing, adding, checking in/out, deleting, * locking/unlocking, moving, reverting, updating, and verifying document * library file entries. Its methods include permission checks. * * @author Brian Wing Shun Chan * @author Alexander Chow */ public class DLFileEntryServiceImpl extends DLFileEntryServiceBaseImpl { @Override public DLFileEntry addFileEntry( long groupId, long repositoryId, long folderId, String sourceFileName, String mimeType, String title, String description, String changeLog, long fileEntryTypeId, Map<String, DDMFormValues> ddmFormValuesMap, File file, InputStream is, long size, ServiceContext serviceContext) throws PortalException { DLFolderPermission.check( getPermissionChecker(), groupId, folderId, ActionKeys.ADD_DOCUMENT); return dlFileEntryLocalService.addFileEntry( getUserId(), groupId, repositoryId, folderId, sourceFileName, mimeType, title, description, changeLog, fileEntryTypeId, ddmFormValuesMap, file, is, size, serviceContext); } @Override public DLFileVersion cancelCheckOut(long fileEntryId) throws PortalException { boolean locked = LockManagerUtil.isLocked( DLFileEntry.class.getName(), fileEntryId); if (locked && !hasFileEntryLock(fileEntryId) && !_hasOverrideCheckoutPermission(fileEntryId)) { throw new PrincipalException.MustHavePermission( getUserId(), DLFileEntry.class.getName(), fileEntryId, ActionKeys.OVERRIDE_CHECKOUT); } return dlFileEntryLocalService.cancelCheckOut(getUserId(), fileEntryId); } @Override public void checkInFileEntry( long fileEntryId, boolean major, String changeLog, ServiceContext serviceContext) throws PortalException { boolean locked = LockManagerUtil.isLocked( DLFileEntry.class.getName(), fileEntryId); if (locked && !hasFileEntryLock(fileEntryId)) { throw new FileEntryLockException.MustOwnLock(); } dlFileEntryLocalService.checkInFileEntry( getUserId(), fileEntryId, major, changeLog, serviceContext); } @Override public void checkInFileEntry( long fileEntryId, String lockUuid, ServiceContext serviceContext) throws PortalException { boolean locked = LockManagerUtil.isLocked( DLFileEntryConstants.getClassName(), fileEntryId); if (locked && !hasFileEntryLock(fileEntryId)) { throw new FileEntryLockException.MustOwnLock(); } dlFileEntryLocalService.checkInFileEntry( getUserId(), fileEntryId, lockUuid, serviceContext); } @Override public DLFileEntry checkOutFileEntry( long fileEntryId, ServiceContext serviceContext) throws PortalException { return checkOutFileEntry( fileEntryId, null, DLFileEntryImpl.LOCK_EXPIRATION_TIME, serviceContext); } @Override public DLFileEntry checkOutFileEntry( long fileEntryId, String owner, long expirationTime, ServiceContext serviceContext) throws PortalException { DLFileEntryPermission.check( getPermissionChecker(), fileEntryId, ActionKeys.UPDATE); return dlFileEntryLocalService.checkOutFileEntry( getUserId(), fileEntryId, owner, expirationTime, serviceContext); } @Override public DLFileEntry copyFileEntry( long groupId, long repositoryId, long fileEntryId, long destFolderId, ServiceContext serviceContext) throws PortalException { DLFileEntryPermission.check( getPermissionChecker(), fileEntryId, ActionKeys.VIEW); DLFolderPermission.check( getPermissionChecker(), groupId, destFolderId, ActionKeys.ADD_DOCUMENT); return dlFileEntryLocalService.copyFileEntry( getUserId(), groupId, repositoryId, fileEntryId, destFolderId, serviceContext); } @Override public void deleteFileEntry(long fileEntryId) throws PortalException { DLFileEntryPermission.check( getPermissionChecker(), fileEntryId, ActionKeys.DELETE); dlFileEntryLocalService.deleteFileEntry(getUserId(), fileEntryId); } @Override public void deleteFileEntry(long groupId, long folderId, String title) throws PortalException { DLFileEntry dlFileEntry = getFileEntry(groupId, folderId, title); deleteFileEntry(dlFileEntry.getFileEntryId()); } @Override public void deleteFileVersion(long fileEntryId, String version) throws PortalException { DLFileEntryPermission.check( getPermissionChecker(), fileEntryId, ActionKeys.DELETE); dlFileEntryLocalService.deleteFileVersion( getUserId(), fileEntryId, version); } @Override public DLFileEntry fetchFileEntryByImageId(long imageId) throws PortalException { DLFileEntry dlFileEntry = dlFileEntryFinder.fetchByAnyImageId(imageId); if (dlFileEntry != null) { DLFileEntryPermission.check( getPermissionChecker(), dlFileEntry, ActionKeys.VIEW); } return dlFileEntry; } @Override public InputStream getFileAsStream(long fileEntryId, String version) throws PortalException { DLFileEntryPermission.check( getPermissionChecker(), fileEntryId, ActionKeys.VIEW); return dlFileEntryLocalService.getFileAsStream(fileEntryId, version); } @Override public InputStream getFileAsStream( long fileEntryId, String version, boolean incrementCounter) throws PortalException { DLFileEntryPermission.check( getPermissionChecker(), fileEntryId, ActionKeys.VIEW); return dlFileEntryLocalService.getFileAsStream( fileEntryId, version, incrementCounter); } @Override public List<DLFileEntry> getFileEntries( long groupId, long folderId, int status, int start, int end, OrderByComparator<DLFileEntry> obc) throws PortalException { DLFolderPermission.check( getPermissionChecker(), groupId, folderId, ActionKeys.VIEW); List<Long> folderIds = new ArrayList<>(); folderIds.add(folderId); QueryDefinition<DLFileEntry> queryDefinition = new QueryDefinition<>( status, false, start, end, obc); return dlFileEntryFinder.filterFindByG_F( groupId, folderIds, queryDefinition); } @Override public List<DLFileEntry> getFileEntries( long groupId, long folderId, int start, int end, OrderByComparator<DLFileEntry> obc) throws PortalException { return getFileEntries( groupId, folderId, WorkflowConstants.STATUS_APPROVED, start, end, obc); } @Override public List<DLFileEntry> getFileEntries( long groupId, long folderId, long fileEntryTypeId, int start, int end, OrderByComparator<DLFileEntry> obc) throws PortalException { DLFolderPermission.check( getPermissionChecker(), groupId, folderId, ActionKeys.VIEW); return dlFileEntryPersistence.filterFindByG_F_F( groupId, folderId, fileEntryTypeId, start, end, obc); } @Override public List<DLFileEntry> getFileEntries( long groupId, long folderId, String[] mimeTypes, int status, int start, int end, OrderByComparator<DLFileEntry> obc) throws PortalException { DLFolderPermission.check( getPermissionChecker(), groupId, folderId, ActionKeys.VIEW); List<Long> folderIds = new ArrayList<>(); folderIds.add(folderId); QueryDefinition<DLFileEntry> queryDefinition = new QueryDefinition<>( status, start, end, obc); return dlFileEntryFinder.filterFindByG_U_F_M( groupId, 0, folderIds, mimeTypes, queryDefinition); } @Override public List<DLFileEntry> getFileEntries( long groupId, long folderId, String[] mimeTypes, int start, int end, OrderByComparator<DLFileEntry> obc) throws PortalException { DLFolderPermission.check( getPermissionChecker(), groupId, folderId, ActionKeys.VIEW); List<Long> folderIds = new ArrayList<>(); folderIds.add(folderId); QueryDefinition<DLFileEntry> queryDefinition = new QueryDefinition<>( WorkflowConstants.STATUS_IN_TRASH, true, start, end, obc); return dlFileEntryFinder.filterFindByG_U_F_M( groupId, 0, folderIds, mimeTypes, queryDefinition); } @Override public int getFileEntriesCount(long groupId, long folderId) { return getFileEntriesCount( groupId, folderId, WorkflowConstants.STATUS_APPROVED); } @Override public int getFileEntriesCount(long groupId, long folderId, int status) { List<Long> folderIds = new ArrayList<>(); folderIds.add(folderId); return dlFileEntryFinder.filterCountByG_F( groupId, folderIds, new QueryDefinition<DLFileEntry>(status)); } @Override public int getFileEntriesCount( long groupId, long folderId, long fileEntryTypeId) { return dlFileEntryPersistence.filterCountByG_F_F( groupId, folderId, fileEntryTypeId); } @Override public int getFileEntriesCount( long groupId, long folderId, String[] mimeTypes) { return getFileEntriesCount( groupId, folderId, mimeTypes, WorkflowConstants.STATUS_ANY); } @Override public int getFileEntriesCount( long groupId, long folderId, String[] mimeTypes, int status) { List<Long> folderIds = new ArrayList<>(); folderIds.add(folderId); return dlFileEntryFinder.filterCountByG_U_F_M( groupId, 0, folderIds, mimeTypes, new QueryDefinition<DLFileEntry>(status)); } @Override public DLFileEntry getFileEntry(long fileEntryId) throws PortalException { DLFileEntryPermission.check( getPermissionChecker(), fileEntryId, ActionKeys.VIEW); return dlFileEntryLocalService.getFileEntry(fileEntryId); } @Override public DLFileEntry getFileEntry(long groupId, long folderId, String title) throws PortalException { DLFileEntry dlFileEntry = dlFileEntryLocalService.getFileEntry( groupId, folderId, title); DLFileEntryPermission.check( getPermissionChecker(), dlFileEntry, ActionKeys.VIEW); return dlFileEntry; } @Override public DLFileEntry getFileEntryByUuidAndGroupId(String uuid, long groupId) throws PortalException { DLFileEntry dlFileEntry = dlFileEntryPersistence.findByUUID_G( uuid, groupId); DLFileEntryPermission.check( getPermissionChecker(), dlFileEntry, ActionKeys.VIEW); return dlFileEntry; } @Override public Lock getFileEntryLock(long fileEntryId) { try { return LockManagerUtil.getLock( DLFileEntry.class.getName(), fileEntryId); } catch (Exception e) { return null; } } @Override public int getFoldersFileEntriesCount( long groupId, List<Long> folderIds, int status) { QueryDefinition<DLFileEntry> queryDefinition = new QueryDefinition<>( status); if (folderIds.size() <= PropsValues.SQL_DATA_MAX_PARAMETERS) { return dlFileEntryFinder.filterCountByG_F( groupId, folderIds, queryDefinition); } else { int start = 0; int end = PropsValues.SQL_DATA_MAX_PARAMETERS; int filesCount = dlFileEntryFinder.filterCountByG_F( groupId, folderIds.subList(start, end), queryDefinition); folderIds.subList(start, end).clear(); filesCount += getFoldersFileEntriesCount( groupId, folderIds, status); return filesCount; } } @Override public List<DLFileEntry> getGroupFileEntries( long groupId, long userId, long rootFolderId, int start, int end, OrderByComparator<DLFileEntry> obc) throws PortalException { List<Long> folderIds = dlFolderService.getFolderIds( groupId, rootFolderId); if (folderIds.isEmpty()) { return Collections.emptyList(); } else if (userId <= 0) { return dlFileEntryPersistence.filterFindByG_F( groupId, ArrayUtil.toLongArray(folderIds), start, end, obc); } else { return dlFileEntryPersistence.filterFindByG_U_F( groupId, userId, ArrayUtil.toLongArray(folderIds), start, end, obc); } } @Override public List<DLFileEntry> getGroupFileEntries( long groupId, long userId, long repositoryId, long rootFolderId, String[] mimeTypes, int status, int start, int end, OrderByComparator<DLFileEntry> obc) throws PortalException { List<Long> repositoryIds = new ArrayList<>(); if (repositoryId != 0) { repositoryIds.add(repositoryId); } QueryDefinition<DLFileEntry> queryDefinition = new QueryDefinition<>( status, start, end, obc); if (rootFolderId == DLFolderConstants.DEFAULT_PARENT_FOLDER_ID) { return dlFileEntryFinder.filterFindByG_U_R_F_M( groupId, userId, repositoryIds, new ArrayList<Long>(), mimeTypes, queryDefinition); } List<Long> folderIds = dlFolderService.getFolderIds( groupId, rootFolderId); if (folderIds.isEmpty()) { return Collections.emptyList(); } return dlFileEntryFinder.filterFindByG_U_R_F_M( groupId, userId, repositoryIds, folderIds, mimeTypes, queryDefinition); } @Override public List<DLFileEntry> getGroupFileEntries( long groupId, long userId, long rootFolderId, String[] mimeTypes, int status, int start, int end, OrderByComparator<DLFileEntry> obc) throws PortalException { return getGroupFileEntries( groupId, userId, 0, rootFolderId, mimeTypes, status, start, end, obc); } @Override public int getGroupFileEntriesCount( long groupId, long userId, long rootFolderId) throws PortalException { List<Long> folderIds = dlFolderService.getFolderIds( groupId, rootFolderId); if (folderIds.isEmpty()) { return 0; } else if (userId <= 0) { return dlFileEntryPersistence.filterCountByG_F( groupId, ArrayUtil.toLongArray(folderIds)); } else { return dlFileEntryPersistence.filterCountByG_U_F( groupId, userId, ArrayUtil.toLongArray(folderIds)); } } @Override public int getGroupFileEntriesCount( long groupId, long userId, long repositoryId, long rootFolderId, String[] mimeTypes, int status) throws PortalException { List<Long> repositoryIds = new ArrayList<>(); if (repositoryId != 0) { repositoryIds.add(repositoryId); } if (rootFolderId == DLFolderConstants.DEFAULT_PARENT_FOLDER_ID) { return dlFileEntryFinder.filterCountByG_U_R_F_M( groupId, userId, repositoryIds, new ArrayList<Long>(), mimeTypes, new QueryDefinition<DLFileEntry>(status)); } List<Long> folderIds = dlFolderService.getFolderIds( groupId, rootFolderId); if (folderIds.isEmpty()) { return 0; } return dlFileEntryFinder.filterCountByG_U_R_F_M( groupId, userId, repositoryIds, folderIds, mimeTypes, new QueryDefinition<DLFileEntry>(status)); } @Override public int getGroupFileEntriesCount( long groupId, long userId, long rootFolderId, String[] mimeTypes, int status) throws PortalException { return getGroupFileEntriesCount( groupId, userId, 0, rootFolderId, mimeTypes, status); } @Override public boolean hasFileEntryLock(long fileEntryId) throws PortalException { DLFileEntry dlFileEntry = dlFileEntryLocalService.getFileEntry( fileEntryId); return dlFileEntry.hasLock(); } @Override public boolean isFileEntryCheckedOut(long fileEntryId) throws PortalException { return dlFileEntryLocalService.isFileEntryCheckedOut(fileEntryId); } @Override public boolean isKeepFileVersionLabel( long fileEntryId, boolean majorVersion, ServiceContext serviceContext) throws PortalException { PermissionChecker permissionChecker = getPermissionChecker(); DLFileEntryPermission.check( permissionChecker, fileEntryId, ActionKeys.VIEW); return dlFileEntryLocalService.isKeepFileVersionLabel( fileEntryId, majorVersion, serviceContext); } /** * @deprecated As of 7.0.0, replaced by {@link #isKeepFileVersionLabel(long, * boolean, ServiceContext)} */ @Deprecated @Override public boolean isKeepFileVersionLabel( long fileEntryId, ServiceContext serviceContext) throws PortalException { PermissionChecker permissionChecker = getPermissionChecker(); DLFileEntryPermission.check( permissionChecker, fileEntryId, ActionKeys.VIEW); return dlFileEntryLocalService.isKeepFileVersionLabel( fileEntryId, serviceContext); } @Override public DLFileEntry moveFileEntry( long fileEntryId, long newFolderId, ServiceContext serviceContext) throws PortalException { PermissionChecker permissionChecker = getPermissionChecker(); DLFileEntryPermission.check( permissionChecker, fileEntryId, ActionKeys.UPDATE); DLFolderPermission.check( permissionChecker, serviceContext.getScopeGroupId(), newFolderId, ActionKeys.ADD_DOCUMENT); return dlFileEntryLocalService.moveFileEntry( getUserId(), fileEntryId, newFolderId, serviceContext); } @Override public Lock refreshFileEntryLock( String lockUuid, long companyId, long expirationTime) throws PortalException { return LockManagerUtil.refresh(lockUuid, companyId, expirationTime); } @Override public void revertFileEntry( long fileEntryId, String version, ServiceContext serviceContext) throws PortalException { DLFileEntryPermission.check( getPermissionChecker(), fileEntryId, ActionKeys.UPDATE); dlFileEntryLocalService.revertFileEntry( getUserId(), fileEntryId, version, serviceContext); } @Override public Hits search( long groupId, long creatorUserId, int status, int start, int end) throws PortalException { return dlFileEntryLocalService.search( groupId, getUserId(), creatorUserId, status, start, end); } @Override public Hits search( long groupId, long creatorUserId, long folderId, String[] mimeTypes, int status, int start, int end) throws PortalException { return dlFileEntryLocalService.search( groupId, getUserId(), creatorUserId, folderId, mimeTypes, status, start, end); } @Override public DLFileEntry updateFileEntry( long fileEntryId, String sourceFileName, String mimeType, String title, String description, String changeLog, boolean majorVersion, long fileEntryTypeId, Map<String, DDMFormValues> ddmFormValuesMap, File file, InputStream is, long size, ServiceContext serviceContext) throws PortalException { DLFileEntryPermission.check( getPermissionChecker(), fileEntryId, ActionKeys.UPDATE); if (LockManagerUtil.isLocked( DLFileEntryConstants.getClassName(), fileEntryId)) { boolean hasLock = LockManagerUtil.hasLock( getUserId(), DLFileEntry.class.getName(), fileEntryId); if (!hasLock) { throw new FileEntryLockException.MustOwnLock(); } } return dlFileEntryLocalService.updateFileEntry( getUserId(), fileEntryId, sourceFileName, mimeType, title, description, changeLog, majorVersion, fileEntryTypeId, ddmFormValuesMap, file, is, size, serviceContext); } @Override public DLFileEntry updateStatus( long userId, long fileVersionId, int status, ServiceContext serviceContext, Map<String, Serializable> workflowContext) throws PortalException { DLFileVersion dlFileVersion = dlFileVersionLocalService.getFileVersion( fileVersionId); DLFileEntryPermission.check( getPermissionChecker(), dlFileVersion.getFileEntryId(), ActionKeys.UPDATE); return dlFileEntryLocalService.updateStatus( userId, fileVersionId, status, serviceContext, workflowContext); } @Override public boolean verifyFileEntryCheckOut(long fileEntryId, String lockUuid) throws PortalException { return dlFileEntryLocalService.verifyFileEntryCheckOut( fileEntryId, lockUuid); } @Override public boolean verifyFileEntryLock(long fileEntryId, String lockUuid) throws PortalException { return dlFileEntryLocalService.verifyFileEntryLock( fileEntryId, lockUuid); } private boolean _hasOverrideCheckoutPermission(long fileEntryId) throws PortalException { return DLFileEntryPermission.contains( getPermissionChecker(), fileEntryId, ActionKeys.OVERRIDE_CHECKOUT); } }