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
pull/2/head
jensp 2016-11-21 19:05:43 +00:00
parent 5fb80631c9
commit ae05156a71
17 changed files with 245 additions and 237 deletions

View File

@ -28,25 +28,19 @@ import com.arsdigita.bebop.event.ActionListener;
import com.arsdigita.globalization.GlobalizedMessage; import com.arsdigita.globalization.GlobalizedMessage;
import com.arsdigita.toolbox.ui.ActionGroup; import com.arsdigita.toolbox.ui.ActionGroup;
import com.arsdigita.toolbox.ui.Section; import com.arsdigita.toolbox.ui.Section;
import com.arsdigita.web.Web;
import org.libreccm.workflow.Workflow; 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.cdi.utils.CdiUtil;
import org.libreccm.security.Shiro; import org.libreccm.security.Shiro;
import org.libreccm.workflow.Task;
import org.libreccm.workflow.AssignableTask; import org.libreccm.workflow.AssignableTask;
import org.libreccm.workflow.AssignableTaskManager;
import org.libreccm.workflow.AssignableTaskRepository; import org.libreccm.workflow.AssignableTaskRepository;
import org.libreccm.workflow.WorkflowConstants;
import org.libreccm.workflow.WorkflowManager; import org.libreccm.workflow.WorkflowManager;
import org.libreccm.workflow.WorkflowRepository; import org.libreccm.workflow.WorkflowState;
import org.librecms.CmsConstants; import org.librecms.CmsConstants;
import org.librecms.workflow.CmsTask; import org.librecms.workflow.CmsTask;
import org.librecms.workflow.CmsTaskTypeOld; import org.librecms.workflow.CmsTaskType;
import java.util.List; import java.util.List;
@ -94,8 +88,8 @@ public final class AssignedTaskSection extends Section {
@Override @Override
public final boolean isVisible(final PageState state) { public final boolean isVisible(final PageState state) {
return m_facade.workflowState(state, WorkflowConstants.INIT) return m_facade.workflowState(state, WorkflowState.INIT)
|| m_facade.workflowState(state, WorkflowConstants.STOPPED); || m_facade.workflowState(state, WorkflowState.STOPPED);
} }
private class Listener implements ActionListener { private class Listener implements ActionListener {
@ -119,7 +113,7 @@ public final class AssignedTaskSection extends Section {
@Override @Override
public final boolean isVisible(final PageState state) { public final boolean isVisible(final PageState state) {
return m_facade.workflowState(state, WorkflowConstants.STARTED) return m_facade.workflowState(state, WorkflowState.STARTED)
&& m_facade.tasksExist(state) && m_facade.tasksExist(state)
&& !m_facade.tasksLocked(state); && !m_facade.tasksLocked(state);
} }
@ -145,7 +139,7 @@ public final class AssignedTaskSection extends Section {
@Override @Override
public final boolean isVisible(final PageState state) { public final boolean isVisible(final PageState state) {
return m_facade.workflowState(state, WorkflowConstants.STARTED) return m_facade.workflowState(state, WorkflowState.STARTED)
&& m_facade.tasksExist(state) && m_facade.tasksExist(state)
&& m_facade.tasksLocked(state); && m_facade.tasksLocked(state);
} }
@ -177,7 +171,8 @@ public final class AssignedTaskSection extends Section {
protected final Object initialValue(final PageState state) { protected final Object initialValue(final PageState state) {
final Workflow workflow = m_flow.getWorkflow(state); final Workflow workflow = m_flow.getWorkflow(state);
final CdiUtil cdiUtil = CdiUtil.createCdiUtil(); 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); final Shiro shiro = cdiUtil.findBean(Shiro.class);
return userTaskRepo.findEnabledTasksForWorkflow(shiro.getUser(), return userTaskRepo.findEnabledTasksForWorkflow(shiro.getUser(),
workflow); workflow);
@ -185,7 +180,7 @@ public final class AssignedTaskSection extends Section {
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
final List<AssignableTask> getTasks(final PageState state) { final List<AssignableTask> getTasks(final PageState state) {
return (ArrayList<AssignableTask>) get(state); return (List<AssignableTask>) get(state);
} }
} }
@ -205,22 +200,24 @@ public final class AssignedTaskSection extends Section {
final void lockTasks(final PageState state) { final void lockTasks(final PageState state) {
final CdiUtil cdiUtil = CdiUtil.createCdiUtil(); final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
final WorkflowManager workflowManager = cdiUtil.findBean(WorkflowManager.class); final AssignableTaskManager taskManager = cdiUtil.findBean(
AssignableTaskManager.class);
for (final AssignableTask task : m_tasks.getTasks(state)) { for (final AssignableTask task : m_tasks.getTasks(state)) {
if (relevant(task) && !task.isLocked()) { if (relevant(task) && !task.isLocked()) {
workflowManager.lockTask(task); taskManager.lockTask(task);
} }
} }
} }
final void unlockTasks(final PageState state) { final void unlockTasks(final PageState state) {
final CdiUtil cdiUtil = CdiUtil.createCdiUtil(); final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
final WorkflowManager workflowManager = cdiUtil.findBean(WorkflowManager.class); final AssignableTaskManager taskManager = cdiUtil.findBean(
AssignableTaskManager.class);
for (final AssignableTask task : m_tasks.getTasks(state)) { for (final AssignableTask task : m_tasks.getTasks(state)) {
if (relevant(task) && task.isLocked()) { if (relevant(task) && task.isLocked()) {
workflowManager.unlockTask(task); taskManager.unlockTask(task);
} }
} }
} }
@ -235,12 +232,11 @@ public final class AssignedTaskSection extends Section {
return true; return true;
} }
final boolean workflowState(final PageState state, int processState) { final boolean workflowState(final PageState state,
final CdiUtil cdiUtil = CdiUtil.createCdiUtil(); WorkflowState processState) {
final WorkflowManager workflowManager = cdiUtil.findBean(WorkflowManager.class);
final Workflow workflow = m_flow.getWorkflow(state); final Workflow workflow = m_flow.getWorkflow(state);
return workflowManager.getState(workflow) == processState; return workflow.getState() == processState;
} }
final boolean tasksExist(final PageState state) { final boolean tasksExist(final PageState state) {
@ -248,11 +244,15 @@ public final class AssignedTaskSection extends Section {
} }
private boolean relevant(final AssignableTask task) { private boolean relevant(final AssignableTask task) {
return true; if (task instanceof CmsTask) {
final CmsTask cmsTask = (CmsTask) task;
return cmsTask.getTaskType() == CmsTaskType.AUTHOR
|| cmsTask.getTaskType() == CmsTaskType.EDIT;
} else {
return false;
}
// ToDo
// return task.getTaskType().getID().equals(CMSTaskType.AUTHOR)
// || task.getTaskType().getID().equals(CMSTaskType.EDIT);
} }
} }

View File

@ -15,36 +15,36 @@
package com.arsdigita.cms.ui.workflow; package com.arsdigita.cms.ui.workflow;
import com.arsdigita.bebop.FormProcessException; 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.FormSectionEvent;
import com.arsdigita.bebop.event.FormValidationListener; 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.CheckboxGroup;
import com.arsdigita.bebop.form.Option;
import com.arsdigita.bebop.form.OptionGroup; import com.arsdigita.bebop.form.OptionGroup;
import com.arsdigita.bebop.form.SingleSelect; import com.arsdigita.bebop.form.SingleSelect;
import com.arsdigita.bebop.form.TextArea; import com.arsdigita.bebop.form.TextArea;
import com.arsdigita.bebop.form.TextField; import com.arsdigita.bebop.form.TextField;
import com.arsdigita.bebop.parameters.IntegerParameter; import com.arsdigita.bebop.parameters.IntegerParameter;
import com.arsdigita.cms.ui.BaseForm; 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.globalization.GlobalizedMessage;
import com.arsdigita.kernel.KernelConfig; import com.arsdigita.util.UncheckedWrapperException;
import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.LogManager;
import org.libreccm.workflow.Task; import org.libreccm.workflow.Task;
import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.Logger;
import org.libreccm.cdi.utils.CdiUtil; 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.TaskRepository;
import org.libreccm.workflow.WorkflowManager;
import org.librecms.CmsConstants; import org.librecms.CmsConstants;
import org.librecms.contentsection.privileges.AdminPrivileges; import org.librecms.contentsection.privileges.AdminPrivileges;
import org.librecms.workflow.CmsTaskTypeRepository; import org.librecms.workflow.CmsTaskType;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Locale;
import java.util.Map; import java.util.Map;
import java.util.TooManyListenersException; import java.util.TooManyListenersException;
import java.util.stream.Collectors; import java.util.stream.Collectors;
@ -55,9 +55,6 @@ import java.util.stream.Collectors;
*/ */
class BaseTaskForm extends BaseForm { class BaseTaskForm extends BaseForm {
private static final Logger LOGGER = LogManager
.getLogger(BaseTaskForm.class);
final WorkflowRequestLocal m_workflow; final WorkflowRequestLocal m_workflow;
final TextField m_name; final TextField m_name;
@ -81,7 +78,7 @@ class BaseTaskForm extends BaseForm {
try { try {
m_type.addPrintListener(new TaskTypePrintListener()); m_type.addPrintListener(new TaskTypePrintListener());
} catch (TooManyListenersException ex) { } catch (TooManyListenersException ex) {
throw new RuntimeException(ex); throw new UncheckedWrapperException(ex);
} }
m_description = new Description("desc", 4000, true); m_description = new Description("desc", 4000, true);
@ -142,30 +139,19 @@ class BaseTaskForm extends BaseForm {
} }
*/ */
// Fix this one too // Fix this one too
private class TaskTypePrintListener extends ListOptionPrintListener<CmsTaskTypeOld> { private class TaskTypePrintListener implements PrintListener {
@Override @Override
protected List<CmsTaskTypeOld> getDataQuery(final PageState state) { public void prepare(final PrintEvent event) {
final CdiUtil cdiUtil = CdiUtil.createCdiUtil(); final OptionGroup target = (OptionGroup) event.getTarget();
final CmsTaskTypeRepository taskTypeRepo = cdiUtil.findBean(
CmsTaskTypeRepository.class);
final List<CmsTaskTypeOld> taskTypes = taskTypeRepo.findAll(); for (final CmsTaskType type : CmsTaskType.values()) {
final GlobalizedMessage label = new GlobalizedMessage(
return taskTypes; String.format("cms.workflow.task_type.%s", type.toString()),
CmsConstants.CMS_BUNDLE);
target.addOption(new Option(type.toString(), new Label(label)));
} }
@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);
} }
} }
@ -176,6 +162,7 @@ class BaseTaskForm extends BaseForm {
* new ones in since it is possible that Tasks will fire events when * new ones in since it is possible that Tasks will fire events when
* dependencies are added and removed. * dependencies are added and removed.
* *
* XXX domlay
*/ */
final void processDependencies(final Task task, final void processDependencies(final Task task,
final String[] selectedDependencies) { final String[] selectedDependencies) {
@ -188,8 +175,7 @@ class BaseTaskForm extends BaseForm {
final CdiUtil cdiUtil = CdiUtil.createCdiUtil(); final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
final TaskRepository taskRepo = cdiUtil.findBean(TaskRepository.class); final TaskRepository taskRepo = cdiUtil.findBean(TaskRepository.class);
final WorkflowManager workflowManager = cdiUtil.findBean( final TaskManager taskManager = cdiUtil.findBean(TaskManager.class);
WorkflowManager.class);
Long selectedId; Long selectedId;
Object addedTask; Object addedTask;
@ -203,11 +189,17 @@ class BaseTaskForm extends BaseForm {
} }
} }
toRemove.values().forEach(taskToRemove -> workflowManager for (final Task taskToRemove : toRemove.values()) {
.removeDependentTask(task, taskToRemove)); taskManager.removeDependentTask(task, taskToRemove);
}
toAdd.values().forEach(tasktoAdd -> workflowManager for (final Task taskToAdd : toAdd.values()) {
.addDependentTask(task, tasktoAdd)); try {
taskManager.addDependentTask(task, taskToAdd);
} catch(CircularTaskDependencyException ex) {
throw new UncheckedWrapperException(ex);
}
}
} }
} }

View File

@ -46,12 +46,13 @@ import com.arsdigita.web.Web;
import org.libreccm.cdi.utils.CdiUtil; import org.libreccm.cdi.utils.CdiUtil;
import org.libreccm.security.Shiro; import org.libreccm.security.Shiro;
import org.libreccm.workflow.Task; import org.libreccm.workflow.Task;
import org.libreccm.workflow.TaskManager;
import org.libreccm.workflow.TaskRepository; import org.libreccm.workflow.TaskRepository;
import org.libreccm.workflow.Workflow; import org.libreccm.workflow.Workflow;
import org.libreccm.workflow.WorkflowManager; import org.libreccm.workflow.WorkflowManager;
import org.librecms.CmsConstants; import org.librecms.CmsConstants;
import org.librecms.contentsection.privileges.AdminPrivileges; import org.librecms.contentsection.privileges.AdminPrivileges;
import org.librecms.workflow.CmsTaskTypeRepository; import org.librecms.workflow.CmsTaskType;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.util.List; import java.util.List;
@ -151,10 +152,8 @@ abstract class BaseWorkflowItemPane extends BaseItemPane {
final Shiro shiro = cdiUtil.findBean(Shiro.class); final Shiro shiro = cdiUtil.findBean(Shiro.class);
final User currentUser = shiro.getUser(); final User currentUser = shiro.getUser();
boolean visible = task.isLocked() return task.isLocked() && (lockingUser == null
&& (lockingUser == null
|| lockingUser.equals(currentUser)); || lockingUser.equals(currentUser));
return visible;
} }
private class Listener implements ActionListener { private class Listener implements ActionListener {
@ -164,18 +163,17 @@ abstract class BaseWorkflowItemPane extends BaseItemPane {
final PageState state = event.getPageState(); final PageState state = event.getPageState();
final CdiUtil cdiUtil = CdiUtil.createCdiUtil(); final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
final WorkflowManager workflowManager = cdiUtil.findBean( final TaskManager taskManager = cdiUtil.findBean(TaskManager.class);
WorkflowManager.class);
final Task task = m_task.getTask(state); final Task task = m_task.getTask(state);
task.setTaskState("finished"); taskManager.finish(task);
} }
} }
} }
@Override
public void reset(final PageState state) { public void reset(final PageState state) {
super.reset(state); super.reset(state);
@ -211,14 +209,10 @@ abstract class BaseWorkflowItemPane extends BaseItemPane {
@Override @Override
protected final Object initialValue(final PageState state) { protected final Object initialValue(final PageState state) {
final String id = m_tasks.getRowSelectionModel().getSelectedKey( final String key = m_tasks.getRowSelectionModel().getSelectedKey(
state).toString(); state).toString();
final CdiUtil cdiUtil = CdiUtil.createCdiUtil(); return CmsTaskType.valueOf(key);
final CmsTaskTypeRepository taskRepo = cdiUtil.findBean(
CmsTaskTypeRepository.class);
return taskRepo.findById(Long.parseLong(id));
} }
} }
@ -237,8 +231,6 @@ abstract class BaseWorkflowItemPane extends BaseItemPane {
ActionGroup.EDIT); ActionGroup.EDIT);
m_actionGroup.addAction(new AdminVisible(deleteLink), m_actionGroup.addAction(new AdminVisible(deleteLink),
ActionGroup.DELETE); ActionGroup.DELETE);
// m_actionGroup.addAction(new AdminVisible(new StartLink()));
// m_actionGroup.addAction(new AdminVisible(new StopLink()));
} }
private class Properties extends PropertyList { private class Properties extends PropertyList {
@ -247,20 +239,20 @@ abstract class BaseWorkflowItemPane extends BaseItemPane {
protected final List<Property> properties(final PageState state) { protected final List<Property> properties(final PageState state) {
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
final List<Property> props = super.properties(state); final List<Property> 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 KernelConfig kernelConfig = KernelConfig.getConfig();
final Locale defaultLocale = kernelConfig.getDefaultLocale(); final Locale defaultLocale = kernelConfig.getDefaultLocale();
props.add(new Property(gz("cms.ui.name"), props.add(new Property(gz("cms.ui.name"),
flow.getName().getValue(defaultLocale))); workflow.getName().getValue(defaultLocale)));
props.add(new Property( props.add(new Property(
gz("cms.ui.description"), gz("cms.ui.description"),
flow.getDescription().getValue(defaultLocale))); workflow.getDescription().getValue(defaultLocale)));
// props.add(new Property(gz("cms.ui.workflow.current_state"), props.add(new Property(gz("cms.ui.workflow.current_state"),
// flow.getStateString())); workflow.getState().toString()));
props.add(new Property(gz("cms.ui.workflow.num_tasks"), props.add(new Property(gz("cms.ui.workflow.num_tasks"),
String.valueOf(flow.getTasks().size()))); String.valueOf(workflow.getTasks().size())));
return props; return props;
} }

View File

@ -24,10 +24,13 @@ import com.arsdigita.bebop.event.FormProcessListener;
import com.arsdigita.bebop.event.FormSectionEvent; import com.arsdigita.bebop.event.FormSectionEvent;
import com.arsdigita.bebop.form.TextArea; import com.arsdigita.bebop.form.TextArea;
import com.arsdigita.cms.ui.BaseForm; import com.arsdigita.cms.ui.BaseForm;
import org.librecms.workflow.CmsTask; import org.librecms.workflow.CmsTask;
import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.Logger;
import org.libreccm.cdi.utils.CdiUtil; import org.libreccm.cdi.utils.CdiUtil;
import org.libreccm.workflow.TaskComment;
import org.libreccm.workflow.TaskManager;
import org.libreccm.workflow.TaskRepository; import org.libreccm.workflow.TaskRepository;
/** /**
@ -69,9 +72,8 @@ class CommentAddForm extends BaseForm {
final CmsTask task = selectedTask.getTask(state); final CmsTask task = selectedTask.getTask(state);
final CdiUtil cdiUtil = CdiUtil.createCdiUtil(); final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
final TaskRepository taskRepo = cdiUtil.findBean(TaskRepository.class); final TaskRepository taskRepo = cdiUtil.findBean(TaskRepository.class);
final TaskManager taskManager = cdiUtil.findBean(TaskManager.class);
task.addComment((String)comment.getValue(state)); taskManager.addComment(task, (String) comment.getValue(state));
taskRepo.save(task);
} }
} }
} }

View File

@ -30,17 +30,17 @@ import com.arsdigita.bebop.form.OptionGroup;
import com.arsdigita.kernel.KernelConfig; import com.arsdigita.kernel.KernelConfig;
import org.librecms.workflow.CmsTask; import org.librecms.workflow.CmsTask;
import org.librecms.workflow.CmsTaskTypeOld;
import com.arsdigita.util.UncheckedWrapperException; import com.arsdigita.util.UncheckedWrapperException;
import org.libreccm.cdi.utils.CdiUtil; import org.libreccm.cdi.utils.CdiUtil;
import org.libreccm.configuration.ConfigurationManager; import org.libreccm.configuration.ConfigurationManager;
import org.libreccm.workflow.Task; import org.libreccm.workflow.Task;
import org.libreccm.workflow.TaskManager;
import org.libreccm.workflow.TaskRepository; import org.libreccm.workflow.TaskRepository;
import org.libreccm.workflow.Workflow; import org.libreccm.workflow.Workflow;
import org.libreccm.workflow.WorkflowManager; import org.libreccm.workflow.WorkflowManager;
import org.librecms.workflow.CmsTaskTypeRepository; import org.librecms.workflow.CmsTaskType;
import java.util.List; import java.util.List;
import java.util.Locale; import java.util.Locale;
@ -105,9 +105,9 @@ class TaskAddForm extends BaseTaskForm {
final CdiUtil cdiUtil = CdiUtil.createCdiUtil(); final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
final TaskRepository taskRepo = cdiUtil.findBean( final TaskRepository taskRepo = cdiUtil.findBean(
TaskRepository.class); TaskRepository.class);
final CmsTaskTypeRepository taskTypeRepo = cdiUtil.findBean(CmsTaskTypeRepository.class);
final WorkflowManager workflowManager = cdiUtil.findBean( final WorkflowManager workflowManager = cdiUtil.findBean(
WorkflowManager.class); WorkflowManager.class);
final TaskManager taskManager = cdiUtil.findBean(TaskManager.class);
final ConfigurationManager confManager = cdiUtil.findBean( final ConfigurationManager confManager = cdiUtil.findBean(
ConfigurationManager.class); ConfigurationManager.class);
final KernelConfig kernelConfig = confManager.findConfiguration( final KernelConfig kernelConfig = confManager.findConfiguration(
@ -120,13 +120,13 @@ class TaskAddForm extends BaseTaskForm {
defaultLocale, defaultLocale,
((String) m_description.getValue(state))); ((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.setTaskType(taskType);
task.setActive(true); task.setActive(true);
taskRepo.save(task); taskRepo.save(task);
workflowManager.addTask(workflow, task); taskManager.addTask(workflow, task);
processDependencies(task, (String[]) m_deps.getValue(state)); processDependencies(task, (String[]) m_deps.getValue(state));

View File

@ -42,13 +42,13 @@ import org.librecms.workflow.CmsTask;
import com.arsdigita.globalization.GlobalizedMessage; import com.arsdigita.globalization.GlobalizedMessage;
import com.arsdigita.util.UncheckedWrapperException; import com.arsdigita.util.UncheckedWrapperException;
import org.libreccm.cdi.utils.CdiUtil; import org.libreccm.cdi.utils.CdiUtil;
import org.libreccm.security.PermissionChecker; import org.libreccm.security.PermissionChecker;
import org.libreccm.security.Role; import org.libreccm.security.Role;
import org.libreccm.security.RoleRepository; import org.libreccm.security.RoleRepository;
import org.libreccm.workflow.AssignableTaskManager;
import org.libreccm.workflow.TaskAssignment; import org.libreccm.workflow.TaskAssignment;
import org.libreccm.workflow.WorkflowManager; import org.libreccm.workflow.WorkflowManager;
import org.librecms.CmsConstants; import org.librecms.CmsConstants;
@ -125,13 +125,14 @@ class TaskAddRole extends CMSForm {
final CmsTask task = m_task.getTask(state); final CmsTask task = m_task.getTask(state);
final CdiUtil cdiUtil = CdiUtil.createCdiUtil(); final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
final WorkflowManager workflowManager = cdiUtil.findBean( final AssignableTaskManager taskManager = cdiUtil.findBean(
WorkflowManager.class); AssignableTaskManager.class);
final RoleRepository roleRepository = cdiUtil.findBean( final RoleRepository roleRepository = cdiUtil.findBean(
RoleRepository.class); RoleRepository.class);
task.getAssignments().forEach(assignment -> workflowManager task.getAssignments().forEach(assignment -> {
.retractTask(task, assignment.getRole())); taskManager.retractTask(task, assignment.getRole());
});
final String[] roleIds = (String[]) m_roles.getValue(state); final String[] roleIds = (String[]) m_roles.getValue(state);
@ -139,7 +140,7 @@ class TaskAddRole extends CMSForm {
for (final String roleId : roleIds) { for (final String roleId : roleIds) {
final Role role = roleRepository.findById(Long final Role role = roleRepository.findById(Long
.parseLong(roleId)); .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); return new GlobalizedMessage(key, CmsConstants.CMS_BUNDLE);
} }
private static String lz(final String key) {
return (String) gz(key).localize();
}
} }

View File

@ -37,10 +37,8 @@ import org.libreccm.cdi.utils.CdiUtil;
import org.libreccm.configuration.ConfigurationManager; import org.libreccm.configuration.ConfigurationManager;
import org.libreccm.workflow.Task; import org.libreccm.workflow.Task;
import org.libreccm.workflow.TaskRepository; import org.libreccm.workflow.TaskRepository;
import org.librecms.workflow.CmsTaskTypeOld; import org.librecms.workflow.CmsTaskType;
import org.librecms.workflow.CmsTaskTypeRepository;
import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Locale; import java.util.Locale;
import java.util.TooManyListenersException; import java.util.TooManyListenersException;
@ -52,13 +50,13 @@ import java.util.stream.Collectors;
*/ */
class TaskEditForm extends BaseTaskForm { class TaskEditForm extends BaseTaskForm {
private TaskRequestLocal m_task; private TaskRequestLocal selectedTask;
public TaskEditForm(final WorkflowRequestLocal workflow, public TaskEditForm(final WorkflowRequestLocal workflow,
final TaskRequestLocal task) { final TaskRequestLocal selectedTask) {
super("task", gz("cms.ui.workflow.task.edit"), workflow); super("task", gz("cms.ui.workflow.task.edit"), workflow);
m_task = task; this.selectedTask = selectedTask;
try { try {
m_deps.addPrintListener(new DependencyPrinter()); m_deps.addPrintListener(new DependencyPrinter());
@ -89,7 +87,7 @@ class TaskEditForm extends BaseTaskForm {
final OptionGroup options) { final OptionGroup options) {
final KernelConfig kernelConfig = KernelConfig.getConfig(); final KernelConfig kernelConfig = KernelConfig.getConfig();
final Locale defaultLocale = kernelConfig.getDefaultLocale(); final Locale defaultLocale = kernelConfig.getDefaultLocale();
if (m_task.getTask(state).getTaskId() != task.getTaskId()) { if (selectedTask.getTask(state).getTaskId() != task.getTaskId()) {
options.addOption(new Option( options.addOption(new Option(
Long.toString(task.getTaskId()), Long.toString(task.getTaskId()),
task.getLabel().getValue(defaultLocale))); task.getLabel().getValue(defaultLocale)));
@ -102,12 +100,11 @@ class TaskEditForm extends BaseTaskForm {
public final void init(final FormSectionEvent event) public final void init(final FormSectionEvent event)
throws FormProcessException { throws FormProcessException {
final PageState state = event.getPageState(); 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_name.setValue(state, task.getLabel());
m_description.setValue(state, task.getDescription()); m_description.setValue(state, task.getDescription());
m_type.setValue(state, Long.toString(task.getTaskType() m_type.setValue(state, task.getTaskType().toString());
.getTaskTypeId()));
final List<Task> dependencies = task.getDependsOn(); final List<Task> dependencies = task.getDependsOn();
final List<String> depIdList = dependencies.stream() final List<String> depIdList = dependencies.stream()
@ -125,13 +122,11 @@ class TaskEditForm extends BaseTaskForm {
public final void process(final FormSectionEvent event) public final void process(final FormSectionEvent event)
throws FormProcessException { throws FormProcessException {
final PageState state = event.getPageState(); final PageState state = event.getPageState();
final CmsTask task = m_task.getTask(state); final CmsTask task = selectedTask.getTask(state);
final CdiUtil cdiUtil = CdiUtil.createCdiUtil(); final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
final TaskRepository taskRepo = cdiUtil.findBean( final TaskRepository taskRepo = cdiUtil.findBean(
TaskRepository.class); TaskRepository.class);
final CmsTaskTypeRepository taskTypeRepo = cdiUtil.findBean(
CmsTaskTypeRepository.class);
final ConfigurationManager confManager = cdiUtil.findBean( final ConfigurationManager confManager = cdiUtil.findBean(
ConfigurationManager.class); ConfigurationManager.class);
final KernelConfig kernelConfig = confManager.findConfiguration( final KernelConfig kernelConfig = confManager.findConfiguration(
@ -144,9 +139,7 @@ class TaskEditForm extends BaseTaskForm {
defaultLocale, defaultLocale,
(String) m_description.getValue(state)); (String) m_description.getValue(state));
final CmsTaskTypeOld taskType = taskTypeRepo.findById((Long) m_type task.setTaskType(CmsTaskType.valueOf((String)m_type.getValue(state)));
.getValue(state));
task.setTaskType(taskType);
taskRepo.save(task); taskRepo.save(task);

View File

@ -29,36 +29,40 @@ import com.arsdigita.bebop.form.Option;
import com.arsdigita.bebop.form.RadioGroup; import com.arsdigita.bebop.form.RadioGroup;
import com.arsdigita.bebop.parameters.BooleanParameter; 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.cms.ui.ContentItemPage;
import com.arsdigita.globalization.GlobalizedMessage; import com.arsdigita.globalization.GlobalizedMessage;
import com.arsdigita.kernel.KernelConfig;
import com.arsdigita.util.UncheckedWrapperException; import com.arsdigita.util.UncheckedWrapperException;
import org.librecms.workflow.CmsTask; import org.librecms.workflow.CmsTask;
import org.librecms.workflow.CmsTaskTypeOld;
import com.arsdigita.web.RedirectSignal; import com.arsdigita.web.RedirectSignal;
import com.arsdigita.web.URL; import com.arsdigita.web.URL;
import com.arsdigita.web.Web;
import org.libreccm.workflow.Task; import org.libreccm.workflow.Task;
import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.Logger;
import java.util.Iterator;
import java.util.Optional; import java.util.Optional;
import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.LogManager;
import org.arsdigita.cms.CMSConfig;
import org.libreccm.cdi.utils.CdiUtil; import org.libreccm.cdi.utils.CdiUtil;
import org.libreccm.configuration.ConfigurationManager;
import org.libreccm.security.PermissionChecker; import org.libreccm.security.PermissionChecker;
import org.libreccm.security.Shiro; 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.TaskRepository;
import org.libreccm.workflow.Workflow;
import org.libreccm.workflow.WorkflowManager; import org.libreccm.workflow.WorkflowManager;
import org.libreccm.workflow.WorkflowRepository;
import org.librecms.CmsConstants; import org.librecms.CmsConstants;
import org.librecms.contentsection.ContentItem; import org.librecms.contentsection.ContentItem;
import org.librecms.contentsection.ContentItemRepository; import org.librecms.contentsection.ContentItemRepository;
import org.librecms.workflow.CmsTaskType;
import java.util.List;
/** /**
* <p> * <p>
@ -82,10 +86,12 @@ public final class TaskFinishForm extends CommentAddForm {
m_task = task; m_task = task;
m_approve = new RadioGroup(new BooleanParameter("approve")); m_approve = new RadioGroup(new BooleanParameter("approve"));
m_approve.addOption(new Option("true", m_approve.addOption(new Option(
lz("cms.ui.workflow.task.approve"))); "true",
m_approve.addOption(new Option("false", new Label(gz("cms.ui.workflow.task.approve"))));
lz("cms.ui.workflow.task.reject"))); 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")); m_approvePrompt = new Label(gz("cms.ui.workflow.task.approve_prompt"));
@ -117,6 +123,7 @@ public final class TaskFinishForm extends CommentAddForm {
} }
} }
} }
} }
private class ValidationListener implements FormValidationListener { private class ValidationListener implements FormValidationListener {
@ -135,6 +142,7 @@ public final class TaskFinishForm extends CommentAddForm {
CmsConstants.CMS_BUNDLE)); CmsConstants.CMS_BUNDLE));
} }
} }
} }
private class ProcessListener implements FormProcessListener { private class ProcessListener implements FormProcessListener {
@ -166,6 +174,16 @@ public final class TaskFinishForm extends CommentAddForm {
final TaskRepository taskRepo = cdiUtil.findBean( 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)) { if (requiresApproval(task)) {
LOGGER.debug("The task requires approval; checking to see " LOGGER.debug("The task requires approval; checking to see "
@ -179,75 +197,77 @@ public final class TaskFinishForm extends CommentAddForm {
if (isApproved.equals(Boolean.TRUE)) { if (isApproved.equals(Boolean.TRUE)) {
LOGGER.debug("The task is approved; finishing the task"); LOGGER.debug("The task is approved; finishing the task");
final Shiro shiro = cdiUtil.findBean(Shiro.class); taskManager.finish(task);
final WorkflowManager workflowManager = cdiUtil.findBean(
WorkflowManager.class);
task.setActive(false);
finishedTask = true; finishedTask = true;
} else { } else {
LOGGER.debug("The task is rejected; reenabling dependent " LOGGER.debug("The task is rejected; reenabling dependent "
+ "tasks"); + "tasks");
// Reenable the previous tasks. // Reenable the previous tasks.
final Iterator<Task> iter = task.getDependentTasks(). for (final Task dependent : task.getDependentTasks()) {
iterator(); LOGGER.debug("Reenabling task {}",
dependent.getLabel().getValue(
kernelConfig.getDefaultLocale()));
while (iter.hasNext()) { taskManager.enable(dependent);
final Task dependent = (Task) iter.next();
if (LOGGER.isDebugEnabled()) {
LOGGER.debug("Reenabling task " + dependent.
getLabel());
}
dependent.setActive(true);
taskRepo.save(dependent);
} }
} }
} else { } else {
LOGGER.debug("The task does not require approval; finishing " LOGGER.debug("The task does not require approval; finishing it");
+ "it");
task.setActive(false); taskManager.disable(task);
taskRepo.save(task);
} }
if (finishedTask) { if (finishedTask) {
Iterator tasks = Engine.getInstance(CMSEngine.CMS_ENGINE_TYPE). final TaskFinishFormController controller = cdiUtil.findBean(
getEnabledTasks(Web.getWebContext().getUser(), TaskFinishFormController.class);
task.getParentID()).iterator(); final Workflow workflow = task.getWorkflow();
if (tasks.hasNext()) { final User user = shiro.getUser();
CmsTask thisTask = (CmsTask) tasks.next(); final List<AssignableTask> tasks = controller.findEnabledTasks(
PermissionDescriptor thisTaskAccess = new PermissionDescriptor( workflow);
thisTask.getTaskType().getPrivilege(), task. for (final AssignableTask currentTask : tasks) {
getWorkflow().getObject(), user); if (!(currentTask instanceof CmsTask)) {
if (PermissionService.checkPermission(thisTaskAccess)) { continue;
}
// Lock task for user final CmsTask currentCmsTask = (CmsTask) currentTask;
thisTask.lock((User) user); final String privilege = currentCmsTask.getTaskType()
int targetTab = (thisTask.getTaskType().getID().equals(CmsTaskTypeOld.DEPLOY)) ? ContentItemPage.PUBLISHING_TAB : ContentItemPage.AUTHORING_TAB; .getPrivilege();
throw new RedirectSignal(URL.there(state.getRequest(), if (permissionChecker.isPermitted(privilege,
ContentItemPage. workflow.getObject())) {
getItemURL( //Lock task for current user
task. assignableTaskManager.lockTask(currentCmsTask);
getItem(),
targetTab)), if (CmsTaskType.DEPLOY == currentCmsTask.getTaskType()) {
} else {
throw new RedirectSignal(
URL.there(state.getRequest(),
ContentItemPage.getItemURL(
item,
ContentItemPage.PUBLISHING_TAB)),
true); true);
} }
} }
}
// redirect to /content-center if streamlined creation mode is active. // redirect to /content-center if streamlined creation mode is active.
if (ContentSection.getConfig().getUseStreamlinedCreation()) { final CMSConfig cmsConfig = confManager.findConfiguration(
throw new RedirectSignal(URL.there(state.getRequest(), CMSConfig.class);
ContentCenter.getURL()), if (cmsConfig.isUseStreamlinedCreation()) {
throw new RedirectSignal(
URL.there(state.getRequest(),
CmsConstants.CONTENT_CENTER_URL),
true); true);
} }
} }
} }
} }
private static boolean requiresApproval(final CmsTask task) { private static boolean requiresApproval(final CmsTask task) {
return !task.getTaskType().getID().equals(CmsTaskTypeOld.AUTHOR); return task.getTaskType() != CmsTaskType.AUTHOR;
} }
} }

View File

@ -50,6 +50,7 @@ import org.libreccm.security.RoleRepository;
import org.libreccm.security.Shiro; import org.libreccm.security.Shiro;
import org.libreccm.workflow.Task; import org.libreccm.workflow.Task;
import org.libreccm.workflow.AssignableTask; import org.libreccm.workflow.AssignableTask;
import org.libreccm.workflow.AssignableTaskManager;
import org.libreccm.workflow.WorkflowManager; import org.libreccm.workflow.WorkflowManager;
import org.librecms.CmsConstants; import org.librecms.CmsConstants;
import org.librecms.contentsection.privileges.AdminPrivileges; import org.librecms.contentsection.privileges.AdminPrivileges;
@ -167,13 +168,13 @@ final class TaskItemPane extends BaseItemPane {
final CmsTask task = m_task.getTask(state); final CmsTask task = m_task.getTask(state);
final CdiUtil cdiUtil = CdiUtil.createCdiUtil(); final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
final WorkflowManager workflowManager = cdiUtil.findBean( final AssignableTaskManager taskManager = cdiUtil.findBean(
WorkflowManager.class); AssignableTaskManager.class);
final Shiro shiro = cdiUtil.findBean(Shiro.class); final Shiro shiro = cdiUtil.findBean(Shiro.class);
final User user = shiro.getUser(); final User user = shiro.getUser();
final List<AssignableTask> tasks = workflowManager.lockedBy(user); final List<AssignableTask> tasks = taskManager.lockedBy(user);
return tasks.contains(task); return tasks.contains(task);
} }
@ -256,9 +257,9 @@ final class TaskItemPane extends BaseItemPane {
if (hasAdmin(state)) { if (hasAdmin(state)) {
final CmsTask task = m_task.getTask(state); final CmsTask task = m_task.getTask(state);
final CdiUtil cdiUtil = CdiUtil.createCdiUtil(); final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
final WorkflowManager workflowManager = cdiUtil final AssignableTaskManager taskManager = cdiUtil
.findBean(WorkflowManager.class); .findBean(AssignableTaskManager.class);
workflowManager.lockTask(task); taskManager.lockTask(task);
} }
} }
@ -290,9 +291,9 @@ final class TaskItemPane extends BaseItemPane {
if (hasAdmin(state)) { if (hasAdmin(state)) {
final CmsTask task = m_task.getTask(state); final CmsTask task = m_task.getTask(state);
final CdiUtil cdiUtil = CdiUtil.createCdiUtil(); final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
final WorkflowManager workflowManager = cdiUtil final AssignableTaskManager taskManager = cdiUtil
.findBean(WorkflowManager.class); .findBean(AssignableTaskManager.class);
workflowManager.unlockTask(task); taskManager.unlockTask(task);
} }
} }
@ -319,7 +320,7 @@ final class TaskItemPane extends BaseItemPane {
props.add(new Property(gz("cms.ui.workflow.task.dependencies"), props.add(new Property(gz("cms.ui.workflow.task.dependencies"),
deps(task))); deps(task)));
props.add(new Property(gz("cms.ui.workflow.task.state"), 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"), props.add(new Property(gz("cms.ui.workflow.task.locked"),
task.isLocked() task.isLocked()
? lz("cms.ui.yes") : lz("cms.ui.no"))); ? lz("cms.ui.yes") : lz("cms.ui.no")));
@ -383,13 +384,13 @@ final class TaskItemPane extends BaseItemPane {
.getRowKey()); .getRowKey());
final CdiUtil cdiUtil = CdiUtil.createCdiUtil(); final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
final WorkflowManager workflowManager = cdiUtil final AssignableTaskManager taskManager = cdiUtil
.findBean(WorkflowManager.class); .findBean(AssignableTaskManager.class);
final RoleRepository roleRepo = cdiUtil.findBean( final RoleRepository roleRepo = cdiUtil.findBean(
RoleRepository.class); RoleRepository.class);
final Role role = roleRepo.findById(roleId); final Role role = roleRepo.findById(roleId);
workflowManager.retractTask(task, role); taskManager.retractTask(task, role);
} }
} }
} }

View File

@ -170,6 +170,7 @@ public class AssignableTaskManager {
* Retrieves a list of all tasks locked by a specific user. * Retrieves a list of all tasks locked by a specific user.
* *
* @param user The user which locks the tasks. * @param user The user which locks the tasks.
*
* @return A list with all tasks locked by the specified user. * @return A list with all tasks locked by the specified user.
*/ */
@AuthorizationRequired @AuthorizationRequired
@ -226,4 +227,14 @@ public class AssignableTaskManager {
finish(task); finish(task);
} }
public List<AssignableTask> findAssignedTasks(final Workflow workflow,
final List<Role> roles) {
final TypedQuery<AssignableTask> query = entityManager.createNamedQuery(
"AssignableTask.findAssignedTasks", AssignableTask.class);
query.setParameter("workflow", workflow);
query.setParameter("roles", roles);
return query.getResultList();
}
} }