/**
* 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.exception.NoSuchFileEntryException;
import com.liferay.document.library.kernel.model.DLFolderConstants;
import com.liferay.document.library.kernel.util.DLProcessorRegistryUtil;
import com.liferay.document.library.kernel.util.comparator.FolderNameComparator;
import com.liferay.document.library.kernel.util.comparator.RepositoryModelModifiedDateComparator;
import com.liferay.document.library.kernel.util.comparator.RepositoryModelTitleComparator;
import com.liferay.portal.kernel.bean.BeanReference;
import com.liferay.portal.kernel.dao.orm.QueryUtil;
import com.liferay.portal.kernel.exception.NoSuchGroupException;
import com.liferay.portal.kernel.exception.PortalException;
import com.liferay.portal.kernel.exception.SystemException;
import com.liferay.portal.kernel.io.unsync.UnsyncByteArrayInputStream;
import com.liferay.portal.kernel.lock.Lock;
import com.liferay.portal.kernel.lock.LockManagerUtil;
import com.liferay.portal.kernel.log.Log;
import com.liferay.portal.kernel.log.LogFactoryUtil;
import com.liferay.portal.kernel.repository.InvalidRepositoryIdException;
import com.liferay.portal.kernel.repository.Repository;
import com.liferay.portal.kernel.repository.RepositoryException;
import com.liferay.portal.kernel.repository.RepositoryProvider;
import com.liferay.portal.kernel.repository.capabilities.TrashCapability;
import com.liferay.portal.kernel.repository.model.FileEntry;
import com.liferay.portal.kernel.repository.model.FileShortcut;
import com.liferay.portal.kernel.repository.model.FileVersion;
import com.liferay.portal.kernel.repository.model.Folder;
import com.liferay.portal.kernel.repository.model.RepositoryEntry;
import com.liferay.portal.kernel.search.Hits;
import com.liferay.portal.kernel.search.Query;
import com.liferay.portal.kernel.search.SearchContext;
import com.liferay.portal.kernel.search.SearchException;
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.transaction.TransactionCommitCallbackUtil;
import com.liferay.portal.kernel.util.ArrayUtil;
import com.liferay.portal.kernel.util.ContentTypes;
import com.liferay.portal.kernel.util.FileUtil;
import com.liferay.portal.kernel.util.GetterUtil;
import com.liferay.portal.kernel.util.MimeTypesUtil;
import com.liferay.portal.kernel.util.OrderByComparator;
import com.liferay.portal.kernel.util.StringBundler;
import com.liferay.portal.kernel.util.StringPool;
import com.liferay.portal.kernel.util.TempFileEntryUtil;
import com.liferay.portal.kernel.util.Validator;
import com.liferay.portal.kernel.workflow.WorkflowConstants;
import com.liferay.portlet.documentlibrary.service.base.DLAppServiceBaseImpl;
import com.liferay.portlet.documentlibrary.service.permission.DLFolderPermission;
import com.liferay.portlet.documentlibrary.service.permission.DLPermission;
import com.liferay.portlet.documentlibrary.util.DLAppUtil;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Queue;
import java.util.concurrent.Callable;
/**
* Provides the remote service for accessing, adding, checking in/out, deleting,
* locking/unlocking, moving, subscription handling of, trash handling of,
* updating, and verifying document library file entries and folders. Its
* methods include permission checks. All portlets should interact with the
* document library through this class or through DLAppLocalService, rather than
* through the individual document library service classes.
*
* <p>
* This class provides a unified interface to all Liferay and third party
* repositories. While the method signatures are universal for all repositories.
* Additional implementation-specific parameters may be specified in the
* serviceContext.
* </p>
*
* <p>
* The <code>repositoryId</code> parameter used by most of the methods is the
* primary key of the specific repository. If the repository is a default
* Liferay repository, the <code>repositoryId</code> is the <code>groupId</code>
* or <code>scopeGroupId</code>. Otherwise, the <code>repositoryId</code> will
* correspond to values obtained from {@link
* com.liferay.portal.kernel.service.RepositoryServiceUtil}.
* </p>
*
* @author Alexander Chow
* @author Mika Koivisto
* @author Shuyang Zhou
* @see DLAppLocalServiceImpl
*/
public class DLAppServiceImpl extends DLAppServiceBaseImpl {
/**
* Adds a file entry and associated metadata. It is created based on a byte
* array.
*
* <p>
* This method takes two file names, the <code>sourceFileName</code> and the
* <code>title</code>. The <code>sourceFileName</code> corresponds to the
* name of the actual file being uploaded. The <code>title</code>
* corresponds to a name the client wishes to assign this file after it has
* been uploaded to the portal. If it is <code>null</code>, the <code>
* sourceFileName</code> will be used.
* </p>
*
* @param repositoryId the primary key of the repository
* @param folderId the primary key of the file entry's parent folder
* @param sourceFileName the original file's name
* @param mimeType the file's MIME type
* @param title the name to be assigned to the file (optionally <code>null
* </code>)
* @param description the file's description
* @param changeLog the file's version change log
* @param bytes the file's data (optionally <code>null</code>)
* @param serviceContext the service context to be applied. Can set the
* asset category IDs, asset tag names, and expando bridge
* attributes for the file entry. In a Liferay repository, it may
* include: <ul> <li> fileEntryTypeId - ID for a custom file entry
* type </li> <li> fieldsMap - mapping for fields associated with a
* custom file entry type </li> </ul>
* @return the file entry
*/
@Override
public FileEntry addFileEntry(
long repositoryId, long folderId, String sourceFileName,
String mimeType, String title, String description, String changeLog,
byte[] bytes, ServiceContext serviceContext)
throws PortalException {
File file = null;
try {
if (ArrayUtil.isNotEmpty(bytes)) {
file = FileUtil.createTempFile(bytes);
}
return addFileEntry(
repositoryId, folderId, sourceFileName, mimeType, title,
description, changeLog, file, serviceContext);
}
catch (IOException ioe) {
throw new SystemException("Unable to write temporary file", ioe);
}
finally {
FileUtil.delete(file);
}
}
/**
* Adds a file entry and associated metadata. It is created based on a
* {@link File} object.
*
* <p>
* This method takes two file names, the <code>sourceFileName</code> and the
* <code>title</code>. The <code>sourceFileName</code> corresponds to the
* name of the actual file being uploaded. The <code>title</code>
* corresponds to a name the client wishes to assign this file after it has
* been uploaded to the portal. If it is <code>null</code>, the <code>
* sourceFileName</code> will be used.
* </p>
*
* @param repositoryId the primary key of the repository
* @param folderId the primary key of the file entry's parent folder
* @param sourceFileName the original file's name
* @param mimeType the file's MIME type
* @param title the name to be assigned to the file (optionally <code>null
* </code>)
* @param description the file's description
* @param changeLog the file's version change log
* @param file the file's data (optionally <code>null</code>)
* @param serviceContext the service context to be applied. Can set the
* asset category IDs, asset tag names, and expando bridge
* attributes for the file entry. In a Liferay repository, it may
* include: <ul> <li> fileEntryTypeId - ID for a custom file entry
* type </li> <li> fieldsMap - mapping for fields associated with a
* custom file entry type </li> </ul>
* @return the file entry
*/
@Override
public FileEntry addFileEntry(
long repositoryId, long folderId, String sourceFileName,
String mimeType, String title, String description, String changeLog,
File file, ServiceContext serviceContext)
throws PortalException {
if ((file == null) || !file.exists() || (file.length() == 0)) {
return addFileEntry(
repositoryId, folderId, sourceFileName, mimeType, title,
description, changeLog, null, 0, serviceContext);
}
mimeType = DLAppUtil.getMimeType(sourceFileName, mimeType, title, file);
Repository repository = getRepository(repositoryId);
FileEntry fileEntry = repository.addFileEntry(
getUserId(), folderId, sourceFileName, mimeType, title, description,
changeLog, file, serviceContext);
return fileEntry;
}
/**
* Adds a file entry and associated metadata. It is created based on a
* {@link InputStream} object.
*
* <p>
* This method takes two file names, the <code>sourceFileName</code> and the
* <code>title</code>. The <code>sourceFileName</code> corresponds to the
* name of the actual file being uploaded. The <code>title</code>
* corresponds to a name the client wishes to assign this file after it has
* been uploaded to the portal. If it is <code>null</code>, the <code>
* sourceFileName</code> will be used.
* </p>
*
* @param repositoryId the primary key of the repository
* @param folderId the primary key of the file entry's parent folder
* @param sourceFileName the original file's name
* @param mimeType the file's MIME type
* @param title the name to be assigned to the file (optionally <code>null
* </code>)
* @param description the file's description
* @param changeLog the file's version change log
* @param is the file's data (optionally <code>null</code>)
* @param size the file's size (optionally <code>0</code>)
* @param serviceContext the service context to be applied. Can set the
* asset category IDs, asset tag names, and expando bridge
* attributes for the file entry. In a Liferay repository, it may
* include: <ul> <li> fileEntryTypeId - ID for a custom file entry
* type </li> <li> fieldsMap - mapping for fields associated with a
* custom file entry type </li> </ul>
* @return the file entry
*/
@Override
public FileEntry addFileEntry(
long repositoryId, long folderId, String sourceFileName,
String mimeType, String title, String description, String changeLog,
InputStream is, long size, ServiceContext serviceContext)
throws PortalException {
if (is == null) {
is = new UnsyncByteArrayInputStream(new byte[0]);
size = 0;
}
if (Validator.isNull(mimeType) ||
mimeType.equals(ContentTypes.APPLICATION_OCTET_STREAM)) {
String extension = DLAppUtil.getExtension(title, sourceFileName);
if (size == 0) {
mimeType = MimeTypesUtil.getExtensionContentType(extension);
}
else {
File file = null;
try {
file = FileUtil.createTempFile(is);
return addFileEntry(
repositoryId, folderId, sourceFileName, mimeType, title,
description, changeLog, file, serviceContext);
}
catch (IOException ioe) {
throw new SystemException(
"Unable to write temporary file", ioe);
}
finally {
FileUtil.delete(file);
}
}
}
Repository repository = getRepository(repositoryId);
FileEntry fileEntry = repository.addFileEntry(
getUserId(), folderId, sourceFileName, mimeType, title, description,
changeLog, is, size, serviceContext);
return fileEntry;
}
/**
* Adds a file shortcut to the existing file entry. This method is only
* supported by the Liferay repository.
*
* @param repositoryId the primary key of the repository
* @param folderId the primary key of the file shortcut's parent folder
* @param toFileEntryId the primary key of the file shortcut's file entry
* @param serviceContext the service context to be applied. Can set the
* asset category IDs, asset tag names, and expando bridge
* attributes for the file entry.
* @return the file shortcut
*/
@Override
public FileShortcut addFileShortcut(
long repositoryId, long folderId, long toFileEntryId,
ServiceContext serviceContext)
throws PortalException {
Repository repository = getRepository(repositoryId);
return repository.addFileShortcut(
getUserId(), folderId, toFileEntryId, serviceContext);
}
/**
* Adds a folder.
*
* @param repositoryId the primary key of the repository
* @param parentFolderId the primary key of the folder's parent folder
* @param name the folder's name
* @param description the folder's description
* @param serviceContext the service context to be applied. In a Liferay
* repository, it may include boolean mountPoint specifying whether
* folder is a facade for mounting a third-party repository
* @return the folder
*/
@Override
public Folder addFolder(
long repositoryId, long parentFolderId, String name,
String description, ServiceContext serviceContext)
throws PortalException {
Repository repository = getRepository(repositoryId);
Folder folder = repository.addFolder(
getUserId(), parentFolderId, name, description, serviceContext);
dlAppHelperLocalService.addFolder(getUserId(), folder, serviceContext);
return folder;
}
/**
* Adds a temporary file entry.
*
* <p>
* This allows a client to upload a file into a temporary location and
* manipulate its metadata prior to making it available for public usage.
* This is different from checking in and checking out a file entry.
* </p>
*
* @param groupId the primary key of the group
* @param folderId the primary key of the folder where the file entry will
* eventually reside
* @param folderName the temporary folder's name
* @param fileName the file's original name
* @param file the file's data (optionally <code>null</code>)
* @param mimeType the file's MIME type
* @return the temporary file entry
* @see TempFileEntryUtil
*/
@Override
public FileEntry addTempFileEntry(
long groupId, long folderId, String folderName, String fileName,
File file, String mimeType)
throws PortalException {
DLFolderPermission.check(
getPermissionChecker(), groupId, folderId, ActionKeys.ADD_DOCUMENT);
return TempFileEntryUtil.addTempFileEntry(
groupId, getUserId(), folderName, fileName, file, mimeType);
}
/**
* Adds a temporary file entry. It is created based on the {@link
* InputStream} object.
*
* <p>
* This allows a client to upload a file into a temporary location and
* manipulate its metadata prior to making it available for public usage.
* This is different from checking in and checking out a file entry.
* </p>
*
* @param groupId the primary key of the group
* @param folderId the primary key of the folder where the file entry will
* eventually reside
* @param folderName the temporary folder's name
* @param fileName the file's original name
* @param inputStream the file's data
* @param mimeType the file's MIME type
* @return the temporary file entry
* @see TempFileEntryUtil
*/
@Override
public FileEntry addTempFileEntry(
long groupId, long folderId, String folderName, String fileName,
InputStream inputStream, String mimeType)
throws PortalException {
DLFolderPermission.check(
getPermissionChecker(), groupId, folderId, ActionKeys.ADD_DOCUMENT);
return TempFileEntryUtil.addTempFileEntry(
groupId, getUserId(), folderName, fileName, inputStream, mimeType);
}
/**
* Cancels the check out of the file entry. If a user has not checked out
* the specified file entry, invoking this method will result in no changes.
*
* <p>
* When a file entry is checked out, a PWC (private working copy) is created
* and the original file entry is locked. A client can make as many changes
* to the PWC as he desires without those changes being visible to other
* users. If the user is satisfied with the changes, he may elect to check
* in his changes, resulting in a new file version based on the PWC; the PWC
* will be removed and the file entry will be unlocked. If the user is not
* satisfied with the changes, he may elect to cancel his check out; this
* results in the deletion of the PWC and unlocking of the file entry.
* </p>
*
* @param fileEntryId the primary key of the file entry to cancel the
* checkout
* @see #checkInFileEntry(long, boolean, String, ServiceContext)
* @see #checkOutFileEntry(long, ServiceContext)
*/
@Override
public void cancelCheckOut(long fileEntryId) throws PortalException {
Repository repository = repositoryProvider.getFileEntryRepository(
fileEntryId);
FileEntry fileEntry = repository.getFileEntry(fileEntryId);
FileVersion draftFileVersion = repository.cancelCheckOut(fileEntryId);
ServiceContext serviceContext = new ServiceContext();
serviceContext.setWorkflowAction(WorkflowConstants.ACTION_PUBLISH);
dlAppHelperLocalService.cancelCheckOut(
getUserId(), fileEntry, null, fileEntry.getFileVersion(),
draftFileVersion, serviceContext);
}
/**
* Checks in the file entry. If a user has not checked out the specified
* file entry, invoking this method will result in no changes.
*
* <p>
* When a file entry is checked out, a PWC (private working copy) is created
* and the original file entry is locked. A client can make as many changes
* to the PWC as he desires without those changes being visible to other
* users. If the user is satisfied with the changes, he may elect to check
* in his changes, resulting in a new file version based on the PWC; the PWC
* will be removed and the file entry will be unlocked. If the user is not
* satisfied with the changes, he may elect to cancel his check out; this
* results in the deletion of the PWC and unlocking of the file entry.
* </p>
*
* @param fileEntryId the primary key of the file entry to check in
* @param majorVersion whether the new file version is a major version
* @param changeLog the file's version change log
* @param serviceContext the service context to be applied
* @see #cancelCheckOut(long)
* @see #checkOutFileEntry(long, ServiceContext)
*/
@Override
public void checkInFileEntry(
long fileEntryId, boolean majorVersion, String changeLog,
ServiceContext serviceContext)
throws PortalException {
Repository repository = repositoryProvider.getFileEntryRepository(
fileEntryId);
repository.checkInFileEntry(
getUserId(), fileEntryId, majorVersion, changeLog, serviceContext);
FileEntry fileEntry = getFileEntry(fileEntryId);
FileVersion fileVersion = fileEntry.getLatestFileVersion();
dlAppHelperLocalService.updateFileEntry(
getUserId(), fileEntry, null, fileVersion,
fileVersion.getFileVersionId());
}
/**
* Checks in the file entry using the lock's UUID. If a user has not checked
* out the specified file entry, invoking this method will result in no
* changes. This method is primarily used by WebDAV.
*
* <p>
* When a file entry is checked out, a PWC (private working copy) is created
* and the original file entry is locked. A client can make as many changes
* to the PWC as he desires without those changes being visible to other
* users. If the user is satisfied with the changes, he may elect to check
* in his changes, resulting in a new file version based on the PWC; the PWC
* will be removed and the file entry will be unlocked. If the user is not
* satisfied with the changes, he may elect to cancel his check out; this
* results in the deletion of the PWC and unlocking of the file entry.
* </p>
*
* @param fileEntryId the primary key of the file entry to check in
* @param lockUuid the lock's UUID
* @param serviceContext the service context to be applied
* @see #cancelCheckOut(long)
* @see #checkOutFileEntry(long, String, long, ServiceContext)
*/
@Override
public void checkInFileEntry(
long fileEntryId, String lockUuid, ServiceContext serviceContext)
throws PortalException {
Repository repository = repositoryProvider.getFileEntryRepository(
fileEntryId);
repository.checkInFileEntry(
getUserId(), fileEntryId, lockUuid, serviceContext);
FileEntry fileEntry = getFileEntry(fileEntryId);
FileVersion fileVersion = fileEntry.getLatestFileVersion();
dlAppHelperLocalService.updateFileEntry(
getUserId(), fileEntry, null, fileVersion,
fileVersion.getFileVersionId());
}
/**
* Check out a file entry.
*
* <p>
* When a file entry is checked out, a PWC (private working copy) is created
* and the original file entry is locked. A client can make as many changes
* to the PWC as he desires without those changes being visible to other
* users. If the user is satisfied with the changes, he may elect to check
* in his changes, resulting in a new file version based on the PWC; the PWC
* will be removed and the file entry will be unlocked. If the user is not
* satisfied with the changes, he may elect to cancel his check out; this
* results in the deletion of the PWC and unlocking of the file entry.
* </p>
*
* @param fileEntryId the file entry to check out
* @param serviceContext the service context to be applied
* @see #cancelCheckOut(long)
* @see #checkInFileEntry(long, boolean, String, ServiceContext)
*/
@Override
public void checkOutFileEntry(
long fileEntryId, ServiceContext serviceContext)
throws PortalException {
Repository repository = repositoryProvider.getFileEntryRepository(
fileEntryId);
FileEntry fileEntry = repository.checkOutFileEntry(
fileEntryId, serviceContext);
FileVersion fileVersion = fileEntry.getLatestFileVersion();
dlAppHelperLocalService.updateFileEntry(
getUserId(), fileEntry, null, fileVersion, fileEntryId);
}
/**
* Checks out the file entry. This method is primarily used by WebDAV.
*
* <p>
* When a file entry is checked out, a PWC (private working copy) is created
* and the original file entry is locked. A client can make as many changes
* to the PWC as he desires without those changes being visible to other
* users. If the user is satisfied with the changes, he may elect to check
* in his changes, resulting in a new file version based on the PWC; the PWC
* will be removed and the file entry will be unlocked. If the user is not
* satisfied with the changes, he may elect to cancel his check out; this
* results in the deletion of the PWC and unlocking of the file entry.
* </p>
*
* @param fileEntryId the file entry to check out
* @param owner the owner string for the checkout (optionally
* <code>null</code>)
* @param expirationTime the time in milliseconds before the lock expires.
* If the value is <code>0</code>, the default expiration time will
* be used from <code>portal.properties</code>.
* @param serviceContext the service context to be applied
* @return the file entry
* @see #cancelCheckOut(long)
* @see #checkInFileEntry(long, String)
*/
@Override
public FileEntry checkOutFileEntry(
long fileEntryId, String owner, long expirationTime,
ServiceContext serviceContext)
throws PortalException {
Repository repository = repositoryProvider.getFileEntryRepository(
fileEntryId);
FileEntry fileEntry = repository.checkOutFileEntry(
fileEntryId, owner, expirationTime, serviceContext);
FileVersion fileVersion = fileEntry.getLatestFileVersion();
dlAppHelperLocalService.updateFileEntry(
getUserId(), fileEntry, null, fileVersion, fileEntryId);
return fileEntry;
}
/**
* Performs a deep copy of the folder.
*
* @param repositoryId the primary key of the repository
* @param sourceFolderId the primary key of the folder to copy
* @param parentFolderId the primary key of the new folder's parent folder
* @param name the new folder's name
* @param description the new folder's description
* @param serviceContext the service context to be applied
* @return the folder
*/
@Override
public Folder copyFolder(
long repositoryId, long sourceFolderId, long parentFolderId,
String name, String description, ServiceContext serviceContext)
throws PortalException {
Repository repository = getRepository(repositoryId);
Folder srcFolder = repository.getFolder(sourceFolderId);
Folder destFolder = repository.addFolder(
getUserId(), parentFolderId, name, description, serviceContext);
dlAppHelperLocalService.addFolder(
getUserId(), destFolder, serviceContext);
copyFolder(repository, srcFolder, destFolder, serviceContext);
return destFolder;
}
/**
* Deletes the file entry with the primary key.
*
* @param fileEntryId the primary key of the file entry
*/
@Override
public void deleteFileEntry(long fileEntryId) throws PortalException {
Repository repository = repositoryProvider.getFileEntryRepository(
fileEntryId);
FileEntry fileEntry = repository.getFileEntry(fileEntryId);
dlAppHelperLocalService.deleteFileEntry(fileEntry);
repository.deleteFileEntry(fileEntryId);
}
/**
* Deletes the file entry with the title in the folder.
*
* @param repositoryId the primary key of the repository
* @param folderId the primary key of the file entry's parent folder
* @param title the file entry's title
*/
@Override
public void deleteFileEntryByTitle(
long repositoryId, long folderId, String title)
throws PortalException {
Repository repository = getRepository(repositoryId);
FileEntry fileEntry = repository.getFileEntry(folderId, title);
dlAppHelperLocalService.deleteFileEntry(fileEntry);
repository.deleteFileEntry(folderId, title);
}
/**
* Deletes the file shortcut with the primary key. This method is only
* supported by the Liferay repository.
*
* @param fileShortcutId the primary key of the file shortcut
*/
@Override
public void deleteFileShortcut(long fileShortcutId) throws PortalException {
Repository repository = repositoryProvider.getFileShortcutRepository(
fileShortcutId);
repository.deleteFileShortcut(fileShortcutId);
}
/**
* Deletes the file version. File versions can only be deleted if it is
* approved and there are other approved file versions available. This
* method is only supported by the Liferay repository.
*
* @param fileEntryId the primary key of the file entry
* @param version the version label of the file version
*/
@Override
public void deleteFileVersion(long fileEntryId, String version)
throws PortalException {
Repository repository = repositoryProvider.getFileEntryRepository(
fileEntryId);
repository.deleteFileVersion(fileEntryId, version);
}
/**
* Deletes the folder with the primary key and all of its subfolders and
* file entries.
*
* @param folderId the primary key of the folder
*/
@Override
public void deleteFolder(long folderId) throws PortalException {
Repository repository = repositoryProvider.getFolderRepository(
folderId);
Folder folder = repository.getFolder(folderId);
if (repository.isCapabilityProvided(TrashCapability.class)) {
TrashCapability trashCapability = repository.getCapability(
TrashCapability.class);
if (trashCapability.isInTrash(folder)) {
trashEntryService.deleteEntry(
DLFolderConstants.getClassName(), folder.getFolderId());
return;
}
}
List<FileEntry> fileEntries = repository.getRepositoryFileEntries(
0, folderId, QueryUtil.ALL_POS, QueryUtil.ALL_POS, null);
for (FileEntry fileEntry : fileEntries) {
dlAppHelperLocalService.deleteFileEntry(fileEntry);
}
repository.deleteFolder(folderId);
dlAppHelperLocalService.deleteFolder(folder);
}
/**
* Deletes the folder with the name in the parent folder and all of its
* subfolders and file entries.
*
* @param repositoryId the primary key of the repository
* @param parentFolderId the primary key of the folder's parent folder
* @param name the folder's name
*/
@Override
public void deleteFolder(
long repositoryId, long parentFolderId, String name)
throws PortalException {
Repository repository = getRepository(repositoryId);
Folder folder = repository.getFolder(parentFolderId, name);
if (repository.isCapabilityProvided(TrashCapability.class)) {
TrashCapability trashCapability = repository.getCapability(
TrashCapability.class);
if (trashCapability.isInTrash(folder)) {
trashEntryService.deleteEntry(
DLFolderConstants.getClassName(), folder.getFolderId());
return;
}
}
repository.deleteFolder(parentFolderId, name);
}
/**
* Deletes the temporary file entry.
*
* @param groupId the primary key of the group
* @param folderId the primary key of the folder where the file entry was
* eventually to reside
* @param folderName the temporary folder's name
* @param fileName the file's original name
* @see TempFileEntryUtil
*/
@Override
public void deleteTempFileEntry(
long groupId, long folderId, String folderName, String fileName)
throws PortalException {
DLFolderPermission.check(
getPermissionChecker(), groupId, folderId, ActionKeys.ADD_DOCUMENT);
TempFileEntryUtil.deleteTempFileEntry(
groupId, getUserId(), folderName, fileName);
}
/**
* Returns all the file entries in the folder.
*
* @param repositoryId the primary key of the file entry's repository
* @param folderId the primary key of the file entry's folder
* @return the file entries in the folder
*/
@Override
public List<FileEntry> getFileEntries(long repositoryId, long folderId)
throws PortalException {
return getFileEntries(
repositoryId, folderId, QueryUtil.ALL_POS, QueryUtil.ALL_POS);
}
/**
* Returns a name-ordered range of all the file entries in the folder.
*
* <p>
* Useful when paginating results. Returns a maximum of <code>end -
* start</code> instances. <code>start</code> and <code>end</code> are not
* primary keys, they are indexes in the result set. Thus, <code>0</code>
* refers to the first result in the set. Setting both <code>start</code>
* and <code>end</code> to {@link QueryUtil#ALL_POS} will return the full
* result set.
* </p>
*
* @param repositoryId the primary key of the file entry's repository
* @param folderId the primary key of the file entry's folder
* @param start the lower bound of the range of results
* @param end the upper bound of the range of results (not inclusive)
* @return the name-ordered range of file entries in the folder
*/
@Override
public List<FileEntry> getFileEntries(
long repositoryId, long folderId, int start, int end)
throws PortalException {
return getFileEntries(
repositoryId, folderId, start, end,
new RepositoryModelTitleComparator<FileEntry>(true));
}
/**
* Returns an ordered range of all the file entries in the folder.
*
* <p>
* Useful when paginating results. Returns a maximum of <code>end -
* start</code> instances. <code>start</code> and <code>end</code> are not
* primary keys, they are indexes in the result set. Thus, <code>0</code>
* refers to the first result in the set. Setting both <code>start</code>
* and <code>end</code> to {@link QueryUtil#ALL_POS} will return the full
* result set.
* </p>
*
* @param repositoryId the primary key of the file entry's repository
* @param folderId the primary key of the file entry's folder
* @param start the lower bound of the range of results
* @param end the upper bound of the range of results (not inclusive)
* @param obc the comparator to order the file entries (optionally
* <code>null</code>)
* @return the range of file entries in the folder ordered by comparator
* <code>obc</code>
*/
@Override
public List<FileEntry> getFileEntries(
long repositoryId, long folderId, int start, int end,
OrderByComparator<FileEntry> obc)
throws PortalException {
Repository repository = getRepository(repositoryId);
return repository.getFileEntries(folderId, start, end, obc);
}
/**
* Returns the file entries with the file entry type in the folder.
*
* @param repositoryId the primary key of the file entry's repository
* @param folderId the primary key of the file entry's folder
* @param fileEntryTypeId the primary key of the file entry type
* @return the file entries with the file entry type in the folder
*/
@Override
public List<FileEntry> getFileEntries(
long repositoryId, long folderId, long fileEntryTypeId)
throws PortalException {
return getFileEntries(
repositoryId, folderId, fileEntryTypeId, QueryUtil.ALL_POS,
QueryUtil.ALL_POS);
}
/**
* Returns a name-ordered range of all the file entries with the file entry
* type in the folder.
*
* @param repositoryId the primary key of the file entry's repository
* @param folderId the primary key of the file entry's folder
* @param fileEntryTypeId the primary key of the file entry type
* @param start the lower bound of the range of results
* @param end the upper bound of the range of results (not inclusive)
* @return the name-ordered range of the file entries in the folder
*/
@Override
public List<FileEntry> getFileEntries(
long repositoryId, long folderId, long fileEntryTypeId, int start,
int end)
throws PortalException {
return getFileEntries(
repositoryId, folderId, fileEntryTypeId, start, end,
new RepositoryModelTitleComparator<FileEntry>(true));
}
/**
* Returns an ordered range of all the file entries with the file entry type
* in the folder.
*
* @param repositoryId the primary key of the repository
* @param folderId the primary key of the folder
* @param fileEntryTypeId the primary key of the file entry type
* @param start the lower bound of the range of results
* @param end the upper bound of the range of results (not inclusive)
* @param obc the comparator to order the results by (optionally
* <code>null</code>)
* @return the range of file entries with the file entry type in the folder
* ordered by <code>null</code>
*/
@Override
public List<FileEntry> getFileEntries(
long repositoryId, long folderId, long fileEntryTypeId, int start,
int end, OrderByComparator<FileEntry> obc)
throws PortalException {
Repository repository = getRepository(repositoryId);
return repository.getFileEntries(
folderId, fileEntryTypeId, start, end, obc);
}
@Override
public List<FileEntry> getFileEntries(
long repositoryId, long folderId, String[] mimeTypes)
throws PortalException {
return getFileEntries(
repositoryId, folderId, mimeTypes, QueryUtil.ALL_POS,
QueryUtil.ALL_POS,
new RepositoryModelTitleComparator<FileEntry>(true));
}
@Override
public List<FileEntry> getFileEntries(
long repositoryId, long folderId, String[] mimeTypes, int start,
int end, OrderByComparator<FileEntry> obc)
throws PortalException {
Repository repository = getRepository(repositoryId);
return repository.getFileEntries(folderId, mimeTypes, start, end, obc);
}
/**
* Returns a range of all the file entries and shortcuts in the folder.
*
* <p>
* Useful when paginating results. Returns a maximum of <code>end -
* start</code> instances. <code>start</code> and <code>end</code> are not
* primary keys, they are indexes in the result set. Thus, <code>0</code>
* refers to the first result in the set. Setting both <code>start</code>
* and <code>end</code> to {@link QueryUtil#ALL_POS} will return the full
* result set.
* </p>
*
* @param repositoryId the primary key of the repository
* @param folderId the primary key of the folder
* @param status the workflow status
* @param start the lower bound of the range of results
* @param end the upper bound of the range of results (not inclusive)
* @return the range of file entries and shortcuts in the folder
*/
@Override
@SuppressWarnings("rawtypes")
public List<Object> getFileEntriesAndFileShortcuts(
long repositoryId, long folderId, int status, int start, int end)
throws PortalException {
Repository repository = getRepository(repositoryId);
return (List)repository.getFileEntriesAndFileShortcuts(
folderId, status, start, end);
}
/**
* Returns the number of file entries and shortcuts in the folder.
*
* @param repositoryId the primary key of the repository
* @param folderId the primary key of the folder
* @param status the workflow status
* @return the number of file entries and shortcuts in the folder
*/
@Override
public int getFileEntriesAndFileShortcutsCount(
long repositoryId, long folderId, int status)
throws PortalException {
Repository repository = getRepository(repositoryId);
return repository.getFileEntriesAndFileShortcutsCount(folderId, status);
}
/**
* Returns the number of file entries and shortcuts in the folder.
*
* @param repositoryId the primary key of the repository
* @param folderId the primary key of the folder
* @param status the workflow status
* @param mimeTypes allowed media types
* @return the number of file entries and shortcuts in the folder
*/
@Override
public int getFileEntriesAndFileShortcutsCount(
long repositoryId, long folderId, int status, String[] mimeTypes)
throws PortalException {
Repository repository = getRepository(repositoryId);
return repository.getFileEntriesAndFileShortcutsCount(
folderId, status, mimeTypes);
}
/**
* Returns the number of file entries in the folder.
*
* @param repositoryId the primary key of the file entry's repository
* @param folderId the primary key of the file entry's folder
* @return the number of file entries in the folder
*/
@Override
public int getFileEntriesCount(long repositoryId, long folderId)
throws PortalException {
Repository repository = getRepository(repositoryId);
return repository.getFileEntriesCount(folderId);
}
/**
* Returns the number of file entries with the file entry type in the
* folder.
*
* @param repositoryId the primary key of the file entry's repository
* @param folderId the primary key of the file entry's folder
* @param fileEntryTypeId the primary key of the file entry type
* @return the number of file entries with the file entry type in the folder
*/
@Override
public int getFileEntriesCount(
long repositoryId, long folderId, long fileEntryTypeId)
throws PortalException {
Repository repository = getRepository(repositoryId);
return repository.getFileEntriesCount(folderId, fileEntryTypeId);
}
@Override
public int getFileEntriesCount(
long repositoryId, long folderId, String[] mimeTypes)
throws PortalException {
Repository repository = getRepository(repositoryId);
return repository.getFileEntriesCount(folderId, mimeTypes);
}
/**
* Returns the file entry with the primary key.
*
* @param fileEntryId the primary key of the file entry
* @return the file entry with the primary key
*/
@Override
public FileEntry getFileEntry(long fileEntryId) throws PortalException {
Repository repository = repositoryProvider.getFileEntryRepository(
fileEntryId);
return repository.getFileEntry(fileEntryId);
}
/**
* Returns the file entry with the title in the folder.
*
* @param groupId the primary key of the file entry's group
* @param folderId the primary key of the file entry's folder
* @param title the file entry's title
* @return the file entry with the title in the folder
*/
@Override
public FileEntry getFileEntry(long groupId, long folderId, String title)
throws PortalException {
try {
Repository repository = getRepository(groupId);
return repository.getFileEntry(folderId, title);
}
catch (NoSuchFileEntryException nsfee) {
if (folderId != DLFolderConstants.DEFAULT_PARENT_FOLDER_ID) {
Repository repository = repositoryProvider.getFolderRepository(
folderId);
return repository.getFileEntry(folderId, title);
}
else {
throw nsfee;
}
}
}
/**
* Returns the file entry with the UUID and group.
*
* @param uuid the file entry's UUID
* @param groupId the primary key of the file entry's group
* @return the file entry with the UUID and group
*/
@Override
public FileEntry getFileEntryByUuidAndGroupId(String uuid, long groupId)
throws PortalException {
FileEntry fileEntry = fetchFileEntryByUuidAndRepositoryId(
uuid, groupId);
if (fileEntry != null) {
return fileEntry;
}
List<com.liferay.portal.kernel.model.Repository> repositories =
repositoryPersistence.findByGroupId(groupId);
for (com.liferay.portal.kernel.model.Repository repository :
repositories) {
fileEntry = fetchFileEntryByUuidAndRepositoryId(
uuid, repository.getRepositoryId());
if (fileEntry != null) {
return fileEntry;
}
}
StringBundler msg = new StringBundler(6);
msg.append("No DLFileEntry exists with the key {");
msg.append("uuid=");
msg.append(uuid);
msg.append(", groupId=");
msg.append(groupId);
msg.append(StringPool.CLOSE_CURLY_BRACE);
throw new NoSuchFileEntryException(msg.toString());
}
/**
* Returns the file shortcut with the primary key. This method is only
* supported by the Liferay repository.
*
* @param fileShortcutId the primary key of the file shortcut
* @return the file shortcut with the primary key
*/
@Override
public FileShortcut getFileShortcut(long fileShortcutId)
throws PortalException {
Repository repository = repositoryProvider.getFileShortcutRepository(
fileShortcutId);
return repository.getFileShortcut(fileShortcutId);
}
/**
* Returns the file version with the primary key.
*
* @param fileVersionId the primary key of the file version
* @return the file version with the primary key
*/
@Override
public FileVersion getFileVersion(long fileVersionId)
throws PortalException {
Repository repository = repositoryProvider.getFileVersionRepository(
fileVersionId);
return repository.getFileVersion(fileVersionId);
}
/**
* Returns the folder with the primary key.
*
* @param folderId the primary key of the folder
* @return the folder with the primary key
*/
@Override
public Folder getFolder(long folderId) throws PortalException {
Repository repository = repositoryProvider.getFolderRepository(
folderId);
return repository.getFolder(folderId);
}
/**
* Returns the folder with the name in the parent folder.
*
* @param repositoryId the primary key of the folder's repository
* @param parentFolderId the primary key of the folder's parent folder
* @param name the folder's name
* @return the folder with the name in the parent folder
*/
@Override
public Folder getFolder(long repositoryId, long parentFolderId, String name)
throws PortalException {
Repository repository = getRepository(repositoryId);
return repository.getFolder(parentFolderId, name);
}
/**
* Returns all immediate subfolders of the parent folder.
*
* @param repositoryId the primary key of the folder's repository
* @param parentFolderId the primary key of the folder's parent folder
* @return the immediate subfolders of the parent folder
*/
@Override
public List<Folder> getFolders(long repositoryId, long parentFolderId)
throws PortalException {
return getFolders(
repositoryId, parentFolderId, QueryUtil.ALL_POS, QueryUtil.ALL_POS);
}
/**
* Returns all immediate subfolders of the parent folder, optionally
* including mount folders for third-party repositories.
*
* @param repositoryId the primary key of the folder's repository
* @param parentFolderId the primary key of the folder's parent folder
* @param includeMountFolders whether to include mount folders for
* third-party repositories
* @return the immediate subfolders of the parent folder
*/
@Override
public List<Folder> getFolders(
long repositoryId, long parentFolderId, boolean includeMountFolders)
throws PortalException {
return getFolders(
repositoryId, parentFolderId, includeMountFolders,
QueryUtil.ALL_POS, QueryUtil.ALL_POS);
}
/**
* Returns a name-ordered range of all the immediate subfolders of the
* parent folder, optionally including mount folders for third-party
* repositories.
*
* <p>
* Useful when paginating results. Returns a maximum of <code>end -
* start</code> instances. <code>start</code> and <code>end</code> are not
* primary keys, they are indexes in the result set. Thus, <code>0</code>
* refers to the first result in the set. Setting both <code>start</code>
* and <code>end</code> to {@link QueryUtil#ALL_POS} will return the full
* result set.
* </p>
*
* @param repositoryId the primary key of the folder's repository
* @param parentFolderId the primary key of the folder's parent folder
* @param includeMountFolders whether to include mount folders for
* third-party repositories
* @param start the lower bound of the range of results
* @param end the upper bound of the range of results (not inclusive)
* @return the name-ordered range of immediate subfolders of the parent
* folder
*/
@Override
public List<Folder> getFolders(
long repositoryId, long parentFolderId, boolean includeMountFolders,
int start, int end)
throws PortalException {
return getFolders(
repositoryId, parentFolderId, includeMountFolders, start, end,
new FolderNameComparator(true));
}
/**
* Returns an ordered range of all the immediate subfolders of the parent
* folder.
*
* <p>
* Useful when paginating results. Returns a maximum of <code>end -
* start</code> instances. <code>start</code> and <code>end</code> are not
* primary keys, they are indexes in the result set. Thus, <code>0</code>
* refers to the first result in the set. Setting both <code>start</code>
* and <code>end</code> to {@link QueryUtil#ALL_POS} will return the full
* result set.
* </p>
*
* @param repositoryId the primary key of the folder's repository
* @param parentFolderId the primary key of the folder's parent folder
* @param includeMountFolders whether to include mount folders for
* third-party repositories
* @param start the lower bound of the range of results
* @param end the upper bound of the range of results (not inclusive)
* @param obc the comparator to order the folders (optionally
* <code>null</code>)
* @return the range of immediate subfolders of the parent folder ordered by
* comparator <code>obc</code>
*/
@Override
public List<Folder> getFolders(
long repositoryId, long parentFolderId, boolean includeMountFolders,
int start, int end, OrderByComparator<Folder> obc)
throws PortalException {
Repository repository = getRepository(repositoryId);
return repository.getFolders(
parentFolderId, includeMountFolders, start, end, obc);
}
/**
* Returns an ordered range of all the immediate subfolders of the parent
* folder.
*
* <p>
* Useful when paginating results. Returns a maximum of <code>end -
* start</code> instances. <code>start</code> and <code>end</code> are not
* primary keys, they are indexes in the result set. Thus, <code>0</code>
* refers to the first result in the set. Setting both <code>start</code>
* and <code>end</code> to {@link QueryUtil#ALL_POS} will return the full
* result set.
* </p>
*
* @param repositoryId the primary key of the folder's repository
* @param parentFolderId the primary key of the folder's parent folder
* @param status the workflow status
* @param includeMountFolders whether to include mount folders for
* third-party repositories
* @param start the lower bound of the range of results
* @param end the upper bound of the range of results (not inclusive)
* @param obc the comparator to order the folders (optionally
* <code>null</code>)
* @return the range of immediate subfolders of the parent folder ordered by
* comparator <code>obc</code>
*/
@Override
public List<Folder> getFolders(
long repositoryId, long parentFolderId, int status,
boolean includeMountFolders, int start, int end,
OrderByComparator<Folder> obc)
throws PortalException {
Repository repository = getRepository(repositoryId);
return repository.getFolders(
parentFolderId, status, includeMountFolders, start, end, obc);
}
/**
* Returns a name-ordered range of all the immediate subfolders of the
* parent folder.
*
* <p>
* Useful when paginating results. Returns a maximum of <code>end -
* start</code> instances. <code>start</code> and <code>end</code> are not
* primary keys, they are indexes in the result set. Thus, <code>0</code>
* refers to the first result in the set. Setting both <code>start</code>
* and <code>end</code> to {@link QueryUtil#ALL_POS} will return the full
* result set.
* </p>
*
* @param repositoryId the primary key of the folder's repository
* @param parentFolderId the primary key of the folder's parent folder
* @param start the lower bound of the range of results
* @param end the upper bound of the range of results (not inclusive)
* @return the name-ordered range of immediate subfolders of the parent
* folder
*/
@Override
public List<Folder> getFolders(
long repositoryId, long parentFolderId, int start, int end)
throws PortalException {
return getFolders(
repositoryId, parentFolderId, start, end,
new FolderNameComparator(true));
}
/**
* Returns an ordered range of all the immediate subfolders of the parent
* folder.
*
* <p>
* Useful when paginating results. Returns a maximum of <code>end -
* start</code> instances. <code>start</code> and <code>end</code> are not
* primary keys, they are indexes in the result set. Thus, <code>0</code>
* refers to the first result in the set. Setting both <code>start</code>
* and <code>end</code> to {@link QueryUtil#ALL_POS} will return the full
* result set.
* </p>
*
* @param repositoryId the primary key of the folder's repository
* @param parentFolderId the primary key of the folder's parent folder
* @param start the lower bound of the range of results
* @param end the upper bound of the range of results (not inclusive)
* @param obc the comparator to order the folders (optionally
* <code>null</code>)
* @return the range of immediate subfolders of the parent folder ordered by
* comparator <code>obc</code>
*/
@Override
public List<Folder> getFolders(
long repositoryId, long parentFolderId, int start, int end,
OrderByComparator<Folder> obc)
throws PortalException {
Repository repository = getRepository(repositoryId);
return repository.getFolders(parentFolderId, true, start, end, obc);
}
/**
* Returns a name-ordered range of all the immediate subfolders, file
* entries, and file shortcuts in the parent folder.
*
* <p>
* Useful when paginating results. Returns a maximum of <code>end -
* start</code> instances. <code>start</code> and <code>end</code> are not
* primary keys, they are indexes in the result set. Thus, <code>0</code>
* refers to the first result in the set. Setting both <code>start</code>
* and <code>end</code> to {@link QueryUtil#ALL_POS} will return the full
* result set.
* </p>
*
* @param repositoryId the primary key of the repository
* @param folderId the primary key of the parent folder
* @param status the workflow status
* @param includeMountFolders whether to include mount folders for
* third-party repositories
* @param start the lower bound of the range of results
* @param end the upper bound of the range of results (not inclusive)
* @return the name-ordered range of immediate subfolders, file entries, and
* file shortcuts in the parent folder
*/
@Override
public List<Object> getFoldersAndFileEntriesAndFileShortcuts(
long repositoryId, long folderId, int status,
boolean includeMountFolders, int start, int end)
throws PortalException {
return getFoldersAndFileEntriesAndFileShortcuts(
repositoryId, folderId, status, includeMountFolders, start, end,
new RepositoryModelTitleComparator<Object>(true));
}
/**
* Returns an ordered range of all the immediate subfolders, file entries,
* and file shortcuts in the parent folder.
*
* <p>
* Useful when paginating results. Returns a maximum of <code>end -
* start</code> instances. <code>start</code> and <code>end</code> are not
* primary keys, they are indexes in the result set. Thus, <code>0</code>
* refers to the first result in the set. Setting both <code>start</code>
* and <code>end</code> to {@link QueryUtil#ALL_POS} will return the full
* result set.
* </p>
*
* @param repositoryId the primary key of the repository
* @param folderId the primary key of the parent folder
* @param status the workflow status
* @param includeMountFolders whether to include mount folders for
* third-party repositories
* @param start the lower bound of the range of results
* @param end the upper bound of the range of results (not inclusive)
* @param obc the comparator to order the results (optionally
* <code>null</code>)
* @return the range of immediate subfolders, file entries, and file
* shortcuts in the parent folder ordered by comparator
* <code>obc</code>
*/
@Override
public List<Object> getFoldersAndFileEntriesAndFileShortcuts(
long repositoryId, long folderId, int status,
boolean includeMountFolders, int start, int end,
OrderByComparator<?> obc)
throws PortalException {
return getFoldersAndFileEntriesAndFileShortcuts(
repositoryId, folderId, status, null, includeMountFolders, start,
end, obc);
}
@Override
@SuppressWarnings("rawtypes")
public List<Object> getFoldersAndFileEntriesAndFileShortcuts(
long repositoryId, long folderId, int status, String[] mimeTypes,
boolean includeMountFolders, int start, int end,
OrderByComparator<?> obc)
throws PortalException {
Repository repository = getRepository(repositoryId);
return (List)repository.getFoldersAndFileEntriesAndFileShortcuts(
folderId, status, mimeTypes, includeMountFolders, start, end, obc);
}
/**
* Returns the number of immediate subfolders, file entries, and file
* shortcuts in the parent folder.
*
* @param repositoryId the primary key of the repository
* @param folderId the primary key of the parent folder
* @param status the workflow status
* @param includeMountFolders whether to include mount folders for
* third-party repositories
* @return the number of immediate subfolders, file entries, and file
* shortcuts in the parent folder
*/
@Override
public int getFoldersAndFileEntriesAndFileShortcutsCount(
long repositoryId, long folderId, int status,
boolean includeMountFolders)
throws PortalException {
return getFoldersAndFileEntriesAndFileShortcutsCount(
repositoryId, folderId, status, null, includeMountFolders);
}
@Override
public int getFoldersAndFileEntriesAndFileShortcutsCount(
long repositoryId, long folderId, int status, String[] mimeTypes,
boolean includeMountFolders)
throws PortalException {
Repository repository = getRepository(repositoryId);
return repository.getFoldersAndFileEntriesAndFileShortcutsCount(
folderId, status, mimeTypes, includeMountFolders);
}
/**
* Returns the number of immediate subfolders of the parent folder.
*
* @param repositoryId the primary key of the folder's repository
* @param parentFolderId the primary key of the folder's parent folder
* @return the number of immediate subfolders of the parent folder
*/
@Override
public int getFoldersCount(long repositoryId, long parentFolderId)
throws PortalException {
return getFoldersCount(repositoryId, parentFolderId, true);
}
/**
* Returns the number of immediate subfolders of the parent folder,
* optionally including mount folders for third-party repositories.
*
* @param repositoryId the primary key of the folder's repository
* @param parentFolderId the primary key of the folder's parent folder
* @param includeMountFolders whether to include mount folders for
* third-party repositories
* @return the number of immediate subfolders of the parent folder
*/
@Override
public int getFoldersCount(
long repositoryId, long parentFolderId, boolean includeMountFolders)
throws PortalException {
Repository repository = getRepository(repositoryId);
return repository.getFoldersCount(parentFolderId, includeMountFolders);
}
/**
* Returns the number of immediate subfolders of the parent folder,
* optionally including mount folders for third-party repositories.
*
* @param repositoryId the primary key of the folder's repository
* @param parentFolderId the primary key of the folder's parent folder
* @param status the workflow status
* @param includeMountFolders whether to include mount folders for
* third-party repositories
* @return the number of immediate subfolders of the parent folder
*/
@Override
public int getFoldersCount(
long repositoryId, long parentFolderId, int status,
boolean includeMountFolders)
throws PortalException {
Repository repository = getRepository(repositoryId);
return repository.getFoldersCount(
parentFolderId, status, includeMountFolders);
}
/**
* Returns the number of immediate subfolders and file entries across the
* folders.
*
* @param repositoryId the primary key of the repository
* @param folderIds the primary keys of folders from which to count
* immediate subfolders and file entries
* @param status the workflow status
* @return the number of immediate subfolders and file entries across the
* folders
*/
@Override
public int getFoldersFileEntriesCount(
long repositoryId, List<Long> folderIds, int status)
throws PortalException {
Repository repository = getRepository(repositoryId);
return repository.getFoldersFileEntriesCount(folderIds, status);
}
/**
* Returns an ordered range of all the file entries in the group starting at
* the repository default parent folder that are stored within the Liferay
* repository. This method is primarily used to search for recently modified
* file entries. It can be limited to the file entries modified by a given
* user.
*
* <p>
* Useful when paginating results. Returns a maximum of <code>end -
* start</code> instances. <code>start</code> and <code>end</code> are not
* primary keys, they are indexes in the result set. Thus, <code>0</code>
* refers to the first result in the set. Setting both <code>start</code>
* and <code>end</code> to {@link QueryUtil#ALL_POS} will return the full
* result set.
* </p>
*
* @param groupId the primary key of the group
* @param userId the primary key of the user who created the file
* (optionally <code>0</code>)
* @param start the lower bound of the range of results
* @param end the upper bound of the range of results (not inclusive)
* @return the range of matching file entries ordered by date modified
*/
@Override
public List<FileEntry> getGroupFileEntries(
long groupId, long userId, int start, int end)
throws PortalException {
return getGroupFileEntries(
groupId, userId, DLFolderConstants.DEFAULT_PARENT_FOLDER_ID, start,
end, new RepositoryModelModifiedDateComparator<FileEntry>());
}
/**
* Returns an ordered range of all the file entries in the group that are
* stored within the Liferay repository. This method is primarily used to
* search for recently modified file entries. It can be limited to the file
* entries modified by a given user.
*
* <p>
* Useful when paginating results. Returns a maximum of <code>end -
* start</code> instances. <code>start</code> and <code>end</code> are not
* primary keys, they are indexes in the result set. Thus, <code>0</code>
* refers to the first result in the set. Setting both <code>start</code>
* and <code>end</code> to {@link QueryUtil#ALL_POS} will return the full
* result set.
* </p>
*
* @param groupId the primary key of the group
* @param userId the primary key of the user who created the file
* (optionally <code>0</code>)
* @param start the lower bound of the range of results
* @param end the upper bound of the range of results (not inclusive)
* @param obc the comparator to order the file entries (optionally
* <code>null</code>)
* @return the range of matching file entries ordered by comparator
* <code>obc</code>
*/
@Override
public List<FileEntry> getGroupFileEntries(
long groupId, long userId, int start, int end,
OrderByComparator<FileEntry> obc)
throws PortalException {
return getGroupFileEntries(
groupId, userId, DLFolderConstants.DEFAULT_PARENT_FOLDER_ID, start,
end, obc);
}
/**
* Returns an ordered range of all the file entries in the group starting at
* the root folder that are stored within the Liferay repository. This
* method is primarily used to search for recently modified file entries. It
* can be limited to the file entries modified by a given user.
*
* <p>
* Useful when paginating results. Returns a maximum of <code>end -
* start</code> instances. <code>start</code> and <code>end</code> are not
* primary keys, they are indexes in the result set. Thus, <code>0</code>
* refers to the first result in the set. Setting both <code>start</code>
* and <code>end</code> to {@link QueryUtil#ALL_POS} will return the full
* result set.
* </p>
*
* @param groupId the primary key of the group
* @param userId the primary key of the user who created the file
* (optionally <code>0</code>)
* @param rootFolderId the primary key of the root folder to begin the
* search
* @param start the lower bound of the range of results
* @param end the upper bound of the range of results (not inclusive)
* @return the range of matching file entries ordered by date modified
*/
@Override
public List<FileEntry> getGroupFileEntries(
long groupId, long userId, long rootFolderId, int start, int end)
throws PortalException {
return getGroupFileEntries(
groupId, userId, rootFolderId, start, end,
new RepositoryModelModifiedDateComparator<FileEntry>());
}
/**
* Returns an ordered range of all the file entries in the group starting at
* the root folder that are stored within the Liferay repository. This
* method is primarily used to search for recently modified file entries. It
* can be limited to the file entries modified by a given user.
*
* <p>
* Useful when paginating results. Returns a maximum of <code>end -
* start</code> instances. <code>start</code> and <code>end</code> are not
* primary keys, they are indexes in the result set. Thus, <code>0</code>
* refers to the first result in the set. Setting both <code>start</code>
* and <code>end</code> to {@link QueryUtil#ALL_POS} will return the full
* result set.
* </p>
*
* @param groupId the primary key of the group
* @param userId the primary key of the user who created the file
* (optionally <code>0</code>)
* @param rootFolderId the primary key of the root folder to begin the
* search
* @param start the lower bound of the range of results
* @param end the upper bound of the range of results (not inclusive)
* @param obc the comparator to order the file entries (optionally
* <code>null</code>)
* @return the range of matching file entries ordered by comparator
* <code>obc</code>
*/
@Override
public List<FileEntry> getGroupFileEntries(
long groupId, long userId, long rootFolderId, int start, int end,
OrderByComparator<FileEntry> obc)
throws PortalException {
Repository repository = getRepository(groupId);
return repository.getRepositoryFileEntries(
userId, rootFolderId, start, end, obc);
}
@Override
public List<FileEntry> getGroupFileEntries(
long groupId, long userId, long rootFolderId, String[] mimeTypes,
int status, int start, int end, OrderByComparator<FileEntry> obc)
throws PortalException {
Repository repository = getRepository(groupId);
return repository.getRepositoryFileEntries(
userId, rootFolderId, mimeTypes, status, start, end, obc);
}
/**
* Returns the number of file entries in a group starting at the repository
* default parent folder that are stored within the Liferay repository. This
* method is primarily used to search for recently modified file entries. It
* can be limited to the file entries modified by a given user.
*
* @param groupId the primary key of the group
* @param userId the primary key of the user who created the file
* (optionally <code>0</code>)
* @return the number of matching file entries
*/
@Override
public int getGroupFileEntriesCount(long groupId, long userId)
throws PortalException {
return getGroupFileEntriesCount(
groupId, userId, DLFolderConstants.DEFAULT_PARENT_FOLDER_ID);
}
/**
* Returns the number of file entries in a group starting at the root folder
* that are stored within the Liferay repository. This method is primarily
* used to search for recently modified file entries. It can be limited to
* the file entries modified by a given user.
*
* @param groupId the primary key of the group
* @param userId the primary key of the user who created the file
* (optionally <code>0</code>)
* @param rootFolderId the primary key of the root folder to begin the
* search
* @return the number of matching file entries
*/
@Override
public int getGroupFileEntriesCount(
long groupId, long userId, long rootFolderId)
throws PortalException {
Repository repository = getRepository(groupId);
return repository.getRepositoryFileEntriesCount(userId, rootFolderId);
}
@Override
public int getGroupFileEntriesCount(
long groupId, long userId, long rootFolderId, String[] mimeTypes,
int status)
throws PortalException {
Repository repository = getRepository(groupId);
return repository.getRepositoryFileEntriesCount(
userId, rootFolderId, mimeTypes, status);
}
/**
* Returns all immediate subfolders of the parent folder that are used for
* mounting third-party repositories. This method is only supported by the
* Liferay repository.
*
* @param repositoryId the primary key of the folder's repository
* @param parentFolderId the primary key of the folder's parent folder
* @return the immediate subfolders of the parent folder that are used for
* mounting third-party repositories
*/
@Override
public List<Folder> getMountFolders(long repositoryId, long parentFolderId)
throws PortalException {
return getMountFolders(
repositoryId, parentFolderId, QueryUtil.ALL_POS, QueryUtil.ALL_POS);
}
/**
* Returns a name-ordered range of all the immediate subfolders of the
* parent folder that are used for mounting third-party repositories. This
* method is only supported by the Liferay repository.
*
* <p>
* Useful when paginating results. Returns a maximum of <code>end -
* start</code> instances. <code>start</code> and <code>end</code> are not
* primary keys, they are indexes in the result set. Thus, <code>0</code>
* refers to the first result in the set. Setting both <code>start</code>
* and <code>end</code> to {@link QueryUtil#ALL_POS} will return the full
* result set.
* </p>
*
* @param repositoryId the primary key of the repository
* @param parentFolderId the primary key of the parent folder
* @param start the lower bound of the range of results
* @param end the upper bound of the range of results (not inclusive)
* @return the name-ordered range of immediate subfolders of the parent
* folder that are used for mounting third-party repositories
*/
@Override
public List<Folder> getMountFolders(
long repositoryId, long parentFolderId, int start, int end)
throws PortalException {
return getMountFolders(
repositoryId, parentFolderId, start, end,
new FolderNameComparator(true));
}
/**
* Returns an ordered range of all the immediate subfolders of the parent
* folder that are used for mounting third-party repositories. This method
* is only supported by the Liferay repository.
*
* <p>
* Useful when paginating results. Returns a maximum of <code>end -
* start</code> instances. <code>start</code> and <code>end</code> are not
* primary keys, they are indexes in the result set. Thus, <code>0</code>
* refers to the first result in the set. Setting both <code>start</code>
* and <code>end</code> to {@link QueryUtil#ALL_POS} will return the full
* result set.
* </p>
*
* @param repositoryId the primary key of the folder's repository
* @param parentFolderId the primary key of the folder's parent folder
* @param start the lower bound of the range of results
* @param end the upper bound of the range of results (not inclusive)
* @param obc the comparator to order the folders (optionally
* <code>null</code>)
* @return the range of immediate subfolders of the parent folder that are
* used for mounting third-party repositories ordered by comparator
* <code>obc</code>
*/
@Override
public List<Folder> getMountFolders(
long repositoryId, long parentFolderId, int start, int end,
OrderByComparator<Folder> obc)
throws PortalException {
Repository repository = getRepository(repositoryId);
return repository.getMountFolders(parentFolderId, start, end, obc);
}
/**
* Returns the number of immediate subfolders of the parent folder that are
* used for mounting third-party repositories. This method is only supported
* by the Liferay repository.
*
* @param repositoryId the primary key of the repository
* @param parentFolderId the primary key of the parent folder
* @return the number of folders of the parent folder that are used for
* mounting third-party repositories
*/
@Override
public int getMountFoldersCount(long repositoryId, long parentFolderId)
throws PortalException {
Repository repository = getRepository(repositoryId);
return repository.getMountFoldersCount(parentFolderId);
}
@Override
public void getSubfolderIds(
long repositoryId, List<Long> folderIds, long folderId)
throws PortalException {
Repository repository = getRepository(repositoryId);
repository.getSubfolderIds(folderIds, folderId);
}
/**
* Returns all the descendant folders of the folder with the primary key.
*
* @param repositoryId the primary key of the repository
* @param folderId the primary key of the folder
* @return the descendant folders of the folder with the primary key
*/
@Override
public List<Long> getSubfolderIds(long repositoryId, long folderId)
throws PortalException {
return getSubfolderIds(repositoryId, folderId, true);
}
/**
* Returns descendant folders of the folder with the primary key, optionally
* limiting to one level deep.
*
* @param repositoryId the primary key of the repository
* @param folderId the primary key of the folder
* @param recurse whether to recurse through each subfolder
* @return the descendant folders of the folder with the primary key
*/
@Override
public List<Long> getSubfolderIds(
long repositoryId, long folderId, boolean recurse)
throws PortalException {
Repository repository = getRepository(repositoryId);
return repository.getSubfolderIds(folderId, recurse);
}
/**
* Returns all the temporary file entry names.
*
* @param groupId the primary key of the group
* @param folderId the primary key of the folder where the file entry will
* eventually reside
* @param folderName the temporary folder's name
* @return the temporary file entry names
* @see #addTempFileEntry(long, long, String, String, File, String)
* @see TempFileEntryUtil
*/
@Override
public String[] getTempFileNames(
long groupId, long folderId, String folderName)
throws PortalException {
DLFolderPermission.check(
getPermissionChecker(), groupId, folderId, ActionKeys.ADD_DOCUMENT);
return TempFileEntryUtil.getTempFileNames(
groupId, getUserId(), folderName);
}
/**
* Locks the folder. This method is primarily used by WebDAV.
*
* @param repositoryId the primary key of the repository
* @param folderId the primary key of the folder
* @return the lock object
*/
@Override
public Lock lockFolder(long repositoryId, long folderId)
throws PortalException {
Repository repository = getRepository(repositoryId);
return repository.lockFolder(folderId);
}
/**
* Locks the folder. This method is primarily used by WebDAV.
*
* @param repositoryId the primary key of the repository
* @param folderId the primary key of the folder
* @param owner the owner string for the checkout (optionally
* <code>null</code>)
* @param inheritable whether the lock must propagate to descendants
* @param expirationTime the time in milliseconds before the lock expires.
* If the value is <code>0</code>, the default expiration time will
* be used from <code>portal.properties</code>.
* @return the lock object
*/
@Override
public Lock lockFolder(
long repositoryId, long folderId, String owner, boolean inheritable,
long expirationTime)
throws PortalException {
Repository repository = getRepository(repositoryId);
return repository.lockFolder(
folderId, owner, inheritable, expirationTime);
}
/**
* Moves the file entry to the new folder.
*
* @param fileEntryId the primary key of the file entry
* @param newFolderId the primary key of the new folder
* @param serviceContext the service context to be applied
* @return the file entry
*/
@Override
public FileEntry moveFileEntry(
long fileEntryId, long newFolderId, ServiceContext serviceContext)
throws PortalException {
Repository fromRepository = repositoryProvider.getFileEntryRepository(
fileEntryId);
Repository toRepository = getFolderRepository(
newFolderId, serviceContext.getScopeGroupId());
if (newFolderId != DLFolderConstants.DEFAULT_PARENT_FOLDER_ID) {
Folder toFolder = toRepository.getFolder(newFolderId);
if (toFolder.isMountPoint()) {
toRepository = getRepository(toFolder.getRepositoryId());
}
}
if (fromRepository.getRepositoryId() ==
toRepository.getRepositoryId()) {
// Move file entries within repository
return fromRepository.moveFileEntry(
getUserId(), fileEntryId, newFolderId, serviceContext);
}
// Move file entries between repositories
return moveFileEntry(
fileEntryId, newFolderId, fromRepository, toRepository,
serviceContext);
}
/**
* Moves the folder to the new parent folder with the primary key.
*
* @param folderId the primary key of the folder
* @param parentFolderId the primary key of the new parent folder
* @param serviceContext the service context to be applied
* @return the file entry
*/
@Override
public Folder moveFolder(
long folderId, long parentFolderId, ServiceContext serviceContext)
throws PortalException {
Repository fromRepository = repositoryProvider.getFolderRepository(
folderId);
Repository toRepository = getFolderRepository(
parentFolderId, serviceContext.getScopeGroupId());
if (parentFolderId != DLFolderConstants.DEFAULT_PARENT_FOLDER_ID) {
Folder toFolder = toRepository.getFolder(parentFolderId);
if (toFolder.isMountPoint()) {
toRepository = getRepository(toFolder.getRepositoryId());
}
}
if (fromRepository.getRepositoryId() ==
toRepository.getRepositoryId()) {
// Move file entries within repository
return fromRepository.moveFolder(
getUserId(), folderId, parentFolderId, serviceContext);
}
// Move file entries between repositories
return moveFolder(
folderId, parentFolderId, fromRepository, toRepository,
serviceContext);
}
/**
* Refreshes the lock for the file entry. This method is primarily used by
* WebDAV.
*
* @param lockUuid the lock's UUID
* @param companyId the primary key of the file entry's company
* @param expirationTime the time in milliseconds before the lock expires.
* If the value is <code>0</code>, the default expiration time will
* be used from <code>portal.properties</code>.
* @return the lock object
*/
@Override
public Lock refreshFileEntryLock(
String lockUuid, long companyId, long expirationTime)
throws PortalException {
Lock lock = LockManagerUtil.getLockByUuidAndCompanyId(
lockUuid, companyId);
long fileEntryId = GetterUtil.getLong(lock.getKey());
Repository repository = repositoryProvider.getFileEntryRepository(
fileEntryId);
return repository.refreshFileEntryLock(
lockUuid, companyId, expirationTime);
}
/**
* Refreshes the lock for the folder. This method is primarily used by
* WebDAV.
*
* @param lockUuid the lock's UUID
* @param companyId the primary key of the file entry's company
* @param expirationTime the time in milliseconds before the lock expires.
* If the value is <code>0</code>, the default expiration time will
* be used from <code>portal.properties</code>.
* @return the lock object
*/
@Override
public Lock refreshFolderLock(
String lockUuid, long companyId, long expirationTime)
throws PortalException {
Lock lock = LockManagerUtil.getLockByUuidAndCompanyId(
lockUuid, companyId);
long folderId = GetterUtil.getLong(lock.getKey());
Repository repository = repositoryProvider.getFolderRepository(
folderId);
return repository.refreshFolderLock(
lockUuid, companyId, expirationTime);
}
/**
* Reverts the file entry to a previous version. A new version will be
* created based on the previous version and metadata.
*
* @param fileEntryId the primary key of the file entry
* @param version the version to revert back to
* @param serviceContext the service context to be applied
*/
@Override
public void revertFileEntry(
long fileEntryId, String version, ServiceContext serviceContext)
throws PortalException {
Repository repository = repositoryProvider.getFileEntryRepository(
fileEntryId);
repository.revertFileEntry(
getUserId(), fileEntryId, version, serviceContext);
FileEntry fileEntry = getFileEntry(fileEntryId);
dlAppHelperLocalService.updateFileEntry(
getUserId(), fileEntry, null, fileEntry.getFileVersion(),
serviceContext);
}
@Override
public Hits search(
long repositoryId, long creatorUserId, int status, int start,
int end)
throws PortalException {
Repository repository = getRepository(repositoryId);
return repository.search(creatorUserId, status, start, end);
}
@Override
public Hits search(
long repositoryId, long creatorUserId, long folderId,
String[] mimeTypes, int status, int start, int end)
throws PortalException {
Repository repository = getRepository(repositoryId);
return repository.search(
creatorUserId, folderId, mimeTypes, status, start, end);
}
@Override
public Hits search(long repositoryId, SearchContext searchContext)
throws SearchException {
try {
Repository repository = getRepository(repositoryId);
PermissionChecker permissionChecker = getPermissionChecker();
searchContext.setCompanyId(permissionChecker.getCompanyId());
searchContext.setUserId(permissionChecker.getUserId());
return repository.search(searchContext);
}
catch (Exception e) {
throw new SearchException(e);
}
}
@Override
public Hits search(
long repositoryId, SearchContext searchContext, Query query)
throws SearchException {
try {
Repository repository = getRepository(repositoryId);
PermissionChecker permissionChecker = getPermissionChecker();
searchContext.setCompanyId(permissionChecker.getCompanyId());
searchContext.setUserId(permissionChecker.getUserId());
return repository.search(searchContext, query);
}
catch (Exception e) {
throw new SearchException(e);
}
}
/**
* Subscribe the user to changes in documents of the file entry type. This
* method is only supported by the Liferay repository.
*
* @param groupId the primary key of the file entry type's group
* @param fileEntryTypeId the primary key of the file entry type
*/
@Override
public void subscribeFileEntryType(long groupId, long fileEntryTypeId)
throws PortalException {
DLPermission.check(
getPermissionChecker(), groupId, ActionKeys.SUBSCRIBE);
dlAppLocalService.subscribeFileEntryType(
getUserId(), groupId, fileEntryTypeId);
}
/**
* Subscribe the user to document changes in the folder. This method is only
* supported by the Liferay repository.
*
* @param groupId the primary key of the folder's group
* @param folderId the primary key of the folder
*/
@Override
public void subscribeFolder(long groupId, long folderId)
throws PortalException {
DLFolderPermission.check(
getPermissionChecker(), groupId, folderId, ActionKeys.SUBSCRIBE);
dlAppLocalService.subscribeFolder(getUserId(), groupId, folderId);
}
/**
* Unlocks the folder. This method is primarily used by WebDAV.
*
* @param repositoryId the primary key of the repository
* @param folderId the primary key of the folder
* @param lockUuid the lock's UUID
*/
@Override
public void unlockFolder(long repositoryId, long folderId, String lockUuid)
throws PortalException {
Repository repository = getRepository(repositoryId);
repository.unlockFolder(folderId, lockUuid);
}
/**
* Unlocks the folder. This method is primarily used by WebDAV.
*
* @param repositoryId the primary key of the repository
* @param parentFolderId the primary key of the parent folder
* @param name the folder's name
* @param lockUuid the lock's UUID
*/
@Override
public void unlockFolder(
long repositoryId, long parentFolderId, String name,
String lockUuid)
throws PortalException {
Repository repository = getRepository(repositoryId);
repository.unlockFolder(parentFolderId, name, lockUuid);
}
/**
* Unsubscribe the user from changes in documents of the file entry type.
* This method is only supported by the Liferay repository.
*
* @param groupId the primary key of the file entry type's group
* @param fileEntryTypeId the primary key of the file entry type
*/
@Override
public void unsubscribeFileEntryType(long groupId, long fileEntryTypeId)
throws PortalException {
DLPermission.check(
getPermissionChecker(), groupId, ActionKeys.SUBSCRIBE);
dlAppLocalService.unsubscribeFileEntryType(
getUserId(), groupId, fileEntryTypeId);
}
/**
* Unsubscribe the user from document changes in the folder. This method is
* only supported by the Liferay repository.
*
* @param groupId the primary key of the folder's group
* @param folderId the primary key of the folder
*/
@Override
public void unsubscribeFolder(long groupId, long folderId)
throws PortalException {
DLFolderPermission.check(
getPermissionChecker(), groupId, folderId, ActionKeys.SUBSCRIBE);
dlAppLocalService.unsubscribeFolder(getUserId(), groupId, folderId);
}
/**
* Updates a file entry and associated metadata based on a byte array
* object. If the file data is <code>null</code>, then only the associated
* metadata (i.e., <code>title</code>, <code>description</code>, and
* parameters in the <code>serviceContext</code>) will be updated.
*
* <p>
* This method takes two file names, the <code>sourceFileName</code> and the
* <code>title</code>. The <code>sourceFileName</code> corresponds to the
* name of the actual file being uploaded. The <code>title</code>
* corresponds to a name the client wishes to assign this file after it has
* been uploaded to the portal.
* </p>
*
* @param fileEntryId the primary key of the file entry
* @param sourceFileName the original file's name (optionally
* <code>null</code>)
* @param mimeType the file's MIME type (optionally <code>null</code>)
* @param title the new name to be assigned to the file (optionally <code>
* <code>null</code></code>)
* @param description the file's new description
* @param changeLog the file's version change log (optionally
* <code>null</code>)
* @param majorVersion whether the new file version is a major version
* @param bytes the file's data (optionally <code>null</code>)
* @param serviceContext the service context to be applied. Can set the
* asset category IDs, asset tag names, and expando bridge
* attributes for the file entry. In a Liferay repository, it may
* include: <ul> <li> fileEntryTypeId - ID for a custom file entry
* type </li> <li> fieldsMap - mapping for fields associated with a
* custom file entry type </li> </ul>
* @return the file entry
*/
@Override
public FileEntry updateFileEntry(
long fileEntryId, String sourceFileName, String mimeType,
String title, String description, String changeLog,
boolean majorVersion, byte[] bytes, ServiceContext serviceContext)
throws PortalException {
File file = null;
try {
if (ArrayUtil.isNotEmpty(bytes)) {
file = FileUtil.createTempFile(bytes);
}
return updateFileEntry(
fileEntryId, sourceFileName, mimeType, title, description,
changeLog, majorVersion, file, serviceContext);
}
catch (IOException ioe) {
throw new SystemException("Unable to write temporary file", ioe);
}
finally {
FileUtil.delete(file);
}
}
/**
* Updates a file entry and associated metadata based on a {@link File}
* object. If the file data is <code>null</code>, then only the associated
* metadata (i.e., <code>title</code>, <code>description</code>, and
* parameters in the <code>serviceContext</code>) will be updated.
*
* <p>
* This method takes two file names, the <code>sourceFileName</code> and the
* <code>title</code>. The <code>sourceFileName</code> corresponds to the
* name of the actual file being uploaded. The <code>title</code>
* corresponds to a name the client wishes to assign this file after it has
* been uploaded to the portal.
* </p>
*
* @param fileEntryId the primary key of the file entry
* @param sourceFileName the original file's name (optionally
* <code>null</code>)
* @param mimeType the file's MIME type (optionally <code>null</code>)
* @param title the new name to be assigned to the file (optionally <code>
* <code>null</code></code>)
* @param description the file's new description
* @param changeLog the file's version change log (optionally
* <code>null</code>)
* @param majorVersion whether the new file version is a major version
* @param file the file's data (optionally <code>null</code>)
* @param serviceContext the service context to be applied. Can set the
* asset category IDs, asset tag names, and expando bridge
* attributes for the file entry. In a Liferay repository, it may
* include: <ul> <li> fileEntryTypeId - ID for a custom file entry
* type </li> <li> fieldsMap - mapping for fields associated with a
* custom file entry type </li> </ul>
* @return the file entry
*/
@Override
public FileEntry updateFileEntry(
long fileEntryId, String sourceFileName, String mimeType,
String title, String description, String changeLog,
boolean majorVersion, File file, ServiceContext serviceContext)
throws PortalException {
if ((file == null) || !file.exists() || (file.length() == 0)) {
return updateFileEntry(
fileEntryId, sourceFileName, mimeType, title, description,
changeLog, majorVersion, null, 0, serviceContext);
}
mimeType = DLAppUtil.getMimeType(sourceFileName, mimeType, title, file);
Repository repository = repositoryProvider.getFileEntryRepository(
fileEntryId);
FileEntry fileEntry = repository.updateFileEntry(
getUserId(), fileEntryId, sourceFileName, mimeType, title,
description, changeLog, majorVersion, file, serviceContext);
dlAppHelperLocalService.updateFileEntry(
getUserId(), fileEntry, null, fileEntry.getLatestFileVersion(),
serviceContext);
return fileEntry;
}
/**
* Updates a file entry and associated metadata based on an {@link
* InputStream} object. If the file data is <code>null</code>, then only the
* associated metadata (i.e., <code>title</code>, <code>description</code>,
* and parameters in the <code>serviceContext</code>) will be updated.
*
* <p>
* This method takes two file names, the <code>sourceFileName</code> and the
* <code>title</code>. The <code>sourceFileName</code> corresponds to the
* name of the actual file being uploaded. The <code>title</code>
* corresponds to a name the client wishes to assign this file after it has
* been uploaded to the portal.
* </p>
*
* @param fileEntryId the primary key of the file entry
* @param sourceFileName the original file's name (optionally
* <code>null</code>)
* @param mimeType the file's MIME type (optionally <code>null</code>)
* @param title the new name to be assigned to the file (optionally <code>
* <code>null</code></code>)
* @param description the file's new description
* @param changeLog the file's version change log (optionally
* <code>null</code>)
* @param majorVersion whether the new file version is a major version
* @param is the file's data (optionally <code>null</code>)
* @param size the file's size (optionally <code>0</code>)
* @param serviceContext the service context to be applied. Can set the
* asset category IDs, asset tag names, and expando bridge
* attributes for the file entry. In a Liferay repository, it may
* include: <ul> <li> fileEntryTypeId - ID for a custom file entry
* type </li> <li> fieldsMap - mapping for fields associated with a
* custom file entry type </li> </ul>
* @return the file entry
*/
@Override
public FileEntry updateFileEntry(
long fileEntryId, String sourceFileName, String mimeType,
String title, String description, String changeLog,
boolean majorVersion, InputStream is, long size,
ServiceContext serviceContext)
throws PortalException {
if (Validator.isNull(mimeType) ||
mimeType.equals(ContentTypes.APPLICATION_OCTET_STREAM)) {
String extension = DLAppUtil.getExtension(title, sourceFileName);
if (size == 0) {
mimeType = MimeTypesUtil.getExtensionContentType(extension);
}
else {
File file = null;
try {
file = FileUtil.createTempFile(is);
return updateFileEntry(
fileEntryId, sourceFileName, mimeType, title,
description, changeLog, majorVersion, file,
serviceContext);
}
catch (IOException ioe) {
throw new SystemException(
"Unable to write temporary file", ioe);
}
finally {
FileUtil.delete(file);
}
}
}
Repository repository = repositoryProvider.getFileEntryRepository(
fileEntryId);
FileEntry fileEntry = repository.updateFileEntry(
getUserId(), fileEntryId, sourceFileName, mimeType, title,
description, changeLog, majorVersion, is, size, serviceContext);
dlAppHelperLocalService.updateFileEntry(
getUserId(), fileEntry, null, fileEntry.getLatestFileVersion(),
serviceContext);
return fileEntry;
}
@Override
public FileEntry updateFileEntryAndCheckIn(
long fileEntryId, String sourceFileName, String mimeType,
String title, String description, String changeLog,
boolean majorVersion, File file, ServiceContext serviceContext)
throws PortalException {
if ((file == null) || !file.exists() || (file.length() == 0)) {
return updateFileEntryAndCheckIn(
fileEntryId, sourceFileName, mimeType, title, description,
changeLog, majorVersion, null, 0, serviceContext);
}
Repository repository = repositoryProvider.getFileEntryRepository(
fileEntryId);
FileEntry fileEntry = repository.updateFileEntry(
getUserId(), fileEntryId, sourceFileName, mimeType, title,
description, changeLog, majorVersion, file, serviceContext);
repository.checkInFileEntry(
getUserId(), fileEntryId, majorVersion, changeLog, serviceContext);
dlAppHelperLocalService.updateFileEntry(
getUserId(), fileEntry, null, fileEntry.getFileVersion(),
serviceContext);
return fileEntry;
}
@Override
public FileEntry updateFileEntryAndCheckIn(
long fileEntryId, String sourceFileName, String mimeType,
String title, String description, String changeLog,
boolean majorVersion, InputStream is, long size,
ServiceContext serviceContext)
throws PortalException {
Repository repository = repositoryProvider.getFileEntryRepository(
fileEntryId);
FileEntry fileEntry = repository.updateFileEntry(
getUserId(), fileEntryId, sourceFileName, mimeType, title,
description, changeLog, majorVersion, is, size, serviceContext);
repository.checkInFileEntry(
getUserId(), fileEntryId, majorVersion, changeLog, serviceContext);
dlAppHelperLocalService.updateFileEntry(
getUserId(), fileEntry, null, fileEntry.getFileVersion(),
serviceContext);
return fileEntry;
}
/**
* Updates a file shortcut to the existing file entry. This method is only
* supported by the Liferay repository.
*
* @param fileShortcutId the primary key of the file shortcut
* @param folderId the primary key of the file shortcut's parent folder
* @param toFileEntryId the primary key of the file shortcut's file entry
* @param serviceContext the service context to be applied. Can set the
* asset category IDs, asset tag names, and expando bridge
* attributes for the file entry.
* @return the file shortcut
*/
@Override
public FileShortcut updateFileShortcut(
long fileShortcutId, long folderId, long toFileEntryId,
ServiceContext serviceContext)
throws PortalException {
Repository repository = repositoryProvider.getFileShortcutRepository(
fileShortcutId);
return repository.updateFileShortcut(
getUserId(), fileShortcutId, folderId, toFileEntryId,
serviceContext);
}
/**
* Updates the folder.
*
* @param folderId the primary key of the folder
* @param name the folder's new name
* @param description the folder's new description
* @param serviceContext the service context to be applied. In a Liferay
* repository, it may include: <ul> <li> defaultFileEntryTypeId -
* the file entry type to default all Liferay file entries to </li>
* <li> dlFileEntryTypesSearchContainerPrimaryKeys - a
* comma-delimited list of file entry type primary keys allowed in
* the given folder and all descendants </li> <li> restrictionType -
* specifying restriction type of file entry types allowed </li>
* <li> workflowDefinitionXYZ - the workflow definition name
* specified per file entry type. The parameter name must be the
* string <code>workflowDefinition</code> appended by the
* <code>fileEntryTypeId</code> (optionally <code>0</code>).</li>
* </ul>
* @return the folder
*/
@Override
public Folder updateFolder(
long folderId, String name, String description,
ServiceContext serviceContext)
throws PortalException {
Repository repository = getFolderRepository(
folderId, serviceContext.getScopeGroupId());
Folder folder = repository.updateFolder(
folderId, name, description, serviceContext);
if (folderId != DLFolderConstants.DEFAULT_PARENT_FOLDER_ID) {
dlAppHelperLocalService.updateFolder(
getUserId(), folder, serviceContext);
}
return folder;
}
/**
* Returns <code>true</code> if the file entry is checked out. This method
* is primarily used by WebDAV.
*
* @param repositoryId the primary key for the repository
* @param fileEntryId the primary key for the file entry
* @param lockUuid the lock's UUID
* @return <code>true</code> if the file entry is checked out;
* <code>false</code> otherwise
*/
@Override
public boolean verifyFileEntryCheckOut(
long repositoryId, long fileEntryId, String lockUuid)
throws PortalException {
Repository repository = getRepository(repositoryId);
return repository.verifyFileEntryCheckOut(fileEntryId, lockUuid);
}
@Override
public boolean verifyFileEntryLock(
long repositoryId, long fileEntryId, String lockUuid)
throws PortalException {
Repository repository = getRepository(repositoryId);
return repository.verifyFileEntryLock(fileEntryId, lockUuid);
}
/**
* Returns <code>true</code> if the inheritable lock exists. This method is
* primarily used by WebDAV.
*
* @param repositoryId the primary key for the repository
* @param folderId the primary key for the folder
* @param lockUuid the lock's UUID
* @return <code>true</code> if the inheritable lock exists;
* <code>false</code> otherwise
*/
@Override
public boolean verifyInheritableLock(
long repositoryId, long folderId, String lockUuid)
throws PortalException {
Repository repository = getRepository(repositoryId);
return repository.verifyInheritableLock(folderId, lockUuid);
}
protected FileEntry copyFileEntry(
Repository toRepository, FileEntry fileEntry, long newFolderId,
ServiceContext serviceContext)
throws PortalException {
List<FileVersion> fileVersions = fileEntry.getFileVersions(
WorkflowConstants.STATUS_ANY);
FileVersion latestFileVersion = fileVersions.get(
fileVersions.size() - 1);
String sourceFileName = DLAppUtil.getSourceFileName(latestFileVersion);
FileEntry destinationFileEntry = toRepository.addFileEntry(
getUserId(), newFolderId, sourceFileName,
latestFileVersion.getMimeType(), latestFileVersion.getTitle(),
latestFileVersion.getDescription(), StringPool.BLANK,
latestFileVersion.getContentStream(false),
latestFileVersion.getSize(), serviceContext);
for (int i = fileVersions.size() - 2; i >= 0; i--) {
FileVersion fileVersion = fileVersions.get(i);
sourceFileName = DLAppUtil.getSourceFileName(fileVersion);
FileVersion previousFileVersion = fileVersions.get(i + 1);
try {
destinationFileEntry = toRepository.updateFileEntry(
getUserId(), destinationFileEntry.getFileEntryId(),
sourceFileName, fileVersion.getMimeType(),
fileVersion.getTitle(), fileVersion.getDescription(),
StringPool.BLANK,
DLAppUtil.isMajorVersion(previousFileVersion, fileVersion),
fileVersion.getContentStream(false), fileVersion.getSize(),
serviceContext);
FileVersion destinationFileVersion =
destinationFileEntry.getFileVersion();
dlAppHelperLocalService.updateFileEntry(
getUserId(), destinationFileEntry, null,
destinationFileVersion, serviceContext);
}
catch (PortalException pe) {
toRepository.deleteFileEntry(
destinationFileEntry.getFileEntryId());
throw pe;
}
}
return destinationFileEntry;
}
protected Folder copyFolder(
long folderId, long parentFolderId, Repository fromRepository,
Repository toRepository, ServiceContext serviceContext)
throws PortalException {
Folder newFolder = null;
try {
Folder folder = fromRepository.getFolder(folderId);
newFolder = toRepository.addFolder(
getUserId(), parentFolderId, folder.getName(),
folder.getDescription(), serviceContext);
dlAppHelperLocalService.addFolder(
getUserId(), newFolder, serviceContext);
copyFolderDependencies(
folder, newFolder, fromRepository, toRepository,
serviceContext);
return newFolder;
}
catch (PortalException pe) {
if (newFolder != null) {
toRepository.deleteFolder(newFolder.getFolderId());
}
throw pe;
}
}
protected void copyFolder(
Repository repository, Folder srcFolder, Folder destFolder,
ServiceContext serviceContext)
throws PortalException {
Queue<Folder[]> folders = new LinkedList<>();
final List<FileEntry> fileEntries = new ArrayList<>();
Folder curSrcFolder = srcFolder;
Folder curDestFolder = destFolder;
while (true) {
List<FileEntry> srcFileEntries = repository.getFileEntries(
curSrcFolder.getFolderId(), QueryUtil.ALL_POS,
QueryUtil.ALL_POS, null);
for (FileEntry srcFileEntry : srcFileEntries) {
try {
FileEntry fileEntry = repository.copyFileEntry(
getUserId(), curDestFolder.getGroupId(),
srcFileEntry.getFileEntryId(),
curDestFolder.getFolderId(), serviceContext);
fileEntries.add(fileEntry);
}
catch (Exception e) {
_log.error(e, e);
}
}
List<Folder> srcSubfolders = repository.getFolders(
curSrcFolder.getFolderId(), false, QueryUtil.ALL_POS,
QueryUtil.ALL_POS, null);
for (Folder srcSubfolder : srcSubfolders) {
Folder destSubfolder = repository.addFolder(
getUserId(), curDestFolder.getFolderId(),
srcSubfolder.getName(), srcSubfolder.getDescription(),
serviceContext);
dlAppHelperLocalService.addFolder(
getUserId(), destSubfolder, serviceContext);
folders.offer(new Folder[] {srcSubfolder, destSubfolder});
}
Folder[] next = folders.poll();
if (next == null) {
break;
}
else {
curSrcFolder = next[0];
curDestFolder = next[1];
}
}
TransactionCommitCallbackUtil.registerCallback(
new Callable<Void>() {
@Override
public Void call() throws Exception {
for (FileEntry fileEntry : fileEntries) {
DLProcessorRegistryUtil.trigger(fileEntry, null);
}
return null;
}
});
}
protected void copyFolderDependencies(
Folder sourceFolder, Folder destinationFolder,
Repository fromRepository, Repository toRepository,
ServiceContext serviceContext)
throws PortalException {
List<RepositoryEntry> repositoryEntries =
fromRepository.getFoldersAndFileEntriesAndFileShortcuts(
sourceFolder.getFolderId(), WorkflowConstants.STATUS_ANY, true,
QueryUtil.ALL_POS, QueryUtil.ALL_POS, null);
for (RepositoryEntry repositoryEntry : repositoryEntries) {
if (repositoryEntry instanceof FileEntry) {
FileEntry fileEntry = (FileEntry)repositoryEntry;
copyFileEntry(
toRepository, fileEntry, destinationFolder.getFolderId(),
serviceContext);
}
else if (repositoryEntry instanceof FileShortcut) {
if (destinationFolder.isSupportsShortcuts()) {
FileShortcut fileShortcut = (FileShortcut)repositoryEntry;
toRepository.addFileShortcut(
getUserId(), destinationFolder.getFolderId(),
fileShortcut.getToFileEntryId(), serviceContext);
}
}
else if (repositoryEntry instanceof Folder) {
Folder currentFolder = (Folder)repositoryEntry;
Folder newFolder = toRepository.addFolder(
getUserId(), destinationFolder.getFolderId(),
currentFolder.getName(), currentFolder.getDescription(),
serviceContext);
dlAppHelperLocalService.addFolder(
getUserId(), newFolder, serviceContext);
copyFolderDependencies(
currentFolder, newFolder, fromRepository, toRepository,
serviceContext);
}
}
}
protected void deleteFileEntry(
long oldFileEntryId, long newFileEntryId, Repository fromRepository,
Repository toRepository)
throws PortalException {
try {
FileEntry fileEntry = fromRepository.getFileEntry(oldFileEntryId);
dlAppHelperLocalService.deleteFileEntry(fileEntry);
fromRepository.deleteFileEntry(oldFileEntryId);
}
catch (PortalException pe) {
FileEntry fileEntry = toRepository.getFileEntry(newFileEntryId);
toRepository.deleteFileEntry(newFileEntryId);
dlAppHelperLocalService.deleteFileEntry(fileEntry);
throw pe;
}
}
protected FileEntry fetchFileEntryByUuidAndRepositoryId(
String uuid, long repositoryId)
throws PortalException {
try {
Repository repository = getRepository(repositoryId);
return repository.getFileEntryByUuid(uuid);
}
catch (NoSuchFileEntryException nsfee) {
if (_log.isDebugEnabled()) {
_log.debug(nsfee, nsfee);
}
return null;
}
catch (RepositoryException re) {
throw new NoSuchFileEntryException(re);
}
}
protected Repository getFolderRepository(long folderId, long groupId)
throws PortalException {
if (folderId == DLFolderConstants.DEFAULT_PARENT_FOLDER_ID) {
return getRepository(groupId);
}
return repositoryProvider.getFolderRepository(folderId);
}
protected Repository getRepository(long repositoryId)
throws PortalException {
try {
return repositoryProvider.getRepository(repositoryId);
}
catch (InvalidRepositoryIdException irie) {
StringBundler sb = new StringBundler(3);
sb.append("No Group exists with the key {repositoryId=");
sb.append(repositoryId);
sb.append("}");
throw new NoSuchGroupException(sb.toString(), irie);
}
}
protected FileEntry moveFileEntry(
long fileEntryId, long newFolderId, Repository fromRepository,
Repository toRepository, ServiceContext serviceContext)
throws PortalException {
FileEntry sourceFileEntry = fromRepository.getFileEntry(fileEntryId);
if (sourceFileEntry.isCheckedOut()) {
throw new FileEntryLockException.MustBeUnlocked();
}
FileEntry destinationFileEntry = copyFileEntry(
toRepository, sourceFileEntry, newFolderId, serviceContext);
deleteFileEntry(
fileEntryId, destinationFileEntry.getFileEntryId(), fromRepository,
toRepository);
return destinationFileEntry;
}
protected Folder moveFolder(
long folderId, long parentFolderId, Repository fromRepository,
Repository toRepository, ServiceContext serviceContext)
throws PortalException {
Folder newFolder = copyFolder(
folderId, parentFolderId, fromRepository, toRepository,
serviceContext);
fromRepository.deleteFolder(folderId);
return newFolder;
}
@BeanReference(type = RepositoryProvider.class)
protected RepositoryProvider repositoryProvider;
private static final Log _log = LogFactoryUtil.getLog(
DLAppServiceImpl.class);
}