Merged DEV/V4.0-BUGFIX into HEAD:

36275 ALF-14029: Updating single-valued association (no List<NodeRef>) fixed.

git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@36279 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261
This commit is contained in:
Frederik Heremans
2012-05-11 10:57:47 +00:00
parent dbb11a5ce2
commit 2a00f36241
2 changed files with 72 additions and 27 deletions

View File

@@ -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<QName, Serializable> props = new HashMap<QName, Serializable>();
// Start the workflow-path
@@ -740,6 +741,7 @@ public class ActivitiTaskComponentTest extends AbstractActivitiComponentTest
// Test altering plain properties
props = new HashMap<QName, Serializable>();
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<NodeRef>)task.getProperties().get(nodeRefPropQname)).size());
assertEquals(anotherRef, ((List<NodeRef>)task.getProperties().get(nodeRefPropQname)).get(0));
// Test changing single-valued association
toAdd = new HashMap<QName, List<NodeRef>>();
toRemove = new HashMap<QName, List<NodeRef>>();
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<QName, List<NodeRef>>();
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,

View File

@@ -684,29 +684,38 @@ public class ActivitiPropertyConverter
// add new associations
for (Entry<QName, List<NodeRef>> toAdd : add.entrySet())
{
// retrieve existing list of noderefs for
// association
List<NodeRef> existingAdd = (List<NodeRef>) 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<NodeRef>) 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<NodeRef> existingList = (List<NodeRef>) 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<NodeRef> existingRemove = (List<NodeRef>) newProperties.get(toRemove.getKey());
Serializable existingRemove = (Serializable) newProperties.get(toRemove.getKey());
boolean isAlreadyNewProperty = existingRemove != null;
if (existingRemove == null)
{
existingRemove = (List<NodeRef>) existingProperties.get(toRemove.getKey());
if(existingRemove != null) {
existingRemove = new ArrayList<NodeRef>(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<NodeRef>((List<NodeRef>)existingRemove);
for (NodeRef nodeRef : toRemove.getValue())
{
((List<NodeRef>)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);
}
}
}
}
}