/** * 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.DuplicateFileEntryTypeException; import com.liferay.document.library.kernel.exception.NoSuchFolderException; import com.liferay.document.library.kernel.exception.NoSuchMetadataSetException; import com.liferay.document.library.kernel.exception.RequiredFileEntryTypeException; import com.liferay.document.library.kernel.model.DLFileEntry; import com.liferay.document.library.kernel.model.DLFileEntryMetadata; import com.liferay.document.library.kernel.model.DLFileEntryType; import com.liferay.document.library.kernel.model.DLFileEntryTypeConstants; import com.liferay.document.library.kernel.model.DLFileVersion; import com.liferay.document.library.kernel.model.DLFolder; import com.liferay.document.library.kernel.model.DLFolderConstants; import com.liferay.document.library.kernel.util.DLUtil; import com.liferay.dynamic.data.mapping.kernel.DDMForm; import com.liferay.dynamic.data.mapping.kernel.DDMFormField; import com.liferay.dynamic.data.mapping.kernel.DDMStructure; import com.liferay.dynamic.data.mapping.kernel.DDMStructureLink; import com.liferay.dynamic.data.mapping.kernel.DDMStructureLinkManagerUtil; import com.liferay.dynamic.data.mapping.kernel.DDMStructureManager; import com.liferay.dynamic.data.mapping.kernel.DDMStructureManagerUtil; import com.liferay.dynamic.data.mapping.kernel.StorageEngineManager; import com.liferay.dynamic.data.mapping.kernel.StructureDefinitionException; import com.liferay.portal.kernel.exception.PortalException; import com.liferay.portal.kernel.log.Log; import com.liferay.portal.kernel.log.LogFactoryUtil; import com.liferay.portal.kernel.model.SystemEventConstants; import com.liferay.portal.kernel.model.User; import com.liferay.portal.kernel.service.ServiceContext; import com.liferay.portal.kernel.service.permission.ModelPermissions; import com.liferay.portal.kernel.systemevent.SystemEvent; import com.liferay.portal.kernel.util.ArrayUtil; import com.liferay.portal.kernel.util.LocaleUtil; import com.liferay.portal.kernel.util.OrderByComparator; import com.liferay.portal.kernel.util.PortalUtil; import com.liferay.portal.kernel.util.SetUtil; import com.liferay.portal.kernel.util.SortedArrayList; import com.liferay.portal.kernel.util.StringUtil; import com.liferay.portal.kernel.util.Validator; import com.liferay.portal.kernel.uuid.PortalUUIDUtil; import com.liferay.portal.repository.liferayrepository.model.LiferayFileEntry; import com.liferay.portal.repository.liferayrepository.model.LiferayFileVersion; import com.liferay.portlet.documentlibrary.service.base.DLFileEntryTypeLocalServiceBaseImpl; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Locale; import java.util.Map; import java.util.Set; /** * Provides the local service for accessing, adding, cascading, deleting, and * updating file and folder file entry types. * * @author Alexander Chow * @author Sergio González */ public class DLFileEntryTypeLocalServiceImpl extends DLFileEntryTypeLocalServiceBaseImpl { @Override public void addDDMStructureLinks( long fileEntryTypeId, Set<Long> ddmStructureIds) { long classNameId = classNameLocalService.getClassNameId( DLFileEntryType.class); for (long ddmStructureId : ddmStructureIds) { DDMStructureLinkManagerUtil.addStructureLink( classNameId, fileEntryTypeId, ddmStructureId); } } @Override public DLFileEntryType addFileEntryType( long userId, long groupId, String fileEntryTypeKey, Map<Locale, String> nameMap, Map<Locale, String> descriptionMap, long[] ddmStructureIds, ServiceContext serviceContext) throws PortalException { User user = userPersistence.findByPrimaryKey(userId); if (Validator.isNull(fileEntryTypeKey)) { fileEntryTypeKey = String.valueOf(counterLocalService.increment()); } else { fileEntryTypeKey = StringUtil.toUpperCase(fileEntryTypeKey.trim()); } String fileEntryTypeUuid = serviceContext.getUuid(); if (Validator.isNull(fileEntryTypeUuid)) { fileEntryTypeUuid = PortalUUIDUtil.generate(); } long fileEntryTypeId = counterLocalService.increment(); ddmStructureIds = _updateDDMStructure( userId, fileEntryTypeUuid, fileEntryTypeId, groupId, nameMap, descriptionMap, ddmStructureIds, serviceContext); validate(fileEntryTypeId, groupId, fileEntryTypeKey, ddmStructureIds); DLFileEntryType dlFileEntryType = dlFileEntryTypePersistence.create( fileEntryTypeId); dlFileEntryType.setUuid(fileEntryTypeUuid); dlFileEntryType.setGroupId(groupId); dlFileEntryType.setCompanyId(user.getCompanyId()); dlFileEntryType.setUserId(user.getUserId()); dlFileEntryType.setUserName(user.getFullName()); dlFileEntryType.setFileEntryTypeKey(fileEntryTypeKey); dlFileEntryType.setNameMap(nameMap); dlFileEntryType.setDescriptionMap(descriptionMap); dlFileEntryTypePersistence.update(dlFileEntryType); addDDMStructureLinks( fileEntryTypeId, SetUtil.fromArray(ddmStructureIds)); if (serviceContext.isAddGroupPermissions() || serviceContext.isAddGuestPermissions()) { addFileEntryTypeResources( dlFileEntryType, serviceContext.isAddGroupPermissions(), serviceContext.isAddGuestPermissions()); } else { addFileEntryTypeResources( dlFileEntryType, serviceContext.getModelPermissions()); } return dlFileEntryType; } @Override public DLFileEntryType addFileEntryType( long userId, long groupId, String name, String description, long[] ddmStructureIds, ServiceContext serviceContext) throws PortalException { Map<Locale, String> nameMap = new HashMap<>(); nameMap.put(LocaleUtil.getSiteDefault(), name); Map<Locale, String> descriptionMap = new HashMap<>(); descriptionMap.put(LocaleUtil.getSiteDefault(), description); return addFileEntryType( userId, groupId, null, nameMap, descriptionMap, ddmStructureIds, serviceContext); } @Override public void cascadeFileEntryTypes(long userId, DLFolder dlFolder) throws PortalException { long[] groupIds = PortalUtil.getCurrentAndAncestorSiteGroupIds( dlFolder.getGroupId()); List<DLFileEntryType> dlFileEntryTypes = getFolderFileEntryTypes( groupIds, dlFolder.getFolderId(), true); List<Long> fileEntryTypeIds = getFileEntryTypeIds(dlFileEntryTypes); long defaultFileEntryTypeId = getDefaultFileEntryTypeId( dlFolder.getFolderId()); ServiceContext serviceContext = new ServiceContext(); serviceContext.setCompanyId(dlFolder.getCompanyId()); serviceContext.setScopeGroupId(dlFolder.getGroupId()); serviceContext.setUserId(userId); cascadeFileEntryTypes( userId, dlFolder.getGroupId(), dlFolder.getFolderId(), defaultFileEntryTypeId, fileEntryTypeIds, serviceContext); } @Override @SystemEvent( action = SystemEventConstants.ACTION_SKIP, type = SystemEventConstants.TYPE_DELETE ) public void deleteFileEntryType(DLFileEntryType dlFileEntryType) throws PortalException { if (dlFileEntryPersistence.countByFileEntryTypeId( dlFileEntryType.getFileEntryTypeId()) > 0) { throw new RequiredFileEntryTypeException( "There are file entries of file entry type " + dlFileEntryType.getFileEntryTypeId()); } DDMStructure ddmStructure = DDMStructureManagerUtil.fetchStructure( dlFileEntryType.getGroupId(), classNameLocalService.getClassNameId(DLFileEntryMetadata.class), DLUtil.getDDMStructureKey(dlFileEntryType)); if (ddmStructure == null) { ddmStructure = DDMStructureManagerUtil.fetchStructure( dlFileEntryType.getGroupId(), classNameLocalService.getClassNameId(DLFileEntryMetadata.class), DLUtil.getDeprecatedDDMStructureKey(dlFileEntryType)); } if (ddmStructure != null) { long classNameId = classNameLocalService.getClassNameId( DLFileEntryType.class); DDMStructureLinkManagerUtil.deleteStructureLink( classNameId, dlFileEntryType.getFileEntryTypeId(), ddmStructure.getStructureId()); DDMStructureManagerUtil.deleteStructure( ddmStructure.getStructureId()); } dlFileEntryTypePersistence.remove(dlFileEntryType); } @Override public void deleteFileEntryType(long fileEntryTypeId) throws PortalException { DLFileEntryType dlFileEntryType = dlFileEntryTypePersistence.findByPrimaryKey(fileEntryTypeId); dlFileEntryTypeLocalService.deleteFileEntryType(dlFileEntryType); } @Override public void deleteFileEntryTypes(long groupId) throws PortalException { List<DLFileEntryType> dlFileEntryTypes = dlFileEntryTypePersistence.findByGroupId(groupId); for (DLFileEntryType dlFileEntryType : dlFileEntryTypes) { dlFileEntryTypeLocalService.deleteFileEntryType(dlFileEntryType); } } @Override public DLFileEntryType fetchFileEntryType(long fileEntryTypeId) { return dlFileEntryTypePersistence.fetchByPrimaryKey(fileEntryTypeId); } @Override public DLFileEntryType fetchFileEntryType( long groupId, String fileEntryTypeKey) { fileEntryTypeKey = StringUtil.toUpperCase( StringUtil.trim(fileEntryTypeKey)); return dlFileEntryTypePersistence.fetchByG_F(groupId, fileEntryTypeKey); } @Override public long getDefaultFileEntryTypeId(long folderId) throws PortalException { folderId = getFileEntryTypesPrimaryFolderId(folderId); if (folderId != DLFolderConstants.DEFAULT_PARENT_FOLDER_ID) { DLFolder dlFolder = dlFolderPersistence.findByPrimaryKey(folderId); return dlFolder.getDefaultFileEntryTypeId(); } else { return 0; } } @Override public DLFileEntryType getFileEntryType(long fileEntryTypeId) throws PortalException { return dlFileEntryTypePersistence.findByPrimaryKey(fileEntryTypeId); } @Override public DLFileEntryType getFileEntryType( long groupId, String fileEntryTypeKey) throws PortalException { fileEntryTypeKey = StringUtil.toUpperCase( StringUtil.trim(fileEntryTypeKey)); return dlFileEntryTypePersistence.findByG_F(groupId, fileEntryTypeKey); } @Override public List<DLFileEntryType> getFileEntryTypes(long ddmStructureId) throws PortalException { List<DLFileEntryType> fileEntryTypes = new ArrayList<>(); long classNameId = classNameLocalService.getClassNameId( DLFileEntryType.class); List<DDMStructureLink> ddmStructureLinks = DDMStructureLinkManagerUtil.getClassNameStructureLinks(classNameId); for (DDMStructureLink ddmStructureLink : ddmStructureLinks) { if (ddmStructureId != ddmStructureLink.getStructureId()) { continue; } DLFileEntryType fileEntryType = getFileEntryType( ddmStructureLink.getClassPK()); fileEntryTypes.add(fileEntryType); } return fileEntryTypes; } @Override public List<DLFileEntryType> getFileEntryTypes(long[] groupIds) { return dlFileEntryTypePersistence.findByGroupId(groupIds); } @Override public List<DLFileEntryType> getFolderFileEntryTypes( long[] groupIds, long folderId, boolean inherited) throws PortalException { if (!inherited) { return dlFolderPersistence.getDLFileEntryTypes(folderId); } List<DLFileEntryType> dlFileEntryTypes = null; folderId = getFileEntryTypesPrimaryFolderId(folderId); if (folderId != DLFolderConstants.DEFAULT_PARENT_FOLDER_ID) { dlFileEntryTypes = dlFolderPersistence.getDLFileEntryTypes( folderId); } else { dlFileEntryTypes = new ArrayList<>(getFileEntryTypes(groupIds)); DLFileEntryType dlFileEntryType = dlFileEntryTypePersistence.findByPrimaryKey( DLFileEntryTypeConstants.FILE_ENTRY_TYPE_ID_BASIC_DOCUMENT); dlFileEntryTypes.add(0, dlFileEntryType); } return dlFileEntryTypes; } @Override public List<DLFileEntryType> search( long companyId, long[] groupIds, String keywords, boolean includeBasicFileEntryType, int start, int end, OrderByComparator<DLFileEntryType> orderByComparator) { return dlFileEntryTypeFinder.findByKeywords( companyId, groupIds, keywords, includeBasicFileEntryType, start, end, orderByComparator); } @Override public int searchCount( long companyId, long[] groupIds, String keywords, boolean includeBasicFileEntryType) { return dlFileEntryTypeFinder.countByKeywords( companyId, groupIds, keywords, includeBasicFileEntryType); } @Override public void unsetFolderFileEntryTypes(long folderId) { List<DLFileEntryType> dlFileEntryTypes = dlFolderPersistence.getDLFileEntryTypes(folderId); for (DLFileEntryType dlFileEntryType : dlFileEntryTypes) { dlFolderPersistence.removeDLFileEntryType( folderId, dlFileEntryType); } } @Override public void updateDDMStructureLinks( long fileEntryTypeId, Set<Long> ddmStructureIds) throws PortalException { Set<Long> existingDDMStructureLinkStructureIds = getExistingDDMStructureLinkStructureIds(fileEntryTypeId); deleteDDMStructureLinks( fileEntryTypeId, getStaleDDMStructureLinkStructureIds( ddmStructureIds, existingDDMStructureLinkStructureIds)); addDDMStructureLinks( fileEntryTypeId, getMissingDDMStructureLinkStructureIds( ddmStructureIds, existingDDMStructureLinkStructureIds)); } @Override public DLFileEntry updateFileEntryFileEntryType( DLFileEntry dlFileEntry, ServiceContext serviceContext) throws PortalException { long groupId = serviceContext.getScopeGroupId(); long folderId = DLFolderConstants.DEFAULT_PARENT_FOLDER_ID; DLFolder dlFolder = dlFolderPersistence.fetchByPrimaryKey( dlFileEntry.getFolderId()); if (dlFolder != null) { groupId = dlFolder.getGroupId(); folderId = dlFolder.getFolderId(); } List<DLFileEntryType> dlFileEntryTypes = getFolderFileEntryTypes( PortalUtil.getCurrentAndAncestorSiteGroupIds(groupId), folderId, true); List<Long> fileEntryTypeIds = getFileEntryTypeIds(dlFileEntryTypes); if (fileEntryTypeIds.contains(dlFileEntry.getFileEntryTypeId())) { return dlFileEntry; } long defaultFileEntryTypeId = getDefaultFileEntryTypeId(folderId); DLFileVersion dlFileVersion = dlFileVersionLocalService.getLatestFileVersion( dlFileEntry.getFileEntryId(), true); if (dlFileVersion.isPending()) { workflowInstanceLinkLocalService.deleteWorkflowInstanceLink( dlFileVersion.getCompanyId(), dlFileEntry.getGroupId(), DLFileEntry.class.getName(), dlFileVersion.getFileVersionId()); } return dlFileEntryLocalService.updateFileEntry( serviceContext.getUserId(), dlFileEntry.getFileEntryId(), null, null, null, null, null, false, defaultFileEntryTypeId, null, null, null, 0, serviceContext); } @Override public void updateFileEntryType( long userId, long fileEntryTypeId, Map<Locale, String> nameMap, Map<Locale, String> descriptionMap, long[] ddmStructureIds, ServiceContext serviceContext) throws PortalException { DLFileEntryType dlFileEntryType = dlFileEntryTypePersistence.findByPrimaryKey(fileEntryTypeId); ddmStructureIds = _updateDDMStructure( userId, dlFileEntryType.getUuid(), fileEntryTypeId, dlFileEntryType.getGroupId(), nameMap, descriptionMap, ddmStructureIds, serviceContext); validate( fileEntryTypeId, dlFileEntryType.getGroupId(), dlFileEntryType.getFileEntryTypeKey(), ddmStructureIds); dlFileEntryType.setNameMap(nameMap); dlFileEntryType.setDescriptionMap(descriptionMap); dlFileEntryTypePersistence.update(dlFileEntryType); updateDDMStructureLinks( fileEntryTypeId, SetUtil.fromArray(ddmStructureIds)); } @Override public void updateFileEntryType( long userId, long fileEntryTypeId, String name, String description, long[] ddmStructureIds, ServiceContext serviceContext) throws PortalException { Map<Locale, String> nameMap = new HashMap<>(); nameMap.put(LocaleUtil.getSiteDefault(), name); Map<Locale, String> descriptionMap = new HashMap<>(); descriptionMap.put(LocaleUtil.getSiteDefault(), description); updateFileEntryType( userId, fileEntryTypeId, nameMap, descriptionMap, ddmStructureIds, serviceContext); } @Override public void updateFolderFileEntryTypes( DLFolder dlFolder, List<Long> fileEntryTypeIds, long defaultFileEntryTypeId, ServiceContext serviceContext) { List<Long> originalFileEntryTypeIds = getFileEntryTypeIds( dlFolderPersistence.getDLFileEntryTypes(dlFolder.getFolderId())); if (fileEntryTypeIds.equals(originalFileEntryTypeIds)) { return; } for (Long fileEntryTypeId : fileEntryTypeIds) { if (!originalFileEntryTypeIds.contains(fileEntryTypeId)) { dlFolderPersistence.addDLFileEntryType( dlFolder.getFolderId(), fileEntryTypeId); } } for (Long originalFileEntryTypeId : originalFileEntryTypeIds) { if (!fileEntryTypeIds.contains(originalFileEntryTypeId)) { dlFolderPersistence.removeDLFileEntryType( dlFolder.getFolderId(), originalFileEntryTypeId); workflowDefinitionLinkLocalService.deleteWorkflowDefinitionLink( dlFolder.getCompanyId(), dlFolder.getGroupId(), DLFolder.class.getName(), dlFolder.getFolderId(), originalFileEntryTypeId); } } } protected void addFileEntryTypeResources( DLFileEntryType dlFileEntryType, boolean addGroupPermissions, boolean addGuestPermissions) throws PortalException { resourceLocalService.addResources( dlFileEntryType.getCompanyId(), dlFileEntryType.getGroupId(), dlFileEntryType.getUserId(), DLFileEntryType.class.getName(), dlFileEntryType.getFileEntryTypeId(), false, addGroupPermissions, addGuestPermissions); } protected void addFileEntryTypeResources( DLFileEntryType dlFileEntryType, ModelPermissions modelPermissions) throws PortalException { resourceLocalService.addModelResources( dlFileEntryType.getCompanyId(), dlFileEntryType.getGroupId(), dlFileEntryType.getUserId(), DLFileEntryType.class.getName(), dlFileEntryType.getFileEntryTypeId(), modelPermissions); } protected void cascadeFileEntryTypes( long userId, long groupId, long folderId, long defaultFileEntryTypeId, List<Long> fileEntryTypeIds, ServiceContext serviceContext) throws PortalException { List<DLFileEntry> dlFileEntries = dlFileEntryPersistence.findByG_F( groupId, folderId); for (DLFileEntry dlFileEntry : dlFileEntries) { Long fileEntryTypeId = dlFileEntry.getFileEntryTypeId(); if (fileEntryTypeIds.contains(fileEntryTypeId)) { continue; } DLFileVersion dlFileVersion = dlFileVersionLocalService.getLatestFileVersion( dlFileEntry.getFileEntryId(), true); if (dlFileVersion.isPending()) { workflowInstanceLinkLocalService.deleteWorkflowInstanceLink( dlFileVersion.getCompanyId(), groupId, DLFileEntry.class.getName(), dlFileVersion.getFileVersionId()); } dlFileEntryLocalService.updateFileEntryType( userId, dlFileEntry.getFileEntryId(), defaultFileEntryTypeId, serviceContext); dlAppHelperLocalService.updateAsset( userId, new LiferayFileEntry(dlFileEntry), new LiferayFileVersion(dlFileVersion), serviceContext.getAssetCategoryIds(), serviceContext.getAssetTagNames(), serviceContext.getAssetLinkEntryIds()); } List<DLFolder> subfolders = dlFolderPersistence.findByG_M_P_H( groupId, false, folderId, false); for (DLFolder subfolder : subfolders) { long subfolderId = subfolder.getFolderId(); if (subfolder.getRestrictionType() == DLFolderConstants.RESTRICTION_TYPE_INHERIT) { continue; } cascadeFileEntryTypes( userId, groupId, subfolderId, defaultFileEntryTypeId, fileEntryTypeIds, serviceContext); } } protected void deleteDDMStructureLinks( long fileEntryTypeId, Set<Long> ddmStructureIds) throws PortalException { long classNameId = classNameLocalService.getClassNameId( DLFileEntryType.class); for (long ddmStructureId : ddmStructureIds) { DDMStructureLinkManagerUtil.deleteStructureLink( classNameId, fileEntryTypeId, ddmStructureId); } } protected void fixDDMStructureKey( String fileEntryTypeUuid, long fileEntryTypeId, long groupId) throws PortalException { DDMStructure ddmStructure = DDMStructureManagerUtil.fetchStructure( groupId, classNameLocalService.getClassNameId(DLFileEntryMetadata.class), DLUtil.getDeprecatedDDMStructureKey(fileEntryTypeId)); if (ddmStructure != null) { DDMStructureManagerUtil.updateStructureKey( ddmStructure.getStructureId(), DLUtil.getDDMStructureKey(fileEntryTypeUuid)); } } protected Set<Long> getExistingDDMStructureLinkStructureIds( long fileEntryTypeId) { long classNameId = classNameLocalService.getClassNameId( DLFileEntryType.class); Set<Long> existingDDMStructureLinkStructureIds = new HashSet<>(); List<DDMStructureLink> structureLinks = DDMStructureLinkManagerUtil.getStructureLinks( classNameId, fileEntryTypeId); for (DDMStructureLink structureLink : structureLinks) { existingDDMStructureLinkStructureIds.add( structureLink.getStructureId()); } return existingDDMStructureLinkStructureIds; } protected List<Long> getFileEntryTypeIds( List<DLFileEntryType> dlFileEntryTypes) { List<Long> fileEntryTypeIds = new SortedArrayList<>(); for (DLFileEntryType dlFileEntryType : dlFileEntryTypes) { fileEntryTypeIds.add(dlFileEntryType.getFileEntryTypeId()); } return fileEntryTypeIds; } protected long getFileEntryTypesPrimaryFolderId(long folderId) throws NoSuchFolderException { while (folderId != DLFolderConstants.DEFAULT_PARENT_FOLDER_ID) { DLFolder dlFolder = dlFolderPersistence.findByPrimaryKey(folderId); if (dlFolder.getRestrictionType() == DLFolderConstants. RESTRICTION_TYPE_FILE_ENTRY_TYPES_AND_WORKFLOW) { break; } folderId = dlFolder.getParentFolderId(); } return folderId; } protected Set<Long> getMissingDDMStructureLinkStructureIds( Set<Long> ddmStructureIds, Set<Long> existingDDMStructureIds) { Set<Long> missingDDMStructureLinkStructureIds = new HashSet<>( ddmStructureIds); missingDDMStructureLinkStructureIds.removeAll(existingDDMStructureIds); return missingDDMStructureLinkStructureIds; } protected Set<Long> getStaleDDMStructureLinkStructureIds( Set<Long> ddmStructureIds, Set<Long> existingDDMStructureIds) { Set<Long> staleDDMStructureLinkStructureIds = new HashSet<>( existingDDMStructureIds); staleDDMStructureLinkStructureIds.removeAll(ddmStructureIds); return staleDDMStructureLinkStructureIds; } /** * @deprecated As of 7.0.0, replaced by {@link #_updateDDMStructure(long, * String, long, long, Map, Map, long[], ServiceContext)} */ @Deprecated protected long updateDDMStructure( long userId, String fileEntryTypeUuid, long fileEntryTypeId, long groupId, Map<Locale, String> nameMap, Map<Locale, String> descriptionMap, ServiceContext serviceContext) throws PortalException { fixDDMStructureKey(fileEntryTypeUuid, fileEntryTypeId, groupId); String ddmStructureKey = DLUtil.getDDMStructureKey(fileEntryTypeUuid); DDMForm ddmForm = (DDMForm)serviceContext.getAttribute("ddmForm"); DDMStructure ddmStructure = DDMStructureManagerUtil.fetchStructure( groupId, classNameLocalService.getClassNameId(DLFileEntryMetadata.class), ddmStructureKey); if ((ddmStructure != null) && (ddmForm == null)) { ddmForm = ddmStructure.getDDMForm(); } if (ddmForm == null) { return 0; } List<DDMFormField> ddmFormFields = ddmForm.getDDMFormFields(); if (ddmFormFields.isEmpty()) { return 0; } try { if (ddmStructure == null) { ddmStructure = DDMStructureManagerUtil.addStructure( userId, groupId, null, classNameLocalService.getClassNameId( DLFileEntryMetadata.class), ddmStructureKey, nameMap, descriptionMap, ddmForm, StorageEngineManager.STORAGE_TYPE_DEFAULT, DDMStructureManager.STRUCTURE_TYPE_AUTO, serviceContext); } else { ddmStructure = DDMStructureManagerUtil.updateStructure( userId, ddmStructure.getStructureId(), ddmStructure.getParentStructureId(), nameMap, descriptionMap, ddmForm, serviceContext); } return ddmStructure.getStructureId(); } catch (StructureDefinitionException sde) { if (_log.isWarnEnabled()) { _log.warn(sde, sde); } if (ddmStructure != null) { DDMStructureManagerUtil.deleteStructure( ddmStructure.getStructureId()); } } return 0; } protected void validate( long fileEntryTypeId, long groupId, String fileEntryTypeKey, long[] ddmStructureIds) throws PortalException { DLFileEntryType dlFileEntryType = dlFileEntryTypePersistence.fetchByG_F( groupId, fileEntryTypeKey); if ((dlFileEntryType != null) && (dlFileEntryType.getFileEntryTypeId() != fileEntryTypeId)) { throw new DuplicateFileEntryTypeException(fileEntryTypeKey); } if (ddmStructureIds.length == 0) { throw new NoSuchMetadataSetException("DDM structure IDs is empty"); } for (long ddmStructureId : ddmStructureIds) { DDMStructure ddmStructure = DDMStructureManagerUtil.fetchStructure( ddmStructureId); if (ddmStructure == null) { throw new NoSuchMetadataSetException( "{ddmStructureId=" + ddmStructureId); } } } private void _deleteDDMStructure(long fileEntryTypeId, long ddmStructureId) throws PortalException { deleteDDMStructureLinks( fileEntryTypeId, Collections.singleton(ddmStructureId)); DDMStructureManagerUtil.deleteStructure(ddmStructureId); } private DDMForm _getDDMForm( DDMStructure ddmStructure, ServiceContext serviceContext) { DDMForm ddmForm = (DDMForm)serviceContext.getAttribute("ddmForm"); if (ddmForm != null) { return ddmForm; } if (ddmStructure != null) { return ddmStructure.getDDMForm(); } return null; } private boolean _isEmptyDDMForm(DDMForm ddmForm) { if (ddmForm == null) { return true; } List<DDMFormField> ddmFormFields = ddmForm.getDDMFormFields(); if (ddmFormFields.isEmpty()) { return true; } return false; } private long[] _updateDDMStructure( long userId, String fileEntryTypeUuid, long fileEntryTypeId, long groupId, Map<Locale, String> nameMap, Map<Locale, String> descriptionMap, long[] ddmStructureIds, ServiceContext serviceContext) throws PortalException { DDMStructure ddmStructure = null; try { fixDDMStructureKey(fileEntryTypeUuid, fileEntryTypeId, groupId); String ddmStructureKey = DLUtil.getDDMStructureKey( fileEntryTypeUuid); ddmStructure = DDMStructureManagerUtil.fetchStructure( groupId, classNameLocalService.getClassNameId(DLFileEntryMetadata.class), ddmStructureKey); DDMForm ddmForm = _getDDMForm(ddmStructure, serviceContext); if (_isEmptyDDMForm(ddmForm)) { if (ddmStructure != null) { _deleteDDMStructure( fileEntryTypeId, ddmStructure.getStructureId()); return ArrayUtil.remove( ddmStructureIds, ddmStructure.getStructureId()); } return ddmStructureIds; } if (ddmStructure == null) { ddmStructure = DDMStructureManagerUtil.addStructure( userId, groupId, null, classNameLocalService.getClassNameId( DLFileEntryMetadata.class), ddmStructureKey, nameMap, descriptionMap, ddmForm, StorageEngineManager.STORAGE_TYPE_DEFAULT, DDMStructureManager.STRUCTURE_TYPE_AUTO, serviceContext); } else { ddmStructure = DDMStructureManagerUtil.updateStructure( userId, ddmStructure.getStructureId(), ddmStructure.getParentStructureId(), nameMap, descriptionMap, ddmForm, serviceContext); } return ArrayUtil.append( ddmStructureIds, ddmStructure.getStructureId()); } catch (StructureDefinitionException sde) { if (_log.isWarnEnabled()) { _log.warn(sde, sde); } if (ddmStructure != null) { long ddmStructureId = ddmStructure.getStructureId(); _deleteDDMStructure(fileEntryTypeId, ddmStructureId); return ArrayUtil.remove(ddmStructureIds, ddmStructureId); } return ddmStructureIds; } } private static final Log _log = LogFactoryUtil.getLog( DLFileEntryTypeLocalServiceImpl.class); }