You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by bd...@apache.org on 2014/10/08 11:13:15 UTC

svn commit: r1630039 - in /sling/trunk/contrib/validation: api/src/main/java/org/apache/sling/validation/api/ core/ core/src/main/java/org/apache/sling/validation/impl/ core/src/main/java/org/apache/sling/validation/impl/validators/ core/src/test/java/...

Author: bdelacretaz
Date: Wed Oct  8 09:13:15 2014
New Revision: 1630039

URL: http://svn.apache.org/r1630039
Log:
SLING-4010 - allow Validator to set a custom failure message. Contributed by Konrad Windszus, thanks!

Modified:
    sling/trunk/contrib/validation/api/src/main/java/org/apache/sling/validation/api/Validator.java
    sling/trunk/contrib/validation/core/pom.xml
    sling/trunk/contrib/validation/core/src/main/java/org/apache/sling/validation/impl/ValidationServiceImpl.java
    sling/trunk/contrib/validation/core/src/main/java/org/apache/sling/validation/impl/validators/RegexValidator.java
    sling/trunk/contrib/validation/core/src/test/java/org/apache/sling/validation/impl/ValidationServiceImplTest.java

Modified: sling/trunk/contrib/validation/api/src/main/java/org/apache/sling/validation/api/Validator.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/validation/api/src/main/java/org/apache/sling/validation/api/Validator.java?rev=1630039&r1=1630038&r2=1630039&view=diff
==============================================================================
--- sling/trunk/contrib/validation/api/src/main/java/org/apache/sling/validation/api/Validator.java (original)
+++ sling/trunk/contrib/validation/api/src/main/java/org/apache/sling/validation/api/Validator.java Wed Oct  8 09:13:15 2014
@@ -31,9 +31,9 @@ public interface Validator {
      * Validates the {@code data} according to the internal constraints of this validator.
      *
      * @param data the data to validate
-     * @return {@code true} if the data is valid, {@code false} otherwise
+     * @return validation error message if validation was not successfull, {@code null} otherwise. In case an empty string is returned a generic validation error message is used.
      * @throws org.apache.sling.validation.api.exceptions.SlingValidationException if the method is called with {@code null} arguments or
      * some expected arguments are missing from the arguments map
      */
-    boolean validate(String data, Map<String, String> arguments) throws SlingValidationException;
+    String validate(String data, Map<String, String> arguments) throws SlingValidationException;
 }

Modified: sling/trunk/contrib/validation/core/pom.xml
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/validation/core/pom.xml?rev=1630039&r1=1630038&r2=1630039&view=diff
==============================================================================
--- sling/trunk/contrib/validation/core/pom.xml (original)
+++ sling/trunk/contrib/validation/core/pom.xml Wed Oct  8 09:13:15 2014
@@ -165,6 +165,18 @@
             <version>1.9.5</version>
             <scope>test</scope>
         </dependency>
+        <dependency>
+            <groupId>org.hamcrest</groupId>
+            <artifactId>hamcrest-library</artifactId>
+            <version>1.3</version>
+            <scope>test</scope>
+        </dependency>
+         <dependency>
+            <groupId>org.hamcrest</groupId>
+            <artifactId>hamcrest-core</artifactId>
+            <version>1.3</version>
+            <scope>test</scope>
+        </dependency>
     </dependencies>
     <profiles>
         <profile>

Modified: sling/trunk/contrib/validation/core/src/main/java/org/apache/sling/validation/impl/ValidationServiceImpl.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/validation/core/src/main/java/org/apache/sling/validation/impl/ValidationServiceImpl.java?rev=1630039&r1=1630038&r2=1630039&view=diff
==============================================================================
--- sling/trunk/contrib/validation/core/src/main/java/org/apache/sling/validation/impl/ValidationServiceImpl.java (original)
+++ sling/trunk/contrib/validation/core/src/main/java/org/apache/sling/validation/impl/ValidationServiceImpl.java Wed Oct  8 09:13:15 2014
@@ -377,9 +377,13 @@ public class ValidationServiceImpl imple
             Validator validator = validatorEntry.getKey();
             Map<String, String> arguments = validatorEntry.getValue();
             try {
-                if (!validator.validate(value, arguments)) {
-                    result.addFailureMessage(property, "Property does not contain a valid value for the " + validator
-                            .getClass().getName() + " validator");
+                String validatorMessage = validator.validate(value, arguments);
+                if (validatorMessage != null) {
+                    if (validatorMessage.isEmpty()) {
+                        validatorMessage = "Property does not contain a valid value for the " + validator
+                                .getClass().getName() + " validator";
+                    } 
+                    result.addFailureMessage(property, validatorMessage);
                 }
             } catch (SlingValidationException e) {
                 // wrap in another SlingValidationException to include information about the property

Modified: sling/trunk/contrib/validation/core/src/main/java/org/apache/sling/validation/impl/validators/RegexValidator.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/validation/core/src/main/java/org/apache/sling/validation/impl/validators/RegexValidator.java?rev=1630039&r1=1630038&r2=1630039&view=diff
==============================================================================
--- sling/trunk/contrib/validation/core/src/main/java/org/apache/sling/validation/impl/validators/RegexValidator.java (original)
+++ sling/trunk/contrib/validation/core/src/main/java/org/apache/sling/validation/impl/validators/RegexValidator.java Wed Oct  8 09:13:15 2014
@@ -37,7 +37,7 @@ public class RegexValidator implements V
     public static final String REGEX_PARAM = "regex";
 
     @Override
-    public boolean validate(String data, Map<String, String> arguments) {
+    public String validate(String data, Map<String, String> arguments) {
         if (data == null || arguments == null) {
             throw new SlingValidationException("Cannot perform data validation with null parameters");
         }
@@ -46,6 +46,9 @@ public class RegexValidator implements V
             throw new SlingValidationException("Mandatory " + REGEX_PARAM + " is missing from the arguments map.");
         }
         Pattern pattern = Pattern.compile(regex);
-        return pattern.matcher(data).matches();
+        if (pattern.matcher(data).matches()) {
+            return null;
+        }
+        return "Property does not match the pattern " + regex;
     }
 }

Modified: sling/trunk/contrib/validation/core/src/test/java/org/apache/sling/validation/impl/ValidationServiceImplTest.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/validation/core/src/test/java/org/apache/sling/validation/impl/ValidationServiceImplTest.java?rev=1630039&r1=1630038&r2=1630039&view=diff
==============================================================================
--- sling/trunk/contrib/validation/core/src/test/java/org/apache/sling/validation/impl/ValidationServiceImplTest.java (original)
+++ sling/trunk/contrib/validation/core/src/test/java/org/apache/sling/validation/impl/ValidationServiceImplTest.java Wed Oct  8 09:13:15 2014
@@ -18,6 +18,17 @@
  */
 package org.apache.sling.validation.impl;
 
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
 import org.apache.jackrabbit.JcrConstants;
 import org.apache.sling.api.resource.ModifiableValueMap;
 import org.apache.sling.api.resource.Resource;
@@ -35,7 +46,9 @@ import org.apache.sling.validation.api.V
 import org.apache.sling.validation.api.exceptions.SlingValidationException;
 import org.apache.sling.validation.impl.setup.MockedResourceResolver;
 import org.apache.sling.validation.impl.validators.RegexValidator;
+import org.hamcrest.Matchers;
 import org.junit.AfterClass;
+import org.junit.Assert;
 import org.junit.Before;
 import org.junit.BeforeClass;
 import org.junit.Test;
@@ -43,17 +56,6 @@ import org.mockito.invocation.Invocation
 import org.mockito.stubbing.Answer;
 import org.powermock.reflect.Whitebox;
 
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.when;
-
 public class ValidationServiceImplTest {
 
     /**
@@ -250,6 +252,11 @@ public class ValidationServiceImplTest {
         field.type = Type.STRING;
         field.validators.put("org.apache.sling.validation.impl.validators.RegexValidator", new String[] {"regex=^\\p{L}+$"});
         fields.add(field);
+        field.name = "field2";
+        field.type = Type.STRING;
+        final String TEST_REGEX = "^test$";
+        field.validators.put("org.apache.sling.validation.impl.validators.RegexValidator", new String[] {"regex="+TEST_REGEX});
+        fields.add(field);
         ResourceResolver rr = rrf.getAdministrativeResourceResolver(null);
         Resource model1 = null;
         try {
@@ -260,10 +267,15 @@ public class ValidationServiceImplTest {
             ValidationModel vm = validationService.getValidationModel("sling/validation/test", "/apps/validation/1/resource");
             HashMap<String, Object> hashMap = new HashMap<String, Object>() {{
                 put("field1", "HelloWorld");
+                put("field2", "HelloWorld");
             }};
             ValueMap map = new ValueMapDecorator(hashMap);
             ValidationResult vr = validationService.validate(map, vm);
-            assertTrue(vr.isValid());
+            assertFalse(vr.isValid());
+            // check for correct error message
+            Map<String, List<String>> expectedFailureMessages = new HashMap<String, List<String>>();
+            expectedFailureMessages.put("field2", Arrays.asList("Property does not match the pattern " + TEST_REGEX));
+            Assert.assertThat(vr.getFailureMessages().entrySet(), Matchers.equalTo(expectedFailureMessages.entrySet()));
             if (model1 != null) {
                 rr.delete(model1);
             }