/**
* 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.portal.portletfilerepository;
import com.liferay.document.library.kernel.exception.NoSuchFileEntryException;
import com.liferay.document.library.kernel.exception.NoSuchFolderException;
import com.liferay.document.library.kernel.model.DLFolderConstants;
import com.liferay.document.library.kernel.service.DLTrashLocalServiceUtil;
import com.liferay.document.library.kernel.util.DLAppHelperThreadLocal;
import com.liferay.portal.kernel.dao.orm.QueryUtil;
import com.liferay.portal.kernel.exception.PortalException;
import com.liferay.portal.kernel.exception.SystemException;
import com.liferay.portal.kernel.log.Log;
import com.liferay.portal.kernel.log.LogFactoryUtil;
import com.liferay.portal.kernel.model.Group;
import com.liferay.portal.kernel.model.Repository;
import com.liferay.portal.kernel.model.User;
import com.liferay.portal.kernel.portletfilerepository.PortletFileRepository;
import com.liferay.portal.kernel.repository.LocalRepository;
import com.liferay.portal.kernel.repository.RepositoryProviderUtil;
import com.liferay.portal.kernel.repository.model.FileEntry;
import com.liferay.portal.kernel.repository.model.Folder;
import com.liferay.portal.kernel.search.Hits;
import com.liferay.portal.kernel.search.SearchContext;
import com.liferay.portal.kernel.security.pacl.DoPrivileged;
import com.liferay.portal.kernel.service.GroupLocalServiceUtil;
import com.liferay.portal.kernel.service.RepositoryLocalServiceUtil;
import com.liferay.portal.kernel.service.ServiceContext;
import com.liferay.portal.kernel.service.UserLocalServiceUtil;
import com.liferay.portal.kernel.systemevent.SystemEventHierarchyEntryThreadLocal;
import com.liferay.portal.kernel.theme.ThemeDisplay;
import com.liferay.portal.kernel.util.ContentTypes;
import com.liferay.portal.kernel.util.FileUtil;
import com.liferay.portal.kernel.util.HtmlUtil;
import com.liferay.portal.kernel.util.HttpUtil;
import com.liferay.portal.kernel.util.MimeTypesUtil;
import com.liferay.portal.kernel.util.ObjectValuePair;
import com.liferay.portal.kernel.util.OrderByComparator;
import com.liferay.portal.kernel.util.PortalUtil;
import com.liferay.portal.kernel.util.StringBundler;
import com.liferay.portal.kernel.util.StringPool;
import com.liferay.portal.kernel.util.URLCodec;
import com.liferay.portal.kernel.util.UnicodeProperties;
import com.liferay.portal.kernel.util.Validator;
import com.liferay.portal.repository.portletrepository.PortletRepository;
import com.liferay.portal.webserver.WebServerServlet;
import com.liferay.trash.kernel.util.TrashUtil;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
/**
* @author Eudaldo Alonso
* @author Alexander Chow
*/
@DoPrivileged
public class PortletFileRepositoryImpl implements PortletFileRepository {
@Override
public void addPortletFileEntries(
long groupId, long userId, String className, long classPK,
String portletId, long folderId,
List<ObjectValuePair<String, InputStream>> inputStreamOVPs)
throws PortalException {
for (int i = 0; i < inputStreamOVPs.size(); i++) {
ObjectValuePair<String, InputStream> inputStreamOVP =
inputStreamOVPs.get(i);
InputStream inputStream = inputStreamOVP.getValue();
String fileName = inputStreamOVP.getKey();
addPortletFileEntry(
groupId, userId, className, classPK, portletId, folderId,
inputStream, fileName, StringPool.BLANK, true);
}
}
@Override
public FileEntry addPortletFileEntry(
long groupId, long userId, String className, long classPK,
String portletId, long folderId, byte[] bytes, String fileName,
String mimeType, boolean indexingEnabled)
throws PortalException {
if (bytes == null) {
return null;
}
File file = null;
try {
file = FileUtil.createTempFile(bytes);
return addPortletFileEntry(
groupId, userId, className, classPK, portletId, folderId, file,
fileName, mimeType, indexingEnabled);
}
catch (IOException ioe) {
throw new SystemException("Unable to write temporary file", ioe);
}
finally {
FileUtil.delete(file);
}
}
@Override
public FileEntry addPortletFileEntry(
long groupId, long userId, String className, long classPK,
String portletId, long folderId, File file, String fileName,
String mimeType, boolean indexingEnabled)
throws PortalException {
if (Validator.isNull(fileName)) {
return null;
}
ServiceContext serviceContext = new ServiceContext();
serviceContext.setAddGroupPermissions(true);
serviceContext.setAddGuestPermissions(true);
Repository repository = addPortletRepository(
groupId, portletId, serviceContext);
serviceContext.setAttribute("className", className);
serviceContext.setAttribute("classPK", String.valueOf(classPK));
serviceContext.setIndexingEnabled(indexingEnabled);
if (Validator.isNull(mimeType) ||
mimeType.equals(ContentTypes.APPLICATION_OCTET_STREAM)) {
mimeType = MimeTypesUtil.getContentType(file, fileName);
}
boolean dlAppHelperEnabled = DLAppHelperThreadLocal.isEnabled();
try {
DLAppHelperThreadLocal.setEnabled(false);
LocalRepository localRepository =
RepositoryProviderUtil.getLocalRepository(
repository.getRepositoryId());
return localRepository.addFileEntry(
userId, folderId, fileName, mimeType, fileName,
StringPool.BLANK, StringPool.BLANK, file, serviceContext);
}
finally {
DLAppHelperThreadLocal.setEnabled(dlAppHelperEnabled);
}
}
@Override
public FileEntry addPortletFileEntry(
long groupId, long userId, String className, long classPK,
String portletId, long folderId, InputStream inputStream,
String fileName, String mimeType, boolean indexingEnabled)
throws PortalException {
if (inputStream == null) {
return null;
}
File file = null;
try {
file = FileUtil.createTempFile(inputStream);
return addPortletFileEntry(
groupId, userId, className, classPK, portletId, folderId, file,
fileName, mimeType, indexingEnabled);
}
catch (IOException ioe) {
throw new SystemException("Unable to write temporary file", ioe);
}
finally {
FileUtil.delete(file);
}
}
@Override
public Folder addPortletFolder(
long userId, long repositoryId, long parentFolderId,
String folderName, ServiceContext serviceContext)
throws PortalException {
boolean dlAppHelperEnabled = DLAppHelperThreadLocal.isEnabled();
LocalRepository localRepository =
RepositoryProviderUtil.getLocalRepository(repositoryId);
try {
DLAppHelperThreadLocal.setEnabled(false);
return localRepository.getFolder(parentFolderId, folderName);
}
catch (NoSuchFolderException nsfe) {
// LPS-52675
if (_log.isDebugEnabled()) {
_log.debug(nsfe, nsfe);
}
return localRepository.addFolder(
userId, parentFolderId, folderName, StringPool.BLANK,
serviceContext);
}
finally {
DLAppHelperThreadLocal.setEnabled(dlAppHelperEnabled);
}
}
@Override
public Folder addPortletFolder(
long groupId, long userId, String portletId, long parentFolderId,
String folderName, ServiceContext serviceContext)
throws PortalException {
Repository repository = addPortletRepository(
groupId, portletId, serviceContext);
return addPortletFolder(
userId, repository.getRepositoryId(), parentFolderId, folderName,
serviceContext);
}
@Override
public Repository addPortletRepository(
long groupId, String portletId, ServiceContext serviceContext)
throws PortalException {
Repository repository = RepositoryLocalServiceUtil.fetchRepository(
groupId, portletId);
if (repository != null) {
return repository;
}
Group group = GroupLocalServiceUtil.getGroup(groupId);
User user = UserLocalServiceUtil.getDefaultUser(group.getCompanyId());
long classNameId = PortalUtil.getClassNameId(
PortletRepository.class.getName());
UnicodeProperties typeSettingsProperties = new UnicodeProperties();
boolean dlAppHelperEnabled = DLAppHelperThreadLocal.isEnabled();
try {
DLAppHelperThreadLocal.setEnabled(false);
return RepositoryLocalServiceUtil.addRepository(
user.getUserId(), groupId, classNameId,
DLFolderConstants.DEFAULT_PARENT_FOLDER_ID, portletId,
StringPool.BLANK, portletId, typeSettingsProperties, true,
serviceContext);
}
finally {
DLAppHelperThreadLocal.setEnabled(dlAppHelperEnabled);
}
}
/**
* @deprecated As of 7.0.0, replaced by {@link #deletePortletFolder}
*/
@Deprecated
@Override
public void deleteFolder(long folderId) throws PortalException {
deletePortletFolder(folderId);
}
@Override
public void deletePortletFileEntries(long groupId, long folderId)
throws PortalException {
LocalRepository localRepository =
RepositoryProviderUtil.getLocalRepository(groupId);
List<FileEntry> fileEntries = localRepository.getFileEntries(
folderId, QueryUtil.ALL_POS, QueryUtil.ALL_POS, null);
for (FileEntry fileEntry : fileEntries) {
deletePortletFileEntry(fileEntry.getFileEntryId());
}
}
@Override
public void deletePortletFileEntries(
long groupId, long folderId, int status)
throws PortalException {
LocalRepository localRepository =
RepositoryProviderUtil.getLocalRepository(groupId);
List<FileEntry> fileEntries = localRepository.getFileEntries(
folderId, status, QueryUtil.ALL_POS, QueryUtil.ALL_POS, null);
for (FileEntry fileEntry : fileEntries) {
deletePortletFileEntry(fileEntry.getFileEntryId());
}
}
@Override
public void deletePortletFileEntry(long fileEntryId)
throws PortalException {
boolean dlAppHelperEnabled = DLAppHelperThreadLocal.isEnabled();
try {
DLAppHelperThreadLocal.setEnabled(false);
SystemEventHierarchyEntryThreadLocal.push(FileEntry.class);
LocalRepository localRepository =
RepositoryProviderUtil.getFileEntryLocalRepository(fileEntryId);
localRepository.deleteFileEntry(fileEntryId);
}
catch (NoSuchFileEntryException nsfee) {
if (_log.isWarnEnabled()) {
_log.warn(nsfee, nsfee);
}
}
finally {
DLAppHelperThreadLocal.setEnabled(dlAppHelperEnabled);
SystemEventHierarchyEntryThreadLocal.pop(FileEntry.class);
}
}
@Override
public void deletePortletFileEntry(
long groupId, long folderId, String fileName)
throws PortalException {
LocalRepository localRepository =
RepositoryProviderUtil.getLocalRepository(groupId);
FileEntry fileEntry = localRepository.getFileEntry(folderId, fileName);
deletePortletFileEntry(fileEntry.getFileEntryId());
}
@Override
public void deletePortletFolder(long folderId) throws PortalException {
boolean dlAppHelperEnabled = DLAppHelperThreadLocal.isEnabled();
try {
DLAppHelperThreadLocal.setEnabled(false);
SystemEventHierarchyEntryThreadLocal.push(Folder.class);
LocalRepository localRepository =
RepositoryProviderUtil.getFolderLocalRepository(folderId);
localRepository.deleteFolder(folderId);
}
catch (NoSuchFolderException nsfe) {
if (_log.isWarnEnabled()) {
_log.warn(nsfe, nsfe);
}
}
finally {
DLAppHelperThreadLocal.setEnabled(dlAppHelperEnabled);
SystemEventHierarchyEntryThreadLocal.pop(Folder.class);
}
}
@Override
public void deletePortletRepository(long groupId, String portletId)
throws PortalException {
Repository repository = RepositoryLocalServiceUtil.fetchRepository(
groupId, portletId);
if (repository != null) {
RepositoryLocalServiceUtil.deleteRepository(
repository.getRepositoryId());
}
}
@Override
public FileEntry fetchPortletFileEntry(
long groupId, long folderId, String fileName) {
try {
return getPortletFileEntry(groupId, folderId, fileName);
}
catch (PortalException pe) {
if (_log.isDebugEnabled()) {
_log.debug(pe, pe);
}
}
return null;
}
@Override
public Repository fetchPortletRepository(long groupId, String portletId) {
return RepositoryLocalServiceUtil.fetchRepository(groupId, portletId);
}
@Override
public String getDownloadPortletFileEntryURL(
ThemeDisplay themeDisplay, FileEntry fileEntry, String queryString) {
return getDownloadPortletFileEntryURL(
themeDisplay, fileEntry, queryString, true);
}
@Override
public String getDownloadPortletFileEntryURL(
ThemeDisplay themeDisplay, FileEntry fileEntry, String queryString,
boolean absoluteURL) {
String portletFileEntryURL = getPortletFileEntryURL(
themeDisplay, fileEntry, queryString, absoluteURL);
return HttpUtil.addParameter(portletFileEntryURL, "download", true);
}
@Override
public List<FileEntry> getPortletFileEntries(long groupId, long folderId)
throws PortalException {
LocalRepository localRepository =
RepositoryProviderUtil.getLocalRepository(groupId);
return localRepository.getFileEntries(
folderId, QueryUtil.ALL_POS, QueryUtil.ALL_POS, null);
}
@Override
public List<FileEntry> getPortletFileEntries(
long groupId, long folderId, int status)
throws PortalException {
return getPortletFileEntries(
groupId, folderId, status, QueryUtil.ALL_POS, QueryUtil.ALL_POS,
null);
}
@Override
public List<FileEntry> getPortletFileEntries(
long groupId, long folderId, int status, int start, int end,
OrderByComparator<FileEntry> obc)
throws PortalException {
LocalRepository localRepository =
RepositoryProviderUtil.getLocalRepository(groupId);
return localRepository.getFileEntries(
folderId, status, start, end, obc);
}
@Override
public List<FileEntry> getPortletFileEntries(
long groupId, long folderId, OrderByComparator<FileEntry> obc)
throws PortalException {
LocalRepository localRepository =
RepositoryProviderUtil.getLocalRepository(groupId);
return localRepository.getFileEntries(
folderId, QueryUtil.ALL_POS, QueryUtil.ALL_POS, obc);
}
@Override
public List<FileEntry> getPortletFileEntries(
long groupId, long folderId, String[] mimeTypes, int status,
int start, int end, OrderByComparator<FileEntry> obc)
throws PortalException {
LocalRepository localRepository =
RepositoryProviderUtil.getLocalRepository(groupId);
return localRepository.getFileEntries(
folderId, mimeTypes, status, start, end, obc);
}
@Override
public int getPortletFileEntriesCount(long groupId, long folderId)
throws PortalException {
LocalRepository localRepository =
RepositoryProviderUtil.getLocalRepository(groupId);
return localRepository.getFileEntriesCount(folderId);
}
@Override
public int getPortletFileEntriesCount(
long groupId, long folderId, int status)
throws PortalException {
LocalRepository localRepository =
RepositoryProviderUtil.getLocalRepository(groupId);
return localRepository.getFileEntriesCount(folderId, status);
}
@Override
public int getPortletFileEntriesCount(
long groupId, long folderId, String[] mimeTypes, int status)
throws PortalException {
LocalRepository localRepository =
RepositoryProviderUtil.getLocalRepository(groupId);
return localRepository.getFileEntriesCount(folderId, mimeTypes, status);
}
@Override
public FileEntry getPortletFileEntry(long fileEntryId)
throws PortalException {
LocalRepository localRepository =
RepositoryProviderUtil.getFileEntryLocalRepository(fileEntryId);
return localRepository.getFileEntry(fileEntryId);
}
@Override
public FileEntry getPortletFileEntry(
long groupId, long folderId, String fileName)
throws PortalException {
LocalRepository localRepository =
RepositoryProviderUtil.getLocalRepository(groupId);
return localRepository.getFileEntry(folderId, fileName);
}
@Override
public FileEntry getPortletFileEntry(String uuid, long groupId)
throws PortalException {
LocalRepository localRepository =
RepositoryProviderUtil.getLocalRepository(groupId);
return localRepository.getFileEntryByUuid(uuid);
}
@Override
public String getPortletFileEntryURL(
ThemeDisplay themeDisplay, FileEntry fileEntry, String queryString) {
return getPortletFileEntryURL(
themeDisplay, fileEntry, queryString, true);
}
@Override
public String getPortletFileEntryURL(
ThemeDisplay themeDisplay, FileEntry fileEntry, String queryString,
boolean absoluteURL) {
StringBundler sb = new StringBundler(12);
if ((themeDisplay != null) && absoluteURL) {
sb.append(themeDisplay.getPortalURL());
}
sb.append(PortalUtil.getPathContext());
sb.append("/documents/");
sb.append(WebServerServlet.PATH_PORTLET_FILE_ENTRY);
sb.append(StringPool.SLASH);
sb.append(fileEntry.getGroupId());
sb.append(StringPool.SLASH);
String title = fileEntry.getTitle();
if (fileEntry.isInTrash()) {
title = TrashUtil.getOriginalTitle(fileEntry.getTitle());
}
sb.append(URLCodec.encodeURL(HtmlUtil.unescape(title)));
sb.append(StringPool.SLASH);
sb.append(URLCodec.encodeURL(fileEntry.getUuid()));
if (Validator.isNotNull(queryString)) {
sb.append(StringPool.QUESTION);
sb.append(queryString);
}
String portletFileEntryURL = sb.toString();
if ((themeDisplay != null) && themeDisplay.isAddSessionIdToURL()) {
return PortalUtil.getURLWithSessionId(
portletFileEntryURL, themeDisplay.getSessionId());
}
return portletFileEntryURL;
}
@Override
public Folder getPortletFolder(long folderId) throws PortalException {
LocalRepository localRepository =
RepositoryProviderUtil.getFolderLocalRepository(folderId);
return localRepository.getFolder(folderId);
}
@Override
public Folder getPortletFolder(
long repositoryId, long parentFolderId, String folderName)
throws PortalException {
LocalRepository localRepository =
RepositoryProviderUtil.getLocalRepository(repositoryId);
return localRepository.getFolder(parentFolderId, folderName);
}
@Override
public Repository getPortletRepository(long groupId, String portletId)
throws PortalException {
return RepositoryLocalServiceUtil.getRepository(groupId, portletId);
}
@Override
public String getUniqueFileName(
long groupId, long folderId, String fileName) {
String uniqueFileName = fileName;
for (int i = 1;; i++) {
try {
getPortletFileEntry(groupId, folderId, uniqueFileName);
uniqueFileName = FileUtil.appendParentheticalSuffix(
fileName, String.valueOf(i));
}
catch (Exception e) {
break;
}
}
return uniqueFileName;
}
@Override
public FileEntry movePortletFileEntryToTrash(long userId, long fileEntryId)
throws PortalException {
boolean dlAppHelperEnabled = DLAppHelperThreadLocal.isEnabled();
try {
DLAppHelperThreadLocal.setEnabled(false);
LocalRepository localRepository =
RepositoryProviderUtil.getFileEntryLocalRepository(fileEntryId);
return DLTrashLocalServiceUtil.moveFileEntryToTrash(
userId, localRepository.getRepositoryId(), fileEntryId);
}
finally {
DLAppHelperThreadLocal.setEnabled(dlAppHelperEnabled);
}
}
@Override
public FileEntry movePortletFileEntryToTrash(
long groupId, long userId, long folderId, String fileName)
throws PortalException {
LocalRepository localRepository =
RepositoryProviderUtil.getLocalRepository(groupId);
FileEntry fileEntry = localRepository.getFileEntry(folderId, fileName);
return movePortletFileEntryToTrash(userId, fileEntry.getFileEntryId());
}
@Override
public Folder movePortletFolder(
long groupId, long userId, long folderId, long parentFolderId,
ServiceContext serviceContext)
throws PortalException {
boolean dlAppHelperEnabled = DLAppHelperThreadLocal.isEnabled();
try {
DLAppHelperThreadLocal.setEnabled(false);
LocalRepository localRepository =
RepositoryProviderUtil.getLocalRepository(groupId);
return localRepository.moveFolder(
userId, folderId, parentFolderId, serviceContext);
}
finally {
DLAppHelperThreadLocal.setEnabled(dlAppHelperEnabled);
}
}
@Override
public void restorePortletFileEntryFromTrash(long userId, long fileEntryId)
throws PortalException {
boolean dlAppHelperEnabled = DLAppHelperThreadLocal.isEnabled();
try {
DLAppHelperThreadLocal.setEnabled(false);
LocalRepository localRepository =
RepositoryProviderUtil.getFileEntryLocalRepository(fileEntryId);
DLTrashLocalServiceUtil.restoreFileEntryFromTrash(
userId, localRepository.getRepositoryId(), fileEntryId);
}
finally {
DLAppHelperThreadLocal.setEnabled(dlAppHelperEnabled);
}
}
@Override
public void restorePortletFileEntryFromTrash(
long groupId, long userId, long folderId, String fileName)
throws PortalException {
LocalRepository localRepository =
RepositoryProviderUtil.getLocalRepository(groupId);
FileEntry fileEntry = localRepository.getFileEntry(folderId, fileName);
restorePortletFileEntryFromTrash(userId, fileEntry.getFileEntryId());
}
@Override
public Hits searchPortletFileEntries(
long repositoryId, SearchContext searchContext)
throws PortalException {
com.liferay.portal.kernel.repository.Repository repository =
RepositoryProviderUtil.getRepository(repositoryId);
return repository.search(searchContext);
}
private static final Log _log = LogFactoryUtil.getLog(
PortletFileRepositoryImpl.class);
}