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.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,7 +113,7 @@ public final class AssignedTaskSection extends Section {
@Override
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.tasksLocked(state);
}
@ -145,7 +139,7 @@ public final class AssignedTaskSection extends Section {
@Override
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.tasksLocked(state);
}
@ -177,7 +171,8 @@ 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(),
workflow);
@ -185,7 +180,7 @@ public final class AssignedTaskSection extends Section {
@SuppressWarnings("unchecked")
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 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)) {
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);
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);
}
}
}
@ -235,12 +232,11 @@ public final class AssignedTaskSection extends Section {
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;
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;
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<CmsTaskTypeOld> {
private class TaskTypePrintListener implements PrintListener {
@Override
protected List<CmsTaskTypeOld> 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<CmsTaskTypeOld> taskTypes = taskTypeRepo.findAll();
return taskTypes;
for (final CmsTaskType type : CmsTaskType.values()) {
final GlobalizedMessage label = new GlobalizedMessage(
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
* 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);
}
}
}
}

View File

@ -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
return task.isLocked() && (lockingUser == null
|| lockingUser.equals(currentUser));
return visible;
}
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<Property> properties(final PageState state) {
@SuppressWarnings("unchecked")
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 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;
}

View File

@ -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));
}
}
}

View File

@ -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));

View File

@ -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;
@ -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();
}
}

View File

@ -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<Task> dependencies = task.getDependsOn();
final List<String> 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);

View File

@ -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;
/**
* <p>
@ -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,6 +123,7 @@ public final class TaskFinishForm extends CommentAddForm {
}
}
}
}
private class ValidationListener implements FormValidationListener {
@ -135,6 +142,7 @@ public final class TaskFinishForm extends CommentAddForm {
CmsConstants.CMS_BUNDLE));
}
}
}
private class ProcessListener implements FormProcessListener {
@ -166,6 +174,16 @@ public final class TaskFinishForm extends CommentAddForm {
final TaskRepository taskRepo = cdiUtil.findBean(
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 "
@ -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");
// Reenable the previous tasks.
final Iterator<Task> 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<AssignableTask> tasks = controller.findEnabledTasks(
workflow);
for (final AssignableTask currentTask : tasks) {
if (!(currentTask instanceof CmsTask)) {
continue;
}
// 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)),
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);
}
}
}
// redirect to /content-center if streamlined creation mode is active.
if (ContentSection.getConfig().getUseStreamlinedCreation()) {
throw new RedirectSignal(URL.there(state.getRequest(),
ContentCenter.getURL()),
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;
}
}

View File

@ -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<AssignableTask> tasks = workflowManager.lockedBy(user);
final List<AssignableTask> 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")));
@ -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);
}
}
}

View File

@ -170,6 +170,7 @@ 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
@ -226,4 +227,14 @@ public class AssignableTaskManager {
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();
}
}