From 98c00fd677a06cb8901360ec4eb587e6c2ef14c5 Mon Sep 17 00:00:00 2001 From: Jens Pelzetter Date: Tue, 19 Jan 2021 20:19:49 +0100 Subject: [PATCH] Deleting content section (if empty) works now --- .../contentsection/ContentSectionManager.java | 110 +++++++++++++----- .../contentsection/FolderRepository.java | 34 +++++- 2 files changed, 115 insertions(+), 29 deletions(-) diff --git a/ccm-cms/src/main/java/org/librecms/contentsection/ContentSectionManager.java b/ccm-cms/src/main/java/org/librecms/contentsection/ContentSectionManager.java index 9139cc21d..7582c9bd4 100644 --- a/ccm-cms/src/main/java/org/librecms/contentsection/ContentSectionManager.java +++ b/ccm-cms/src/main/java/org/librecms/contentsection/ContentSectionManager.java @@ -54,11 +54,14 @@ import java.util.Optional; import org.librecms.contentsection.privileges.TypePrivileges; import org.librecms.dispatcher.ItemResolver; +import java.util.Collections; import java.util.Objects; -import java.util.logging.Level; -import java.util.logging.Logger; +import java.util.stream.Collectors; import javax.enterprise.inject.Instance; +import javax.persistence.criteria.CriteriaBuilder; +import javax.persistence.criteria.CriteriaDelete; +import javax.persistence.criteria.Root; import static org.librecms.contentsection.ContentSection.*; @@ -675,34 +678,89 @@ public class ContentSectionManager { public void deleteContentSection(final ContentSection section) { Objects.requireNonNull(section); - try { - for (final ContentType type : section.getContentTypes()) { - @SuppressWarnings("unchecked") - final Class clazz - = (Class) Class.forName( - type.getContentItemClass() - ); - removeContentTypeFromSection(clazz, section); - } - } catch (ClassNotFoundException ex) { - throw new UnexpectedErrorException(ex); - } - for (final LifecycleDefinition lifecycle : section - .getLifecycleDefinitions()) { - removeLifecycleDefinitionFromContentSection( - lifecycle, section + final CriteriaBuilder criteriaBuilder = entityManager + .getCriteriaBuilder(); + + if (!section.getContentTypes().isEmpty()) { + final CriteriaDelete contentTypeDelete + = criteriaBuilder + .createCriteriaDelete(ContentType.class); + final Root contentTypeRoot = contentTypeDelete.from( + ContentType.class ); + contentTypeDelete.where( + criteriaBuilder.equal( + contentTypeRoot.get("contentSection"), + section + ) + ); + entityManager.createQuery(contentTypeDelete).executeUpdate(); } - for (final Role role : section.getRoles()) { - removeRoleFromContentSection(section, role); + + if (!section.getLifecycleDefinitions().isEmpty()) { + final CriteriaDelete lifecycleDelete + = criteriaBuilder + .createCriteriaDelete(LifecycleDefinition.class); + final Root lifecycleRoot = lifecycleDelete + .from(LifecycleDefinition.class); + lifecycleDelete.where( + criteriaBuilder + .in(lifecycleRoot.get("definitionId")) + .value( + section + .getLifecycleDefinitions() + .stream() + .map(LifecycleDefinition::getDefinitionId) + .collect(Collectors.toSet()) + ) + ); + entityManager.createQuery(lifecycleDelete).executeUpdate(); } - for (final Workflow workflow : section.getWorkflowTemplates()) { - removeWorkflowTemplateFromContentSection(workflow, section); + + section.setRoles(Collections.emptyList()); + sectionRepo.save(section); + + if (!section.getWorkflowTemplates().isEmpty()) { + final CriteriaDelete workflowDelete = criteriaBuilder + .createCriteriaDelete(Workflow.class); + final Root workflowRoot = workflowDelete.from( + Workflow.class); + workflowDelete.where( + criteriaBuilder + .in(workflowRoot.get("workflowId")) + .value( + section + .getWorkflowTemplates() + .stream() + .map(Workflow::getWorkflowId) + .collect(Collectors.toSet()) + ) + ); + entityManager.createQuery(workflowDelete).executeUpdate(); } - - folderRepository.delete(section.getRootAssetsFolder()); - folderRepository.delete(section.getRootDocumentsFolder()); - + + final Folder rootAssetsFolder = section.getRootAssetsFolder(); + final Folder rootDocumentsFolder = section.getRootDocumentsFolder(); + + section.setRootAssetsFolder(null); + section.setRootDocumentFolder(null); + sectionRepo.save(section); + + folderRepository.delete(rootAssetsFolder); + folderRepository.delete(rootDocumentsFolder); + + if (!section.getPermissions().isEmpty()) { + final CriteriaDelete permissionsDelete = criteriaBuilder + .createCriteriaDelete(Permission.class); + final Root permissionRoot = permissionsDelete.from( + Permission.class + ); + permissionsDelete.where( + criteriaBuilder.equal(permissionRoot.get("object"), section) + ); + entityManager.createQuery(permissionsDelete).executeUpdate(); + } + sectionRepo.delete(section); } diff --git a/ccm-cms/src/main/java/org/librecms/contentsection/FolderRepository.java b/ccm-cms/src/main/java/org/librecms/contentsection/FolderRepository.java index 561e522e2..b3200b8e0 100644 --- a/ccm-cms/src/main/java/org/librecms/contentsection/FolderRepository.java +++ b/ccm-cms/src/main/java/org/librecms/contentsection/FolderRepository.java @@ -23,6 +23,7 @@ import org.apache.logging.log4j.Logger; import org.libreccm.categorization.Category; import org.libreccm.core.AbstractEntityRepository; import org.libreccm.security.AuthorizationRequired; +import org.libreccm.security.Permission; import org.libreccm.security.RequiresPrivilege; import org.librecms.contentsection.privileges.ItemPrivileges; @@ -30,10 +31,14 @@ import java.util.List; import java.util.Objects; import java.util.Optional; import java.util.UUID; +import java.util.stream.Collectors; import javax.enterprise.context.RequestScoped; import javax.inject.Inject; import javax.persistence.TypedQuery; +import javax.persistence.criteria.CriteriaBuilder; +import javax.persistence.criteria.CriteriaDelete; +import javax.persistence.criteria.Root; import javax.transaction.Transactional; /** @@ -225,8 +230,8 @@ public class FolderRepository extends AbstractEntityRepository { @Override public void save( @RequiresPrivilege(ItemPrivileges.CREATE_NEW) - final Folder folder) { - + final Folder folder + ) { super.save(folder); } @@ -235,7 +240,30 @@ public class FolderRepository extends AbstractEntityRepository { @Override public void delete( @RequiresPrivilege(ItemPrivileges.CREATE_NEW) - final Folder folder) { + final Folder folder + ) { + final CriteriaBuilder criteriaBuilder = getEntityManager() + .getCriteriaBuilder(); + final CriteriaDelete permissionsDelete = criteriaBuilder + .createCriteriaDelete(Permission.class); + final Root permissionRoot = permissionsDelete.from( + Permission.class + ); + permissionsDelete.where( + criteriaBuilder.equal(permissionRoot.get("object"), folder) + ); +// permissionsDelete.where( +// criteriaBuilder +// .in(permissionRoot.get("permissionId")) +// .value( +// folder +// .getPermissions() +// .stream() +// .map(Permission::getPermissionId) +// .collect(Collectors.toSet()) +// ) +// ); + getEntityManager().createQuery(permissionsDelete).executeUpdate(); super.delete(folder); }