Author: kwin Date: Fri Dec 5 14:12:28 2014 New Revision: 1643291 URL: http://svn.apache.org/r1643291 Log: SLING-4221 fix for AIOOBE in case of empty multivalue properties
Modified: sling/trunk/contrib/extensions/validation/core/src/main/java/org/apache/sling/validation/impl/ValidationServiceImpl.java sling/trunk/contrib/extensions/validation/core/src/test/java/org/apache/sling/validation/impl/ValidationServiceImplTest.java Modified: sling/trunk/contrib/extensions/validation/core/src/main/java/org/apache/sling/validation/impl/ValidationServiceImpl.java URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/validation/core/src/main/java/org/apache/sling/validation/impl/ValidationServiceImpl.java?rev=1643291&r1=1643290&r2=1643291&view=diff ============================================================================== --- sling/trunk/contrib/extensions/validation/core/src/main/java/org/apache/sling/validation/impl/ValidationServiceImpl.java (original) +++ sling/trunk/contrib/extensions/validation/core/src/main/java/org/apache/sling/validation/impl/ValidationServiceImpl.java Fri Dec 5 14:12:28 2014 @@ -417,7 +417,7 @@ public class ValidationServiceImpl imple Object[] typedValue = (Object[])valueMap.get(property, type); // see https://issues.apache.org/jira/browse/SLING-4178 for why the second check is necessary - if (typedValue == null || typedValue[0] == null) { + if (typedValue == null || (typedValue.length > 0 && typedValue[0] == null)) { // here the missing required property case was already treated in validateValueMap result.addFailureMessage(property, "Property was expected to be of type '" + validator.getType() + "' but cannot be converted to that type." ); return; Modified: sling/trunk/contrib/extensions/validation/core/src/test/java/org/apache/sling/validation/impl/ValidationServiceImplTest.java URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/validation/core/src/test/java/org/apache/sling/validation/impl/ValidationServiceImplTest.java?rev=1643291&r1=1643290&r2=1643291&view=diff ============================================================================== --- sling/trunk/contrib/extensions/validation/core/src/test/java/org/apache/sling/validation/impl/ValidationServiceImplTest.java (original) +++ sling/trunk/contrib/extensions/validation/core/src/test/java/org/apache/sling/validation/impl/ValidationServiceImplTest.java Fri Dec 5 14:12:28 2014 @@ -278,6 +278,48 @@ public class ValidationServiceImplTest { } @Test() + public void testValueMapWithMissingField() throws Exception { + validationService.validators.put("org.apache.sling.validation.impl.validators.RegexValidator", new RegexValidator()); + + TestProperty property = new TestProperty("field1"); + property.addValidator("org.apache.sling.validation.impl.validators.RegexValidator", "regex=.*"); + TestProperty property2 = new TestProperty("field2"); + property2.addValidator("org.apache.sling.validation.impl.validators.RegexValidator", "regex=.*"); + TestProperty property3 = new TestProperty("field3"); + property3.addValidator("org.apache.sling.validation.impl.validators.RegexValidator", "regex=.*"); + TestProperty property4 = new TestProperty("field4"); + property3.addValidator("org.apache.sling.validation.impl.validators.RegexValidator", "regex=.*"); + ResourceResolver rr = rrf.getAdministrativeResourceResolver(null); + Resource model1 = null; + try { + if (rr != null) { + model1 = createValidationModelResource(rr, libsValidatorsRoot.getPath(), "testValidationModel1", "sling/validation/test", + new String[]{"/apps/validation"}, property, property2, property3, property4); + } + ValidationModel vm = validationService.getValidationModel("sling/validation/test", "/apps/validation/1/resource"); + // this should not be detected as missing property + HashMap<String, Object> hashMap = new HashMap<String, Object>() {{ + put("field1", new String[]{}); + put("field2", new String[]{"null"}); + put("field3", ""); + }}; + ValueMap map = new ValueMapDecorator(hashMap); + ValidationResult vr = validationService.validate(map, vm); + Map<String, List<String>> expectedFailureMessages = new HashMap<String, List<String>>(); + expectedFailureMessages.put("field4", Arrays.asList("Missing required property.")); + Assert.assertThat(vr.getFailureMessages().entrySet(), Matchers.equalTo(expectedFailureMessages.entrySet())); + } finally { + if (model1 != null) { + rr.delete(model1); + } + if (rr != null) { + rr.commit(); + rr.close(); + } + } + } + + @Test() public void testValueMapWithMissingOptionalValue() throws Exception { validationService.validators.put("org.apache.sling.validation.impl.validators.RegexValidator", new RegexValidator());