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