From 2dbd24533e4207e369dd001d20476f16f1fe8025 Mon Sep 17 00:00:00 2001 From: N Smith Date: Thu, 8 Jul 2010 16:04:31 +0000 Subject: [PATCH] Modified TaskInstancesGet webscript so that it no longer omits properties with a null value. Also added an 'id' property to the task JSON representation. git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@21005 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261 --- .../alfresco/repository/workflow/task.lib.ftl | 23 ++++++----- .../workflow/WorkflowModelBuilder.java | 40 ++++++++++++++----- .../workflow/WorkflowModelBuilderTest.java | 2 + .../scripts/workflow/WorkflowRestApiTest.java | 16 +++----- 4 files changed, 52 insertions(+), 29 deletions(-) diff --git a/config/alfresco/templates/webscripts/org/alfresco/repository/workflow/task.lib.ftl b/config/alfresco/templates/webscripts/org/alfresco/repository/workflow/task.lib.ftl index d692c6a229..17fb721651 100644 --- a/config/alfresco/templates/webscripts/org/alfresco/repository/workflow/task.lib.ftl +++ b/config/alfresco/templates/webscripts/org/alfresco/repository/workflow/task.lib.ftl @@ -1,6 +1,7 @@ <#-- Renders a task instance. --> <#macro taskJSON task > { + "id": "${task.id}", "url": "${task.url}", "name": "${task.name}", "title": "${task.title}", @@ -8,16 +9,18 @@ "state": "${task.state}", "typeDefinitionTitle": "${task.typeDefinitionTitle}", "isPooled": ${task.isPooled?string}, + "owner": <#if task.owner??> - "owner": - { - "userName": "${task.owner.userName}", - "firstName": "${task.owner.firstName}", - "lastName": "${task.owner.lastName}" - }, + { + "userName": "${task.owner.userName}", + "firstName": "${task.owner.firstName}", + "lastName": "${task.owner.lastName}" + }, + <#else> + null "properties": - <@propertiesJSON properties=task.properties /> + <@propertiesJSON properties=task.properties /> } @@ -25,9 +28,9 @@ <#macro propertiesJSON properties> { <#list properties?keys as key> + "${key}" : <#if properties[key]??> <#assign val=properties[key]> - "${key}" : <#if val?is_boolean == true> ${val?string} <#elseif val?is_number == true> @@ -41,8 +44,10 @@ <#else> "${jsonUtils.encodeJSONString(shortQName(val?string))}" - <#if (key_has_next)>, + <#else> + null + <#if (key_has_next)>, } diff --git a/source/java/org/alfresco/repo/web/scripts/workflow/WorkflowModelBuilder.java b/source/java/org/alfresco/repo/web/scripts/workflow/WorkflowModelBuilder.java index 2fb1b25fbb..c3c1c77053 100644 --- a/source/java/org/alfresco/repo/web/scripts/workflow/WorkflowModelBuilder.java +++ b/source/java/org/alfresco/repo/web/scripts/workflow/WorkflowModelBuilder.java @@ -22,12 +22,16 @@ import java.io.Serializable; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; +import java.util.HashSet; import java.util.List; import java.util.Map; +import java.util.Set; import org.alfresco.error.AlfrescoRuntimeException; import org.alfresco.model.ContentModel; import org.alfresco.repo.workflow.WorkflowModel; +import org.alfresco.service.cmr.dictionary.AssociationDefinition; +import org.alfresco.service.cmr.dictionary.PropertyDefinition; import org.alfresco.service.cmr.repository.NodeRef; import org.alfresco.service.cmr.repository.NodeService; import org.alfresco.service.cmr.repository.datatype.DefaultTypeConverter; @@ -56,6 +60,7 @@ public class WorkflowModelBuilder public static final String TASK_NAME = "name"; public static final String TASK_URL = "url"; public static final String TASK_IS_POOLED = "isPooled"; + public static final String TASK_ID = "id"; private static final String PREFIX_SEPARATOR = Character.toString(QName.NAMESPACE_PREFIX); @@ -79,6 +84,7 @@ public class WorkflowModelBuilder public Map buildSimple(WorkflowTask task, Collection propertyFilters) { HashMap model = new HashMap(); + model.put(TASK_ID, task.id); model.put(TASK_URL, getUrl(task)); model.put(TASK_NAME, task.name); model.put(TASK_TITLE, task.title); @@ -88,11 +94,9 @@ public class WorkflowModelBuilder model.put(TASK_IS_POOLED, isPooled(task.properties)); Serializable owner = task.properties.get(ContentModel.PROP_OWNER); - if (owner != null && owner instanceof String) { - model.put(TASK_OWNER, getPersonModel((String) owner)); - } + model.put(TASK_OWNER, getPersonModel((String) owner)); - model.put(TASK_PROPERTIES, buildProperties(task.properties, propertyFilters)); + model.put(TASK_PROPERTIES, buildProperties(task, propertyFilters)); return model; } @@ -102,19 +106,33 @@ public class WorkflowModelBuilder return actors!=null && !actors.isEmpty(); } - private Map buildProperties(Map properties, Collection propertyFilters) + private Map buildProperties(WorkflowTask task, Collection propertyFilters) { + Map properties = task.properties; Collection keys; if (propertyFilters == null || propertyFilters.size() == 0) - keys = properties.keySet(); + { + Map propDefs = task.definition.metadata.getProperties(); + Map assocDefs = task.definition.metadata.getAssociations(); + Set propKeys = properties.keySet(); + keys = new HashSet(propDefs.size() + assocDefs.size() + propKeys.size()); + keys.addAll(propDefs.keySet()); + keys.addAll(assocDefs.keySet()); + keys.addAll(propKeys); + } else keys = buildQNameKeys(propertyFilters); + return buildQNameProperties(properties, keys); + } + + private Map buildQNameProperties(Map properties, Collection keys) + { Map model = new HashMap(); for (QName key : keys) { Object value = convertValue(properties.get(key)); - String preixedKey = key.toPrefixString(namespaceService); - String strKey = preixedKey.replace(PREFIX_SEPARATOR, "_"); + String prefixedKey = key.toPrefixString(namespaceService); + String strKey = prefixedKey.replace(PREFIX_SEPARATOR, "_"); model.put(strKey, value); } return model; @@ -160,8 +178,12 @@ public class WorkflowModelBuilder return qKeys; } - private Map getPersonModel(String name) + private Map getPersonModel(Serializable nameSer) { + if (!(nameSer instanceof String)) + return null; + + String name = (String) nameSer; NodeRef person = personService.getPerson(name); Map properties = nodeService.getProperties(person); diff --git a/source/java/org/alfresco/repo/web/scripts/workflow/WorkflowModelBuilderTest.java b/source/java/org/alfresco/repo/web/scripts/workflow/WorkflowModelBuilderTest.java index 6839dfd4fc..9477a31608 100644 --- a/source/java/org/alfresco/repo/web/scripts/workflow/WorkflowModelBuilderTest.java +++ b/source/java/org/alfresco/repo/web/scripts/workflow/WorkflowModelBuilderTest.java @@ -88,6 +88,8 @@ public class WorkflowModelBuilderTest extends TestCase task.properties.put(testDate, date); Map model = builder.buildSimple(task, null); + Object id = model.get(WorkflowModelBuilder.TASK_ID); + assertEquals(task.id, id); Object url = model.get(WorkflowModelBuilder.TASK_URL); assertEquals("api/task-instance/"+task.id, url); assertEquals(task.name, model.get(WorkflowModelBuilder.TASK_NAME)); diff --git a/source/java/org/alfresco/repo/web/scripts/workflow/WorkflowRestApiTest.java b/source/java/org/alfresco/repo/web/scripts/workflow/WorkflowRestApiTest.java index 05ffb1a11f..197287d1c2 100644 --- a/source/java/org/alfresco/repo/web/scripts/workflow/WorkflowRestApiTest.java +++ b/source/java/org/alfresco/repo/web/scripts/workflow/WorkflowRestApiTest.java @@ -66,7 +66,8 @@ public class WorkflowRestApiTest extends BaseWebScriptTest personManager.setUser(USER2); Response response = sendRequest(new GetRequest(URL_TASKS), 200); assertEquals(Status.STATUS_OK, response.getStatus()); - JSONObject json = new JSONObject(response.getContentAsString()); + String jsonStr = response.getContentAsString(); + JSONObject json = new JSONObject(jsonStr); JSONArray results = json.getJSONArray("data"); assertNotNull(results); assertTrue(results.length()==0); @@ -88,13 +89,12 @@ public class WorkflowRestApiTest extends BaseWebScriptTest List tasks = workflowService.getAssignedTasks(USER2, WorkflowTaskState.IN_PROGRESS); WorkflowTask task = tasks.get(0); - Serializable actors = task.properties.get(WorkflowModel.ASSOC_POOLED_ACTORS); - System.out.println("Pooled Actors: " + actors); - personManager.setUser(USER2); response = sendRequest(new GetRequest(URL_TASKS), 200); assertEquals(Status.STATUS_OK, response.getStatus()); - json = new JSONObject(response.getContentAsString()); + jsonStr = response.getContentAsString(); + System.out.println(jsonStr); + json = new JSONObject(jsonStr); results = json.getJSONArray("data"); assertNotNull(results); assertTrue(results.length()==tasks.size()); @@ -115,12 +115,6 @@ public class WorkflowRestApiTest extends BaseWebScriptTest assertEquals(personManager.getLastName(USER2), owner.getString("lastName")); JSONObject properties = result.getJSONObject("properties"); - Collection values = task.properties.values(); - while(values.contains(null)) - { - values.remove(null); - } - assertEquals(values.size(), properties.length()); //TODO Add more tests to check property filtering and pooled actors. }