From ae05156a71a7b42607f38e824db58feb70ccaeb9 Mon Sep 17 00:00:00 2001 From: jensp Date: Mon, 21 Nov 2016 19:05:43 +0000 Subject: [PATCH] CCM NG/ccm-cms: Work on the forms for Workflow management git-svn-id: https://svn.libreccm.org/ccm/ccm_ng@4449 8810af33-2d31-482b-a856-94f89814c4df --- ...age.java.off => ContentItemPage.java.todo} | 0 ...va.off => CustomizedPreviewLink.java.todo} | 0 ...tion.java.off => AssignedTaskSection.java} | 84 +++++----- ...e.java.off => AssignedTaskTable.java.todo} | 0 ...> AssignedTaskTableModelBuilder.java.todo} | 0 ...aseTaskForm.java.off => BaseTaskForm.java} | 68 ++++---- ...ane.java.off => BaseWorkflowItemPane.java} | 38 ++--- ...ntAddForm.java.off => CommentAddForm.java} | 8 +- ...{TaskAddForm.java.off => TaskAddForm.java} | 10 +- ...{TaskAddRole.java.off => TaskAddRole.java} | 19 +-- ...askEditForm.java.off => TaskEditForm.java} | 25 +-- ...Form.java.off => TaskFinishForm.java.todo} | 158 ++++++++++-------- ...askItemPane.java.off => TaskItemPane.java} | 29 ++-- ...inPane.java.off => WorkflowAdminPane.java} | 0 ...temPane.java.off => WorkflowItemPane.java} | 0 .../workflow/AssignableTaskManager.java | 35 ++-- .../main/java/org/libreccm/workflow/Task.java | 8 +- 17 files changed, 245 insertions(+), 237 deletions(-) rename ccm-cms/src/main/java/com/arsdigita/cms/ui/{ContentItemPage.java.off => ContentItemPage.java.todo} (100%) rename ccm-cms/src/main/java/com/arsdigita/cms/ui/item/{CustomizedPreviewLink.java.off => CustomizedPreviewLink.java.todo} (100%) rename ccm-cms/src/main/java/com/arsdigita/cms/ui/workflow/{AssignedTaskSection.java.off => AssignedTaskSection.java} (77%) rename ccm-cms/src/main/java/com/arsdigita/cms/ui/workflow/{AssignedTaskTable.java.off => AssignedTaskTable.java.todo} (100%) rename ccm-cms/src/main/java/com/arsdigita/cms/ui/workflow/{AssignedTaskTableModelBuilder.java.off => AssignedTaskTableModelBuilder.java.todo} (100%) rename ccm-cms/src/main/java/com/arsdigita/cms/ui/workflow/{BaseTaskForm.java.off => BaseTaskForm.java} (78%) rename ccm-cms/src/main/java/com/arsdigita/cms/ui/workflow/{BaseWorkflowItemPane.java.off => BaseWorkflowItemPane.java} (87%) rename ccm-cms/src/main/java/com/arsdigita/cms/ui/workflow/{CommentAddForm.java.off => CommentAddForm.java} (91%) rename ccm-cms/src/main/java/com/arsdigita/cms/ui/workflow/{TaskAddForm.java.off => TaskAddForm.java} (93%) rename ccm-cms/src/main/java/com/arsdigita/cms/ui/workflow/{TaskAddRole.java.off => TaskAddRole.java} (93%) rename ccm-cms/src/main/java/com/arsdigita/cms/ui/workflow/{TaskEditForm.java.off => TaskEditForm.java} (85%) rename ccm-cms/src/main/java/com/arsdigita/cms/ui/workflow/{TaskFinishForm.java.off => TaskFinishForm.java.todo} (60%) rename ccm-cms/src/main/java/com/arsdigita/cms/ui/workflow/{TaskItemPane.java.off => TaskItemPane.java} (93%) rename ccm-cms/src/main/java/com/arsdigita/cms/ui/workflow/{WorkflowAdminPane.java.off => WorkflowAdminPane.java} (100%) rename ccm-cms/src/main/java/com/arsdigita/cms/ui/workflow/{WorkflowItemPane.java.off => WorkflowItemPane.java} (100%) diff --git a/ccm-cms/src/main/java/com/arsdigita/cms/ui/ContentItemPage.java.off b/ccm-cms/src/main/java/com/arsdigita/cms/ui/ContentItemPage.java.todo similarity index 100% rename from ccm-cms/src/main/java/com/arsdigita/cms/ui/ContentItemPage.java.off rename to ccm-cms/src/main/java/com/arsdigita/cms/ui/ContentItemPage.java.todo diff --git a/ccm-cms/src/main/java/com/arsdigita/cms/ui/item/CustomizedPreviewLink.java.off b/ccm-cms/src/main/java/com/arsdigita/cms/ui/item/CustomizedPreviewLink.java.todo similarity index 100% rename from ccm-cms/src/main/java/com/arsdigita/cms/ui/item/CustomizedPreviewLink.java.off rename to ccm-cms/src/main/java/com/arsdigita/cms/ui/item/CustomizedPreviewLink.java.todo diff --git a/ccm-cms/src/main/java/com/arsdigita/cms/ui/workflow/AssignedTaskSection.java.off b/ccm-cms/src/main/java/com/arsdigita/cms/ui/workflow/AssignedTaskSection.java similarity index 77% rename from ccm-cms/src/main/java/com/arsdigita/cms/ui/workflow/AssignedTaskSection.java.off rename to ccm-cms/src/main/java/com/arsdigita/cms/ui/workflow/AssignedTaskSection.java index 16d84091c..a21ca6e24 100755 --- a/ccm-cms/src/main/java/com/arsdigita/cms/ui/workflow/AssignedTaskSection.java.off +++ b/ccm-cms/src/main/java/com/arsdigita/cms/ui/workflow/AssignedTaskSection.java @@ -28,25 +28,19 @@ import com.arsdigita.bebop.event.ActionListener; import com.arsdigita.globalization.GlobalizedMessage; import com.arsdigita.toolbox.ui.ActionGroup; import com.arsdigita.toolbox.ui.Section; -import com.arsdigita.web.Web; import org.libreccm.workflow.Workflow; -import java.util.ArrayList; -import java.util.Iterator; - -import org.apache.log4j.Logger; import org.libreccm.cdi.utils.CdiUtil; import org.libreccm.security.Shiro; -import org.libreccm.workflow.Task; import org.libreccm.workflow.AssignableTask; +import org.libreccm.workflow.AssignableTaskManager; import org.libreccm.workflow.AssignableTaskRepository; -import org.libreccm.workflow.WorkflowConstants; import org.libreccm.workflow.WorkflowManager; -import org.libreccm.workflow.WorkflowRepository; +import org.libreccm.workflow.WorkflowState; import org.librecms.CmsConstants; import org.librecms.workflow.CmsTask; -import org.librecms.workflow.CmsTaskTypeOld; +import org.librecms.workflow.CmsTaskType; import java.util.List; @@ -94,8 +88,8 @@ public final class AssignedTaskSection extends Section { @Override public final boolean isVisible(final PageState state) { - return m_facade.workflowState(state, WorkflowConstants.INIT) - || m_facade.workflowState(state, WorkflowConstants.STOPPED); + return m_facade.workflowState(state, WorkflowState.INIT) + || m_facade.workflowState(state, WorkflowState.STOPPED); } private class Listener implements ActionListener { @@ -119,9 +113,9 @@ public final class AssignedTaskSection extends Section { @Override public final boolean isVisible(final PageState state) { - return m_facade.workflowState(state, WorkflowConstants.STARTED) - && m_facade.tasksExist(state) - && !m_facade.tasksLocked(state); + return m_facade.workflowState(state, WorkflowState.STARTED) + && m_facade.tasksExist(state) + && !m_facade.tasksLocked(state); } private class Listener implements ActionListener { @@ -145,9 +139,9 @@ public final class AssignedTaskSection extends Section { @Override public final boolean isVisible(final PageState state) { - return m_facade.workflowState(state, WorkflowConstants.STARTED) - && m_facade.tasksExist(state) - && m_facade.tasksLocked(state); + return m_facade.workflowState(state, WorkflowState.STARTED) + && m_facade.tasksExist(state) + && m_facade.tasksLocked(state); } private class Listener implements ActionListener { @@ -177,23 +171,24 @@ public final class AssignedTaskSection extends Section { protected final Object initialValue(final PageState state) { final Workflow workflow = m_flow.getWorkflow(state); final CdiUtil cdiUtil = CdiUtil.createCdiUtil(); - final AssignableTaskRepository userTaskRepo = cdiUtil.findBean(AssignableTaskRepository.class); + final AssignableTaskRepository userTaskRepo = cdiUtil.findBean( + AssignableTaskRepository.class); final Shiro shiro = cdiUtil.findBean(Shiro.class); - return userTaskRepo.findEnabledTasksForWorkflow(shiro.getUser(), + return userTaskRepo.findEnabledTasksForWorkflow(shiro.getUser(), workflow); } @SuppressWarnings("unchecked") final List getTasks(final PageState state) { - return (ArrayList) get(state); + return (List) get(state); } } final void restartWorkflow(final PageState state) { final CdiUtil cdiUtil = CdiUtil.createCdiUtil(); - final WorkflowManager workflowManager = cdiUtil.findBean( - WorkflowManager.class); + final WorkflowManager workflowManager = cdiUtil.findBean( + WorkflowManager.class); final Workflow workflow = m_flow.getWorkflow(state); workflowManager.start(workflow); @@ -205,42 +200,43 @@ public final class AssignedTaskSection extends Section { final void lockTasks(final PageState state) { final CdiUtil cdiUtil = CdiUtil.createCdiUtil(); - final WorkflowManager workflowManager = cdiUtil.findBean(WorkflowManager.class); - - for(final AssignableTask task : m_tasks.getTasks(state)) { + final AssignableTaskManager taskManager = cdiUtil.findBean( + AssignableTaskManager.class); + + for (final AssignableTask task : m_tasks.getTasks(state)) { if (relevant(task) && !task.isLocked()) { - workflowManager.lockTask(task); + taskManager.lockTask(task); } } } final void unlockTasks(final PageState state) { final CdiUtil cdiUtil = CdiUtil.createCdiUtil(); - final WorkflowManager workflowManager = cdiUtil.findBean(WorkflowManager.class); - - for(final AssignableTask task : m_tasks.getTasks(state)) { + final AssignableTaskManager taskManager = cdiUtil.findBean( + AssignableTaskManager.class); + + for (final AssignableTask task : m_tasks.getTasks(state)) { if (relevant(task) && task.isLocked()) { - workflowManager.unlockTask(task); + taskManager.unlockTask(task); } } } final boolean tasksLocked(final PageState state) { - for(final AssignableTask task : m_tasks.getTasks(state)) { + for (final AssignableTask task : m_tasks.getTasks(state)) { if (relevant(task) && !task.isLocked()) { return false; } } - + return true; } - final boolean workflowState(final PageState state, int processState) { - final CdiUtil cdiUtil = CdiUtil.createCdiUtil(); - final WorkflowManager workflowManager = cdiUtil.findBean(WorkflowManager.class); + final boolean workflowState(final PageState state, + WorkflowState processState) { final Workflow workflow = m_flow.getWorkflow(state); - - return workflowManager.getState(workflow) == processState; + + return workflow.getState() == processState; } final boolean tasksExist(final PageState state) { @@ -248,11 +244,15 @@ public final class AssignedTaskSection extends Section { } private boolean relevant(final AssignableTask task) { - return true; - -// ToDo -// return task.getTaskType().getID().equals(CMSTaskType.AUTHOR) -// || task.getTaskType().getID().equals(CMSTaskType.EDIT); + if (task instanceof CmsTask) { + final CmsTask cmsTask = (CmsTask) task; + + return cmsTask.getTaskType() == CmsTaskType.AUTHOR + || cmsTask.getTaskType() == CmsTaskType.EDIT; + } else { + return false; + } + } } diff --git a/ccm-cms/src/main/java/com/arsdigita/cms/ui/workflow/AssignedTaskTable.java.off b/ccm-cms/src/main/java/com/arsdigita/cms/ui/workflow/AssignedTaskTable.java.todo similarity index 100% rename from ccm-cms/src/main/java/com/arsdigita/cms/ui/workflow/AssignedTaskTable.java.off rename to ccm-cms/src/main/java/com/arsdigita/cms/ui/workflow/AssignedTaskTable.java.todo diff --git a/ccm-cms/src/main/java/com/arsdigita/cms/ui/workflow/AssignedTaskTableModelBuilder.java.off b/ccm-cms/src/main/java/com/arsdigita/cms/ui/workflow/AssignedTaskTableModelBuilder.java.todo similarity index 100% rename from ccm-cms/src/main/java/com/arsdigita/cms/ui/workflow/AssignedTaskTableModelBuilder.java.off rename to ccm-cms/src/main/java/com/arsdigita/cms/ui/workflow/AssignedTaskTableModelBuilder.java.todo diff --git a/ccm-cms/src/main/java/com/arsdigita/cms/ui/workflow/BaseTaskForm.java.off b/ccm-cms/src/main/java/com/arsdigita/cms/ui/workflow/BaseTaskForm.java similarity index 78% rename from ccm-cms/src/main/java/com/arsdigita/cms/ui/workflow/BaseTaskForm.java.off rename to ccm-cms/src/main/java/com/arsdigita/cms/ui/workflow/BaseTaskForm.java index 9ff3c3b5e..6aabc1d5e 100755 --- a/ccm-cms/src/main/java/com/arsdigita/cms/ui/workflow/BaseTaskForm.java.off +++ b/ccm-cms/src/main/java/com/arsdigita/cms/ui/workflow/BaseTaskForm.java @@ -15,36 +15,36 @@ package com.arsdigita.cms.ui.workflow; import com.arsdigita.bebop.FormProcessException; -import com.arsdigita.bebop.PageState; +import com.arsdigita.bebop.Label; import com.arsdigita.bebop.event.FormSectionEvent; import com.arsdigita.bebop.event.FormValidationListener; +import com.arsdigita.bebop.event.PrintEvent; +import com.arsdigita.bebop.event.PrintListener; import com.arsdigita.bebop.form.CheckboxGroup; +import com.arsdigita.bebop.form.Option; import com.arsdigita.bebop.form.OptionGroup; import com.arsdigita.bebop.form.SingleSelect; import com.arsdigita.bebop.form.TextArea; import com.arsdigita.bebop.form.TextField; import com.arsdigita.bebop.parameters.IntegerParameter; import com.arsdigita.cms.ui.BaseForm; -import com.arsdigita.cms.ui.ListOptionPrintListener; - -import org.librecms.workflow.CmsTaskTypeOld; import com.arsdigita.globalization.GlobalizedMessage; -import com.arsdigita.kernel.KernelConfig; +import com.arsdigita.util.UncheckedWrapperException; import org.apache.logging.log4j.LogManager; import org.libreccm.workflow.Task; import org.apache.logging.log4j.Logger; import org.libreccm.cdi.utils.CdiUtil; +import org.libreccm.workflow.CircularTaskDependencyException; +import org.libreccm.workflow.TaskManager; import org.libreccm.workflow.TaskRepository; -import org.libreccm.workflow.WorkflowManager; import org.librecms.CmsConstants; import org.librecms.contentsection.privileges.AdminPrivileges; -import org.librecms.workflow.CmsTaskTypeRepository; +import org.librecms.workflow.CmsTaskType; import java.util.HashMap; import java.util.List; -import java.util.Locale; import java.util.Map; import java.util.TooManyListenersException; import java.util.stream.Collectors; @@ -55,9 +55,6 @@ import java.util.stream.Collectors; */ class BaseTaskForm extends BaseForm { - private static final Logger LOGGER = LogManager - .getLogger(BaseTaskForm.class); - final WorkflowRequestLocal m_workflow; final TextField m_name; @@ -81,7 +78,7 @@ class BaseTaskForm extends BaseForm { try { m_type.addPrintListener(new TaskTypePrintListener()); } catch (TooManyListenersException ex) { - throw new RuntimeException(ex); + throw new UncheckedWrapperException(ex); } m_description = new Description("desc", 4000, true); @@ -142,30 +139,19 @@ class BaseTaskForm extends BaseForm { } */ // Fix this one too - private class TaskTypePrintListener extends ListOptionPrintListener { + private class TaskTypePrintListener implements PrintListener { @Override - protected List getDataQuery(final PageState state) { - final CdiUtil cdiUtil = CdiUtil.createCdiUtil(); - final CmsTaskTypeRepository taskTypeRepo = cdiUtil.findBean( - CmsTaskTypeRepository.class); + public void prepare(final PrintEvent event) { + final OptionGroup target = (OptionGroup) event.getTarget(); - final List taskTypes = taskTypeRepo.findAll(); + for (final CmsTaskType type : CmsTaskType.values()) { + final GlobalizedMessage label = new GlobalizedMessage( + String.format("cms.workflow.task_type.%s", type.toString()), + CmsConstants.CMS_BUNDLE); - return taskTypes; - - } - - @Override - public String getKey(final CmsTaskTypeOld taskType) { - return Long.toString(taskType.getTaskTypeId()); - } - - @Override - public String getValue(final CmsTaskTypeOld taskType) { - final KernelConfig kernelConfig = KernelConfig.getConfig(); - final Locale defaultLocale = kernelConfig.getDefaultLocale(); - return taskType.getName().getValue(defaultLocale); + target.addOption(new Option(type.toString(), new Label(label))); + } } } @@ -176,6 +162,7 @@ class BaseTaskForm extends BaseForm { * new ones in since it is possible that Tasks will fire events when * dependencies are added and removed. * + * XXX domlay */ final void processDependencies(final Task task, final String[] selectedDependencies) { @@ -188,8 +175,7 @@ class BaseTaskForm extends BaseForm { final CdiUtil cdiUtil = CdiUtil.createCdiUtil(); final TaskRepository taskRepo = cdiUtil.findBean(TaskRepository.class); - final WorkflowManager workflowManager = cdiUtil.findBean( - WorkflowManager.class); + final TaskManager taskManager = cdiUtil.findBean(TaskManager.class); Long selectedId; Object addedTask; @@ -203,11 +189,17 @@ class BaseTaskForm extends BaseForm { } } - toRemove.values().forEach(taskToRemove -> workflowManager - .removeDependentTask(task, taskToRemove)); + for (final Task taskToRemove : toRemove.values()) { + taskManager.removeDependentTask(task, taskToRemove); + } - toAdd.values().forEach(tasktoAdd -> workflowManager - .addDependentTask(task, tasktoAdd)); + for (final Task taskToAdd : toAdd.values()) { + try { + taskManager.addDependentTask(task, taskToAdd); + } catch(CircularTaskDependencyException ex) { + throw new UncheckedWrapperException(ex); + } + } } } diff --git a/ccm-cms/src/main/java/com/arsdigita/cms/ui/workflow/BaseWorkflowItemPane.java.off b/ccm-cms/src/main/java/com/arsdigita/cms/ui/workflow/BaseWorkflowItemPane.java similarity index 87% rename from ccm-cms/src/main/java/com/arsdigita/cms/ui/workflow/BaseWorkflowItemPane.java.off rename to ccm-cms/src/main/java/com/arsdigita/cms/ui/workflow/BaseWorkflowItemPane.java index cb67c7cf8..3e968b315 100755 --- a/ccm-cms/src/main/java/com/arsdigita/cms/ui/workflow/BaseWorkflowItemPane.java.off +++ b/ccm-cms/src/main/java/com/arsdigita/cms/ui/workflow/BaseWorkflowItemPane.java @@ -46,12 +46,13 @@ import com.arsdigita.web.Web; import org.libreccm.cdi.utils.CdiUtil; import org.libreccm.security.Shiro; import org.libreccm.workflow.Task; +import org.libreccm.workflow.TaskManager; import org.libreccm.workflow.TaskRepository; import org.libreccm.workflow.Workflow; import org.libreccm.workflow.WorkflowManager; import org.librecms.CmsConstants; import org.librecms.contentsection.privileges.AdminPrivileges; -import org.librecms.workflow.CmsTaskTypeRepository; +import org.librecms.workflow.CmsTaskType; import java.math.BigDecimal; import java.util.List; @@ -151,10 +152,8 @@ abstract class BaseWorkflowItemPane extends BaseItemPane { final Shiro shiro = cdiUtil.findBean(Shiro.class); final User currentUser = shiro.getUser(); - boolean visible = task.isLocked() - && (lockingUser == null - || lockingUser.equals(currentUser)); - return visible; + return task.isLocked() && (lockingUser == null + || lockingUser.equals(currentUser)); } private class Listener implements ActionListener { @@ -164,18 +163,17 @@ abstract class BaseWorkflowItemPane extends BaseItemPane { final PageState state = event.getPageState(); final CdiUtil cdiUtil = CdiUtil.createCdiUtil(); - final WorkflowManager workflowManager = cdiUtil.findBean( - WorkflowManager.class); + final TaskManager taskManager = cdiUtil.findBean(TaskManager.class); final Task task = m_task.getTask(state); - task.setTaskState("finished"); - + taskManager.finish(task); } } } + @Override public void reset(final PageState state) { super.reset(state); @@ -211,14 +209,10 @@ abstract class BaseWorkflowItemPane extends BaseItemPane { @Override protected final Object initialValue(final PageState state) { - final String id = m_tasks.getRowSelectionModel().getSelectedKey( + final String key = m_tasks.getRowSelectionModel().getSelectedKey( state).toString(); - final CdiUtil cdiUtil = CdiUtil.createCdiUtil(); - final CmsTaskTypeRepository taskRepo = cdiUtil.findBean( - CmsTaskTypeRepository.class); - - return taskRepo.findById(Long.parseLong(id)); + return CmsTaskType.valueOf(key); } } @@ -237,8 +231,6 @@ abstract class BaseWorkflowItemPane extends BaseItemPane { ActionGroup.EDIT); m_actionGroup.addAction(new AdminVisible(deleteLink), ActionGroup.DELETE); -// m_actionGroup.addAction(new AdminVisible(new StartLink())); -// m_actionGroup.addAction(new AdminVisible(new StopLink())); } private class Properties extends PropertyList { @@ -247,20 +239,20 @@ abstract class BaseWorkflowItemPane extends BaseItemPane { protected final List properties(final PageState state) { @SuppressWarnings("unchecked") final List props = super.properties(state); - final Workflow flow = (Workflow) m_workflow.get(state); + final Workflow workflow = (Workflow) m_workflow.get(state); final KernelConfig kernelConfig = KernelConfig.getConfig(); final Locale defaultLocale = kernelConfig.getDefaultLocale(); props.add(new Property(gz("cms.ui.name"), - flow.getName().getValue(defaultLocale))); + workflow.getName().getValue(defaultLocale))); props.add(new Property( gz("cms.ui.description"), - flow.getDescription().getValue(defaultLocale))); -// props.add(new Property(gz("cms.ui.workflow.current_state"), -// flow.getStateString())); + workflow.getDescription().getValue(defaultLocale))); + props.add(new Property(gz("cms.ui.workflow.current_state"), + workflow.getState().toString())); props.add(new Property(gz("cms.ui.workflow.num_tasks"), - String.valueOf(flow.getTasks().size()))); + String.valueOf(workflow.getTasks().size()))); return props; } diff --git a/ccm-cms/src/main/java/com/arsdigita/cms/ui/workflow/CommentAddForm.java.off b/ccm-cms/src/main/java/com/arsdigita/cms/ui/workflow/CommentAddForm.java similarity index 91% rename from ccm-cms/src/main/java/com/arsdigita/cms/ui/workflow/CommentAddForm.java.off rename to ccm-cms/src/main/java/com/arsdigita/cms/ui/workflow/CommentAddForm.java index 64f91fdf7..9f08a3cfc 100755 --- a/ccm-cms/src/main/java/com/arsdigita/cms/ui/workflow/CommentAddForm.java.off +++ b/ccm-cms/src/main/java/com/arsdigita/cms/ui/workflow/CommentAddForm.java @@ -24,10 +24,13 @@ import com.arsdigita.bebop.event.FormProcessListener; import com.arsdigita.bebop.event.FormSectionEvent; import com.arsdigita.bebop.form.TextArea; import com.arsdigita.cms.ui.BaseForm; + import org.librecms.workflow.CmsTask; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.libreccm.cdi.utils.CdiUtil; +import org.libreccm.workflow.TaskComment; +import org.libreccm.workflow.TaskManager; import org.libreccm.workflow.TaskRepository; /** @@ -69,9 +72,8 @@ class CommentAddForm extends BaseForm { final CmsTask task = selectedTask.getTask(state); final CdiUtil cdiUtil = CdiUtil.createCdiUtil(); final TaskRepository taskRepo = cdiUtil.findBean(TaskRepository.class); - - task.addComment((String)comment.getValue(state)); - taskRepo.save(task); + final TaskManager taskManager = cdiUtil.findBean(TaskManager.class); + taskManager.addComment(task, (String) comment.getValue(state)); } } } diff --git a/ccm-cms/src/main/java/com/arsdigita/cms/ui/workflow/TaskAddForm.java.off b/ccm-cms/src/main/java/com/arsdigita/cms/ui/workflow/TaskAddForm.java similarity index 93% rename from ccm-cms/src/main/java/com/arsdigita/cms/ui/workflow/TaskAddForm.java.off rename to ccm-cms/src/main/java/com/arsdigita/cms/ui/workflow/TaskAddForm.java index aa0e63d80..0a1ea4058 100755 --- a/ccm-cms/src/main/java/com/arsdigita/cms/ui/workflow/TaskAddForm.java.off +++ b/ccm-cms/src/main/java/com/arsdigita/cms/ui/workflow/TaskAddForm.java @@ -30,17 +30,17 @@ import com.arsdigita.bebop.form.OptionGroup; import com.arsdigita.kernel.KernelConfig; import org.librecms.workflow.CmsTask; -import org.librecms.workflow.CmsTaskTypeOld; import com.arsdigita.util.UncheckedWrapperException; import org.libreccm.cdi.utils.CdiUtil; import org.libreccm.configuration.ConfigurationManager; import org.libreccm.workflow.Task; +import org.libreccm.workflow.TaskManager; import org.libreccm.workflow.TaskRepository; import org.libreccm.workflow.Workflow; import org.libreccm.workflow.WorkflowManager; -import org.librecms.workflow.CmsTaskTypeRepository; +import org.librecms.workflow.CmsTaskType; import java.util.List; import java.util.Locale; @@ -105,9 +105,9 @@ class TaskAddForm extends BaseTaskForm { final CdiUtil cdiUtil = CdiUtil.createCdiUtil(); final TaskRepository taskRepo = cdiUtil.findBean( TaskRepository.class); - final CmsTaskTypeRepository taskTypeRepo = cdiUtil.findBean(CmsTaskTypeRepository.class); final WorkflowManager workflowManager = cdiUtil.findBean( WorkflowManager.class); + final TaskManager taskManager = cdiUtil.findBean(TaskManager.class); final ConfigurationManager confManager = cdiUtil.findBean( ConfigurationManager.class); final KernelConfig kernelConfig = confManager.findConfiguration( @@ -120,13 +120,13 @@ class TaskAddForm extends BaseTaskForm { defaultLocale, ((String) m_description.getValue(state))); - final CmsTaskTypeOld taskType = taskTypeRepo.findById((Long) m_type.getValue(state)); + final CmsTaskType taskType = CmsTaskType.valueOf((String) m_type.getValue(state)); task.setTaskType(taskType); task.setActive(true); taskRepo.save(task); - workflowManager.addTask(workflow, task); + taskManager.addTask(workflow, task); processDependencies(task, (String[]) m_deps.getValue(state)); diff --git a/ccm-cms/src/main/java/com/arsdigita/cms/ui/workflow/TaskAddRole.java.off b/ccm-cms/src/main/java/com/arsdigita/cms/ui/workflow/TaskAddRole.java similarity index 93% rename from ccm-cms/src/main/java/com/arsdigita/cms/ui/workflow/TaskAddRole.java.off rename to ccm-cms/src/main/java/com/arsdigita/cms/ui/workflow/TaskAddRole.java index ab316f4b0..f76c7e726 100755 --- a/ccm-cms/src/main/java/com/arsdigita/cms/ui/workflow/TaskAddRole.java.off +++ b/ccm-cms/src/main/java/com/arsdigita/cms/ui/workflow/TaskAddRole.java @@ -42,13 +42,13 @@ import org.librecms.workflow.CmsTask; import com.arsdigita.globalization.GlobalizedMessage; - import com.arsdigita.util.UncheckedWrapperException; import org.libreccm.cdi.utils.CdiUtil; import org.libreccm.security.PermissionChecker; import org.libreccm.security.Role; import org.libreccm.security.RoleRepository; +import org.libreccm.workflow.AssignableTaskManager; import org.libreccm.workflow.TaskAssignment; import org.libreccm.workflow.WorkflowManager; import org.librecms.CmsConstants; @@ -109,7 +109,7 @@ class TaskAddRole extends CMSForm { final List roles = assignments.stream() .map(TaskAssignment::getRole) .collect(Collectors.toList()); - + m_roles.setValue(state, roles); } @@ -125,13 +125,14 @@ class TaskAddRole extends CMSForm { final CmsTask task = m_task.getTask(state); final CdiUtil cdiUtil = CdiUtil.createCdiUtil(); - final WorkflowManager workflowManager = cdiUtil.findBean( - WorkflowManager.class); + final AssignableTaskManager taskManager = cdiUtil.findBean( + AssignableTaskManager.class); final RoleRepository roleRepository = cdiUtil.findBean( RoleRepository.class); - task.getAssignments().forEach(assignment -> workflowManager - .retractTask(task, assignment.getRole())); + task.getAssignments().forEach(assignment -> { + taskManager.retractTask(task, assignment.getRole()); + }); final String[] roleIds = (String[]) m_roles.getValue(state); @@ -139,7 +140,7 @@ class TaskAddRole extends CMSForm { for (final String roleId : roleIds) { final Role role = roleRepository.findById(Long .parseLong(roleId)); - workflowManager.assignTask(task, role); + taskManager.assignTask(task, role); } } } @@ -201,8 +202,4 @@ class TaskAddRole extends CMSForm { return new GlobalizedMessage(key, CmsConstants.CMS_BUNDLE); } - private static String lz(final String key) { - return (String) gz(key).localize(); - } - } diff --git a/ccm-cms/src/main/java/com/arsdigita/cms/ui/workflow/TaskEditForm.java.off b/ccm-cms/src/main/java/com/arsdigita/cms/ui/workflow/TaskEditForm.java similarity index 85% rename from ccm-cms/src/main/java/com/arsdigita/cms/ui/workflow/TaskEditForm.java.off rename to ccm-cms/src/main/java/com/arsdigita/cms/ui/workflow/TaskEditForm.java index 3e4bbc3fd..e2d998526 100755 --- a/ccm-cms/src/main/java/com/arsdigita/cms/ui/workflow/TaskEditForm.java.off +++ b/ccm-cms/src/main/java/com/arsdigita/cms/ui/workflow/TaskEditForm.java @@ -37,10 +37,8 @@ import org.libreccm.cdi.utils.CdiUtil; import org.libreccm.configuration.ConfigurationManager; import org.libreccm.workflow.Task; import org.libreccm.workflow.TaskRepository; -import org.librecms.workflow.CmsTaskTypeOld; -import org.librecms.workflow.CmsTaskTypeRepository; +import org.librecms.workflow.CmsTaskType; -import java.util.ArrayList; import java.util.List; import java.util.Locale; import java.util.TooManyListenersException; @@ -52,13 +50,13 @@ import java.util.stream.Collectors; */ class TaskEditForm extends BaseTaskForm { - private TaskRequestLocal m_task; + private TaskRequestLocal selectedTask; public TaskEditForm(final WorkflowRequestLocal workflow, - final TaskRequestLocal task) { + final TaskRequestLocal selectedTask) { super("task", gz("cms.ui.workflow.task.edit"), workflow); - m_task = task; + this.selectedTask = selectedTask; try { m_deps.addPrintListener(new DependencyPrinter()); @@ -89,7 +87,7 @@ class TaskEditForm extends BaseTaskForm { final OptionGroup options) { final KernelConfig kernelConfig = KernelConfig.getConfig(); final Locale defaultLocale = kernelConfig.getDefaultLocale(); - if (m_task.getTask(state).getTaskId() != task.getTaskId()) { + if (selectedTask.getTask(state).getTaskId() != task.getTaskId()) { options.addOption(new Option( Long.toString(task.getTaskId()), task.getLabel().getValue(defaultLocale))); @@ -102,12 +100,11 @@ class TaskEditForm extends BaseTaskForm { public final void init(final FormSectionEvent event) throws FormProcessException { final PageState state = event.getPageState(); - final CmsTask task = m_task.getTask(state); + final CmsTask task = selectedTask.getTask(state); m_name.setValue(state, task.getLabel()); m_description.setValue(state, task.getDescription()); - m_type.setValue(state, Long.toString(task.getTaskType() - .getTaskTypeId())); + m_type.setValue(state, task.getTaskType().toString()); final List dependencies = task.getDependsOn(); final List depIdList = dependencies.stream() @@ -125,13 +122,11 @@ class TaskEditForm extends BaseTaskForm { public final void process(final FormSectionEvent event) throws FormProcessException { final PageState state = event.getPageState(); - final CmsTask task = m_task.getTask(state); + final CmsTask task = selectedTask.getTask(state); final CdiUtil cdiUtil = CdiUtil.createCdiUtil(); final TaskRepository taskRepo = cdiUtil.findBean( TaskRepository.class); - final CmsTaskTypeRepository taskTypeRepo = cdiUtil.findBean( - CmsTaskTypeRepository.class); final ConfigurationManager confManager = cdiUtil.findBean( ConfigurationManager.class); final KernelConfig kernelConfig = confManager.findConfiguration( @@ -144,9 +139,7 @@ class TaskEditForm extends BaseTaskForm { defaultLocale, (String) m_description.getValue(state)); - final CmsTaskTypeOld taskType = taskTypeRepo.findById((Long) m_type - .getValue(state)); - task.setTaskType(taskType); + task.setTaskType(CmsTaskType.valueOf((String)m_type.getValue(state))); taskRepo.save(task); diff --git a/ccm-cms/src/main/java/com/arsdigita/cms/ui/workflow/TaskFinishForm.java.off b/ccm-cms/src/main/java/com/arsdigita/cms/ui/workflow/TaskFinishForm.java.todo similarity index 60% rename from ccm-cms/src/main/java/com/arsdigita/cms/ui/workflow/TaskFinishForm.java.off rename to ccm-cms/src/main/java/com/arsdigita/cms/ui/workflow/TaskFinishForm.java.todo index 525bdcc29..f9524027e 100755 --- a/ccm-cms/src/main/java/com/arsdigita/cms/ui/workflow/TaskFinishForm.java.off +++ b/ccm-cms/src/main/java/com/arsdigita/cms/ui/workflow/TaskFinishForm.java.todo @@ -29,36 +29,40 @@ import com.arsdigita.bebop.form.Option; import com.arsdigita.bebop.form.RadioGroup; import com.arsdigita.bebop.parameters.BooleanParameter; -import org.librecms.contentsection.ContentSection; - -import com.arsdigita.cms.ContentCenter; import com.arsdigita.cms.ui.ContentItemPage; import com.arsdigita.globalization.GlobalizedMessage; +import com.arsdigita.kernel.KernelConfig; import com.arsdigita.util.UncheckedWrapperException; import org.librecms.workflow.CmsTask; -import org.librecms.workflow.CmsTaskTypeOld; import com.arsdigita.web.RedirectSignal; import com.arsdigita.web.URL; -import com.arsdigita.web.Web; import org.libreccm.workflow.Task; import org.apache.logging.log4j.Logger; -import java.util.Iterator; import java.util.Optional; import org.apache.logging.log4j.LogManager; +import org.arsdigita.cms.CMSConfig; import org.libreccm.cdi.utils.CdiUtil; +import org.libreccm.configuration.ConfigurationManager; import org.libreccm.security.PermissionChecker; import org.libreccm.security.Shiro; +import org.libreccm.security.User; +import org.libreccm.workflow.AssignableTask; +import org.libreccm.workflow.AssignableTaskManager; +import org.libreccm.workflow.TaskManager; import org.libreccm.workflow.TaskRepository; +import org.libreccm.workflow.Workflow; import org.libreccm.workflow.WorkflowManager; -import org.libreccm.workflow.WorkflowRepository; import org.librecms.CmsConstants; import org.librecms.contentsection.ContentItem; import org.librecms.contentsection.ContentItemRepository; +import org.librecms.workflow.CmsTaskType; + +import java.util.List; /** *

@@ -71,7 +75,7 @@ import org.librecms.contentsection.ContentItemRepository; public final class TaskFinishForm extends CommentAddForm { private static final Logger LOGGER = LogManager.getLogger( - TaskFinishForm.class); + TaskFinishForm.class); private final TaskRequestLocal m_task; private final Label m_approvePrompt; private final RadioGroup m_approve; @@ -82,10 +86,12 @@ public final class TaskFinishForm extends CommentAddForm { m_task = task; m_approve = new RadioGroup(new BooleanParameter("approve")); - m_approve.addOption(new Option("true", - lz("cms.ui.workflow.task.approve"))); - m_approve.addOption(new Option("false", - lz("cms.ui.workflow.task.reject"))); + m_approve.addOption(new Option( + "true", + new Label(gz("cms.ui.workflow.task.approve")))); + m_approve.addOption(new Option( + "false", + new Label(gz("cms.ui.workflow.task.reject")))); m_approvePrompt = new Label(gz("cms.ui.workflow.task.approve_prompt")); @@ -117,13 +123,14 @@ public final class TaskFinishForm extends CommentAddForm { } } } + } private class ValidationListener implements FormValidationListener { @Override public final void validate(final FormSectionEvent e) - throws FormProcessException { + throws FormProcessException { LOGGER.debug("Validating task finish"); final PageState state = e.getPageState(); @@ -131,17 +138,18 @@ public final class TaskFinishForm extends CommentAddForm { if (requiresApproval(task) && m_approve.getValue(state) == null) { throw new FormProcessException(new GlobalizedMessage( - "cms.ui.workflow.task.approval_or_reject_required", - CmsConstants.CMS_BUNDLE)); + "cms.ui.workflow.task.approval_or_reject_required", + CmsConstants.CMS_BUNDLE)); } } + } private class ProcessListener implements FormProcessListener { @Override public final void process(final FormSectionEvent event) - throws FormProcessException { + throws FormProcessException { LOGGER.debug("Processing task finish"); final PageState state = event.getPageState(); @@ -150,26 +158,36 @@ public final class TaskFinishForm extends CommentAddForm { final CdiUtil cdiUtil = CdiUtil.createCdiUtil(); final PermissionChecker permissionChecker = cdiUtil.findBean( - PermissionChecker.class); + PermissionChecker.class); final ContentItemRepository itemRepo = cdiUtil.findBean( - ContentItemRepository.class); + ContentItemRepository.class); final Optional item = itemRepo.findItemWithWorkflow( - task.getWorkflow()); + task.getWorkflow()); if (!item.isPresent()) { throw new UncheckedWrapperException( - "Workflow not assigned to an item"); + "Workflow not assigned to an item"); } permissionChecker.checkPermission(task.getTaskType().getPrivilege(), item.get()); final TaskRepository taskRepo = cdiUtil.findBean( - TaskRepository.class); + TaskRepository.class); + final WorkflowManager workflowManager = cdiUtil.findBean( + WorkflowManager.class); + final TaskManager taskManager = cdiUtil.findBean(TaskManager.class); + final AssignableTaskManager assignableTaskManager = cdiUtil + .findBean(AssignableTaskManager.class); + final Shiro shiro = cdiUtil.findBean(Shiro.class); + final ConfigurationManager confManager = cdiUtil.findBean( + ConfigurationManager.class); + final KernelConfig kernelConfig = confManager.findConfiguration( + KernelConfig.class); if (requiresApproval(task)) { LOGGER.debug("The task requires approval; checking to see " - + "if it's approved"); + + "if it's approved"); // XXX I think the fact that this returns a Boolean is // the effect of broken parameter marshalling in @@ -179,75 +197,77 @@ public final class TaskFinishForm extends CommentAddForm { if (isApproved.equals(Boolean.TRUE)) { LOGGER.debug("The task is approved; finishing the task"); - final Shiro shiro = cdiUtil.findBean(Shiro.class); - final WorkflowManager workflowManager = cdiUtil.findBean( - WorkflowManager.class); - - task.setActive(false); + taskManager.finish(task); finishedTask = true; } else { LOGGER.debug("The task is rejected; reenabling dependent " - + "tasks"); + + "tasks"); // Reenable the previous tasks. - final Iterator iter = task.getDependentTasks(). - iterator(); + for (final Task dependent : task.getDependentTasks()) { + LOGGER.debug("Reenabling task {}", + dependent.getLabel().getValue( + kernelConfig.getDefaultLocale())); - while (iter.hasNext()) { - final Task dependent = (Task) iter.next(); - - if (LOGGER.isDebugEnabled()) { - LOGGER.debug("Reenabling task " + dependent. - getLabel()); - } - - dependent.setActive(true); - - taskRepo.save(dependent); + taskManager.enable(dependent); } } } else { - LOGGER.debug("The task does not require approval; finishing " - + "it"); + LOGGER.debug("The task does not require approval; finishing it"); - task.setActive(false); - taskRepo.save(task); + taskManager.disable(task); } if (finishedTask) { - Iterator tasks = Engine.getInstance(CMSEngine.CMS_ENGINE_TYPE). - getEnabledTasks(Web.getWebContext().getUser(), - task.getParentID()).iterator(); - if (tasks.hasNext()) { - CmsTask thisTask = (CmsTask) tasks.next(); - PermissionDescriptor thisTaskAccess = new PermissionDescriptor( - thisTask.getTaskType().getPrivilege(), task. - getWorkflow().getObject(), user); - if (PermissionService.checkPermission(thisTaskAccess)) { + final TaskFinishFormController controller = cdiUtil.findBean( + TaskFinishFormController.class); + final Workflow workflow = task.getWorkflow(); + final User user = shiro.getUser(); + final List tasks = controller.findEnabledTasks( + workflow); + for (final AssignableTask currentTask : tasks) { + if (!(currentTask instanceof CmsTask)) { + continue; + } + + final CmsTask currentCmsTask = (CmsTask) currentTask; + final String privilege = currentCmsTask.getTaskType() + .getPrivilege(); + if (permissionChecker.isPermitted(privilege, + workflow.getObject())) { + //Lock task for current user + assignableTaskManager.lockTask(currentCmsTask); + + if (CmsTaskType.DEPLOY == currentCmsTask.getTaskType()) { + + } else { + throw new RedirectSignal( + URL.there(state.getRequest(), + ContentItemPage.getItemURL( + item, + ContentItemPage.PUBLISHING_TAB)), + true); + } - // Lock task for user - thisTask.lock((User) user); - int targetTab = (thisTask.getTaskType().getID().equals(CmsTaskTypeOld.DEPLOY)) ? ContentItemPage.PUBLISHING_TAB : ContentItemPage.AUTHORING_TAB; - throw new RedirectSignal(URL.there(state.getRequest(), - ContentItemPage. - getItemURL( - task. - getItem(), - targetTab)), - true); } } + // redirect to /content-center if streamlined creation mode is active. - if (ContentSection.getConfig().getUseStreamlinedCreation()) { - throw new RedirectSignal(URL.there(state.getRequest(), - ContentCenter.getURL()), - true); + final CMSConfig cmsConfig = confManager.findConfiguration( + CMSConfig.class); + if (cmsConfig.isUseStreamlinedCreation()) { + throw new RedirectSignal( + URL.there(state.getRequest(), + CmsConstants.CONTENT_CENTER_URL), + true); } } } + } private static boolean requiresApproval(final CmsTask task) { - return !task.getTaskType().getID().equals(CmsTaskTypeOld.AUTHOR); + return task.getTaskType() != CmsTaskType.AUTHOR; } + } diff --git a/ccm-cms/src/main/java/com/arsdigita/cms/ui/workflow/TaskItemPane.java.off b/ccm-cms/src/main/java/com/arsdigita/cms/ui/workflow/TaskItemPane.java similarity index 93% rename from ccm-cms/src/main/java/com/arsdigita/cms/ui/workflow/TaskItemPane.java.off rename to ccm-cms/src/main/java/com/arsdigita/cms/ui/workflow/TaskItemPane.java index 0ff7964a7..10fdce4b7 100755 --- a/ccm-cms/src/main/java/com/arsdigita/cms/ui/workflow/TaskItemPane.java.off +++ b/ccm-cms/src/main/java/com/arsdigita/cms/ui/workflow/TaskItemPane.java @@ -50,6 +50,7 @@ import org.libreccm.security.RoleRepository; import org.libreccm.security.Shiro; import org.libreccm.workflow.Task; import org.libreccm.workflow.AssignableTask; +import org.libreccm.workflow.AssignableTaskManager; import org.libreccm.workflow.WorkflowManager; import org.librecms.CmsConstants; import org.librecms.contentsection.privileges.AdminPrivileges; @@ -167,13 +168,13 @@ final class TaskItemPane extends BaseItemPane { final CmsTask task = m_task.getTask(state); final CdiUtil cdiUtil = CdiUtil.createCdiUtil(); - final WorkflowManager workflowManager = cdiUtil.findBean( - WorkflowManager.class); + final AssignableTaskManager taskManager = cdiUtil.findBean( + AssignableTaskManager.class); final Shiro shiro = cdiUtil.findBean(Shiro.class); final User user = shiro.getUser(); - final List tasks = workflowManager.lockedBy(user); + final List tasks = taskManager.lockedBy(user); return tasks.contains(task); } @@ -256,9 +257,9 @@ final class TaskItemPane extends BaseItemPane { if (hasAdmin(state)) { final CmsTask task = m_task.getTask(state); final CdiUtil cdiUtil = CdiUtil.createCdiUtil(); - final WorkflowManager workflowManager = cdiUtil - .findBean(WorkflowManager.class); - workflowManager.lockTask(task); + final AssignableTaskManager taskManager = cdiUtil + .findBean(AssignableTaskManager.class); + taskManager.lockTask(task); } } @@ -290,9 +291,9 @@ final class TaskItemPane extends BaseItemPane { if (hasAdmin(state)) { final CmsTask task = m_task.getTask(state); final CdiUtil cdiUtil = CdiUtil.createCdiUtil(); - final WorkflowManager workflowManager = cdiUtil - .findBean(WorkflowManager.class); - workflowManager.unlockTask(task); + final AssignableTaskManager taskManager = cdiUtil + .findBean(AssignableTaskManager.class); + taskManager.unlockTask(task); } } @@ -319,7 +320,7 @@ final class TaskItemPane extends BaseItemPane { props.add(new Property(gz("cms.ui.workflow.task.dependencies"), deps(task))); props.add(new Property(gz("cms.ui.workflow.task.state"), - task.getTaskState())); + task.getTaskState().toString())); props.add(new Property(gz("cms.ui.workflow.task.locked"), task.isLocked() ? lz("cms.ui.yes") : lz("cms.ui.no"))); @@ -334,7 +335,7 @@ final class TaskItemPane extends BaseItemPane { return dependencies.stream() .map(dependency -> dependency.getLabel().getValue( - defaultLocale)) + defaultLocale)) .collect(Collectors.joining(", ")); } @@ -383,13 +384,13 @@ final class TaskItemPane extends BaseItemPane { .getRowKey()); final CdiUtil cdiUtil = CdiUtil.createCdiUtil(); - final WorkflowManager workflowManager = cdiUtil - .findBean(WorkflowManager.class); + final AssignableTaskManager taskManager = cdiUtil + .findBean(AssignableTaskManager.class); final RoleRepository roleRepo = cdiUtil.findBean( RoleRepository.class); final Role role = roleRepo.findById(roleId); - workflowManager.retractTask(task, role); + taskManager.retractTask(task, role); } } } diff --git a/ccm-cms/src/main/java/com/arsdigita/cms/ui/workflow/WorkflowAdminPane.java.off b/ccm-cms/src/main/java/com/arsdigita/cms/ui/workflow/WorkflowAdminPane.java similarity index 100% rename from ccm-cms/src/main/java/com/arsdigita/cms/ui/workflow/WorkflowAdminPane.java.off rename to ccm-cms/src/main/java/com/arsdigita/cms/ui/workflow/WorkflowAdminPane.java diff --git a/ccm-cms/src/main/java/com/arsdigita/cms/ui/workflow/WorkflowItemPane.java.off b/ccm-cms/src/main/java/com/arsdigita/cms/ui/workflow/WorkflowItemPane.java similarity index 100% rename from ccm-cms/src/main/java/com/arsdigita/cms/ui/workflow/WorkflowItemPane.java.off rename to ccm-cms/src/main/java/com/arsdigita/cms/ui/workflow/WorkflowItemPane.java 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 e2cd6b4ea..5b513a169 100644 --- a/ccm-core/src/main/java/org/libreccm/workflow/AssignableTaskManager.java +++ b/ccm-core/src/main/java/org/libreccm/workflow/AssignableTaskManager.java @@ -123,8 +123,8 @@ public class AssignableTaskManager { } /** - * - * @param task + * + * @param task */ @AuthorizationRequired @RequiresPrivilege(CoreConstants.PRIVILEGE_ADMIN) @@ -133,14 +133,14 @@ public class AssignableTaskManager { if (task == null) { throw new IllegalArgumentException("Can't lock task null."); } - + if (task.isLocked()) { throw new IllegalArgumentException(String.format( "Task %s is already locked by user \"%s\".", Objects.toString(task), task.getLockingUser().getName())); } - + task.setLocked(true); task.setLockingUser(shiro.getUser()); @@ -149,7 +149,7 @@ public class AssignableTaskManager { /** * Unlocks a task. - * + * * @param task The task to unlock. */ @AuthorizationRequired @@ -159,7 +159,7 @@ public class AssignableTaskManager { if (task == null) { throw new IllegalArgumentException("Can't unlock task null."); } - + task.setLocked(false); task.setLockingUser(null); @@ -168,19 +168,20 @@ public class AssignableTaskManager { /** * Retrieves a list of all tasks locked by a specific user. - * + * * @param user The user which locks the tasks. + * * @return A list with all tasks locked by the specified user. */ @AuthorizationRequired @RequiresPrivilege(CoreConstants.PRIVILEGE_ADMIN) @Transactional(Transactional.TxType.REQUIRED) public List lockedBy(final User user) { - + if (user == null) { throw new IllegalArgumentException("user can't be null."); } - + final TypedQuery query = entityManager.createNamedQuery( "UserTask.findLockedBy", AssignableTask.class); query.setParameter("user", user); @@ -190,7 +191,7 @@ public class AssignableTaskManager { /** * Finishes a {@link AssignableTask}. - * + * * @param task The task to finish. */ @AuthorizationRequired @@ -213,8 +214,8 @@ public class AssignableTaskManager { /** * Finishes a {@link AssignableTask} with a comment. - * - * @param task The task to finish. + * + * @param task The task to finish. * @param comment The comment to add to the task. */ @AuthorizationRequired @@ -226,4 +227,14 @@ public class AssignableTaskManager { finish(task); } + public List findAssignedTasks(final Workflow workflow, + final List roles) { + final TypedQuery query = entityManager.createNamedQuery( + "AssignableTask.findAssignedTasks", AssignableTask.class); + query.setParameter("workflow", workflow); + query.setParameter("roles", roles); + + return query.getResultList(); + } + } 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 58cf6e8ff..e18c85543 100644 --- a/ccm-core/src/main/java/org/libreccm/workflow/Task.java +++ b/ccm-core/src/main/java/org/libreccm/workflow/Task.java @@ -107,7 +107,7 @@ public class Task implements Identifiable, Serializable { @Column(name = "TASK_ID") @GeneratedValue(strategy = GenerationType.AUTO) private long taskId; - + /** * The UUID of the task. */ @@ -205,11 +205,11 @@ public class Task implements Identifiable, Serializable { public String getUuid() { return uuid; } - + protected void setUuid(final String uuid) { this.uuid = uuid; } - + public LocalizedString getLabel() { return label; } @@ -374,7 +374,7 @@ public class Task implements Identifiable, Serializable { public String toString(final String data) { return String.format("%s{ " + "taskId = %d, " - + "uuid = \"%s\", " + + "uuid = \"%s\", " + "label = %s, " + "active = %b, " + "taskState = \"%s\", "