diff --git a/ccm-core/src/main/java/com/arsdigita/bebop/table/RowData.java b/ccm-core/src/main/java/com/arsdigita/bebop/table/RowData.java new file mode 100644 index 000000000..eb5fc67bd --- /dev/null +++ b/ccm-core/src/main/java/com/arsdigita/bebop/table/RowData.java @@ -0,0 +1,62 @@ +/* + * Copyright (C) 2016 LibreCCM Foundation. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, + * MA 02110-1301 USA + */ +package com.arsdigita.bebop.table; + +import org.libreccm.cdi.utils.CdiUtil; + +import java.util.ArrayList; +import java.util.List; + +/** + * This class is used as an bridge between a CDI based Controller class and + * a Bebop {@link TableModel}. The Controller provides a (transactional) method + * for retrieving the data to show in the table. The table model simply retrieves + * the Controller bean using the {@link CdiUtil} and uses the returned list of + * objects of this class for creating the table rows. + * + * @author Jens Pelzetter + * @param Type of the row key. + */ +public class RowData { + + private K rowKey; + + private final List cols; + + public RowData(final int numCols) { + cols = new ArrayList<>(numCols); + } + + public K getRowKey() { + return rowKey; + } + + public void setRowKey(final K rowKey) { + this.rowKey = rowKey; + } + + public String getColData(final int colIndex) { + return cols.get(colIndex); + } + + public void setColData(final int colIndex, final String data) { + cols.set(colIndex, data); + } + +} diff --git a/ccm-core/src/main/java/com/arsdigita/web/BaseApplicationServlet.java b/ccm-core/src/main/java/com/arsdigita/web/BaseApplicationServlet.java index 291a2198f..868aa2bab 100644 --- a/ccm-core/src/main/java/com/arsdigita/web/BaseApplicationServlet.java +++ b/ccm-core/src/main/java/com/arsdigita/web/BaseApplicationServlet.java @@ -18,8 +18,11 @@ */ package com.arsdigita.web; +import com.arsdigita.dispatcher.DispatcherHelper; +import com.arsdigita.dispatcher.InitialRequestContext; +import com.arsdigita.dispatcher.RequestContext; + import org.apache.log4j.Logger; -import org.libreccm.cdi.utils.CdiUtil; import org.libreccm.web.ApplicationRepository; import org.libreccm.web.CcmApplication; @@ -92,7 +95,7 @@ public abstract class BaseApplicationServlet extends BaseServlet { */ @Inject private ApplicationRepository appRepository; - + /** *

* Augments the context of the request and delegates to {@link @@ -120,7 +123,9 @@ public abstract class BaseApplicationServlet extends BaseServlet { // final RequestContext rc = makeLegacyContext( // request, app, Web.getUserContext()); // -// DispatcherHelper.setRequestContext(request, rc); + final RequestContext context = new InitialRequestContext(request, + getServletContext()); + DispatcherHelper.setRequestContext(request, context); // // final ServletException[] servletException = {null}; // final IOException[] ioException = {null}; diff --git a/ccm-core/src/main/java/com/arsdigita/web/BaseServlet.java b/ccm-core/src/main/java/com/arsdigita/web/BaseServlet.java index 83b098ca7..563cc77a6 100644 --- a/ccm-core/src/main/java/com/arsdigita/web/BaseServlet.java +++ b/ccm-core/src/main/java/com/arsdigita/web/BaseServlet.java @@ -18,6 +18,8 @@ */ package com.arsdigita.web; +import com.arsdigita.dispatcher.DispatcherHelper; + import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; @@ -87,6 +89,8 @@ public abstract class BaseServlet extends HttpServlet { final HttpServletResponse response) throws ServletException, IOException { + InternalRequestLocal.prepareAll(request); + DispatcherHelper.setRequest(request); Web.init(request, getServletContext()); Web.getWebContext().setRequestURL(getRequestURL(request)); diff --git a/ccm-core/src/main/java/org/libreccm/workflow/UserTask.java b/ccm-core/src/main/java/org/libreccm/workflow/UserTask.java index f8c95fc4a..00a31de2c 100644 --- a/ccm-core/src/main/java/org/libreccm/workflow/UserTask.java +++ b/ccm-core/src/main/java/org/libreccm/workflow/UserTask.java @@ -46,11 +46,25 @@ import javax.persistence.TemporalType; */ @Entity @Table(name = "WORKFLOW_USER_TASKS", schema = DB_SCHEMA) -@NamedQueries( +@NamedQueries({ @NamedQuery( name = "UserTask.findLockedBy", query = "SELECT t FROM UserTask t WHERE t.lockingUser = :user") -) + , + @NamedQuery( + name = "UserTask.findEnabledTasksForWorkflow", + query = "SELECT t FROM UserTask t " + + "WHERE t.lockingUser = :user " + + "AND t.workflow = :workflow" + ) + , + @NamedQuery( + name = "UserTask.findAssignedTasks", + query = "SELECT t FROM UserTask t " + + "WHERE t.assignments.role IN :roles " + + "AND t.assignments.workflow = :workflow " + + "AND t.active = true") +}) //Can't reduce complexity yet @SuppressWarnings({"PMD.CyclomaticComplexity", "PMD.StdCyclomaticComplexity", diff --git a/ccm-core/src/main/java/org/libreccm/workflow/UserTaskRepository.java b/ccm-core/src/main/java/org/libreccm/workflow/UserTaskRepository.java index fcd8abcf4..5ddcf3615 100644 --- a/ccm-core/src/main/java/org/libreccm/workflow/UserTaskRepository.java +++ b/ccm-core/src/main/java/org/libreccm/workflow/UserTaskRepository.java @@ -19,15 +19,21 @@ package org.libreccm.workflow; import org.libreccm.core.AbstractEntityRepository; +import org.libreccm.security.Role; +import org.libreccm.security.User; + +import java.util.List; +import java.util.stream.Collectors; import javax.enterprise.context.RequestScoped; +import javax.persistence.TypedQuery; /** * * @author Jens Pelzetter */ @RequestScoped -public class UserTaskRepository extends AbstractEntityRepository{ +public class UserTaskRepository extends AbstractEntityRepository { @Override public Class getEntityClass() { @@ -38,7 +44,30 @@ public class UserTaskRepository extends AbstractEntityRepository public boolean isNew(final UserTask task) { return task.getTaskId() == 0; } + + public List findEnabledTasksForWorkflow(final User user, + final Workflow workflow) { + final TypedQuery query = getEntityManager().createNamedQuery( + "UserTask.findEnabledTasksForWorkflow", UserTask.class); + query.setParameter("user", user); + query.setParameter("workflow", workflow); + + return query.getResultList(); + } - - + public List getAssignedTasks(final User user, + final Workflow workflow) { + final TypedQuery query = getEntityManager().createNamedQuery( + "UserTask.findAssignedTasks", UserTask.class); + final List roles = user.getRoleMemberships() + .stream() + .map(membership -> membership.getRole()) + .collect(Collectors.toList()); + + query.setParameter("roles", roles ); + query.setParameter("workflow", workflow); + + return query.getResultList(); + } + } diff --git a/ccm-core/src/main/java/org/libreccm/workflow/WorkflowConstants.java b/ccm-core/src/main/java/org/libreccm/workflow/WorkflowConstants.java new file mode 100644 index 000000000..c6c3aa45c --- /dev/null +++ b/ccm-core/src/main/java/org/libreccm/workflow/WorkflowConstants.java @@ -0,0 +1,37 @@ +/* + * Copyright (C) 2016 LibreCCM Foundation. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, + * MA 02110-1301 USA + */ +package org.libreccm.workflow; + +/** + * + * @author Jens Pelzetter + */ +public final class WorkflowConstants { + + private WorkflowConstants() { + //Nothing + } + + public final static int NONE = -1; + public final static int STARTED = 0; + public final static int STOPPED = 1; + public final static int DELETED = 2; + public final static int INIT = 3; + +} diff --git a/ccm-core/src/main/java/org/libreccm/workflow/WorkflowManager.java b/ccm-core/src/main/java/org/libreccm/workflow/WorkflowManager.java index c0b460267..7271c4597 100644 --- a/ccm-core/src/main/java/org/libreccm/workflow/WorkflowManager.java +++ b/ccm-core/src/main/java/org/libreccm/workflow/WorkflowManager.java @@ -36,6 +36,7 @@ import java.lang.reflect.Method; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Optional; import java.util.stream.Collectors; import javax.enterprise.context.RequestScoped; @@ -71,17 +72,17 @@ public class WorkflowManager { @Transactional(Transactional.TxType.REQUIRED) public Workflow createWorkflow(final WorkflowTemplate template) { final Workflow workflow = new Workflow(); - + final LocalizedString name = new LocalizedString(); template.getName().getValues().forEach( (locale, str) -> name.addValue(locale, str)); workflow.setName(name); - + final LocalizedString description = new LocalizedString(); template.getDescription().getValues().forEach( - (locale, str) -> description.addValue(locale, str)); + (locale, str) -> description.addValue(locale, str)); workflow.setDescription(description); - + final Map tasks = new HashMap<>(); template.getTasks().forEach(taskTemplate -> createTask(taskTemplate, @@ -142,9 +143,9 @@ public class WorkflowManager { } else { writeMethod.invoke(task, value); } - } catch (IllegalAccessException | - IllegalArgumentException | - InvocationTargetException ex) { + } catch (IllegalAccessException + | IllegalArgumentException + | InvocationTargetException ex) { throw new RuntimeException(); } @@ -275,4 +276,35 @@ public class WorkflowManager { return query.getResultList(); } + public void start(final Workflow workflow) { + if (workflow.getTasks() != null && !workflow.getTasks().isEmpty()) { + final Task first = workflow.getTasks().get(0); + + if (first instanceof UserTask) { + final User user = shiro.getUser(); + lockTask((UserTask) first); + } + } + } + + /** + * Gets the state of a workflow. + * + * @param workflow + * @return + */ + public int getState(final Workflow workflow) { + + final Optional activeTask = workflow.getTasks() + .stream() + .filter(task -> task.isActive()) + .findAny(); + + if (activeTask.isPresent()) { + return WorkflowConstants.STARTED; + } else { + return -1; + } + } + }