From 2a00f362410948e3c59d68f23eefecd4fb7a8590 Mon Sep 17 00:00:00 2001 From: Frederik Heremans Date: Fri, 11 May 2012 10:57:47 +0000 Subject: [PATCH] Merged DEV/V4.0-BUGFIX into HEAD: 36275 ALF-14029: Updating single-valued association (no List) fixed. git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@36279 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261 --- .../activiti/ActivitiTaskComponentTest.java | 27 +++++++ .../properties/ActivitiPropertyConverter.java | 72 ++++++++++++------- 2 files changed, 72 insertions(+), 27 deletions(-) diff --git a/source/java/org/alfresco/repo/workflow/activiti/ActivitiTaskComponentTest.java b/source/java/org/alfresco/repo/workflow/activiti/ActivitiTaskComponentTest.java index e733e0296f..ea076f9ca5 100644 --- a/source/java/org/alfresco/repo/workflow/activiti/ActivitiTaskComponentTest.java +++ b/source/java/org/alfresco/repo/workflow/activiti/ActivitiTaskComponentTest.java @@ -721,6 +721,7 @@ public class ActivitiTaskComponentTest extends AbstractActivitiComponentTest QName propQname = QName.createQName("testProp"); QName nodeRefPropQname = QName.createQName("testAssoc"); + QName singleNodeRefPropQname = QName.createQName("testAssocSingleValue"); HashMap props = new HashMap(); // Start the workflow-path @@ -740,6 +741,7 @@ public class ActivitiTaskComponentTest extends AbstractActivitiComponentTest // Test altering plain properties props = new HashMap(); props.put(propQname, "54321"); + props.put(singleNodeRefPropQname, nodeRef); workflowEngine.updateTask(task.getId(), props, null, null); tasks = workflowEngine.queryTasks(taskQuery); @@ -766,6 +768,31 @@ public class ActivitiTaskComponentTest extends AbstractActivitiComponentTest task = tasks.get(0); assertEquals(1, ((List)task.getProperties().get(nodeRefPropQname)).size()); assertEquals(anotherRef, ((List)task.getProperties().get(nodeRefPropQname)).get(0)); + + // Test changing single-valued association + toAdd = new HashMap>(); + toRemove = new HashMap>(); + + toRemove.put(singleNodeRefPropQname, Arrays.asList(nodeRef)); + toAdd.put(singleNodeRefPropQname, Arrays.asList(anotherRef)); + + workflowEngine.updateTask(task.getId(), null, toAdd, toRemove); + tasks = workflowEngine.queryTasks(taskQuery); + task = tasks.get(0); + + assertEquals(anotherRef, task.getProperties().get(singleNodeRefPropQname)); + + // Test clearing single-valued association + toRemove = new HashMap>(); + + toRemove.put(singleNodeRefPropQname, Arrays.asList(anotherRef)); + + workflowEngine.updateTask(task.getId(), null, null, toRemove); + tasks = workflowEngine.queryTasks(taskQuery); + task = tasks.get(0); + + // Association value should be empty now + assertNull(task.getProperties().get(singleNodeRefPropQname)); } private void checkTaskVariableTaskPresent(WorkflowTaskState state, diff --git a/source/java/org/alfresco/repo/workflow/activiti/properties/ActivitiPropertyConverter.java b/source/java/org/alfresco/repo/workflow/activiti/properties/ActivitiPropertyConverter.java index f34f8995d3..2d65770f7e 100644 --- a/source/java/org/alfresco/repo/workflow/activiti/properties/ActivitiPropertyConverter.java +++ b/source/java/org/alfresco/repo/workflow/activiti/properties/ActivitiPropertyConverter.java @@ -684,29 +684,38 @@ public class ActivitiPropertyConverter // add new associations for (Entry> toAdd : add.entrySet()) { - // retrieve existing list of noderefs for - // association - List existingAdd = (List) newProperties.get(toAdd.getKey()); + // Retrieve existing list of noderefs for association OR single nodeRef + Serializable existingAdd = newProperties.get(toAdd.getKey()); if (existingAdd == null) { - existingAdd = (List) existingProperties.get(toAdd.getKey()); + // Get the property values from the existing values, if any + existingAdd = existingProperties.get(toAdd.getKey()); newProperties.put(toAdd.getKey(), (Serializable) existingAdd); } - - // make the additions + + // Add property values, if nessesairy if (existingAdd == null) { newProperties.put(toAdd.getKey(), (Serializable) toAdd.getValue()); } else { - for (NodeRef nodeRef : toAdd.getValue()) - { - if (!(existingAdd.contains(nodeRef))) - { - existingAdd.add(nodeRef); - } - } + if(existingAdd instanceof List) { + List existingList = (List) existingAdd; + + for (NodeRef nodeRef : toAdd.getValue()) + { + if (!(existingList.contains(nodeRef))) + { + existingList.add(nodeRef); + } + } + } else { + // Single valued property, add first value + if(toAdd.getValue().size() > 0) { + newProperties.put(toAdd.getKey(), (Serializable) toAdd.getValue().get(0)); + } + } } } } @@ -718,23 +727,32 @@ public class ActivitiPropertyConverter { // retrieve existing list of noderefs for // association - List existingRemove = (List) newProperties.get(toRemove.getKey()); + Serializable existingRemove = (Serializable) newProperties.get(toRemove.getKey()); + boolean isAlreadyNewProperty = existingRemove != null; + if (existingRemove == null) { - existingRemove = (List) existingProperties.get(toRemove.getKey()); - if(existingRemove != null) { - existingRemove = new ArrayList(existingRemove); - newProperties.put(toRemove.getKey(), (Serializable) existingRemove); - } + existingRemove = (Serializable) existingProperties.get(toRemove.getKey()); } - - // make the subtractions - if (existingRemove != null) - { - for (NodeRef nodeRef : toRemove.getValue()) - { - existingRemove.remove(nodeRef); - } + + // Only if the current property value is set, remove makes sense + if(existingRemove != null) { + if(existingRemove instanceof List) { + existingRemove = new ArrayList((List)existingRemove); + + for (NodeRef nodeRef : toRemove.getValue()) + { + ((List)existingRemove).remove(nodeRef); + } + newProperties.put(toRemove.getKey(),existingRemove); + } else { + // It's a single-valued property and an "add" has been done. No need to remove + // previous value, since it's overridden by the new value. + if(!isAlreadyNewProperty) { + // Property is single-valued and should be removed + newProperties.put(toRemove.getKey(), null); + } + } } } }