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());
 


Reply via email to