/**
* Copyright (c) 2000-present Liferay, Inc. All rights reserved.
*
* This library is free software; you can redistribute it and/or modify it under
* the terms of the GNU Lesser General Public License as published by the Free
* Software Foundation; either version 2.1 of the License, or (at your option)
* any later version.
*
* This library is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
* details.
*/
package com.liferay.document.library.internal.exportimport.data.handler;
import com.liferay.document.library.kernel.model.DLFileEntryType;
import com.liferay.document.library.kernel.model.DLFileEntryTypeConstants;
import com.liferay.document.library.kernel.model.DLFolder;
import com.liferay.document.library.kernel.model.DLFolderConstants;
import com.liferay.document.library.kernel.service.DLAppLocalService;
import com.liferay.document.library.kernel.service.DLFileEntryTypeLocalService;
import com.liferay.document.library.kernel.service.DLFolderLocalService;
import com.liferay.exportimport.data.handler.base.BaseStagedModelDataHandler;
import com.liferay.exportimport.kernel.lar.ExportImportPathUtil;
import com.liferay.exportimport.kernel.lar.PortletDataContext;
import com.liferay.exportimport.kernel.lar.PortletDataException;
import com.liferay.exportimport.kernel.lar.StagedModelDataHandler;
import com.liferay.exportimport.kernel.lar.StagedModelDataHandlerUtil;
import com.liferay.exportimport.kernel.lar.StagedModelModifiedDateComparator;
import com.liferay.portal.kernel.dao.orm.QueryUtil;
import com.liferay.portal.kernel.exception.PortalException;
import com.liferay.portal.kernel.model.Repository;
import com.liferay.portal.kernel.model.RepositoryEntry;
import com.liferay.portal.kernel.repository.model.FileEntry;
import com.liferay.portal.kernel.repository.model.Folder;
import com.liferay.portal.kernel.service.RepositoryLocalService;
import com.liferay.portal.kernel.service.ServiceContext;
import com.liferay.portal.kernel.trash.TrashHandler;
import com.liferay.portal.kernel.trash.TrashHandlerRegistryUtil;
import com.liferay.portal.kernel.util.GetterUtil;
import com.liferay.portal.kernel.util.MapUtil;
import com.liferay.portal.kernel.util.Portal;
import com.liferay.portal.kernel.util.StringPool;
import com.liferay.portal.kernel.util.StringUtil;
import com.liferay.portal.kernel.util.Validator;
import com.liferay.portal.kernel.xml.Element;
import com.liferay.portal.repository.liferayrepository.model.LiferayFolder;
import com.liferay.portal.repository.portletrepository.PortletRepository;
import com.liferay.portlet.documentlibrary.lar.FileEntryUtil;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import org.osgi.service.component.annotations.Component;
import org.osgi.service.component.annotations.Reference;
/**
* @author Mate Thurzo
*/
@Component(immediate = true, service = StagedModelDataHandler.class)
public class FolderStagedModelDataHandler
extends BaseStagedModelDataHandler<Folder> {
public static final String[] CLASS_NAMES = {
DLFolder.class.getName(), Folder.class.getName(),
LiferayFolder.class.getName()
};
@Override
public void deleteStagedModel(Folder folder) throws PortalException {
_dlAppLocalService.deleteFolder(folder.getFolderId());
}
@Override
public void deleteStagedModel(
String uuid, long groupId, String className, String extraData)
throws PortalException {
Folder folder = fetchStagedModelByUuidAndGroupId(uuid, groupId);
if (folder != null) {
deleteStagedModel(folder);
}
}
@Override
public Folder fetchStagedModelByUuidAndGroupId(String uuid, long groupId) {
return FolderUtil.fetchByUUID_R(uuid, groupId);
}
@Override
public List<Folder> fetchStagedModelsByUuidAndCompanyId(
String uuid, long companyId) {
List<DLFolder> dlFolders =
_dlFolderLocalService.getDLFoldersByUuidAndCompanyId(
uuid, companyId, QueryUtil.ALL_POS, QueryUtil.ALL_POS,
new StagedModelModifiedDateComparator<DLFolder>());
List<Folder> folders = new ArrayList<>();
for (DLFolder dlFolder : dlFolders) {
folders.add(new LiferayFolder(dlFolder));
}
return folders;
}
@Override
public String[] getClassNames() {
return CLASS_NAMES;
}
@Override
public String getDisplayName(Folder folder) {
return folder.getName();
}
@Override
public void restoreStagedModel(
PortletDataContext portletDataContext, Folder stagedModel)
throws PortletDataException {
try {
doRestoreStagedModel(portletDataContext, stagedModel);
}
catch (PortletDataException pde) {
throw pde;
}
catch (Exception e) {
throw new PortletDataException(e);
}
}
@Override
protected void doExportStagedModel(
PortletDataContext portletDataContext, Folder folder)
throws Exception {
Element folderElement = portletDataContext.getExportDataElement(folder);
String folderPath = ExportImportPathUtil.getModelPath(folder);
if (!folder.isDefaultRepository()) {
Repository repository = _repositoryLocalService.getRepository(
folder.getRepositoryId());
StagedModelDataHandlerUtil.exportReferenceStagedModel(
portletDataContext, folder, repository,
PortletDataContext.REFERENCE_TYPE_STRONG);
portletDataContext.addClassedModel(
folderElement, folderPath, folder);
long portletRepositoryClassNameId = _portal.getClassNameId(
PortletRepository.class.getName());
if (repository.getClassNameId() != portletRepositoryClassNameId) {
return;
}
}
if (folder.getParentFolderId() !=
DLFolderConstants.DEFAULT_PARENT_FOLDER_ID) {
StagedModelDataHandlerUtil.exportReferenceStagedModel(
portletDataContext, folder, folder.getParentFolder(),
PortletDataContext.REFERENCE_TYPE_PARENT);
}
exportFolderFileEntryTypes(portletDataContext, folderElement, folder);
portletDataContext.addClassedModel(
folderElement, folderPath, folder, DLFolder.class);
}
@Override
protected void doImportMissingReference(
PortletDataContext portletDataContext, String uuid, long groupId,
long folderId)
throws Exception {
Folder existingFolder = fetchMissingReference(uuid, groupId);
Map<Long, Long> folderIds =
(Map<Long, Long>)portletDataContext.getNewPrimaryKeysMap(
Folder.class);
folderIds.put(folderId, existingFolder.getFolderId());
}
@Override
protected void doImportStagedModel(
PortletDataContext portletDataContext, Folder folder)
throws Exception {
Map<Long, Long> folderIdsAndRepositoryEntryIds =
(Map<Long, Long>)portletDataContext.getNewPrimaryKeysMap(
Folder.class + ".folderIdsAndRepositoryEntryIds");
if (!folder.isDefaultRepository()) {
Map<Long, Long> repositoryEntryIds =
(Map<Long, Long>)portletDataContext.getNewPrimaryKeysMap(
RepositoryEntry.class);
folderIdsAndRepositoryEntryIds.put(
folder.getFolderId(),
repositoryEntryIds.get(folder.getFolderId()));
return;
}
long userId = portletDataContext.getUserId(folder.getUserUuid());
Map<Long, Long> folderIds =
(Map<Long, Long>)portletDataContext.getNewPrimaryKeysMap(
Folder.class);
long parentFolderId = MapUtil.getLong(
folderIds, folder.getParentFolderId(), folder.getParentFolderId());
ServiceContext serviceContext = portletDataContext.createServiceContext(
folder, DLFolder.class);
serviceContext.setUserId(userId);
Folder importedFolder = null;
if (portletDataContext.isDataStrategyMirror()) {
Folder existingFolder = fetchStagedModelByUuidAndGroupId(
folder.getUuid(), portletDataContext.getScopeGroupId());
if (existingFolder == null) {
String name = getFolderName(
null, portletDataContext.getScopeGroupId(), parentFolderId,
folder.getName(), 2);
serviceContext.setUuid(folder.getUuid());
importedFolder = _dlAppLocalService.addFolder(
userId, portletDataContext.getScopeGroupId(),
parentFolderId, name, folder.getDescription(),
serviceContext);
}
else {
String name = getFolderName(
folder.getUuid(), portletDataContext.getScopeGroupId(),
parentFolderId, folder.getName(), 2);
importedFolder = _dlAppLocalService.updateFolder(
existingFolder.getFolderId(), parentFolderId, name,
folder.getDescription(), serviceContext);
}
}
else {
String name = getFolderName(
null, portletDataContext.getScopeGroupId(), parentFolderId,
folder.getName(), 2);
importedFolder = _dlAppLocalService.addFolder(
userId, portletDataContext.getScopeGroupId(), parentFolderId,
name, folder.getDescription(), serviceContext);
}
Element folderElement = portletDataContext.getImportDataElement(folder);
importFolderFileEntryTypes(
portletDataContext, folderElement, folder, importedFolder,
serviceContext);
portletDataContext.importClassedModel(
folder, importedFolder, DLFolder.class);
folderIds.put(folder.getFolderId(), importedFolder.getFolderId());
folderIdsAndRepositoryEntryIds.put(
folder.getFolderId(), importedFolder.getFolderId());
}
@Override
protected void doRestoreStagedModel(
PortletDataContext portletDataContext, Folder folder)
throws Exception {
long userId = portletDataContext.getUserId(folder.getUserUuid());
Folder existingFolder = fetchStagedModelByUuidAndGroupId(
folder.getUuid(), portletDataContext.getScopeGroupId());
if ((existingFolder == null) ||
!(existingFolder.getModel() instanceof DLFolder)) {
return;
}
DLFolder dlFolder = (DLFolder)existingFolder.getModel();
if (!dlFolder.isInTrash()) {
return;
}
TrashHandler trashHandler = TrashHandlerRegistryUtil.getTrashHandler(
DLFolder.class.getName());
if (trashHandler.isRestorable(existingFolder.getFolderId())) {
trashHandler.restoreTrashEntry(
userId, existingFolder.getFolderId());
}
}
protected void exportFolderFileEntryTypes(
PortletDataContext portletDataContext, Element folderElement,
Folder folder)
throws Exception {
if (!folder.isDefaultRepository()) {
return;
}
List<DLFileEntryType> dlFileEntryTypes =
_dlFileEntryTypeLocalService.getFolderFileEntryTypes(
new long[] {
portletDataContext.getCompanyGroupId(),
portletDataContext.getScopeGroupId()
},
folder.getFolderId(), false);
long defaultFileEntryTypeId =
_dlFileEntryTypeLocalService.getDefaultFileEntryTypeId(
folder.getFolderId());
String defaultFileEntryTypeUuid = StringPool.BLANK;
for (DLFileEntryType dlFileEntryType : dlFileEntryTypes) {
if (dlFileEntryType.getFileEntryTypeId() ==
DLFileEntryTypeConstants.
FILE_ENTRY_TYPE_ID_BASIC_DOCUMENT) {
folderElement.addAttribute("basic-document", "true");
continue;
}
if (defaultFileEntryTypeId ==
dlFileEntryType.getFileEntryTypeId()) {
defaultFileEntryTypeUuid = dlFileEntryType.getUuid();
}
if (dlFileEntryType.isExportable()) {
StagedModelDataHandlerUtil.exportReferenceStagedModel(
portletDataContext, folder, dlFileEntryType,
PortletDataContext.REFERENCE_TYPE_STRONG);
}
}
folderElement.addAttribute(
"defaultFileEntryTypeUuid", defaultFileEntryTypeUuid);
}
protected String getFolderName(
String uuid, long groupId, long parentFolderId, String name,
int count)
throws Exception {
Folder folder = FolderUtil.fetchByR_P_N(groupId, parentFolderId, name);
if (folder == null) {
FileEntry fileEntry = FileEntryUtil.fetchByR_F_T(
groupId, parentFolderId, name);
if (fileEntry == null) {
return name;
}
}
else if (Validator.isNotNull(uuid) && uuid.equals(folder.getUuid())) {
return name;
}
name = StringUtil.appendParentheticalSuffix(name, count);
return getFolderName(uuid, groupId, parentFolderId, name, ++count);
}
protected void importFolderFileEntryTypes(
PortletDataContext portletDataContext, Element folderElement,
Folder folder, Folder importedFolder, ServiceContext serviceContext)
throws Exception {
if (!folder.isDefaultRepository()) {
return;
}
List<Long> currentFolderFileEntryTypeIds = new ArrayList<>();
String defaultFileEntryTypeUuid = GetterUtil.getString(
folderElement.attributeValue("defaultFileEntryTypeUuid"));
long defaultFileEntryTypeId = 0;
List<Element> referenceElements =
portletDataContext.getReferenceElements(
folder, DLFileEntryType.class);
for (Element referenceElement : referenceElements) {
long referenceDLFileEntryTypeId = GetterUtil.getLong(
referenceElement.attributeValue("class-pk"));
String referenceDLFileEntryTypeUuid =
referenceElement.attributeValue("uuid");
Map<Long, Long> dlFileEntryTypeIds =
(Map<Long, Long>)portletDataContext.getNewPrimaryKeysMap(
DLFileEntryType.class);
long dlFileEntryTypeId = MapUtil.getLong(
dlFileEntryTypeIds, referenceDLFileEntryTypeId,
referenceDLFileEntryTypeId);
DLFileEntryType existingDLFileEntryType =
_dlFileEntryTypeLocalService.fetchDLFileEntryType(
dlFileEntryTypeId);
if (existingDLFileEntryType == null) {
continue;
}
currentFolderFileEntryTypeIds.add(
existingDLFileEntryType.getFileEntryTypeId());
if (defaultFileEntryTypeUuid.equals(referenceDLFileEntryTypeUuid)) {
defaultFileEntryTypeId =
existingDLFileEntryType.getFileEntryTypeId();
}
}
if (GetterUtil.getBoolean(
folderElement.attributeValue("basic-document"))) {
currentFolderFileEntryTypeIds.add(
DLFileEntryTypeConstants.FILE_ENTRY_TYPE_ID_BASIC_DOCUMENT);
}
if (!currentFolderFileEntryTypeIds.isEmpty()) {
DLFolder dlFolder = (DLFolder)importedFolder.getModel();
dlFolder.setDefaultFileEntryTypeId(defaultFileEntryTypeId);
dlFolder.setRestrictionType(
DLFolderConstants.
RESTRICTION_TYPE_FILE_ENTRY_TYPES_AND_WORKFLOW);
_dlFolderLocalService.updateDLFolder(dlFolder);
_dlFileEntryTypeLocalService.updateFolderFileEntryTypes(
dlFolder, currentFolderFileEntryTypeIds, defaultFileEntryTypeId,
serviceContext);
}
}
@Reference(unbind = "-")
protected void setDLAppLocalService(DLAppLocalService dlAppLocalService) {
_dlAppLocalService = dlAppLocalService;
}
@Reference(unbind = "-")
protected void setDLFileEntryTypeLocalService(
DLFileEntryTypeLocalService dlFileEntryTypeLocalService) {
_dlFileEntryTypeLocalService = dlFileEntryTypeLocalService;
}
@Reference(unbind = "-")
protected void setDLFolderLocalService(
DLFolderLocalService dlFolderLocalService) {
_dlFolderLocalService = dlFolderLocalService;
}
@Reference(unbind = "-")
protected void setRepositoryLocalService(
RepositoryLocalService repositoryLocalService) {
_repositoryLocalService = repositoryLocalService;
}
@Override
protected void validateExport(
PortletDataContext portletDataContext, Folder folder)
throws PortletDataException {
if ((folder.getGroupId() != portletDataContext.getGroupId()) &&
(folder.getGroupId() != portletDataContext.getScopeGroupId())) {
PortletDataException pde = new PortletDataException(
PortletDataException.INVALID_GROUP);
pde.setStagedModel(folder);
throw pde;
}
if (folder instanceof LiferayFolder) {
LiferayFolder liferayFolder = (LiferayFolder)folder;
DLFolder dlFolder = (DLFolder)liferayFolder.getModel();
if (dlFolder.isInTrash() || dlFolder.isInTrashContainer()) {
PortletDataException pde = new PortletDataException(
PortletDataException.STATUS_IN_TRASH);
pde.setStagedModel(folder);
throw pde;
}
}
}
private DLAppLocalService _dlAppLocalService;
private DLFileEntryTypeLocalService _dlFileEntryTypeLocalService;
private DLFolderLocalService _dlFolderLocalService;
@Reference
private Portal _portal;
private RepositoryLocalService _repositoryLocalService;
}