diff --git a/ccm-cms/src/main/java/org/librecms/ui/contentsections/ConfigurationFixItemPermissionsController.java b/ccm-cms/src/main/java/org/librecms/ui/contentsections/ConfigurationFixItemPermissionsController.java
index 8363561f9..3a5728d29 100644
--- a/ccm-cms/src/main/java/org/librecms/ui/contentsections/ConfigurationFixItemPermissionsController.java
+++ b/ccm-cms/src/main/java/org/librecms/ui/contentsections/ConfigurationFixItemPermissionsController.java
@@ -18,18 +18,11 @@
*/
package org.librecms.ui.contentsections;
-import org.libreccm.categorization.Categorization;
import org.libreccm.security.AuthorizationRequired;
-import org.libreccm.security.PermissionManager;
-import org.librecms.contentsection.Asset;
-import org.librecms.contentsection.ContentItem;
import org.librecms.contentsection.ContentSection;
-import org.librecms.contentsection.ContentSectionManager;
-import org.librecms.contentsection.Folder;
+import org.librecms.ui.contentsections.fixpermissions.FixItemPermissionsTaskManager;
-import java.util.List;
import java.util.Optional;
-import java.util.stream.Collectors;
import javax.enterprise.context.RequestScoped;
import javax.inject.Inject;
diff --git a/ccm-cms/src/main/java/org/librecms/ui/contentsections/FixItemPermissions.java b/ccm-cms/src/main/java/org/librecms/ui/contentsections/FixItemPermissions.java
deleted file mode 100644
index f03f9c62e..000000000
--- a/ccm-cms/src/main/java/org/librecms/ui/contentsections/FixItemPermissions.java
+++ /dev/null
@@ -1,153 +0,0 @@
-/*
- * Copyright (C) 2023 LibreCCM Foundation.
- *
- * 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.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
- * MA 02110-1301 USA
- */
-package org.librecms.ui.contentsections;
-
-import org.apache.logging.log4j.LogManager;
-import org.apache.logging.log4j.Logger;
-import org.libreccm.categorization.Categorization;
-import org.libreccm.core.CcmObject;
-import org.libreccm.security.PermissionManager;
-import org.librecms.contentsection.Asset;
-import org.librecms.contentsection.AssetManager;
-import org.librecms.contentsection.ContentItem;
-import org.librecms.contentsection.ContentItemManager;
-import org.librecms.contentsection.ContentSection;
-import org.librecms.contentsection.ContentSectionRepository;
-import org.librecms.contentsection.Folder;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Optional;
-import java.util.stream.Collectors;
-
-import javax.enterprise.context.ApplicationScoped;
-import javax.inject.Inject;
-import javax.transaction.Transactional;
-
-/**
- *
- * @author Jens Pelzetter
- */
-@ApplicationScoped
-public class FixItemPermissions {
-
- private static final Logger LOGGER = LogManager.getLogger(
- FixItemPermissions.class
- );
-
- @Inject
- private AssetManager assetManager;
-
- @Inject
- private ContentItemManager itemManager;
-
- @Inject
- private ContentSectionRepository sectionRepo;
-
- @Inject
- private PermissionManager permissionManager;
-
- @Transactional(Transactional.TxType.REQUIRED)
- public void fixItemPermissions(final ContentSection contentSection) {
- final String sectionUuid = Optional
- .ofNullable(contentSection)
- .map(ContentSection::getUuid)
- .orElseThrow(
- () -> new IllegalArgumentException(
- "Can't fix ItemPermissions for content section null"
- )
- );
-
- final ContentSection section = sectionRepo
- .findByUuid(sectionUuid)
- .orElseThrow(
- () -> new IllegalArgumentException(
- String.format(
- "No ContentSection with UUID %s in the database.",
- sectionUuid
- )
- )
- );
-
- fixContentItemPermissions(section.getRootDocumentsFolder());
- fixAssetPermissions(section.getRootAssetsFolder());
- }
-
- private void fixContentItemPermissions(final Folder folder) {
- final List items = new ArrayList<>();
- for (final Categorization categorization : folder.getObjects()) {
- final CcmObject categorized = categorization.getCategorizedObject();
- if (categorized instanceof ContentItem) {
- items.add((ContentItem) categorized);
- }
- }
-
-// final List items = folder
-// .getObjects()
-// .stream()
-// .map(Categorization::getCategorizedObject)
-// .filter(obj -> obj instanceof ContentItem)
-// .map(obj -> (ContentItem) obj)
-// .collect(Collectors.toList());
- for (final ContentItem item : items) {
- LOGGER.info(
- "Fixing permissions for item {} {}",
- item.getUuid(),
- itemManager.getItemPath(item)
- );
- permissionManager.copyPermissions(folder, item, true);
-
- if (itemManager.isLive(item)) {
- permissionManager.copyPermissions(
- folder,
- itemManager.getLiveVersion(item, ContentItem.class).get(),
- true
- );
- }
- }
-
- for (final Folder subFolder : folder.getSubFolders()) {
- fixContentItemPermissions(subFolder);
- }
- }
-
- private void fixAssetPermissions(final Folder folder) {
- final List assets = folder
- .getObjects()
- .stream()
- .map(Categorization::getCategorizedObject)
- .filter(obj -> obj instanceof Asset)
- .map(obj -> (Asset) obj)
- .collect(Collectors.toList());
-
- for (final Asset asset : assets) {
- LOGGER.info(
- "Fixing permissions for asset {} {}...",
- asset.getUuid(),
- assetManager.getAssetPath(asset)
- );
- permissionManager.copyPermissions(folder, asset, true);
- }
-
- for (final Folder subFolder : folder.getSubFolders()) {
- fixAssetPermissions(subFolder);
- }
- }
-
-}
diff --git a/ccm-cms/src/main/java/org/librecms/ui/contentsections/FixItemPermissionsTasks.java b/ccm-cms/src/main/java/org/librecms/ui/contentsections/FixItemPermissionsTasks.java
deleted file mode 100644
index 0c1fae9ca..000000000
--- a/ccm-cms/src/main/java/org/librecms/ui/contentsections/FixItemPermissionsTasks.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * Copyright (C) 2023 LibreCCM Foundation.
- *
- * 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.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
- * MA 02110-1301 USA
- */
-package org.librecms.ui.contentsections;
-
-import org.apache.shiro.util.ThreadContext;
-import org.libreccm.security.Shiro;
-
-import javax.enterprise.context.ApplicationScoped;
-import javax.enterprise.event.ObservesAsync;
-import javax.inject.Inject;
-import javax.transaction.Transactional;
-
-/**
- *
- * @author Jens Pelzetter
- */
-@ApplicationScoped
-public class FixItemPermissionsTasks {
-
- @Inject
- private FixItemPermissions fixItemPermissions;
-
- @Inject
- private Shiro shiro;
-
- @Transactional(Transactional.TxType.REQUIRED)
- public void fixItemPermissions(
- @ObservesAsync final FixItemPermissionsTask task
- ) {
- ThreadContext.bind(task.getSecurityManager());
- shiro.getSystemUser().execute(() -> executeFixItemPermissions(task));
- }
-
-
- private void executeFixItemPermissions(final FixItemPermissionsTask task) {
- fixItemPermissions.fixItemPermissions(task.getContentSection());
- }
-
-}
diff --git a/ccm-cms/src/main/java/org/librecms/ui/contentsections/FixItemPermissionsTask.java b/ccm-cms/src/main/java/org/librecms/ui/contentsections/fixpermissions/FixItemPermissionsTask.java
similarity index 73%
rename from ccm-cms/src/main/java/org/librecms/ui/contentsections/FixItemPermissionsTask.java
rename to ccm-cms/src/main/java/org/librecms/ui/contentsections/fixpermissions/FixItemPermissionsTask.java
index be2a8f905..a4445b380 100644
--- a/ccm-cms/src/main/java/org/librecms/ui/contentsections/FixItemPermissionsTask.java
+++ b/ccm-cms/src/main/java/org/librecms/ui/contentsections/fixpermissions/FixItemPermissionsTask.java
@@ -16,12 +16,15 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
* MA 02110-1301 USA
*/
-package org.librecms.ui.contentsections;
+package org.librecms.ui.contentsections.fixpermissions;
import org.apache.shiro.mgt.SecurityManager;
import org.librecms.contentsection.ContentSection;
import java.time.LocalDate;
+import java.time.format.DateTimeFormatter;
+import java.util.Objects;
+import java.util.Optional;
/**
*
@@ -65,4 +68,23 @@ public class FixItemPermissionsTask {
return securityManager;
}
+ @Override
+ public String toString() {
+ return String.format(
+ "%s{"
+ + "contentSection = %s, "
+ + "started = %s, "
+ + "status = %s"
+ + "}",
+ super.toString(),
+ Objects.toString(contentSection),
+ Optional
+ .ofNullable(started)
+ .map(
+ value -> DateTimeFormatter.ISO_LOCAL_DATE_TIME.format(value)
+ ).orElse("null"),
+ Objects.toString(status)
+ );
+ }
+
}
diff --git a/ccm-cms/src/main/java/org/librecms/ui/contentsections/FixItemPermissionsTaskManager.java b/ccm-cms/src/main/java/org/librecms/ui/contentsections/fixpermissions/FixItemPermissionsTaskManager.java
similarity index 90%
rename from ccm-cms/src/main/java/org/librecms/ui/contentsections/FixItemPermissionsTaskManager.java
rename to ccm-cms/src/main/java/org/librecms/ui/contentsections/fixpermissions/FixItemPermissionsTaskManager.java
index 52362478d..7e85c467c 100644
--- a/ccm-cms/src/main/java/org/librecms/ui/contentsections/FixItemPermissionsTaskManager.java
+++ b/ccm-cms/src/main/java/org/librecms/ui/contentsections/fixpermissions/FixItemPermissionsTaskManager.java
@@ -16,7 +16,7 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
* MA 02110-1301 USA
*/
-package org.librecms.ui.contentsections;
+package org.librecms.ui.contentsections.fixpermissions;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
@@ -76,7 +76,7 @@ public class FixItemPermissionsTaskManager {
.anyMatch(
task -> task.getContentSection().equals(name)
&& task.getStatus()
- == FixItemPermissionsStatus.RUNNING
+ == FixPermissionsTaskStatus.RUNNING
);
}
@@ -86,7 +86,7 @@ public class FixItemPermissionsTaskManager {
.anyMatch(
task -> task.getContentSection().equals(name)
&& task.getStatus()
- == FixItemPermissionsStatus.ERROR
+ == FixPermissionsTaskStatus.ERROR
);
}
@@ -115,9 +115,9 @@ public class FixItemPermissionsTaskManager {
.stream()
.filter(
task -> task.getStatus()
- == FixItemPermissionsStatus.ERROR
+ == FixPermissionsTaskStatus.ERROR
|| task.getStatus()
- == FixItemPermissionsStatus.FINISHED
+ == FixPermissionsTaskStatus.FINISHED
)
.collect(Collectors.toSet())
);
@@ -135,7 +135,7 @@ public class FixItemPermissionsTaskManager {
)
).handle((task, ex) -> handleTaskResult(task, ex, taskStatus));
- taskStatus.setStatus(FixItemPermissionsStatus.RUNNING);
+ taskStatus.setStatus(FixPermissionsTaskStatus.RUNNING);
tasks.add(taskStatus);
}
@@ -145,9 +145,9 @@ public class FixItemPermissionsTaskManager {
final FixItemPermissionsTaskStatus status
) {
if (ex == null) {
- status.setStatus(FixItemPermissionsStatus.FINISHED);
+ status.setStatus(FixPermissionsTaskStatus.FINISHED);
} else {
- status.setStatus(FixItemPermissionsStatus.ERROR);
+ status.setStatus(FixPermissionsTaskStatus.ERROR);
status.setException(ex);
LOGGER.error(
"Fix Item Permissions for Content Section {} failed ",
diff --git a/ccm-cms/src/main/java/org/librecms/ui/contentsections/FixItemPermissionsTaskStatus.java b/ccm-cms/src/main/java/org/librecms/ui/contentsections/fixpermissions/FixItemPermissionsTaskStatus.java
similarity index 94%
rename from ccm-cms/src/main/java/org/librecms/ui/contentsections/FixItemPermissionsTaskStatus.java
rename to ccm-cms/src/main/java/org/librecms/ui/contentsections/fixpermissions/FixItemPermissionsTaskStatus.java
index b12541635..00030d951 100644
--- a/ccm-cms/src/main/java/org/librecms/ui/contentsections/FixItemPermissionsTaskStatus.java
+++ b/ccm-cms/src/main/java/org/librecms/ui/contentsections/fixpermissions/FixItemPermissionsTaskStatus.java
@@ -16,7 +16,7 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
* MA 02110-1301 USA
*/
-package org.librecms.ui.contentsections;
+package org.librecms.ui.contentsections.fixpermissions;
import java.time.LocalDateTime;
import java.time.ZoneId;
@@ -44,7 +44,7 @@ public class FixItemPermissionsTaskStatus
/**
* The status of the task.
*/
- private FixItemPermissionsStatus status;
+ private FixPermissionsTaskStatus status;
/**
* If the proces throw an exception, it is stored here.
@@ -67,11 +67,11 @@ public class FixItemPermissionsTaskStatus
this.started = started;
}
- public FixItemPermissionsStatus getStatus() {
+ public FixPermissionsTaskStatus getStatus() {
return status;
}
- protected void setStatus(final FixItemPermissionsStatus status) {
+ protected void setStatus(final FixPermissionsTaskStatus status) {
this.status = status;
}
diff --git a/ccm-cms/src/main/java/org/librecms/ui/contentsections/FixItemPermissionsTaskStatusModel.java b/ccm-cms/src/main/java/org/librecms/ui/contentsections/fixpermissions/FixItemPermissionsTaskStatusModel.java
similarity index 93%
rename from ccm-cms/src/main/java/org/librecms/ui/contentsections/FixItemPermissionsTaskStatusModel.java
rename to ccm-cms/src/main/java/org/librecms/ui/contentsections/fixpermissions/FixItemPermissionsTaskStatusModel.java
index c0efd7eac..d9fda27b2 100644
--- a/ccm-cms/src/main/java/org/librecms/ui/contentsections/FixItemPermissionsTaskStatusModel.java
+++ b/ccm-cms/src/main/java/org/librecms/ui/contentsections/fixpermissions/FixItemPermissionsTaskStatusModel.java
@@ -16,7 +16,9 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
* MA 02110-1301 USA
*/
-package org.librecms.ui.contentsections;
+package org.librecms.ui.contentsections.fixpermissions;
+
+import org.librecms.ui.contentsections.ContentSectionModel;
import javax.enterprise.context.RequestScoped;
import javax.inject.Inject;
diff --git a/ccm-cms/src/main/java/org/librecms/ui/contentsections/fixpermissions/FixItemPermissionsTasks.java b/ccm-cms/src/main/java/org/librecms/ui/contentsections/fixpermissions/FixItemPermissionsTasks.java
new file mode 100644
index 000000000..87a95b7f7
--- /dev/null
+++ b/ccm-cms/src/main/java/org/librecms/ui/contentsections/fixpermissions/FixItemPermissionsTasks.java
@@ -0,0 +1,404 @@
+/*
+ * Copyright (C) 2023 LibreCCM Foundation.
+ *
+ * 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.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+ * MA 02110-1301 USA
+ */
+package org.librecms.ui.contentsections.fixpermissions;
+
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+import org.apache.shiro.util.ThreadContext;
+import org.libreccm.categorization.Categorization;
+import org.libreccm.core.CcmObject;
+import org.libreccm.security.PermissionManager;
+import org.libreccm.security.Shiro;
+import org.librecms.contentsection.Asset;
+import org.librecms.contentsection.AssetManager;
+import org.librecms.contentsection.ContentItem;
+import org.librecms.contentsection.ContentItemManager;
+import org.librecms.contentsection.ContentSection;
+import org.librecms.contentsection.ContentSectionRepository;
+import org.librecms.contentsection.Folder;
+import javax.enterprise.event.Event;
+
+import java.util.ArrayList;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Objects;
+import java.util.Optional;
+import java.util.Queue;
+import java.util.stream.Collectors;
+
+import javax.enterprise.context.ApplicationScoped;
+import javax.enterprise.event.ObservesAsync;
+import javax.inject.Inject;
+import javax.transaction.Transactional;
+
+/**
+ *
+ * @author Jens Pelzetter
+ */
+@ApplicationScoped
+public class FixItemPermissionsTasks {
+
+ private static final Logger LOGGER = LogManager.getLogger(
+ FixItemPermissionsTasks.class
+ );
+
+ private final Queue openItemTasks;
+
+ private final Queue openAssetTasks;
+
+ @Inject
+ private AssetManager assetManager;
+
+ @Inject
+ private ContentItemManager itemManager;
+
+ @Inject
+ private ContentSectionRepository sectionRepo;
+
+ @Inject
+ private PermissionManager permissionManager;
+
+ @Inject
+ private Event readyForItemTaskSender;
+
+ @Inject
+ private Event readyForAssetTaskSender;
+
+ private long timestamp = 0;
+
+ @Inject
+ private Shiro shiro;
+
+ public FixItemPermissionsTasks() {
+ openItemTasks = new LinkedList<>();
+ openAssetTasks = new LinkedList<>();
+ }
+
+ public boolean isTaskOpenForContentSection(final ContentSection section) {
+ final String sectionUuid = section.getUuid();
+
+ return openItemTasks
+ .stream()
+ .anyMatch(task -> task.getSectionUuid().equals(sectionUuid))
+ || openAssetTasks
+ .stream()
+ .anyMatch(task -> task.getSectionUuid().equals(sectionUuid));
+ }
+
+ @Transactional(Transactional.TxType.REQUIRES_NEW)
+ public void fixItemPermissions(
+ @ObservesAsync final FixItemPermissionsTask task
+ ) {
+ ThreadContext.bind(task.getSecurityManager());
+ shiro.getSystemUser().execute(() -> executeFixItemPermissions(task));
+
+ readyForItemTaskSender.fireAsync(new ReadyForNextItemTaskEvent());
+ readyForAssetTaskSender.fireAsync(new ReadyForNextAssetTaskEvent());
+ }
+
+ @Transactional(Transactional.TxType.REQUIRES_NEW)
+ public void startNextItemTask(
+ @ObservesAsync final ReadyForNextItemTaskEvent event
+ ) {
+ LOGGER.info("Starting next fix permissions for item task...");
+
+ final FixPermissionsForItemTask task = openItemTasks.poll();
+ if (task == null) {
+ LOGGER.info("No more fix permissions for item tasks available.");
+ return;
+ }
+
+ ThreadContext.bind(task.getSecurityManager());
+ shiro.getSystemUser().execute(() -> executeFixPermissionsForItem(task));
+
+ readyForItemTaskSender.fireAsync(new ReadyForNextItemTaskEvent());
+ }
+
+ @Transactional(Transactional.TxType.REQUIRES_NEW)
+ public void startNextAssetTask(
+ @ObservesAsync final ReadyForNextItemTaskEvent event
+ ) {
+ LOGGER.info("Starting next fix permissions for asset task...");
+
+ final FixPermissionsForAssetTask task = openAssetTasks.poll();
+ if (task == null) {
+ LOGGER.info("No more fix permissions for asset tasks available.");
+ return;
+ }
+
+ ThreadContext.bind(task.getSecurityManager());
+ shiro.getSystemUser().execute(() -> executeFixPermissionsForAsset(task));
+
+ readyForAssetTaskSender.fireAsync(new ReadyForNextAssetTaskEvent());
+ }
+
+ private void executeFixItemPermissions(final FixItemPermissionsTask task) {
+ Optional
+ .ofNullable(task)
+ .map(FixItemPermissionsTask::getContentSection)
+ .map(ContentSection::getUuid)
+ .map(uuid -> sectionRepo.findByUuid(uuid).orElse(null))
+ .orElseThrow(
+ () -> new IllegalArgumentException(
+ String.format(
+ "Can't get ContentSection from "
+ + "FixItemPermissionsTask %s",
+ Objects.toString(task)
+ )
+ )
+ );
+
+ fixItemPermissions(
+ sectionRepo.findByUuid(
+ task.getContentSection().getUuid()
+ ).orElseThrow(
+ () -> new IllegalArgumentException()
+ ),
+ task.getSecurityManager()
+ );
+ }
+
+ @Transactional(Transactional.TxType.REQUIRED)
+ public void fixItemPermissions(
+ final ContentSection contentSection,
+ final org.apache.shiro.mgt.SecurityManager securityManager
+ ) {
+ LOGGER.info(
+ "Fixing item permissions for content section {}...",
+ contentSection.getLabel()
+ );
+ timestamp = System.currentTimeMillis();
+ final String sectionUuid = Optional
+ .ofNullable(contentSection)
+ .map(ContentSection::getUuid)
+ .orElseThrow(
+ () -> new IllegalArgumentException(
+ "Can't fix ItemPermissions for content section null"
+ )
+ );
+
+ final ContentSection section = sectionRepo
+ .findByUuid(sectionUuid)
+ .orElseThrow(
+ () -> new IllegalArgumentException(
+ String.format(
+ "No ContentSection with UUID %s in the database.",
+ sectionUuid
+ )
+ )
+ );
+ LOGGER.info(
+ "Retrieve content section in {} ms.",
+ System.currentTimeMillis() - timestamp
+ );
+ timestamp = System.currentTimeMillis();
+
+ fixContentItemPermissions(
+ section,
+ section.getRootDocumentsFolder(),
+ securityManager
+ );
+ fixAssetPermissions(
+ section,
+ section.getRootAssetsFolder(),
+ securityManager
+ );
+ }
+
+ private void fixContentItemPermissions(
+ final ContentSection section,
+ final Folder folder,
+ final org.apache.shiro.mgt.SecurityManager securityManager
+ ) {
+ LOGGER.info(
+ "Fixing permissions for items in folder {}",
+ folder.getName()
+ );
+ final List items = new ArrayList<>();
+ for (final Categorization categorization : folder.getObjects()) {
+ final CcmObject categorized = categorization.getCategorizedObject();
+ if (categorized instanceof ContentItem) {
+ items.add((ContentItem) categorized);
+ }
+ }
+
+// final List items = folder
+// .getObjects()
+// .stream()
+// .map(Categorization::getCategorizedObject)
+// .filter(obj -> obj instanceof ContentItem)
+// .map(obj -> (ContentItem) obj)
+// .collect(Collectors.toList());
+ for (final ContentItem item : items) {
+ final FixPermissionsForItemTask task
+ = createFixItemPermissionsForItemTask(
+ section,
+ folder,
+ item,
+ securityManager
+ );
+ openItemTasks.add(task);
+
+ if (itemManager.isLive(item)) {
+ final FixPermissionsForItemTask liveTask
+ = createFixItemPermissionsForItemTask(
+ section,
+ folder,
+ itemManager.getLiveVersion(item, ContentItem.class)
+ .get(),
+ securityManager
+ );
+ openItemTasks.add(liveTask);
+ }
+// final long fixForItemStart = System.currentTimeMillis();
+// LOGGER.info(
+// "Fixing permissions for item {} {}",
+// item.getUuid(),
+// itemManager.getItemPath(item)
+// );
+// permissionManager.copyPermissions(folder, item, true);
+// LOGGER.info(
+// "in {} ms",
+// System.currentTimeMillis() - fixForItemStart
+// );
+//
+// final long fixForLiveStart = System.currentTimeMillis();
+// if (itemManager.isLive(item)) {
+// permissionManager.copyPermissions(
+// folder,
+// itemManager.getLiveVersion(item, ContentItem.class).get(),
+// true
+// );
+// }
+// LOGGER.info(
+// "Fixed permissions for live item in {} ms",
+// System.currentTimeMillis() - fixForLiveStart
+// );
+// LOGGER.info(
+// "Fixed permissions for item in {} ms",
+// System.currentTimeMillis() - fixForItemStart
+// );
+ }
+ LOGGER.info(
+ "Fixed permissions for items in folder {} in {} ms",
+ folder.getName(),
+ System.currentTimeMillis() - timestamp
+ );
+ timestamp = System.currentTimeMillis();
+
+ for (final Folder subFolder : folder.getSubFolders()) {
+ fixContentItemPermissions(section, subFolder, securityManager);
+ }
+ }
+
+ private void fixAssetPermissions(
+ final ContentSection section,
+ final Folder folder,
+ final org.apache.shiro.mgt.SecurityManager securityManager
+ ) {
+ LOGGER.info(
+ "Fixing permissions for assets in folder {}",
+ folder.getName()
+ );
+ final List assets = folder
+ .getObjects()
+ .stream()
+ .map(Categorization::getCategorizedObject)
+ .filter(obj -> obj instanceof Asset)
+ .map(obj -> (Asset) obj)
+ .collect(Collectors.toList());
+
+ for (final Asset asset : assets) {
+ final FixPermissionsForAssetTask task
+ = createFixItemPermissionsForAssetTask(
+ section,
+ folder,
+ asset,
+ securityManager
+ );
+ openAssetTasks.add(task);
+// LOGGER.info(
+// "Fixing permissions for asset {} {}...",
+// asset.getUuid(),
+// assetManager.getAssetPath(asset)
+// );
+// permissionManager.copyPermissions(folder, asset, true);
+ }
+
+ for (final Folder subFolder : folder.getSubFolders()) {
+ fixAssetPermissions(section, subFolder, securityManager);
+ }
+ }
+
+ private FixPermissionsForItemTask createFixItemPermissionsForItemTask(
+ final ContentSection section,
+ final Folder folder,
+ final ContentItem item,
+ final org.apache.shiro.mgt.SecurityManager securityManager
+ ) {
+ final FixPermissionsForItemTask task
+ = new FixPermissionsForItemTask(
+ section.getUuid(),
+ folder,
+ item,
+ securityManager
+ );
+
+ return task;
+ }
+
+ private FixPermissionsForAssetTask createFixItemPermissionsForAssetTask(
+ final ContentSection section,
+ final Folder folder,
+ final Asset asset,
+ final org.apache.shiro.mgt.SecurityManager securityManager
+ ) {
+ final FixPermissionsForAssetTask task
+ = new FixPermissionsForAssetTask(
+ section.getUuid(),
+ folder,
+ asset,
+ securityManager
+ );
+
+ return task;
+ }
+
+
+ private void executeFixPermissionsForItem(
+ final FixPermissionsForItemTask task
+ ) {
+ permissionManager.copyPermissions(
+ task.getFolder(),
+ task.getItem(),
+ true
+ );
+ }
+
+ private void executeFixPermissionsForAsset(
+ final FixPermissionsForAssetTask task
+ ) {
+ permissionManager.copyPermissions(
+ task.getFolder(),
+ task.getAsset(),
+ true
+ );
+ }
+
+}
diff --git a/ccm-cms/src/main/java/org/librecms/ui/contentsections/fixpermissions/FixPermissionsForAssetTask.java b/ccm-cms/src/main/java/org/librecms/ui/contentsections/fixpermissions/FixPermissionsForAssetTask.java
new file mode 100644
index 000000000..abdce4d05
--- /dev/null
+++ b/ccm-cms/src/main/java/org/librecms/ui/contentsections/fixpermissions/FixPermissionsForAssetTask.java
@@ -0,0 +1,78 @@
+/*
+ * Copyright (C) 2023 LibreCCM Foundation.
+ *
+ * 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.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+ * MA 02110-1301 USA
+ */
+package org.librecms.ui.contentsections.fixpermissions;
+
+import org.apache.shiro.mgt.SecurityManager;
+import org.librecms.contentsection.Asset;
+import org.librecms.contentsection.ContentSection;
+import org.librecms.contentsection.Folder;
+
+/**
+ *
+ * @author Jens Pelzetter
+ */
+public class FixPermissionsForAssetTask {
+
+ /**
+ * UUID of the {@link ContentSection} to which the item belongs.
+ */
+ private final String sectionUuid;
+
+ /**
+ * The {@link Folder} in which the item is stored. Source for the
+ * permissions to be copied to the item.
+ */
+ private final Folder folder;
+
+ /**
+ * The {@link Asset} which permssions will be fixed.
+ */
+ private final Asset asset;
+
+ private final org.apache.shiro.mgt.SecurityManager securityManager;
+
+ public FixPermissionsForAssetTask(
+ final String sectionUuid,
+ final Folder folder,
+ final Asset asset,
+ final SecurityManager securityManager
+ ) {
+ this.sectionUuid = sectionUuid;
+ this.folder = folder;
+ this.asset = asset;
+ this.securityManager = securityManager;
+ }
+
+ public String getSectionUuid() {
+ return sectionUuid;
+ }
+
+ public Folder getFolder() {
+ return folder;
+ }
+
+ public Asset getAsset() {
+ return asset;
+ }
+
+ public org.apache.shiro.mgt.SecurityManager getSecurityManager() {
+ return securityManager;
+ }
+
+}
diff --git a/ccm-cms/src/main/java/org/librecms/ui/contentsections/fixpermissions/FixPermissionsForItemTask.java b/ccm-cms/src/main/java/org/librecms/ui/contentsections/fixpermissions/FixPermissionsForItemTask.java
new file mode 100644
index 000000000..21d7d2628
--- /dev/null
+++ b/ccm-cms/src/main/java/org/librecms/ui/contentsections/fixpermissions/FixPermissionsForItemTask.java
@@ -0,0 +1,78 @@
+/*
+ * Copyright (C) 2023 LibreCCM Foundation.
+ *
+ * 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.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+ * MA 02110-1301 USA
+ */
+package org.librecms.ui.contentsections.fixpermissions;
+
+import org.apache.shiro.mgt.SecurityManager;
+import org.librecms.contentsection.ContentItem;
+import org.librecms.contentsection.ContentSection;
+import org.librecms.contentsection.Folder;
+
+/**
+ *
+ * @author Jens Pelzetter
+ */
+public class FixPermissionsForItemTask {
+
+ /**
+ * UUID of the {@link ContentSection} to which the item belongs.
+ */
+ private final String sectionUuid;
+
+ /**
+ * The {@link Folder} in which the item is stored. Source for the
+ * permissions to be copied to the item.
+ */
+ private final Folder folder;
+
+ /**
+ * The {@link ContentItem} which permssions will be fixed.
+ */
+ private final ContentItem item;
+
+ private final org.apache.shiro.mgt.SecurityManager securityManager;
+
+ public FixPermissionsForItemTask(
+ final String sectionUuid,
+ final Folder folder,
+ final ContentItem item,
+ final SecurityManager securityManager
+ ) {
+ this.sectionUuid = sectionUuid;
+ this.folder = folder;
+ this.item = item;
+ this.securityManager = securityManager;
+ }
+
+ public String getSectionUuid() {
+ return sectionUuid;
+ }
+
+ public Folder getFolder() {
+ return folder;
+ }
+
+ public ContentItem getItem() {
+ return item;
+ }
+
+ public SecurityManager getSecurityManager() {
+ return securityManager;
+ }
+
+}
diff --git a/ccm-cms/src/main/java/org/librecms/ui/contentsections/FixItemPermissionsStatus.java b/ccm-cms/src/main/java/org/librecms/ui/contentsections/fixpermissions/FixPermissionsTaskStatus.java
similarity index 92%
rename from ccm-cms/src/main/java/org/librecms/ui/contentsections/FixItemPermissionsStatus.java
rename to ccm-cms/src/main/java/org/librecms/ui/contentsections/fixpermissions/FixPermissionsTaskStatus.java
index c493502d3..41389e6f5 100644
--- a/ccm-cms/src/main/java/org/librecms/ui/contentsections/FixItemPermissionsStatus.java
+++ b/ccm-cms/src/main/java/org/librecms/ui/contentsections/fixpermissions/FixPermissionsTaskStatus.java
@@ -16,13 +16,13 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
* MA 02110-1301 USA
*/
-package org.librecms.ui.contentsections;
+package org.librecms.ui.contentsections.fixpermissions;
/**
*
* @author Jens Pelzetter
*/
-public enum FixItemPermissionsStatus {
+public enum FixPermissionsTaskStatus {
/**
* An error occured during the process.
diff --git a/ccm-cms/src/main/java/org/librecms/ui/contentsections/fixpermissions/ReadyForNextAssetTaskEvent.java b/ccm-cms/src/main/java/org/librecms/ui/contentsections/fixpermissions/ReadyForNextAssetTaskEvent.java
new file mode 100644
index 000000000..de0770332
--- /dev/null
+++ b/ccm-cms/src/main/java/org/librecms/ui/contentsections/fixpermissions/ReadyForNextAssetTaskEvent.java
@@ -0,0 +1,27 @@
+/*
+ * Copyright (C) 2023 LibreCCM Foundation.
+ *
+ * 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.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+ * MA 02110-1301 USA
+ */
+package org.librecms.ui.contentsections.fixpermissions;
+
+/**
+ *
+ * @author Jens Pelzetter
+ */
+public class ReadyForNextAssetTaskEvent {
+
+}
diff --git a/ccm-cms/src/main/java/org/librecms/ui/contentsections/fixpermissions/ReadyForNextItemTaskEvent.java b/ccm-cms/src/main/java/org/librecms/ui/contentsections/fixpermissions/ReadyForNextItemTaskEvent.java
new file mode 100644
index 000000000..d666725d6
--- /dev/null
+++ b/ccm-cms/src/main/java/org/librecms/ui/contentsections/fixpermissions/ReadyForNextItemTaskEvent.java
@@ -0,0 +1,27 @@
+/*
+ * Copyright (C) 2023 LibreCCM Foundation.
+ *
+ * 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.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+ * MA 02110-1301 USA
+ */
+package org.librecms.ui.contentsections.fixpermissions;
+
+/**
+ *
+ * @author Jens Pelzetter
+ */
+public class ReadyForNextItemTaskEvent {
+
+}