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;
+ }
+ }
+
}