Deleting content section (if empty) works now

Former-commit-id: 98c00fd677
pull/10/head
Jens Pelzetter 2021-01-19 20:19:49 +01:00
parent a63147b480
commit 5adf223121
2 changed files with 115 additions and 29 deletions

View File

@ -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,33 +678,88 @@ public class ContentSectionManager {
public void deleteContentSection(final ContentSection section) {
Objects.requireNonNull(section);
try {
for (final ContentType type : section.getContentTypes()) {
@SuppressWarnings("unchecked")
final Class<? extends ContentItem> clazz
= (Class<? extends ContentItem>) Class.forName(
type.getContentItemClass()
final CriteriaBuilder criteriaBuilder = entityManager
.getCriteriaBuilder();
if (!section.getContentTypes().isEmpty()) {
final CriteriaDelete<ContentType> contentTypeDelete
= criteriaBuilder
.createCriteriaDelete(ContentType.class);
final Root<ContentType> contentTypeRoot = contentTypeDelete.from(
ContentType.class
);
removeContentTypeFromSection(clazz, section);
}
} catch (ClassNotFoundException ex) {
throw new UnexpectedErrorException(ex);
}
for (final LifecycleDefinition lifecycle : section
.getLifecycleDefinitions()) {
removeLifecycleDefinitionFromContentSection(
lifecycle, section
contentTypeDelete.where(
criteriaBuilder.equal(
contentTypeRoot.get("contentSection"),
section
)
);
}
for (final Role role : section.getRoles()) {
removeRoleFromContentSection(section, role);
}
for (final Workflow workflow : section.getWorkflowTemplates()) {
removeWorkflowTemplateFromContentSection(workflow, section);
entityManager.createQuery(contentTypeDelete).executeUpdate();
}
folderRepository.delete(section.getRootAssetsFolder());
folderRepository.delete(section.getRootDocumentsFolder());
if (!section.getLifecycleDefinitions().isEmpty()) {
final CriteriaDelete<LifecycleDefinition> lifecycleDelete
= criteriaBuilder
.createCriteriaDelete(LifecycleDefinition.class);
final Root<LifecycleDefinition> 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();
}
section.setRoles(Collections.emptyList());
sectionRepo.save(section);
if (!section.getWorkflowTemplates().isEmpty()) {
final CriteriaDelete<Workflow> workflowDelete = criteriaBuilder
.createCriteriaDelete(Workflow.class);
final Root<Workflow> 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();
}
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<Permission> permissionsDelete = criteriaBuilder
.createCriteriaDelete(Permission.class);
final Root<Permission> permissionRoot = permissionsDelete.from(
Permission.class
);
permissionsDelete.where(
criteriaBuilder.equal(permissionRoot.get("object"), section)
);
entityManager.createQuery(permissionsDelete).executeUpdate();
}
sectionRepo.delete(section);
}

View File

@ -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<Long, Folder> {
@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<Long, Folder> {
@Override
public void delete(
@RequiresPrivilege(ItemPrivileges.CREATE_NEW)
final Folder folder) {
final Folder folder
) {
final CriteriaBuilder criteriaBuilder = getEntityManager()
.getCriteriaBuilder();
final CriteriaDelete<Permission> permissionsDelete = criteriaBuilder
.createCriteriaDelete(Permission.class);
final Root<Permission> 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);
}