Merged BRANCHES/DEV/BELARUS/HEAD_2010_07_29 to HEAD:

21523: ALF-3895 : F66 REST API to get a specific workflow instance

git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@21569 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261
This commit is contained in:
Gavin Cornwell
2010-08-03 13:21:31 +00:00
parent c853a3cd6b
commit 75065e6daa
10 changed files with 498 additions and 80 deletions

View File

@@ -48,7 +48,7 @@ public abstract class AbstractWorkflowWebscript extends DeclarativeWebScript
@Override
protected Map<String, Object> executeImpl(WebScriptRequest req, Status status, Cache cache)
{
WorkflowModelBuilder modelBuilder = new WorkflowModelBuilder(namespaceService, nodeService, personService);
WorkflowModelBuilder modelBuilder = new WorkflowModelBuilder(namespaceService, nodeService, personService, workflowService);
return buildModel(modelBuilder, req, status, cache);
}

View File

@@ -0,0 +1,86 @@
/*
* Copyright (C) 2005-2010 Alfresco Software Limited.
*
* This file is part of Alfresco
*
* Alfresco 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 3 of the License, or
* (at your option) any later version.
*
* Alfresco 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 Alfresco. If not, see <http://www.gnu.org/licenses/>.
*/
package org.alfresco.repo.web.scripts.workflow;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.http.HttpServletResponse;
import org.alfresco.service.cmr.workflow.WorkflowInstance;
import org.springframework.extensions.webscripts.Cache;
import org.springframework.extensions.webscripts.Status;
import org.springframework.extensions.webscripts.WebScriptException;
import org.springframework.extensions.webscripts.WebScriptRequest;
/**
* @author unknown
* @since 3.4
*
*/
public class WorkflowInstanceGet extends AbstractWorkflowWebscript
{
public static final String PARAM_INCLUDE_TASKS = "includeTasks";
@Override
protected Map<String, Object> buildModel(WorkflowModelBuilder modelBuilder, WebScriptRequest req, Status status, Cache cache)
{
Map<String, String> params = req.getServiceMatch().getTemplateVars();
// getting workflow instance id from request parameters
String workflowInstanceId = params.get("workflow_instance_id");
boolean includeTasks = getIncludeTasks(req);
WorkflowInstance workflowInstance = workflowService.getWorkflowById(workflowInstanceId);
// task was not found -> return 404
if (workflowInstance == null)
{
throw new WebScriptException(HttpServletResponse.SC_NOT_FOUND, "Unable to find workflow instance with id: " + workflowInstanceId);
}
Map<String, Object> model = new HashMap<String, Object>();
// build the model for ftl
model.put("workflowInstance", modelBuilder.buildDetailed(workflowInstance, includeTasks));
return model;
}
private boolean getIncludeTasks(WebScriptRequest req)
{
String includeTasks = req.getParameter(PARAM_INCLUDE_TASKS);
if (includeTasks != null)
{
try
{
return Boolean.valueOf(includeTasks);
}
catch (Exception e)
{
// do nothing, false will be returned
}
}
// Defaults to false.
return false;
}
}

View File

@@ -22,6 +22,7 @@ import java.io.Serializable;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Date;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
@@ -42,8 +43,11 @@ import org.alfresco.service.cmr.workflow.WorkflowDefinition;
import org.alfresco.service.cmr.workflow.WorkflowInstance;
import org.alfresco.service.cmr.workflow.WorkflowNode;
import org.alfresco.service.cmr.workflow.WorkflowPath;
import org.alfresco.service.cmr.workflow.WorkflowService;
import org.alfresco.service.cmr.workflow.WorkflowTask;
import org.alfresco.service.cmr.workflow.WorkflowTaskDefinition;
import org.alfresco.service.cmr.workflow.WorkflowTaskQuery;
import org.alfresco.service.cmr.workflow.WorkflowTaskState;
import org.alfresco.service.cmr.workflow.WorkflowTransition;
import org.alfresco.service.namespace.NamespaceException;
import org.alfresco.service.namespace.NamespaceService;
@@ -87,8 +91,15 @@ public class WorkflowModelBuilder
public static final String TASK_WORKFLOW_INSTANCE_DESCRIPTION = "description";
public static final String TASK_WORKFLOW_INSTANCE_IS_ACTIVE = "isActive";
public static final String TASK_WORKFLOW_INSTANCE_START_DATE = "startDate";
public static final String TASK_WORKFLOW_INSTANCE_DUE_DATE = "dueDate";
public static final String TASK_WORKFLOW_INSTANCE_END_DATE = "endDate";
public static final String TASK_WORKFLOW_INSTANCE_PRIORITY = "priority";
public static final String TASK_WORKFLOW_INSTANCE_INITIATOR = "initiator";
public static final String TASK_WORKFLOW_INSTANCE_CONTEXT = "context";
public static final String TASK_WORKFLOW_INSTANCE_PACKAGE = "package";
public static final String TASK_WORKFLOW_INSTANCE_START_TASK_INSTANCE_ID = "startTaskInstanceId";
public static final String TASK_WORKFLOW_INSTANCE_DEFINITION = "definition";
public static final String TASK_WORKFLOW_INSTANCE_TASKS = "tasks";
public static final String TASK_WORKFLOW_INSTANCE_DEFINITION_URL = "definitionUrl";
public static final String TASK_WORKFLOW_INSTANCE_INITIATOR_USERNAME = "userName";
@@ -117,18 +128,24 @@ public class WorkflowModelBuilder
public static final String WORKFLOW_DEFINITION_NAME = "name";
public static final String WORKFLOW_DEFINITION_TITLE = "title";
public static final String WORKFLOW_DEFINITION_DESCRIPTION = "description";
public static final String WORKFLOW_DEFINITION_VERSION = "version";
public static final String WORKFLOW_DEFINITION_START_TASK_DEFINITION_URL = "startTaskDefinitionUrl";
public static final String WORKFLOW_DEFINITION_START_TASK_DEFINITION_TYPE = "startTaskDefinitionType";
public static final String WORKFLOW_DEFINITION_TASK_DEFINITIONS = "taskDefinitions";
private static final String PREFIX_SEPARATOR = Character.toString(QName.NAMESPACE_PREFIX);
private final NamespaceService namespaceService;
private final NodeService nodeService;
private final PersonService personService;
private final WorkflowService workflowService;
public WorkflowModelBuilder(NamespaceService namespaceService, NodeService nodeService, PersonService personService)
public WorkflowModelBuilder(NamespaceService namespaceService, NodeService nodeService, PersonService personService, WorkflowService workflowService)
{
this.namespaceService = namespaceService;
this.nodeService = nodeService;
this.personService = personService;
this.workflowService = workflowService;
}
/**
@@ -168,10 +185,148 @@ public class WorkflowModelBuilder
model.put(TASK_PATH, getUrl(workflowTask.getPath()));
// workflow instance part
model.put(TASK_WORKFLOW_INSTANCE, buildWorkflowInstance(workflowTask.path.instance));
model.put(TASK_WORKFLOW_INSTANCE, buildSimple(workflowTask.getPath().getInstance()));
// definition part
model.put(TASK_DEFINITION, buildTaskDefinition(workflowTask.definition, workflowTask));
model.put(TASK_DEFINITION, buildTaskDefinition(workflowTask.getDefinition(), workflowTask));
return model;
}
/**
* Returns a simple representation of a {@link WorkflowInstance}.
* @param workflowInstance The workflow instance to be represented.
* @return
*/
public Map<String, Object> buildSimple(WorkflowInstance workflowInstance)
{
Map<String, Object> model = new HashMap<String, Object>();
model.put(TASK_WORKFLOW_INSTANCE_ID, workflowInstance.getId());
model.put(TASK_WORKFLOW_INSTANCE_URL, getUrl(workflowInstance));
model.put(TASK_WORKFLOW_INSTANCE_NAME, workflowInstance.getDefinition().getName());
model.put(TASK_WORKFLOW_INSTANCE_TITLE, workflowInstance.getDefinition().getTitle());
model.put(TASK_WORKFLOW_INSTANCE_DESCRIPTION, workflowInstance.getDefinition().getDescription());
model.put(TASK_WORKFLOW_INSTANCE_IS_ACTIVE, workflowInstance.isActive());
if (workflowInstance.getStartDate() == null)
{
model.put(TASK_WORKFLOW_INSTANCE_START_DATE, workflowInstance.getStartDate());
}
else
{
model.put(TASK_WORKFLOW_INSTANCE_START_DATE, ISO8601DateFormat.format(workflowInstance.getStartDate()));
}
if (workflowInstance.getEndDate() == null)
{
model.put(TASK_WORKFLOW_INSTANCE_END_DATE, workflowInstance.getEndDate());
}
else
{
model.put(TASK_WORKFLOW_INSTANCE_END_DATE, ISO8601DateFormat.format(workflowInstance.getEndDate()));
}
if (workflowInstance.getInitiator() == null)
{
model.put(TASK_WORKFLOW_INSTANCE_INITIATOR, null);
}
else
{
model.put(TASK_WORKFLOW_INSTANCE_INITIATOR, getPersonModel(nodeService.getProperty(workflowInstance.initiator, ContentModel.PROP_USERNAME)));
}
model.put(TASK_WORKFLOW_INSTANCE_DEFINITION_URL, getUrl(workflowInstance.getDefinition()));
return model;
}
/**
* Returns a detailed representation of a {@link WorkflowInstance}.
* @param workflowInstance The workflow instance to be represented.
* @param includeTasks should we include task in model?
* @return
*/
public Map<String, Object> buildDetailed(WorkflowInstance workflowInstance, boolean includeTasks)
{
Map<String, Object> model = buildSimple(workflowInstance);
Serializable dueDate = null;
Serializable priority = null;
Serializable startTaskId = null;
// get all active tasks
List<WorkflowTask> activeTasks = workflowService.queryTasks(new WorkflowTaskQuery());
// get all completed tasks
WorkflowTaskQuery completedTasksQuery = new WorkflowTaskQuery();
completedTasksQuery.setTaskState(WorkflowTaskState.COMPLETED);
completedTasksQuery.setActive(null);
List<WorkflowTask> completedTasks = workflowService.queryTasks(completedTasksQuery);
ArrayList<Map<String, Object>> results = new ArrayList<Map<String, Object>>();
for (WorkflowTask completedTask : completedTasks)
{
if (completedTask.path.instance.id.equals(workflowInstance.id))
{
if (completedTask.properties.get(WorkflowModel.PROP_DUE_DATE) != null)
{
dueDate = completedTask.properties.get(WorkflowModel.PROP_DUE_DATE);
}
if (completedTask.properties.get(WorkflowModel.PROP_PRIORITY) != null)
{
priority = completedTask.properties.get(WorkflowModel.PROP_PRIORITY);
}
if (workflowInstance.definition.getStartTaskDefinition().id.equals(completedTask.definition.id))
{
startTaskId = completedTask.id;
}
results.add(buildSimple(completedTask, null));
}
}
for (WorkflowTask activeTask : activeTasks)
{
if (activeTask.path.instance.id.equals(workflowInstance.id))
{
if (activeTask.properties.get(WorkflowModel.PROP_DUE_DATE) != null)
{
dueDate = activeTask.properties.get(WorkflowModel.PROP_DUE_DATE);
}
if (activeTask.properties.get(WorkflowModel.PROP_PRIORITY) != null)
{
priority = activeTask.properties.get(WorkflowModel.PROP_PRIORITY);
}
if (workflowInstance.definition.getStartTaskDefinition().id.equals(activeTask.definition.id))
{
startTaskId = activeTask.id;
}
results.add(buildSimple(activeTask, null));
}
}
if (includeTasks)
{
model.put(TASK_WORKFLOW_INSTANCE_TASKS, results);
}
if (dueDate != null)
{
model.put(TASK_WORKFLOW_INSTANCE_DUE_DATE, ISO8601DateFormat.format((Date) dueDate));
}
else
{
model.put(TASK_WORKFLOW_INSTANCE_DUE_DATE, dueDate);
}
if (workflowInstance.context != null)
{
model.put(TASK_WORKFLOW_INSTANCE_CONTEXT, workflowInstance.context.toString());
}
model.put(TASK_WORKFLOW_INSTANCE_PRIORITY, priority);
model.put(TASK_WORKFLOW_INSTANCE_PACKAGE, workflowInstance.workflowPackage.toString());
model.put(TASK_WORKFLOW_INSTANCE_START_TASK_INSTANCE_ID, startTaskId);
model.put(TASK_WORKFLOW_INSTANCE_DEFINITION, buildDetailed(workflowInstance.definition));
return model;
}
@@ -195,6 +350,40 @@ public class WorkflowModelBuilder
return model;
}
/**
* Returns a detailed representation of a {@link WorkflowDefinition}.
*
* @param workflowDefinition the WorkflowDefinition object to be represented.
* @return
*/
public Map<String, Object> buildDetailed(WorkflowDefinition workflowDefinition)
{
Map<String, Object> model = buildSimple(workflowDefinition);
model.put(WORKFLOW_DEFINITION_VERSION, workflowDefinition.getVersion());
model.put(WORKFLOW_DEFINITION_START_TASK_DEFINITION_URL, getUrl(workflowDefinition.getStartTaskDefinition().getMetadata()));
model.put(WORKFLOW_DEFINITION_START_TASK_DEFINITION_TYPE, workflowDefinition.getStartTaskDefinition().getMetadata().getName());
ArrayList<Map<String, Object>> results = new ArrayList<Map<String, Object>>();
for (WorkflowTaskDefinition taskDefinition : workflowService.getTaskDefinitions(workflowDefinition.getId()))
{
if (taskDefinition.id.equals(workflowDefinition.getStartTaskDefinition().getId()))
{
continue;
}
Map<String, Object> result = new HashMap<String, Object>();
result.put(TASK_DEFINITION_URL, getUrl(taskDefinition.getMetadata()));
result.put(TASK_DEFINITION_TYPE, taskDefinition.getMetadata().getName());
results.add(result);
}
model.put(WORKFLOW_DEFINITION_TASK_DEFINITIONS, results);
return model;
}
private Object isPooled(Map<QName, Serializable> properties)
{
Collection<?> actors = (Collection<?>) properties.get(WorkflowModel.ASSOC_POOLED_ACTORS);
@@ -240,6 +429,7 @@ public class WorkflowModelBuilder
{
return value;
}
if (value instanceof Collection<?>)
{
Collection<?> collection = (Collection<?>) value;
@@ -250,6 +440,7 @@ public class WorkflowModelBuilder
}
return results;
}
return DefaultTypeConverter.INSTANCE.convert(String.class, value);
}
@@ -289,48 +480,6 @@ public class WorkflowModelBuilder
return model;
}
private Map<String, Object> buildWorkflowInstance(WorkflowInstance workflowInstance)
{
Map<String, Object> model = new HashMap<String, Object>();
model.put(TASK_WORKFLOW_INSTANCE_ID, workflowInstance.id);
model.put(TASK_WORKFLOW_INSTANCE_URL, getUrl(workflowInstance));
model.put(TASK_WORKFLOW_INSTANCE_NAME, workflowInstance.definition.name);
model.put(TASK_WORKFLOW_INSTANCE_TITLE, workflowInstance.definition.title);
model.put(TASK_WORKFLOW_INSTANCE_DESCRIPTION, workflowInstance.definition.description);
model.put(TASK_WORKFLOW_INSTANCE_IS_ACTIVE, workflowInstance.active);
if (workflowInstance.startDate == null)
{
model.put(TASK_WORKFLOW_INSTANCE_START_DATE, workflowInstance.startDate);
}
else
{
model.put(TASK_WORKFLOW_INSTANCE_START_DATE, ISO8601DateFormat.format(workflowInstance.startDate));
}
if (workflowInstance.endDate == null)
{
model.put(TASK_WORKFLOW_INSTANCE_END_DATE, workflowInstance.endDate);
}
else
{
model.put(TASK_WORKFLOW_INSTANCE_END_DATE, ISO8601DateFormat.format(workflowInstance.endDate));
}
if (workflowInstance.initiator == null)
{
model.put(TASK_WORKFLOW_INSTANCE_INITIATOR, null);
}
else
{
model.put(TASK_WORKFLOW_INSTANCE_INITIATOR, getPersonModel(nodeService.getProperty(workflowInstance.initiator, ContentModel.PROP_USERNAME)));
}
model.put(TASK_WORKFLOW_INSTANCE_DEFINITION_URL, getUrl(workflowInstance.definition));
return model;
}
private Map<String, Object> buildTaskDefinition(WorkflowTaskDefinition workflowTaskDefinition, WorkflowTask workflowTask)
{
Map<String, Object> model = new HashMap<String, Object>();
@@ -382,9 +531,11 @@ public class WorkflowModelBuilder
private List<?> getHiddenTransitions(Map<QName, Serializable> properties)
{
Serializable hiddenSer = properties.get(WorkflowModel.PROP_HIDDEN_TRANSITIONS);
if(hiddenSer instanceof List<?>)
if (hiddenSer instanceof List<?>)
{
return (List<?>) hiddenSer;
else if(hiddenSer instanceof String)
}
else if (hiddenSer instanceof String)
{
String hiddenStr = (String) hiddenSer;
return Arrays.asList(hiddenStr.split(","));
@@ -399,15 +550,16 @@ public class WorkflowModelBuilder
model.put(WORKFLOW_NODE_TRANSITION_ID, id);
model.put(WORKFLOW_NODE_TRANSITION_TITLE, workflowTransition.getTitle());
model.put(WORKFLOW_NODE_TRANSITION_DESCRIPTION, workflowTransition.getDescription());
model.put(WORKFLOW_NODE_TRANSITION_IS_DEFAULT, workflowTransition.isDefault);
model.put(WORKFLOW_NODE_TRANSITION_IS_DEFAULT, workflowTransition.isDefault());
model.put(WORKFLOW_NODE_TRANSITION_IS_HIDDEN, isHiddenTransition(id, hiddenTransitions));
return model;
}
private boolean isHiddenTransition(String transitionId, List<?> hiddenTransitions)
{
if(hiddenTransitions == null)
if (hiddenTransitions == null)
return false;
return hiddenTransitions.contains(transitionId);
}

View File

@@ -42,6 +42,7 @@ import org.alfresco.service.cmr.workflow.WorkflowDefinition;
import org.alfresco.service.cmr.workflow.WorkflowInstance;
import org.alfresco.service.cmr.workflow.WorkflowNode;
import org.alfresco.service.cmr.workflow.WorkflowPath;
import org.alfresco.service.cmr.workflow.WorkflowService;
import org.alfresco.service.cmr.workflow.WorkflowTask;
import org.alfresco.service.cmr.workflow.WorkflowTaskDefinition;
import org.alfresco.service.cmr.workflow.WorkflowTaskState;
@@ -62,10 +63,12 @@ public class WorkflowModelBuilderTest extends TestCase
private static final String firstName = "Joe";
private static final String lastName = "Bloggs";
private static final NodeRef person = new NodeRef(StoreRef.STORE_REF_WORKSPACE_SPACESSTORE, userName);
private static final NodeRef workflowPackage = new NodeRef(StoreRef.STORE_REF_WORKSPACE_SPACESSTORE, "workflowPackage");
private NamespaceService namespaceService;
private PersonService personService;
private NodeService nodeService;
private WorkflowService workflowService;
private WorkflowModelBuilder builder;
@SuppressWarnings("unchecked")
@@ -199,13 +202,50 @@ public class WorkflowModelBuilderTest extends TestCase
WorkflowDefinition workflowDefinition = new WorkflowDefinition("The Id", "The Name", "The Version", "The Title", "The Description", workflowTaskDefinition);
Map<String, Object> model = builder.buildSimple(workflowDefinition);
assertEquals(workflowDefinition.id, model.get(WorkflowModelBuilder.WORKFLOW_DEFINITION_ID));
assertEquals("api/workflow-definitions/" + workflowDefinition.id, model.get(WorkflowModelBuilder.WORKFLOW_DEFINITION_URL));
assertEquals(workflowDefinition.name, model.get(WorkflowModelBuilder.WORKFLOW_DEFINITION_NAME));
assertEquals(workflowDefinition.title, model.get(WorkflowModelBuilder.WORKFLOW_DEFINITION_TITLE));
assertEquals(workflowDefinition.description, model.get(WorkflowModelBuilder.WORKFLOW_DEFINITION_DESCRIPTION));
assertEquals(workflowDefinition.getId(), model.get(WorkflowModelBuilder.WORKFLOW_DEFINITION_ID));
assertEquals("api/workflow-definitions/" + workflowDefinition.getId(), model.get(WorkflowModelBuilder.WORKFLOW_DEFINITION_URL));
assertEquals(workflowDefinition.getName(), model.get(WorkflowModelBuilder.WORKFLOW_DEFINITION_NAME));
assertEquals(workflowDefinition.getTitle(), model.get(WorkflowModelBuilder.WORKFLOW_DEFINITION_TITLE));
assertEquals(workflowDefinition.getDescription(), model.get(WorkflowModelBuilder.WORKFLOW_DEFINITION_DESCRIPTION));
}
@SuppressWarnings("unchecked")
public void testBuildWorkflowInstanceDetailed() throws Exception
{
WorkflowTaskDefinition workflowTaskDefinition = new WorkflowTaskDefinition();
workflowTaskDefinition.metadata = mock(TypeDefinition.class);
when(workflowTaskDefinition.getMetadata().getName()).thenReturn(QName.createQName("The Type Name"));
when(workflowTaskDefinition.getMetadata().getTitle()).thenReturn("The Type Title");
when(workflowTaskDefinition.getMetadata().getDescription()).thenReturn("The Type Description");
WorkflowInstance workflowInstance = makeWorkflowInstance(workflowTaskDefinition);
Map<String, Object> model = builder.buildDetailed(workflowInstance, true);
assertEquals(workflowInstance.getId(), model.get(WorkflowModelBuilder.TASK_WORKFLOW_INSTANCE_ID));
assertEquals(workflowInstance.getDefinition().getName(), model.get(WorkflowModelBuilder.TASK_WORKFLOW_INSTANCE_NAME));
assertEquals(workflowInstance.getDefinition().getTitle(), model.get(WorkflowModelBuilder.TASK_WORKFLOW_INSTANCE_TITLE));
assertEquals(workflowInstance.getDefinition().getDescription(), model.get(WorkflowModelBuilder.TASK_WORKFLOW_INSTANCE_DESCRIPTION));
assertEquals(workflowInstance.isActive(), model.get(WorkflowModelBuilder.TASK_WORKFLOW_INSTANCE_IS_ACTIVE));
assertEquals(ISO8601DateFormat.format(workflowInstance.getStartDate()), model.get(WorkflowModelBuilder.TASK_WORKFLOW_INSTANCE_START_DATE));
assertEquals(ISO8601DateFormat.format(workflowInstance.getEndDate()), model.get(WorkflowModelBuilder.TASK_WORKFLOW_INSTANCE_END_DATE));
Map<String, Object> initiator = (Map<String, Object>) model.get(WorkflowModelBuilder.TASK_WORKFLOW_INSTANCE_INITIATOR);
assertEquals(userName, initiator.get(WorkflowModelBuilder.PERSON_USER_NAME));
assertEquals(firstName, initiator.get(WorkflowModelBuilder.PERSON_FIRST_NAME));
assertEquals(lastName, initiator.get(WorkflowModelBuilder.PERSON_LAST_NAME));
assertEquals(workflowInstance.getContext().toString(), model.get(WorkflowModelBuilder.TASK_WORKFLOW_INSTANCE_CONTEXT));
assertEquals(workflowInstance.getWorkflowPackage().toString(), model.get(WorkflowModelBuilder.TASK_WORKFLOW_INSTANCE_PACKAGE));
Map<String, Object> taskInstanceModel = (Map<String, Object>) model.get(WorkflowModelBuilder.TASK_WORKFLOW_INSTANCE_DEFINITION);
assertEquals(workflowInstance.getDefinition().getVersion(), taskInstanceModel.get(WorkflowModelBuilder.WORKFLOW_DEFINITION_VERSION));
assertEquals(workflowInstance.getDefinition().getStartTaskDefinition().getMetadata().getName(),
taskInstanceModel.get(WorkflowModelBuilder.WORKFLOW_DEFINITION_START_TASK_DEFINITION_TYPE));
}
private WorkflowNode makeNode()
{
WorkflowNode node = new WorkflowNode();
@@ -273,6 +313,21 @@ public class WorkflowModelBuilderTest extends TestCase
task.properties = makeTaskProperties(date);
return task;
}
private WorkflowInstance makeWorkflowInstance(WorkflowTaskDefinition taskDefinition)
{
WorkflowInstance workflowInstance = new WorkflowInstance();
workflowInstance.id = "The id";
workflowInstance.active = true;
workflowInstance.startDate = new Date();
workflowInstance.endDate = new Date();
workflowInstance.initiator = person;
workflowInstance.definition = new WorkflowDefinition(
"The Id", "The Name", "The Version", "The Title", "The Description", taskDefinition);
workflowInstance.workflowPackage = workflowPackage;
workflowInstance.context = workflowPackage;
return workflowInstance;
}
private HashMap<QName, Serializable> makeTaskProperties(Date date)
{
@@ -307,7 +362,10 @@ public class WorkflowModelBuilderTest extends TestCase
personProps.put(ContentModel.PROP_FIRSTNAME, firstName);
personProps.put(ContentModel.PROP_LASTNAME, lastName);
when(nodeService.getProperties(person)).thenReturn(personProps);
when(nodeService.getProperty(person, ContentModel.PROP_USERNAME)).thenReturn(userName);
builder = new WorkflowModelBuilder(namespaceService, nodeService, personService);
workflowService = mock(WorkflowService.class);
builder = new WorkflowModelBuilder(namespaceService, nodeService, personService, workflowService);
}
}

View File

@@ -65,6 +65,7 @@ public class WorkflowRestApiTest extends BaseWebScriptTest
private final static String USER3 = "Nick" + GUID.generate();
private static final String URL_TASKS = "api/task-instances";
private static final String URL_WORKFLOW_DEFINITIONS = "api/workflow-definitions";
private static final String URL_WORKFLOW_INSTANCES = "api/workflow-instances";
private TestPersonManager personManager;
private WorkflowService workflowService;
@@ -313,6 +314,68 @@ public class WorkflowRestApiTest extends BaseWebScriptTest
}
}
public void testWorkflowInstanceGet() throws Exception
{
//Start workflow as USER1 and assign task to USER2.
personManager.setUser(USER1);
WorkflowDefinition adhocDef = workflowService.getDefinitionByName("jbpm$wf:adhoc");
Map<QName, Serializable> params = new HashMap<QName, Serializable>();
params.put(WorkflowModel.ASSOC_ASSIGNEE, personManager.get(USER2));
Date dueDate = new Date();
params.put(WorkflowModel.PROP_DUE_DATE, dueDate);
params.put(WorkflowModel.PROP_PRIORITY, 1);
params.put(WorkflowModel.ASSOC_PACKAGE, packageRef);
params.put(WorkflowModel.PROP_CONTEXT, packageRef);
WorkflowPath adhocPath = workflowService.startWorkflow(adhocDef.id, params);
WorkflowTask startTask = workflowService.getTasksForWorkflowPath(adhocPath.id).get(0);
startTask = workflowService.endTask(startTask.id, null);
WorkflowInstance adhocInstance = startTask.path.instance;
Response response = sendRequest(new GetRequest(URL_WORKFLOW_INSTANCES + "/" + adhocInstance.id + "?includeTasks=true"), 200);
assertEquals(Status.STATUS_OK, response.getStatus());
String jsonStr = response.getContentAsString();
JSONObject json = new JSONObject(jsonStr);
JSONObject result = json.getJSONObject("data");
assertNotNull(result);
assertEquals(adhocInstance.id, result.getString("id"));
assertEquals(adhocInstance.definition.name, result.getString("name"));
assertEquals(adhocInstance.definition.title, result.getString("title"));
assertEquals(adhocInstance.definition.description, result.getString("description"));
assertEquals(adhocInstance.active, result.getBoolean("isActive"));
assertEquals(ISO8601DateFormat.format(adhocInstance.startDate), result.getString("startDate"));
assertNotNull(result.getString("dueDate"));
assertNotNull(result.getString("endDate"));
assertEquals(2, result.getInt("priority"));
JSONObject initiator = result.getJSONObject("initiator");
assertEquals(USER1, initiator.getString("userName"));
assertEquals(personManager.getFirstName(USER1), initiator.getString("firstName"));
assertEquals(personManager.getLastName(USER1), initiator.getString("lastName"));
assertEquals(adhocInstance.context.toString(), result.getString("context"));
assertEquals(adhocInstance.workflowPackage.toString(), result.getString("package"));
assertNotNull(result.getString("startTaskInstanceId"));
JSONObject jsonDefinition = result.getJSONObject("definition");
WorkflowDefinition adhocDefinition = adhocInstance.definition;
assertNotNull(jsonDefinition);
assertEquals(adhocDefinition.id, jsonDefinition.getString("id"));
assertEquals(adhocDefinition.name, jsonDefinition.getString("name"));
assertEquals(adhocDefinition.title, jsonDefinition.getString("title"));
assertEquals(adhocDefinition.description, jsonDefinition.getString("description"));
assertEquals(adhocDefinition.version, jsonDefinition.getString("version"));
assertEquals(adhocDefinition.getStartTaskDefinition().metadata.getName().toPrefixString(namespaceService), jsonDefinition.getString("startTaskDefinitionType"));
assertTrue(jsonDefinition.has("taskDefinitions"));
JSONArray tasks = result.getJSONArray("tasks");
assertTrue(tasks.length() > 1);
}
@Override
protected void setUp() throws Exception
{