diff --git a/source/java/org/alfresco/repo/action/evaluator/ComparePropertyValueEvaluator.java b/source/java/org/alfresco/repo/action/evaluator/ComparePropertyValueEvaluator.java index 5c196b3000..45f41c897d 100644 --- a/source/java/org/alfresco/repo/action/evaluator/ComparePropertyValueEvaluator.java +++ b/source/java/org/alfresco/repo/action/evaluator/ComparePropertyValueEvaluator.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2005-2010 Alfresco Software Limited. + * Copyright (C) 2005-2014 Alfresco Software Limited. * * This file is part of Alfresco * @@ -19,6 +19,7 @@ package org.alfresco.repo.action.evaluator; import java.io.Serializable; +import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -258,8 +259,25 @@ public class ComparePropertyValueEvaluator extends ActionConditionEvaluatorAbstr PropertyValueComparator comparator = this.comparators.get(propertyTypeQName); if (comparator != null) { - // Call the comparator for the property type - result = comparator.compare(propertyValue, compareValue, operation); + // Figure out if property is multivalued, compare all of the entries till finding a match + PropertyDefinition propertyDef = dictionaryService.getProperty(propertyQName); + if (propertyDef.isMultiValued()) + { + for(Serializable value : ((ArrayList) propertyValue)) + { + boolean success = comparator.compare(value, compareValue, operation); + if (success) + { + result = true; + break; + } + } + } + else + { + // Call the comparator for the property type + result = comparator.compare(propertyValue, compareValue, operation); + } } else { diff --git a/source/test-java/org/alfresco/repo/action/evaluator/ComparePropertyValueEvaluatorTest.java b/source/test-java/org/alfresco/repo/action/evaluator/ComparePropertyValueEvaluatorTest.java index d0fca40a20..9ec2c4ed5f 100644 --- a/source/test-java/org/alfresco/repo/action/evaluator/ComparePropertyValueEvaluatorTest.java +++ b/source/test-java/org/alfresco/repo/action/evaluator/ComparePropertyValueEvaluatorTest.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2005-2010 Alfresco Software Limited. + * Copyright (C) 2005-2014 Alfresco Software Limited. * * This file is part of Alfresco * @@ -61,6 +61,7 @@ public class ComparePropertyValueEvaluatorTest extends BaseSpringTest private static final QName PROP_INT = QName.createQName(TEST_TYPE_NAMESPACE, "propInt"); private static final QName PROP_DATETIME = QName.createQName(TEST_TYPE_NAMESPACE, "propDatetime"); private static final QName PROP_NODEREF = QName.createQName(TEST_TYPE_NAMESPACE, "propNodeRef"); + private static final QName PROP_MULTI_VALUE = QName.createQName(TEST_TYPE_NAMESPACE, "propMultiValue"); private static final String TEXT_VALUE = "myDocument.doc"; private static final int INT_VALUE = 100; @@ -122,6 +123,7 @@ public class ComparePropertyValueEvaluatorTest extends BaseSpringTest props.put(PROP_INT, INT_VALUE); props.put(PROP_DATETIME, this.dateValue); props.put(PROP_NODEREF, this.nodeValue); + props.put(PROP_MULTI_VALUE, TEXT_VALUE); // Create the node used for tests this.nodeRef = this.nodeService.createNode( @@ -492,6 +494,21 @@ public class ComparePropertyValueEvaluatorTest extends BaseSpringTest assertFalse(this.evaluator.evaluate(condition, this.nodeRef)); + } + + public void testMultiValuedPropertyComparisons() + { + ActionConditionImpl condition = new ActionConditionImpl(GUID.generate(), ComparePropertyValueEvaluator.NAME); + condition.setParameterValue(ComparePropertyValueEvaluator.PARAM_PROPERTY, PROP_MULTI_VALUE); + + condition.setParameterValue(ComparePropertyValueEvaluator.PARAM_OPERATION, ComparePropertyValueOperation.CONTAINS.toString()); + + condition.setParameterValue(ComparePropertyValueEvaluator.PARAM_VALUE, "Document"); + assertTrue(this.evaluator.evaluate(condition, this.nodeRef)); + + condition.setParameterValue(ComparePropertyValueEvaluator.PARAM_VALUE, "bobbins"); + assertFalse(this.evaluator.evaluate(condition, this.nodeRef)); + } private void createTestModel() @@ -524,7 +541,12 @@ public class ComparePropertyValueEvaluatorTest extends BaseSpringTest prop4.setMandatory(false); prop4.setType("d:" + DataTypeDefinition.NODE_REF.getLocalName()); prop4.setMultiValued(false); - + + M2Property prop5 = testType.createProperty("test:" + PROP_MULTI_VALUE.getLocalName()); + prop5.setMandatory(false); + prop5.setType("d:" + DataTypeDefinition.TEXT.getLocalName()); + prop5.setMultiValued(true); + dictionaryDAO.putModel(model); } }