/**
* 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.journal.service.impl;
import com.liferay.dynamic.data.mapping.model.DDMStructure;
import com.liferay.dynamic.data.mapping.service.permission.DDMStructurePermission;
import com.liferay.journal.model.JournalArticle;
import com.liferay.journal.model.JournalFolder;
import com.liferay.journal.service.base.JournalFolderServiceBaseImpl;
import com.liferay.journal.service.permission.JournalFolderPermission;
import com.liferay.portal.kernel.dao.orm.QueryDefinition;
import com.liferay.portal.kernel.exception.PortalException;
import com.liferay.portal.kernel.security.permission.ActionKeys;
import com.liferay.portal.kernel.security.permission.PermissionChecker;
import com.liferay.portal.kernel.service.ServiceContext;
import com.liferay.portal.kernel.util.ListUtil;
import com.liferay.portal.kernel.util.OrderByComparator;
import com.liferay.portal.kernel.workflow.WorkflowConstants;
import com.liferay.portal.util.PropsValues;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Locale;
/**
* @author Juan Fernández
*/
public class JournalFolderServiceImpl extends JournalFolderServiceBaseImpl {
@Override
public JournalFolder addFolder(
long groupId, long parentFolderId, String name, String description,
ServiceContext serviceContext)
throws PortalException {
JournalFolderPermission.check(
getPermissionChecker(), groupId, parentFolderId,
ActionKeys.ADD_FOLDER);
return journalFolderLocalService.addFolder(
getUserId(), groupId, parentFolderId, name, description,
serviceContext);
}
@Override
public void deleteFolder(long folderId) throws PortalException {
JournalFolder folder = journalFolderLocalService.getFolder(folderId);
JournalFolderPermission.check(
getPermissionChecker(), folder, ActionKeys.DELETE);
journalFolderLocalService.deleteFolder(folderId);
}
@Override
public void deleteFolder(long folderId, boolean includeTrashedEntries)
throws PortalException {
JournalFolder folder = journalFolderLocalService.getFolder(folderId);
JournalFolderPermission.check(
getPermissionChecker(), folder, ActionKeys.DELETE);
journalFolderLocalService.deleteFolder(folderId, includeTrashedEntries);
}
@Override
public JournalFolder fetchFolder(long folderId) throws PortalException {
JournalFolder folder = journalFolderLocalService.fetchFolder(folderId);
if (folder != null) {
JournalFolderPermission.check(
getPermissionChecker(), folder, ActionKeys.VIEW);
}
return folder;
}
@Override
public List<DDMStructure> getDDMStructures(
long[] groupIds, long folderId, int restrictionType)
throws PortalException {
return filterStructures(
journalFolderLocalService.getDDMStructures(
groupIds, folderId, restrictionType));
}
@Override
public JournalFolder getFolder(long folderId) throws PortalException {
JournalFolder folder = journalFolderLocalService.getFolder(folderId);
JournalFolderPermission.check(
getPermissionChecker(), folder, ActionKeys.VIEW);
return folder;
}
@Override
public List<Long> getFolderIds(long groupId, long folderId)
throws PortalException {
JournalFolderPermission.check(
getPermissionChecker(), groupId, folderId, ActionKeys.VIEW);
List<Long> folderIds = getSubfolderIds(groupId, folderId, true);
folderIds.add(0, folderId);
return folderIds;
}
@Override
public List<JournalFolder> getFolders(long groupId) {
return journalFolderPersistence.filterFindByGroupId(groupId);
}
@Override
public List<JournalFolder> getFolders(long groupId, long parentFolderId) {
return getFolders(
groupId, parentFolderId, WorkflowConstants.STATUS_APPROVED);
}
@Override
public List<JournalFolder> getFolders(
long groupId, long parentFolderId, int status) {
return journalFolderPersistence.filterFindByG_P_S(
groupId, parentFolderId, status);
}
@Override
public List<JournalFolder> getFolders(
long groupId, long parentFolderId, int start, int end) {
return getFolders(
groupId, parentFolderId, WorkflowConstants.STATUS_APPROVED, start,
end);
}
@Override
public List<JournalFolder> getFolders(
long groupId, long parentFolderId, int status, int start, int end) {
return journalFolderPersistence.filterFindByG_P_S(
groupId, parentFolderId, status, start, end);
}
@Override
public List<Object> getFoldersAndArticles(
long groupId, long folderId, int status, int start, int end,
OrderByComparator<?> obc) {
return getFoldersAndArticles(
groupId, 0, folderId, status, start, end, obc);
}
@Override
public List<Object> getFoldersAndArticles(
long groupId, long folderId, int start, int end,
OrderByComparator<?> obc) {
return getFoldersAndArticles(
groupId, folderId, WorkflowConstants.STATUS_ANY, start, end, obc);
}
@Override
public List<Object> getFoldersAndArticles(
long groupId, long userId, long folderId, int status, int start,
int end, OrderByComparator<?> obc) {
QueryDefinition<?> queryDefinition = new QueryDefinition<>(
status, userId, true, start, end, (OrderByComparator<Object>)obc);
return journalFolderFinder.filterFindF_A_ByG_F(
groupId, folderId, queryDefinition);
}
@Override
public List<Object> getFoldersAndArticles(
long groupId, long userId, long folderId, int status, Locale locale,
int start, int end, OrderByComparator<?> obc) {
QueryDefinition<?> queryDefinition = new QueryDefinition<>(
status, userId, true, start, end, (OrderByComparator<Object>)obc);
return journalFolderFinder.filterFindF_A_ByG_F_L(
groupId, folderId, locale, queryDefinition);
}
@Override
public int getFoldersAndArticlesCount(
long groupId, List<Long> folderIds, int status) {
QueryDefinition<JournalArticle> queryDefinition = new QueryDefinition<>(
status);
if (folderIds.size() <= PropsValues.SQL_DATA_MAX_PARAMETERS) {
return journalArticleFinder.filterCountByG_F(
groupId, folderIds, queryDefinition);
}
else {
int start = 0;
int end = PropsValues.SQL_DATA_MAX_PARAMETERS;
int articlesCount = journalArticleFinder.filterCountByG_F(
groupId, folderIds.subList(start, end), queryDefinition);
folderIds.subList(start, end).clear();
articlesCount += getFoldersAndArticlesCount(
groupId, folderIds, status);
return articlesCount;
}
}
@Override
public int getFoldersAndArticlesCount(long groupId, long folderId) {
return getFoldersAndArticlesCount(
groupId, folderId, WorkflowConstants.STATUS_ANY);
}
@Override
public int getFoldersAndArticlesCount(
long groupId, long folderId, int status) {
return getFoldersAndArticlesCount(groupId, 0, folderId, status);
}
@Override
public int getFoldersAndArticlesCount(
long groupId, long userId, long folderId, int status) {
QueryDefinition<Object> queryDefinition = new QueryDefinition<>(
status, userId, true);
return journalFolderFinder.filterCountF_A_ByG_F(
groupId, folderId, queryDefinition);
}
@Override
public int getFoldersCount(long groupId, long parentFolderId) {
return getFoldersCount(
groupId, parentFolderId, WorkflowConstants.STATUS_APPROVED);
}
@Override
public int getFoldersCount(long groupId, long parentFolderId, int status) {
if (status == WorkflowConstants.STATUS_ANY) {
return journalFolderPersistence.filterCountByG_P_NotS(
groupId, parentFolderId, WorkflowConstants.STATUS_IN_TRASH);
}
else {
return journalFolderPersistence.filterCountByG_P_S(
groupId, parentFolderId, status);
}
}
/**
* @deprecated As of 4.0.0, replaced by {@link #getSubfolderIds(List, long,
* long, boolean)}
*/
@Deprecated
@Override
public void getSubfolderIds(
List<Long> folderIds, long groupId, long folderId) {
getSubfolderIds(folderIds, groupId, folderId, true);
}
@Override
public void getSubfolderIds(
List<Long> folderIds, long groupId, long folderId, boolean recurse) {
List<JournalFolder> folders =
journalFolderPersistence.filterFindByG_P_NotS(
groupId, folderId, WorkflowConstants.STATUS_IN_TRASH);
for (JournalFolder folder : folders) {
folderIds.add(folder.getFolderId());
if (recurse) {
getSubfolderIds(
folderIds, folder.getGroupId(), folder.getFolderId(),
recurse);
}
}
}
@Override
public List<Long> getSubfolderIds(
long groupId, long folderId, boolean recurse) {
List<Long> folderIds = new ArrayList<>();
getSubfolderIds(folderIds, groupId, folderId, recurse);
return folderIds;
}
@Override
public JournalFolder moveFolder(
long folderId, long parentFolderId, ServiceContext serviceContext)
throws PortalException {
JournalFolder folder = journalFolderLocalService.getFolder(folderId);
JournalFolderPermission.check(
getPermissionChecker(), folder, ActionKeys.UPDATE);
return journalFolderLocalService.moveFolder(
folderId, parentFolderId, serviceContext);
}
@Override
public JournalFolder moveFolderFromTrash(
long folderId, long parentFolderId, ServiceContext serviceContext)
throws PortalException {
JournalFolder folder = journalFolderLocalService.getFolder(folderId);
JournalFolderPermission.check(
getPermissionChecker(), folder, ActionKeys.UPDATE);
return journalFolderLocalService.moveFolderFromTrash(
getUserId(), folderId, parentFolderId, serviceContext);
}
@Override
public JournalFolder moveFolderToTrash(long folderId)
throws PortalException {
JournalFolder folder = journalFolderLocalService.getFolder(folderId);
JournalFolderPermission.check(
getPermissionChecker(), folder, ActionKeys.DELETE);
return journalFolderLocalService.moveFolderToTrash(
getUserId(), folderId);
}
@Override
public void restoreFolderFromTrash(long folderId) throws PortalException {
JournalFolder folder = journalFolderLocalService.getFolder(folderId);
JournalFolderPermission.check(
getPermissionChecker(), folder, ActionKeys.UPDATE);
journalFolderLocalService.restoreFolderFromTrash(getUserId(), folderId);
}
@Override
public List<DDMStructure> searchDDMStructures(
long companyId, long[] groupIds, long folderId, int restrictionType,
String keywords, int start, int end,
OrderByComparator<DDMStructure> obc)
throws PortalException {
return filterStructures(
journalFolderLocalService.searchDDMStructures(
companyId, groupIds, folderId, restrictionType, keywords, start,
end, obc));
}
@Override
public void subscribe(long groupId, long folderId) throws PortalException {
JournalFolderPermission.check(
getPermissionChecker(), groupId, folderId, ActionKeys.SUBSCRIBE);
journalFolderLocalService.subscribe(getUserId(), groupId, folderId);
}
@Override
public void unsubscribe(long groupId, long folderId)
throws PortalException {
JournalFolderPermission.check(
getPermissionChecker(), groupId, folderId, ActionKeys.SUBSCRIBE);
journalFolderLocalService.unsubscribe(getUserId(), groupId, folderId);
}
@Override
public JournalFolder updateFolder(
long groupId, long folderId, long parentFolderId, String name,
String description, boolean mergeWithParentFolder,
ServiceContext serviceContext)
throws PortalException {
JournalFolder folder = journalFolderLocalService.getFolder(folderId);
JournalFolderPermission.check(
getPermissionChecker(), folder, ActionKeys.UPDATE);
return journalFolderLocalService.updateFolder(
getUserId(), groupId, folderId, parentFolderId, name, description,
mergeWithParentFolder, serviceContext);
}
@Override
public JournalFolder updateFolder(
long groupId, long folderId, long parentFolderId, String name,
String description, long[] ddmStructureIds, int restrictionType,
boolean mergeWithParentFolder, ServiceContext serviceContext)
throws PortalException {
JournalFolderPermission.check(
getPermissionChecker(), groupId, folderId, ActionKeys.UPDATE);
return journalFolderLocalService.updateFolder(
getUserId(), groupId, folderId, parentFolderId, name, description,
ddmStructureIds, restrictionType, mergeWithParentFolder,
serviceContext);
}
protected List<DDMStructure> filterStructures(
List<DDMStructure> ddmStructures)
throws PortalException {
PermissionChecker permissionChecker = getPermissionChecker();
ddmStructures = ListUtil.copy(ddmStructures);
Iterator<DDMStructure> itr = ddmStructures.iterator();
while (itr.hasNext()) {
DDMStructure ddmStructure = itr.next();
if (!DDMStructurePermission.contains(
permissionChecker, ddmStructure, ActionKeys.VIEW)) {
itr.remove();
}
}
return ddmStructures;
}
}