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
This commit is contained in:
N Smith
2010-07-08 16:04:31 +00:00
parent d91a77ff03
commit 2dbd24533e
4 changed files with 52 additions and 29 deletions

View File

@@ -1,6 +1,7 @@
<#-- Renders a task instance. --> <#-- Renders a task instance. -->
<#macro taskJSON task > <#macro taskJSON task >
{ {
"id": "${task.id}",
"url": "${task.url}", "url": "${task.url}",
"name": "${task.name}", "name": "${task.name}",
"title": "${task.title}", "title": "${task.title}",
@@ -8,16 +9,18 @@
"state": "${task.state}", "state": "${task.state}",
"typeDefinitionTitle": "${task.typeDefinitionTitle}", "typeDefinitionTitle": "${task.typeDefinitionTitle}",
"isPooled": ${task.isPooled?string}, "isPooled": ${task.isPooled?string},
"owner":
<#if task.owner??> <#if task.owner??>
"owner": {
{ "userName": "${task.owner.userName}",
"userName": "${task.owner.userName}", "firstName": "${task.owner.firstName}",
"firstName": "${task.owner.firstName}", "lastName": "${task.owner.lastName}"
"lastName": "${task.owner.lastName}" },
}, <#else>
null
</#if> </#if>
"properties": "properties":
<@propertiesJSON properties=task.properties /> <@propertiesJSON properties=task.properties />
} }
</#macro> </#macro>
@@ -25,9 +28,9 @@
<#macro propertiesJSON properties> <#macro propertiesJSON properties>
{ {
<#list properties?keys as key> <#list properties?keys as key>
"${key}" :
<#if properties[key]??> <#if properties[key]??>
<#assign val=properties[key]> <#assign val=properties[key]>
"${key}" :
<#if val?is_boolean == true> <#if val?is_boolean == true>
${val?string} ${val?string}
<#elseif val?is_number == true> <#elseif val?is_number == true>
@@ -41,8 +44,10 @@
<#else> <#else>
"${jsonUtils.encodeJSONString(shortQName(val?string))}" "${jsonUtils.encodeJSONString(shortQName(val?string))}"
</#if> </#if>
<#if (key_has_next)>,</#if> <#else>
null
</#if> </#if>
<#if (key_has_next)>,</#if>
</#list> </#list>
} }
</#macro> </#macro>

View File

@@ -22,12 +22,16 @@ import java.io.Serializable;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collection; import java.util.Collection;
import java.util.HashMap; import java.util.HashMap;
import java.util.HashSet;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Set;
import org.alfresco.error.AlfrescoRuntimeException; import org.alfresco.error.AlfrescoRuntimeException;
import org.alfresco.model.ContentModel; import org.alfresco.model.ContentModel;
import org.alfresco.repo.workflow.WorkflowModel; 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.NodeRef;
import org.alfresco.service.cmr.repository.NodeService; import org.alfresco.service.cmr.repository.NodeService;
import org.alfresco.service.cmr.repository.datatype.DefaultTypeConverter; 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_NAME = "name";
public static final String TASK_URL = "url"; public static final String TASK_URL = "url";
public static final String TASK_IS_POOLED = "isPooled"; 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); private static final String PREFIX_SEPARATOR = Character.toString(QName.NAMESPACE_PREFIX);
@@ -79,6 +84,7 @@ public class WorkflowModelBuilder
public Map<String, Object> buildSimple(WorkflowTask task, Collection<String> propertyFilters) public Map<String, Object> buildSimple(WorkflowTask task, Collection<String> propertyFilters)
{ {
HashMap<String, Object> model = new HashMap<String, Object>(); HashMap<String, Object> model = new HashMap<String, Object>();
model.put(TASK_ID, task.id);
model.put(TASK_URL, getUrl(task)); model.put(TASK_URL, getUrl(task));
model.put(TASK_NAME, task.name); model.put(TASK_NAME, task.name);
model.put(TASK_TITLE, task.title); model.put(TASK_TITLE, task.title);
@@ -88,11 +94,9 @@ public class WorkflowModelBuilder
model.put(TASK_IS_POOLED, isPooled(task.properties)); model.put(TASK_IS_POOLED, isPooled(task.properties));
Serializable owner = task.properties.get(ContentModel.PROP_OWNER); 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; return model;
} }
@@ -102,19 +106,33 @@ public class WorkflowModelBuilder
return actors!=null && !actors.isEmpty(); return actors!=null && !actors.isEmpty();
} }
private Map<String, Object> buildProperties(Map<QName, Serializable> properties, Collection<String> propertyFilters) private Map<String, Object> buildProperties(WorkflowTask task, Collection<String> propertyFilters)
{ {
Map<QName, Serializable> properties = task.properties;
Collection<QName> keys; Collection<QName> keys;
if (propertyFilters == null || propertyFilters.size() == 0) if (propertyFilters == null || propertyFilters.size() == 0)
keys = properties.keySet(); {
Map<QName, PropertyDefinition> propDefs = task.definition.metadata.getProperties();
Map<QName, AssociationDefinition> assocDefs = task.definition.metadata.getAssociations();
Set<QName> propKeys = properties.keySet();
keys = new HashSet<QName>(propDefs.size() + assocDefs.size() + propKeys.size());
keys.addAll(propDefs.keySet());
keys.addAll(assocDefs.keySet());
keys.addAll(propKeys);
}
else else
keys = buildQNameKeys(propertyFilters); keys = buildQNameKeys(propertyFilters);
return buildQNameProperties(properties, keys);
}
private Map<String, Object> buildQNameProperties(Map<QName, Serializable> properties, Collection<QName> keys)
{
Map<String, Object> model = new HashMap<String, Object>(); Map<String, Object> model = new HashMap<String, Object>();
for (QName key : keys) for (QName key : keys)
{ {
Object value = convertValue(properties.get(key)); Object value = convertValue(properties.get(key));
String preixedKey = key.toPrefixString(namespaceService); String prefixedKey = key.toPrefixString(namespaceService);
String strKey = preixedKey.replace(PREFIX_SEPARATOR, "_"); String strKey = prefixedKey.replace(PREFIX_SEPARATOR, "_");
model.put(strKey, value); model.put(strKey, value);
} }
return model; return model;
@@ -160,8 +178,12 @@ public class WorkflowModelBuilder
return qKeys; return qKeys;
} }
private Map<String, Object> getPersonModel(String name) private Map<String, Object> getPersonModel(Serializable nameSer)
{ {
if (!(nameSer instanceof String))
return null;
String name = (String) nameSer;
NodeRef person = personService.getPerson(name); NodeRef person = personService.getPerson(name);
Map<QName, Serializable> properties = nodeService.getProperties(person); Map<QName, Serializable> properties = nodeService.getProperties(person);

View File

@@ -88,6 +88,8 @@ public class WorkflowModelBuilderTest extends TestCase
task.properties.put(testDate, date); task.properties.put(testDate, date);
Map<String, Object> model = builder.buildSimple(task, null); Map<String, Object> model = builder.buildSimple(task, null);
Object id = model.get(WorkflowModelBuilder.TASK_ID);
assertEquals(task.id, id);
Object url = model.get(WorkflowModelBuilder.TASK_URL); Object url = model.get(WorkflowModelBuilder.TASK_URL);
assertEquals("api/task-instance/"+task.id, url); assertEquals("api/task-instance/"+task.id, url);
assertEquals(task.name, model.get(WorkflowModelBuilder.TASK_NAME)); assertEquals(task.name, model.get(WorkflowModelBuilder.TASK_NAME));

View File

@@ -66,7 +66,8 @@ public class WorkflowRestApiTest extends BaseWebScriptTest
personManager.setUser(USER2); personManager.setUser(USER2);
Response response = sendRequest(new GetRequest(URL_TASKS), 200); Response response = sendRequest(new GetRequest(URL_TASKS), 200);
assertEquals(Status.STATUS_OK, response.getStatus()); 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"); JSONArray results = json.getJSONArray("data");
assertNotNull(results); assertNotNull(results);
assertTrue(results.length()==0); assertTrue(results.length()==0);
@@ -88,13 +89,12 @@ public class WorkflowRestApiTest extends BaseWebScriptTest
List<WorkflowTask> tasks = workflowService.getAssignedTasks(USER2, WorkflowTaskState.IN_PROGRESS); List<WorkflowTask> tasks = workflowService.getAssignedTasks(USER2, WorkflowTaskState.IN_PROGRESS);
WorkflowTask task = tasks.get(0); WorkflowTask task = tasks.get(0);
Serializable actors = task.properties.get(WorkflowModel.ASSOC_POOLED_ACTORS);
System.out.println("Pooled Actors: " + actors);
personManager.setUser(USER2); personManager.setUser(USER2);
response = sendRequest(new GetRequest(URL_TASKS), 200); response = sendRequest(new GetRequest(URL_TASKS), 200);
assertEquals(Status.STATUS_OK, response.getStatus()); 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"); results = json.getJSONArray("data");
assertNotNull(results); assertNotNull(results);
assertTrue(results.length()==tasks.size()); assertTrue(results.length()==tasks.size());
@@ -115,12 +115,6 @@ public class WorkflowRestApiTest extends BaseWebScriptTest
assertEquals(personManager.getLastName(USER2), owner.getString("lastName")); assertEquals(personManager.getLastName(USER2), owner.getString("lastName"));
JSONObject properties = result.getJSONObject("properties"); JSONObject properties = result.getJSONObject("properties");
Collection<Serializable> 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. //TODO Add more tests to check property filtering and pooled actors.
} }