From 48d1c24ca71296605f60288dab3eb4cbd889cb20 Mon Sep 17 00:00:00 2001 From: jensp Date: Mon, 26 Jun 2017 17:15:45 +0000 Subject: [PATCH] CCM NG/ccm-core: Several improvments for Workflow Handling git-svn-id: https://svn.libreccm.org/ccm/ccm_ng@4816 8810af33-2d31-482b-a856-94f89814c4df --- .../ui/workflow/AssignedTaskController.java | 25 ++++++++---------- .../AssignedTaskTableModelBuilder.java | 2 -- .../org/libreccm/workflow/AssignableTask.java | 11 +++++++- .../workflow/AssignableTaskManager.java | 19 ++++++++++++++ .../workflow/AssignableTaskRepository.java | 19 +++++++++----- .../main/java/org/libreccm/workflow/Task.java | 1 + .../libreccm/workflow/WorkflowManager.java | 26 +++++++++++++++---- 7 files changed, 74 insertions(+), 29 deletions(-) diff --git a/ccm-cms/src/main/java/com/arsdigita/cms/ui/workflow/AssignedTaskController.java b/ccm-cms/src/main/java/com/arsdigita/cms/ui/workflow/AssignedTaskController.java index 1349fdf5f..f48da5e0b 100644 --- a/ccm-cms/src/main/java/com/arsdigita/cms/ui/workflow/AssignedTaskController.java +++ b/ccm-cms/src/main/java/com/arsdigita/cms/ui/workflow/AssignedTaskController.java @@ -54,25 +54,24 @@ public class AssignedTaskController { @Inject private Shiro shiro; - + @Inject private ConfigurationManager confManager; - + private Locale defaultLocale; - + @PostConstruct private void init() { final KernelConfig kernelConfig = confManager.findConfiguration( KernelConfig.class); defaultLocale = kernelConfig.getDefaultLocale(); } - @Transactional(Transactional.TxType.REQUIRED) public List> getAssignedTasks(final Workflow workflow) { final User user = shiro.getUser().get(); final List tasks = userTaskRepo.getAssignedTasks(user, - workflow); + workflow); return tasks .stream() @@ -82,24 +81,22 @@ public class AssignedTaskController { } private RowData createRowData(final AssignableTask task) { - - + final RowData rowData = new RowData<>(3); - + rowData.setRowKey(task.getTaskId()); - + // Change when Workflow forms provide fields to enter localised label. rowData.setColData(0, task.getLabel().getValue(defaultLocale)); - + if (task.isLocked()) { rowData.setColData(1, task.getLockingUser().getName()); } else { - rowData.setColData(1,""); + rowData.setColData(1, ""); } - + rowData.setColData(2, ""); - - + return rowData; } diff --git a/ccm-cms/src/main/java/com/arsdigita/cms/ui/workflow/AssignedTaskTableModelBuilder.java b/ccm-cms/src/main/java/com/arsdigita/cms/ui/workflow/AssignedTaskTableModelBuilder.java index e5f86f092..e9d603e8f 100755 --- a/ccm-cms/src/main/java/com/arsdigita/cms/ui/workflow/AssignedTaskTableModelBuilder.java +++ b/ccm-cms/src/main/java/com/arsdigita/cms/ui/workflow/AssignedTaskTableModelBuilder.java @@ -56,8 +56,6 @@ class AssignedTaskTableModelBuilder extends AbstractTableModelBuilder { Assert.exists(workflow, Workflow.class); final CdiUtil cdiUtil = CdiUtil.createCdiUtil(); - final WorkflowManager workflowManager = cdiUtil.findBean( - WorkflowManager.class); final WorkflowState workflowState = workflow.getState(); if (workflowState == WorkflowState.STARTED) { diff --git a/ccm-core/src/main/java/org/libreccm/workflow/AssignableTask.java b/ccm-core/src/main/java/org/libreccm/workflow/AssignableTask.java index bc2ebd821..c81d498fc 100644 --- a/ccm-core/src/main/java/org/libreccm/workflow/AssignableTask.java +++ b/ccm-core/src/main/java/org/libreccm/workflow/AssignableTask.java @@ -70,12 +70,21 @@ import static org.libreccm.core.CoreConstants.DB_SCHEMA; , @NamedQuery( name = "AssignableTask.findAssignedTasks", - query = "SELECT t FROM AssignableTask t " + query = "SELECT DISTINCT t FROM AssignableTask t " + "JOIN t.assignments a " + "WHERE a.role IN :roles " + "AND t.workflow = :workflow " + "AND t.active = true") , + @NamedQuery( + name = "AssignableTask.isAssignedTo", + query = "SELECT (CASE WHEN COUNT(t) > 0 THEN true ELSE false END) " + + "FROM AssignableTask t " + + "JOIN t.assignments a " + + "WHERE a.role IN :roles " + + "AND t = :task" + ) + , @NamedQuery( name = "AssignableTask.findOverdueTasks", query = "SELECT t FROM AssignableTask t " diff --git a/ccm-core/src/main/java/org/libreccm/workflow/AssignableTaskManager.java b/ccm-core/src/main/java/org/libreccm/workflow/AssignableTaskManager.java index f98579db4..a7f281529 100644 --- a/ccm-core/src/main/java/org/libreccm/workflow/AssignableTaskManager.java +++ b/ccm-core/src/main/java/org/libreccm/workflow/AssignableTaskManager.java @@ -22,6 +22,7 @@ import org.libreccm.core.CoreConstants; import org.libreccm.security.AuthorizationRequired; import org.libreccm.security.RequiresPrivilege; import org.libreccm.security.Role; +import org.libreccm.security.RoleMembership; import org.libreccm.security.RoleRepository; import org.libreccm.security.Shiro; import org.libreccm.security.User; @@ -125,6 +126,24 @@ public class AssignableTaskManager { } } + @Transactional(Transactional.TxType.REQUIRED) + public boolean isAssignedTo(final AssignableTask task, + final User user) { + final TypedQuery query = entityManager + .createNamedQuery("AssignableTask.isAssignedTo", + Boolean.class); + final List roles = user + .getRoleMemberships() + .stream() + .map(RoleMembership::getRole) + .collect(Collectors.toList()); + + query.setParameter("roles", roles); + query.setParameter("task", task); + + return query.getSingleResult(); + } + /** * * @param task diff --git a/ccm-core/src/main/java/org/libreccm/workflow/AssignableTaskRepository.java b/ccm-core/src/main/java/org/libreccm/workflow/AssignableTaskRepository.java index 7b8af11d0..7a7891066 100644 --- a/ccm-core/src/main/java/org/libreccm/workflow/AssignableTaskRepository.java +++ b/ccm-core/src/main/java/org/libreccm/workflow/AssignableTaskRepository.java @@ -20,18 +20,20 @@ package org.libreccm.workflow; import org.libreccm.core.AbstractEntityRepository; import org.libreccm.security.Role; +import org.libreccm.security.RoleMembership; import org.libreccm.security.User; import javax.enterprise.context.RequestScoped; import javax.persistence.NoResultException; import javax.persistence.TypedQuery; + import java.util.List; import java.util.Optional; import java.util.stream.Collectors; /** * Repository for assignable tasks. - * + * * @author Jens Pelzetter */ @RequestScoped @@ -56,7 +58,8 @@ public class AssignableTaskRepository * @return An optional either with the found item or empty */ public Optional findByUuid(final String uuid) { - final TypedQuery query = getEntityManager().createNamedQuery( + final TypedQuery query = getEntityManager() + .createNamedQuery( "AssignableTask.findByUuid", AssignableTask.class); query.setParameter("uuid", uuid); @@ -71,7 +74,8 @@ public class AssignableTaskRepository final User user, final Workflow workflow) { final TypedQuery query = getEntityManager() .createNamedQuery( - "AssignableTask.findEnabledTasksForWorkflow", AssignableTask.class); + "AssignableTask.findEnabledTasksForWorkflow", + AssignableTask.class); query.setParameter("user", user); query.setParameter("workflow", workflow); @@ -81,11 +85,12 @@ public class AssignableTaskRepository public List getAssignedTasks(final User user, final Workflow workflow) { final TypedQuery query = getEntityManager() - .createNamedQuery( - "AssignableTask.findAssignedTasks", AssignableTask.class); - final List roles = user.getRoleMemberships() + .createNamedQuery("AssignableTask.findAssignedTasks", + AssignableTask.class); + final List roles = user + .getRoleMemberships() .stream() - .map(membership -> membership.getRole()) + .map(RoleMembership::getRole) .collect(Collectors.toList()); query.setParameter("roles", roles); diff --git a/ccm-core/src/main/java/org/libreccm/workflow/Task.java b/ccm-core/src/main/java/org/libreccm/workflow/Task.java index fb5f41313..68c18ad3c 100644 --- a/ccm-core/src/main/java/org/libreccm/workflow/Task.java +++ b/ccm-core/src/main/java/org/libreccm/workflow/Task.java @@ -216,6 +216,7 @@ public class Task implements Identifiable, Serializable { this.taskId = taskId; } + @Override public String getUuid() { return uuid; } diff --git a/ccm-core/src/main/java/org/libreccm/workflow/WorkflowManager.java b/ccm-core/src/main/java/org/libreccm/workflow/WorkflowManager.java index cf645583c..a2f61675d 100644 --- a/ccm-core/src/main/java/org/libreccm/workflow/WorkflowManager.java +++ b/ccm-core/src/main/java/org/libreccm/workflow/WorkflowManager.java @@ -51,7 +51,9 @@ import javax.persistence.TypedQuery; import javax.transaction.Transactional; import org.apache.shiro.subject.Subject; -import org.libreccm.security.Role; +import org.libreccm.security.User; + +import java.util.Optional; /** * Manager for {@link Workflow}s. The logic of some of these classes has been @@ -360,12 +362,26 @@ public class WorkflowManager { workflow.setActive(true); updateState(workflow); - for (final Task current : workflow.getTasks()) { - current.setActive(true); - taskManager.updateState(current); +// for (final Task current : workflow.getTasks()) { +// current.setActive(true); +// taskManager.updateState(current); +// } + final List tasks = workflow.getTasks(); + if (!tasks.isEmpty()) { + final Task firstTask = tasks.get(0); + firstTask.setActive(true); + taskManager.updateState(firstTask); + + final Optional currentUser = shiro.getUser(); + if (!currentUser.isPresent() + && assignableTaskManager + .isAssignedTo((AssignableTask) firstTask, + currentUser.get())) { + assignableTaskManager.lockTask((AssignableTask) firstTask); + } } } - + workflowRepo.save(workflow); }