You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by kw...@apache.org on 2015/12/18 15:50:40 UTC

svn commit: r1720802 [2/2] - in /sling/trunk/bundles/extensions: models/validation-impl/src/main/java/org/apache/sling/models/validation/ validation/api/src/main/java/org/apache/sling/validation/ validation/api/src/main/java/org/apache/sling/validation...

Modified: sling/trunk/bundles/extensions/validation/core/src/test/java/org/apache/sling/validation/impl/ValidationServiceImplTest.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/validation/core/src/test/java/org/apache/sling/validation/impl/ValidationServiceImplTest.java?rev=1720802&r1=1720801&r2=1720802&view=diff
==============================================================================
--- sling/trunk/bundles/extensions/validation/core/src/test/java/org/apache/sling/validation/impl/ValidationServiceImplTest.java (original)
+++ sling/trunk/bundles/extensions/validation/core/src/test/java/org/apache/sling/validation/impl/ValidationServiceImplTest.java Fri Dec 18 14:50:39 2015
@@ -40,8 +40,8 @@ import org.apache.sling.api.resource.Val
 import org.apache.sling.api.wrappers.ValueMapDecorator;
 import org.apache.sling.jcr.resource.JcrResourceConstants;
 import org.apache.sling.testing.mock.sling.junit.SlingContext;
+import org.apache.sling.validation.ValidationFailure;
 import org.apache.sling.validation.ValidationResult;
-import org.apache.sling.validation.Validator;
 import org.apache.sling.validation.exceptions.SlingValidationException;
 import org.apache.sling.validation.impl.model.ChildResourceImpl;
 import org.apache.sling.validation.impl.model.ResourcePropertyBuilder;
@@ -51,6 +51,10 @@ import org.apache.sling.validation.impl.
 import org.apache.sling.validation.model.ChildResource;
 import org.apache.sling.validation.model.ResourceProperty;
 import org.apache.sling.validation.model.ValidationModel;
+import org.apache.sling.validation.spi.DefaultValidationFailure;
+import org.apache.sling.validation.spi.DefaultValidationResult;
+import org.apache.sling.validation.spi.ValidationContext;
+import org.apache.sling.validation.spi.Validator;
 import org.hamcrest.Matchers;
 import org.junit.Assert;
 import org.junit.Before;
@@ -93,24 +97,21 @@ public class ValidationServiceImplTest {
         HashMap<String, Object> hashMap = new HashMap<String, Object>();
         hashMap.put("field1", "1");
         ValidationResult vr = validationService.validate(new ValueMapDecorator(hashMap), vm);
-        Map<String, List<String>> expectedFailureMessages = new HashMap<String, List<String>>();
-        expectedFailureMessages
-                .put("field1",
-                        Arrays.asList("Property was expected to be of type 'class java.util.Date' but cannot be converted to that type."));
-        Assert.assertThat(vr.getFailureMessages().entrySet(), Matchers.equalTo(expectedFailureMessages.entrySet()));
+        Assert.assertThat(vr.getFailures(), Matchers.<ValidationFailure>contains(new DefaultValidationFailure("Property was expected to be of type 'class java.util.Date' but cannot be converted to that type.", "field1")));
     }
 
     @Test
     public void testValidateNeverCalledWithNullValues() throws Exception {
         Validator<String> myValidator = new Validator<String>() {
             @Override
-            public String validate(@Nonnull String data, @Nonnull ValueMap valueMap, Resource resource, @Nonnull ValueMap arguments)
+            public @Nonnull ValidationResult validate(@Nonnull String data, @Nonnull ValidationContext context, @Nonnull ValueMap arguments)
                     throws SlingValidationException {
                 Assert.assertNotNull("data parameter for validate should never be null", data);
-                Assert.assertNotNull("valueMap parameter for validate should never be null", valueMap);
-                Assert.assertNull("resource cannot be set if validate was called only with a value map", resource);
+                Assert.assertNotNull("location of context parameter for validate should never be null", context.getLocation());
+                Assert.assertNotNull("valueMap of context parameter for validate should never be null", context.getValueMap());
+                Assert.assertNull("resource of context parameter for validate cannot be set if validate was called only with a value map", context.getResource());
                 Assert.assertNotNull("arguments parameter for validate should never be null", arguments);
-                return null;
+                return DefaultValidationResult.VALID;
             }
         };
         propertyBuilder.validator(myValidator);
@@ -120,7 +121,7 @@ public class ValidationServiceImplTest {
         HashMap<String, Object> hashMap = new HashMap<String, Object>();
         hashMap.put("field1", "1");
         ValidationResult vr = validationService.validate(new ValueMapDecorator(hashMap), vm);
-        Assert.assertThat(vr.getFailureMessages().entrySet(), Matchers.empty());
+        Assert.assertThat(vr.getFailures(), Matchers.hasSize(0));
         Assert.assertTrue(vr.isValid());
     }
 
@@ -139,9 +140,7 @@ public class ValidationServiceImplTest {
         hashMap.put("field3", "");
 
         ValidationResult vr = validationService.validate(new ValueMapDecorator(hashMap), 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()));
+        Assert.assertThat(vr.getFailures(), Matchers.<ValidationFailure>contains(new DefaultValidationFailure("Missing required property.", "field4")));
     }
 
     @Test()
@@ -152,7 +151,7 @@ public class ValidationServiceImplTest {
         HashMap<String, Object> hashMap = new HashMap<String, Object>();
         hashMap.put("field2", "1");
         ValidationResult vr = validationService.validate(new ValueMapDecorator(hashMap), vm);
-        Assert.assertThat(vr.getFailureMessages().entrySet(), Matchers.empty());
+        Assert.assertThat(vr.getFailures(), Matchers.hasSize(0));
         Assert.assertTrue(vr.isValid());
     }
 
@@ -168,8 +167,7 @@ public class ValidationServiceImplTest {
         ValidationResult vr = validationService.validate(new ValueMapDecorator(hashMap), vm);
 
         Assert.assertFalse(vr.isValid()); // check for correct error message Map<String, List<String>>
-        Assert.assertThat(vr.getFailureMessages(),
-                Matchers.hasEntry("field1", Arrays.asList("Property does not match the pattern abc")));
+        Assert.assertThat(vr.getFailures(), Matchers.<ValidationFailure>contains(new DefaultValidationFailure("Property does not match the pattern 'abc'", "field1")));
     }
 
     @Test
@@ -188,9 +186,8 @@ public class ValidationServiceImplTest {
 
         ValidationResult vr = validationService.validate(new ValueMapDecorator(hashMap), vm);
 
-        Assert.assertFalse(vr.isValid()); // check for correct error message Map<String, List<String>>
-        Assert.assertThat(vr.getFailureMessages(),
-                Matchers.hasEntry("field2", Arrays.asList("Property does not match the pattern " + TEST_REGEX)));
+        Assert.assertFalse(vr.isValid());
+        Assert.assertThat(vr.getFailures(), Matchers.<ValidationFailure> hasItem(new DefaultValidationFailure("Property does not match the pattern '" + TEST_REGEX + "'", "field2")));
     }
 
     @Test
@@ -222,9 +219,7 @@ public class ValidationServiceImplTest {
 
         ValidationResult vr = validationService.validate(testResource, vm);
         Assert.assertFalse("resource should have been considered invalid", vr.isValid());
-        Assert.assertThat(vr.getFailureMessages(),
-                Matchers.hasEntry("child/grandchild/field1", Arrays.asList("Missing required property.")));
-        Assert.assertThat(vr.getFailureMessages().keySet(), Matchers.hasSize(1));
+        Assert.assertThat(vr.getFailures(), Matchers.<ValidationFailure>contains(new DefaultValidationFailure("Missing required property.", "child/grandchild/field1")));
     }
 
     @Test
@@ -243,7 +238,7 @@ public class ValidationServiceImplTest {
                 JcrConstants.NT_UNSTRUCTURED, JcrConstants.NT_UNSTRUCTURED, true);
 
         ValidationResult vr = validationService.validate(testResource, vm);
-        Assert.assertThat(vr.getFailureMessages().entrySet(), Matchers.empty());
+        Assert.assertThat(vr.getFailures(), Matchers.hasSize(0));
         Assert.assertTrue(vr.isValid());
     }
 
@@ -269,7 +264,7 @@ public class ValidationServiceImplTest {
         rr.create(resourceChild, "grandchild", properties);
 
         ValidationResult vr = validationService.validate(testResource, vm);
-        Assert.assertThat(vr.getFailureMessages().entrySet(), Matchers.empty());
+        Assert.assertThat(vr.getFailures(), Matchers.hasSize(0));
         Assert.assertTrue(vr.isValid());
     }
 
@@ -277,11 +272,16 @@ public class ValidationServiceImplTest {
     public void testResourceWithValidatorLeveragingTheResource() throws Exception {
         Validator<String> extendedValidator = new Validator<String>() {
             @Override
-            @CheckForNull
-            public String validate(String data, ValueMap valueMap, Resource resource, ValueMap arguments)
+            @Nonnull
+            public ValidationResult validate(@Nonnull String data, @Nonnull ValidationContext context, @Nonnull ValueMap arguments)
                     throws SlingValidationException {
-                Assert.assertThat(resource.getPath(), Matchers.equalTo("/content/validation/1/resource"));
-                return null;
+                Resource resource = context.getResource();
+                if (resource == null) {
+                    Assert.fail("Resource must not be null");
+                } else {
+                    Assert.assertThat(resource.getPath(), Matchers.equalTo("/content/validation/1/resource"));
+                }
+                return DefaultValidationResult.VALID;
             }
             
         };
@@ -296,8 +296,7 @@ public class ValidationServiceImplTest {
         Resource testResource = ResourceUtil.getOrCreateResource(rr,
                 "/content/validation/1/resource", properties, JcrConstants.NT_UNSTRUCTURED, true);
         ValidationResult vr = validationService.validate(testResource, vm);
-        // until we upgrade to a newer version of hamcrest we must use this workaround (https://github.com/hamcrest/JavaHamcrest/issues/35)
-        Assert.assertThat(vr.getFailureMessages().entrySet(), Matchers.empty());
+        Assert.assertTrue(vr.isValid());
     }
 
     @Test
@@ -331,15 +330,12 @@ public class ValidationServiceImplTest {
 
         ValidationResult vr = validationService.validate(testResource, vm);
         Assert.assertFalse("resource should have been considered invalid", vr.isValid());
-        Assert.assertThat(vr.getFailureMessages(),
-                Matchers.hasEntry("child2/grandchild.*", Arrays.asList("Missing required child resource.")));
-        Assert.assertThat(vr.getFailureMessages(),
-                Matchers.hasEntry("child3/grandchild.*", Arrays.asList("Missing required child resource.")));
-        Assert.assertThat(vr.getFailureMessages(),
-                Matchers.hasEntry("child3/field1", Arrays.asList("Missing required property.")));
-        Assert.assertThat(vr.getFailureMessages(),
-                Matchers.hasEntry("siblingchild.*", Arrays.asList("Missing required child resource.")));
-        Assert.assertThat(vr.getFailureMessages().keySet(), Matchers.hasSize(4));
+        
+        Assert.assertThat(vr.getFailures(), Matchers.<ValidationFailure>containsInAnyOrder(
+                new DefaultValidationFailure("Missing required child resource.", "child2/grandchild.*"),
+                new DefaultValidationFailure("Missing required child resource.", "child3/grandchild.*"),
+                new DefaultValidationFailure("Missing required property.", "child3/field1"),
+                new DefaultValidationFailure("Missing required child resource.", "siblingchild.*")));
     }
 
     @Test
@@ -365,11 +361,10 @@ public class ValidationServiceImplTest {
 
         ValidationResult vr = validationService.validate(testResource, vm);
         Assert.assertFalse("resource should have been considered invalid", vr.isValid());
-        Assert.assertThat(vr.getFailureMessages(),
-                Matchers.hasEntry("field3", Arrays.asList("Property does not match the pattern \\d")));
-        Assert.assertThat(vr.getFailureMessages(),
-                Matchers.hasEntry("otherfield.*", Arrays.asList("Missing required property.")));
-        Assert.assertThat(vr.getFailureMessages().keySet(), Matchers.hasSize(2));
+        
+        Assert.assertThat(vr.getFailures(), Matchers.<ValidationFailure>contains(
+                new DefaultValidationFailure("Property does not match the pattern '\\d'", "field3"),
+                new DefaultValidationFailure("Missing required property.", "otherfield.*")));
     }
 
     @Test
@@ -387,9 +382,7 @@ public class ValidationServiceImplTest {
 
         ValidationResult vr = validationService.validate(testResource, vm);
         Assert.assertFalse("resource should have been considered invalid", vr.isValid());
-        Assert.assertThat(vr.getFailureMessages(),
-                Matchers.hasEntry("field[1]", Arrays.asList("Property does not match the pattern \\d")));
-        Assert.assertThat(vr.getFailureMessages().keySet(), Matchers.hasSize(1));
+        Assert.assertThat(vr.getFailures(), Matchers.<ValidationFailure>contains(new DefaultValidationFailure("Property does not match the pattern '\\d'", "field[1]")));
     }
 
     @Test()
@@ -449,11 +442,9 @@ public class ValidationServiceImplTest {
         
         ValidationResult vr = validationService.validateResourceRecursively(testResource, true, ignoreResourceType3Filter, false);
         Assert.assertFalse("resource should have been considered invalid", vr.isValid());
-        Assert.assertThat(vr.getFailureMessages(),
-                Matchers.hasEntry("field1", Arrays.asList("Missing required property.")));
-        Assert.assertThat(vr.getFailureMessages(),
-                Matchers.hasEntry("child2/field2", Arrays.asList("Missing required property.")));
-        Assert.assertThat(vr.getFailureMessages().keySet(), Matchers.hasSize(2));
+        Assert.assertThat(vr.getFailures(), Matchers.<ValidationFailure>contains(
+                new DefaultValidationFailure("Missing required property.", "field1"),
+                new DefaultValidationFailure("Missing required property.", "child2/field2")));
     }
 
     @Test(expected = IllegalArgumentException.class)
@@ -471,7 +462,7 @@ public class ValidationServiceImplTest {
         Resource testResource = ResourceUtil.getOrCreateResource(rr, "/content/validation/1/resource", "resourcetype1",
                 JcrConstants.NT_UNSTRUCTURED, true);
 
-        ValidationResult vr = validationService.validateResourceRecursively(testResource, true, null, false);
+        validationService.validateResourceRecursively(testResource, true, null, false);
     }
 
     @Test()

Modified: sling/trunk/bundles/extensions/validation/core/src/test/java/org/apache/sling/validation/impl/resourcemodel/ResourceValidationModelProviderImplTest.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/validation/core/src/test/java/org/apache/sling/validation/impl/resourcemodel/ResourceValidationModelProviderImplTest.java?rev=1720802&r1=1720801&r2=1720802&view=diff
==============================================================================
--- sling/trunk/bundles/extensions/validation/core/src/test/java/org/apache/sling/validation/impl/resourcemodel/ResourceValidationModelProviderImplTest.java (original)
+++ sling/trunk/bundles/extensions/validation/core/src/test/java/org/apache/sling/validation/impl/resourcemodel/ResourceValidationModelProviderImplTest.java Fri Dec 18 14:50:39 2015
@@ -47,8 +47,6 @@ import org.apache.sling.testing.mock.jcr
 import org.apache.sling.testing.mock.jcr.MockQueryResultHandler;
 import org.apache.sling.testing.mock.sling.ResourceResolverType;
 import org.apache.sling.testing.mock.sling.junit.SlingContext;
-import org.apache.sling.validation.Validator;
-import org.apache.sling.validation.impl.Constants;
 import org.apache.sling.validation.impl.model.ChildResourceImpl;
 import org.apache.sling.validation.impl.model.ResourcePropertyBuilder;
 import org.apache.sling.validation.impl.model.ValidationModelBuilder;
@@ -57,6 +55,7 @@ import org.apache.sling.validation.model
 import org.apache.sling.validation.model.ParameterizedValidator;
 import org.apache.sling.validation.model.ResourceProperty;
 import org.apache.sling.validation.model.ValidationModel;
+import org.apache.sling.validation.spi.Validator;
 import org.hamcrest.Matchers;
 import org.junit.After;
 import org.junit.Assert;
@@ -299,10 +298,10 @@ public class ResourceValidationModelProv
     private Resource createValidationModelResource(ResourceResolver rr, String root, String name, ValidationModel model)
             throws Exception {
         Map<String, Object> modelProperties = new HashMap<String, Object>();
-        modelProperties.put(Constants.VALIDATED_RESOURCE_TYPE, model.getValidatedResourceType());
-        modelProperties.put(Constants.APPLICABLE_PATHS, model.getApplicablePaths());
+        modelProperties.put(ResourceValidationModelProviderImpl.VALIDATED_RESOURCE_TYPE, model.getValidatedResourceType());
+        modelProperties.put(ResourceValidationModelProviderImpl.APPLICABLE_PATHS, model.getApplicablePaths());
         modelProperties
-                .put(JcrResourceConstants.SLING_RESOURCE_TYPE_PROPERTY, Constants.VALIDATION_MODEL_RESOURCE_TYPE);
+                .put(JcrResourceConstants.SLING_RESOURCE_TYPE_PROPERTY, ResourceValidationModelProviderImpl.VALIDATION_MODEL_RESOURCE_TYPE);
         modelProperties.put(JcrConstants.JCR_PRIMARYTYPE, JcrConstants.NT_UNSTRUCTURED);
         Resource modelResource = ResourceUtil.getOrCreateResource(rr, root + "/" + name, modelProperties,
                 JcrResourceConstants.NT_SLING_FOLDER, true);
@@ -333,7 +332,7 @@ public class ResourceValidationModelProv
             return;
         }
         Resource propertiesResource = ResourceUtil.getOrCreateResource(rr,
-                model.getPath() + "/" + Constants.PROPERTIES, JcrConstants.NT_UNSTRUCTURED, null, true);
+                model.getPath() + "/" + ResourceValidationModelProviderImpl.PROPERTIES, JcrConstants.NT_UNSTRUCTURED, null, true);
         for (ResourceProperty property : properties) {
             Map<String, Object> modelPropertyJCRProperties = new HashMap<String, Object>();
             modelPropertyJCRProperties.put(JcrConstants.JCR_PRIMARYTYPE, JcrConstants.NT_UNSTRUCTURED);
@@ -343,12 +342,12 @@ public class ResourceValidationModelProv
                 ModifiableValueMap values = propertyResource.adaptTo(ModifiableValueMap.class);
                 Pattern pattern = property.getNamePattern();
                 if (pattern != null) {
-                    values.put(Constants.NAME_REGEX, pattern.pattern());
+                    values.put(ResourceValidationModelProviderImpl.NAME_REGEX, pattern.pattern());
                 }
-                values.put(Constants.PROPERTY_MULTIPLE, property.isMultiple());
-                values.put(Constants.OPTIONAL, !property.isRequired());
+                values.put(ResourceValidationModelProviderImpl.PROPERTY_MULTIPLE, property.isMultiple());
+                values.put(ResourceValidationModelProviderImpl.OPTIONAL, !property.isRequired());
                 Resource validators = ResourceUtil.getOrCreateResource(rr, propertyResource.getPath() + "/"
-                        + Constants.VALIDATORS, JcrConstants.NT_UNSTRUCTURED, null, true);
+                        + ResourceValidationModelProviderImpl.VALIDATORS, JcrConstants.NT_UNSTRUCTURED, null, true);
                 if (validators != null) {
                     for (ParameterizedValidator validator : property.getValidators()) {
                         Map<String, Object> validatorProperties = new HashMap<String, Object>();
@@ -356,7 +355,7 @@ public class ResourceValidationModelProv
                         Map<String, Object> parameters = validator.getParameters();
                         if (!parameters.isEmpty()) {
                             // convert to right format
-                            validatorProperties.put(Constants.VALIDATOR_ARGUMENTS,
+                            validatorProperties.put(ResourceValidationModelProviderImpl.VALIDATOR_ARGUMENTS,
                                     convertMapToJcrValidatorArguments(parameters));
                         }
                         ResourceUtil.getOrCreateResource(rr, validators.getPath() + "/"
@@ -383,13 +382,13 @@ public class ResourceValidationModelProv
 
     private Resource createValidationModelChildResource(Resource parentResource, ChildResource child) throws PersistenceException {
         ResourceResolver rr = parentResource.getResourceResolver();
-        Resource modelChildren = rr.create(parentResource, Constants.CHILDREN, primaryTypeUnstructuredMap);
+        Resource modelChildren = rr.create(parentResource, ResourceValidationModelProviderImpl.CHILDREN, primaryTypeUnstructuredMap);
         Resource modelResource = rr.create(modelChildren, child.getName(), primaryTypeUnstructuredMap);
         ModifiableValueMap mvm = modelResource.adaptTo(ModifiableValueMap.class);
         if (child.getNamePattern() != null) {
-            mvm.put(Constants.NAME_REGEX, child.getNamePattern() );
+            mvm.put(ResourceValidationModelProviderImpl.NAME_REGEX, child.getNamePattern() );
         }
-        mvm.put(Constants.OPTIONAL, !child.isRequired());
+        mvm.put(ResourceValidationModelProviderImpl.OPTIONAL, !child.isRequired());
         createValidationModelProperties(modelResource, child.getProperties());
         // recursion for all childs
         for (ChildResource grandChild : child.getChildren()) {

Modified: sling/trunk/bundles/extensions/validation/core/src/test/java/org/apache/sling/validation/impl/util/ValidatorTypeUtilTest.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/validation/core/src/test/java/org/apache/sling/validation/impl/util/ValidatorTypeUtilTest.java?rev=1720802&r1=1720801&r2=1720802&view=diff
==============================================================================
--- sling/trunk/bundles/extensions/validation/core/src/test/java/org/apache/sling/validation/impl/util/ValidatorTypeUtilTest.java (original)
+++ sling/trunk/bundles/extensions/validation/core/src/test/java/org/apache/sling/validation/impl/util/ValidatorTypeUtilTest.java Fri Dec 18 14:50:39 2015
@@ -22,9 +22,8 @@ import java.util.Collection;
 
 import javax.annotation.Nonnull;
 
-import org.apache.sling.api.resource.Resource;
 import org.apache.sling.api.resource.ValueMap;
-import org.apache.sling.validation.Validator;
+import org.apache.sling.validation.ValidationResult;
 import org.apache.sling.validation.exceptions.SlingValidationException;
 import org.apache.sling.validation.impl.util.examplevalidators.DerivedStringValidator;
 import org.apache.sling.validation.impl.util.examplevalidators.ExtendedStringValidator;
@@ -33,6 +32,9 @@ import org.apache.sling.validation.impl.
 import org.apache.sling.validation.impl.util.examplevalidators.StringArrayValidator;
 import org.apache.sling.validation.impl.util.examplevalidators.StringValidator;
 import org.apache.sling.validation.impl.validators.RegexValidator;
+import org.apache.sling.validation.spi.DefaultValidationResult;
+import org.apache.sling.validation.spi.ValidationContext;
+import org.apache.sling.validation.spi.Validator;
 import org.hamcrest.CoreMatchers;
 import org.hamcrest.Matchers;
 import org.junit.Assert;
@@ -61,11 +63,10 @@ public class ValidatorTypeUtilTest {
     }
     
     private class InnerStringValidator implements Validator<String> {
-
         @Override
-        public String validate(@Nonnull String data, @Nonnull ValueMap valueMap, Resource resource, @Nonnull ValueMap arguments)
+        public @Nonnull ValidationResult validate(@Nonnull String data, @Nonnull ValidationContext context, @Nonnull ValueMap arguments)
                 throws SlingValidationException {
-            return null;
+            return DefaultValidationResult.VALID;
         }
     }
     
@@ -80,9 +81,9 @@ public class ValidatorTypeUtilTest {
     public void testGetValidatorTypeWithAnonymousClass() {
         Assert.assertThat((Class<String>)ValidatorTypeUtil.getValidatorType(new Validator<String>() {
             @Override
-            public String validate(@Nonnull String data, @Nonnull ValueMap valueMap, Resource resource, @Nonnull ValueMap arguments)
+            public @Nonnull ValidationResult validate(@Nonnull String data, @Nonnull ValidationContext context, @Nonnull ValueMap arguments)
                     throws SlingValidationException {
-                return null;
+                return DefaultValidationResult.VALID;
             }
             
         }), Matchers.equalTo(String.class));
@@ -98,18 +99,18 @@ public class ValidatorTypeUtilTest {
     public void testGetValidatorTypeWithCollectionType() {
         ValidatorTypeUtil.getValidatorType(new Validator<Collection<String>>() {
             @Override
-            public String validate(@Nonnull Collection<String> data, @Nonnull ValueMap valueMap, Resource resource, @Nonnull ValueMap arguments)
+            public @Nonnull ValidationResult validate(@Nonnull Collection<String> data, @Nonnull ValidationContext context, @Nonnull ValueMap arguments)
                     throws SlingValidationException {
-                return null;
+                return DefaultValidationResult.VALID;
             }
         });
     }
     
     private class InnerStringValidatorWithAdditionalBaseClass extends GenericTypeParameterBaseClass<Integer> implements Validator<String> {
         @Override
-        public String validate(@Nonnull String data, @Nonnull ValueMap valueMap, Resource resource, @Nonnull ValueMap arguments)
+        public @Nonnull ValidationResult validate(@Nonnull String data, @Nonnull ValidationContext context, @Nonnull ValueMap arguments)
                 throws SlingValidationException {
-            return null;
+            return DefaultValidationResult.VALID;
         }
     }
     

Modified: sling/trunk/bundles/extensions/validation/core/src/test/java/org/apache/sling/validation/impl/util/examplevalidators/AbstractValidatorWithAdditionalType.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/validation/core/src/test/java/org/apache/sling/validation/impl/util/examplevalidators/AbstractValidatorWithAdditionalType.java?rev=1720802&r1=1720801&r2=1720802&view=diff
==============================================================================
--- sling/trunk/bundles/extensions/validation/core/src/test/java/org/apache/sling/validation/impl/util/examplevalidators/AbstractValidatorWithAdditionalType.java (original)
+++ sling/trunk/bundles/extensions/validation/core/src/test/java/org/apache/sling/validation/impl/util/examplevalidators/AbstractValidatorWithAdditionalType.java Fri Dec 18 14:50:39 2015
@@ -18,7 +18,7 @@
  */
 package org.apache.sling.validation.impl.util.examplevalidators;
 
-import org.apache.sling.validation.Validator;
+import org.apache.sling.validation.spi.Validator;
 
 public abstract class AbstractValidatorWithAdditionalType<A,T,B> implements Validator<T>{
     public abstract A getA();

Modified: sling/trunk/bundles/extensions/validation/core/src/test/java/org/apache/sling/validation/impl/util/examplevalidators/DateValidator.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/validation/core/src/test/java/org/apache/sling/validation/impl/util/examplevalidators/DateValidator.java?rev=1720802&r1=1720801&r2=1720802&view=diff
==============================================================================
--- sling/trunk/bundles/extensions/validation/core/src/test/java/org/apache/sling/validation/impl/util/examplevalidators/DateValidator.java (original)
+++ sling/trunk/bundles/extensions/validation/core/src/test/java/org/apache/sling/validation/impl/util/examplevalidators/DateValidator.java Fri Dec 18 14:50:39 2015
@@ -22,16 +22,18 @@ import java.util.Date;
 
 import javax.annotation.Nonnull;
 
-import org.apache.sling.api.resource.Resource;
 import org.apache.sling.api.resource.ValueMap;
-import org.apache.sling.validation.Validator;
+import org.apache.sling.validation.ValidationResult;
 import org.apache.sling.validation.exceptions.SlingValidationException;
+import org.apache.sling.validation.spi.DefaultValidationResult;
+import org.apache.sling.validation.spi.ValidationContext;
+import org.apache.sling.validation.spi.Validator;
 
 public class DateValidator implements Validator<Date> {
 
     @Override
-    public String validate(@Nonnull Date data, @Nonnull ValueMap valueMap, Resource resource, @Nonnull ValueMap arguments) throws SlingValidationException {
-        return null;
+    public @Nonnull ValidationResult validate(@Nonnull Date data, @Nonnull ValidationContext context, @Nonnull ValueMap arguments) throws SlingValidationException {
+        return DefaultValidationResult.VALID;
     }
 
 }

Modified: sling/trunk/bundles/extensions/validation/core/src/test/java/org/apache/sling/validation/impl/util/examplevalidators/ExtendedStringValidator.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/validation/core/src/test/java/org/apache/sling/validation/impl/util/examplevalidators/ExtendedStringValidator.java?rev=1720802&r1=1720801&r2=1720802&view=diff
==============================================================================
--- sling/trunk/bundles/extensions/validation/core/src/test/java/org/apache/sling/validation/impl/util/examplevalidators/ExtendedStringValidator.java (original)
+++ sling/trunk/bundles/extensions/validation/core/src/test/java/org/apache/sling/validation/impl/util/examplevalidators/ExtendedStringValidator.java Fri Dec 18 14:50:39 2015
@@ -18,19 +18,20 @@
  */
 package org.apache.sling.validation.impl.util.examplevalidators;
 
-import javax.annotation.CheckForNull;
 import javax.annotation.Nonnull;
 
-import org.apache.sling.api.resource.Resource;
 import org.apache.sling.api.resource.ValueMap;
+import org.apache.sling.validation.ValidationResult;
 import org.apache.sling.validation.exceptions.SlingValidationException;
+import org.apache.sling.validation.spi.DefaultValidationResult;
+import org.apache.sling.validation.spi.ValidationContext;
 
 public class ExtendedStringValidator extends AbstractValidatorWithAdditionalType<Boolean, String, Integer> {
 
     @Override
-    public @CheckForNull String validate(@Nonnull String data, @Nonnull ValueMap valueMap, Resource resource, @Nonnull ValueMap arguments)
+    public @Nonnull ValidationResult validate(@Nonnull String data, @Nonnull ValidationContext context, @Nonnull ValueMap arguments)
             throws SlingValidationException {
-        return null;
+        return DefaultValidationResult.VALID;
     }
 
     @Override

Modified: sling/trunk/bundles/extensions/validation/core/src/test/java/org/apache/sling/validation/impl/util/examplevalidators/IntegerValidator.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/validation/core/src/test/java/org/apache/sling/validation/impl/util/examplevalidators/IntegerValidator.java?rev=1720802&r1=1720801&r2=1720802&view=diff
==============================================================================
--- sling/trunk/bundles/extensions/validation/core/src/test/java/org/apache/sling/validation/impl/util/examplevalidators/IntegerValidator.java (original)
+++ sling/trunk/bundles/extensions/validation/core/src/test/java/org/apache/sling/validation/impl/util/examplevalidators/IntegerValidator.java Fri Dec 18 14:50:39 2015
@@ -20,17 +20,19 @@ package org.apache.sling.validation.impl
 
 import javax.annotation.Nonnull;
 
-import org.apache.sling.api.resource.Resource;
 import org.apache.sling.api.resource.ValueMap;
-import org.apache.sling.validation.Validator;
+import org.apache.sling.validation.ValidationResult;
 import org.apache.sling.validation.exceptions.SlingValidationException;
+import org.apache.sling.validation.spi.DefaultValidationResult;
+import org.apache.sling.validation.spi.ValidationContext;
+import org.apache.sling.validation.spi.Validator;
 
 public class IntegerValidator implements Validator<Integer> {
 
     @Override
-    public String validate(@Nonnull Integer data, @Nonnull ValueMap valueMap, Resource resource, @Nonnull ValueMap arguments)
+    public @Nonnull ValidationResult validate(@Nonnull Integer data, @Nonnull ValidationContext context, @Nonnull ValueMap arguments)
             throws SlingValidationException {
-        return null;
+        return DefaultValidationResult.VALID;
     }
 
 }

Modified: sling/trunk/bundles/extensions/validation/core/src/test/java/org/apache/sling/validation/impl/util/examplevalidators/StringArrayValidator.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/validation/core/src/test/java/org/apache/sling/validation/impl/util/examplevalidators/StringArrayValidator.java?rev=1720802&r1=1720801&r2=1720802&view=diff
==============================================================================
--- sling/trunk/bundles/extensions/validation/core/src/test/java/org/apache/sling/validation/impl/util/examplevalidators/StringArrayValidator.java (original)
+++ sling/trunk/bundles/extensions/validation/core/src/test/java/org/apache/sling/validation/impl/util/examplevalidators/StringArrayValidator.java Fri Dec 18 14:50:39 2015
@@ -20,17 +20,19 @@ package org.apache.sling.validation.impl
 
 import javax.annotation.Nonnull;
 
-import org.apache.sling.api.resource.Resource;
 import org.apache.sling.api.resource.ValueMap;
-import org.apache.sling.validation.Validator;
+import org.apache.sling.validation.ValidationResult;
 import org.apache.sling.validation.exceptions.SlingValidationException;
+import org.apache.sling.validation.spi.DefaultValidationResult;
+import org.apache.sling.validation.spi.ValidationContext;
+import org.apache.sling.validation.spi.Validator;
 
 public class StringArrayValidator implements Validator<String[]> {
 
     @Override
-    public String validate(@Nonnull String[] data, @Nonnull ValueMap valueMap, Resource resource, @Nonnull ValueMap arguments)
+    public @Nonnull ValidationResult validate(@Nonnull String[] data, @Nonnull ValidationContext context, @Nonnull ValueMap arguments)
             throws SlingValidationException {
-        return null;
+        return DefaultValidationResult.VALID;
     }
 
 }

Modified: sling/trunk/bundles/extensions/validation/core/src/test/java/org/apache/sling/validation/impl/util/examplevalidators/StringValidator.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/validation/core/src/test/java/org/apache/sling/validation/impl/util/examplevalidators/StringValidator.java?rev=1720802&r1=1720801&r2=1720802&view=diff
==============================================================================
--- sling/trunk/bundles/extensions/validation/core/src/test/java/org/apache/sling/validation/impl/util/examplevalidators/StringValidator.java (original)
+++ sling/trunk/bundles/extensions/validation/core/src/test/java/org/apache/sling/validation/impl/util/examplevalidators/StringValidator.java Fri Dec 18 14:50:39 2015
@@ -20,17 +20,19 @@ package org.apache.sling.validation.impl
 
 import javax.annotation.Nonnull;
 
-import org.apache.sling.api.resource.Resource;
 import org.apache.sling.api.resource.ValueMap;
-import org.apache.sling.validation.Validator;
+import org.apache.sling.validation.ValidationResult;
 import org.apache.sling.validation.exceptions.SlingValidationException;
+import org.apache.sling.validation.spi.DefaultValidationResult;
+import org.apache.sling.validation.spi.ValidationContext;
+import org.apache.sling.validation.spi.Validator;
 
 public class StringValidator implements Validator<String> {
 
     @Override
-    public String validate(@Nonnull String data, @Nonnull ValueMap valueMap, Resource resource, @Nonnull ValueMap arguments)
+    public @Nonnull ValidationResult validate(@Nonnull String data, @Nonnull ValidationContext context, @Nonnull ValueMap arguments)
             throws SlingValidationException {
-        return null;
+        return DefaultValidationResult.VALID;
     }
 
 }

Modified: sling/trunk/bundles/extensions/validation/examples/src/main/java/org/apache/sling/validation/examples/models/UserModel.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/validation/examples/src/main/java/org/apache/sling/validation/examples/models/UserModel.java?rev=1720802&r1=1720801&r2=1720802&view=diff
==============================================================================
--- sling/trunk/bundles/extensions/validation/examples/src/main/java/org/apache/sling/validation/examples/models/UserModel.java (original)
+++ sling/trunk/bundles/extensions/validation/examples/src/main/java/org/apache/sling/validation/examples/models/UserModel.java Fri Dec 18 14:50:39 2015
@@ -18,7 +18,7 @@
  */
 package org.apache.sling.validation.examples.models;
 
-import java.util.HashMap;
+import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
 
@@ -27,6 +27,7 @@ import javax.inject.Inject;
 
 import org.apache.sling.api.resource.Resource;
 import org.apache.sling.models.annotations.Model;
+import org.apache.sling.validation.ValidationFailure;
 import org.apache.sling.validation.ValidationResult;
 import org.apache.sling.validation.ValidationService;
 import org.apache.sling.validation.model.ValidationModel;
@@ -37,7 +38,7 @@ public class UserModel {
     private static final String INVALID = "INVALID";
 
     private Resource resource;
-    private Map<String, List<String>> errors = new HashMap<String, List<String>>();
+    private List<ValidationFailure> errors = new LinkedList<ValidationFailure>();
 
     @Inject
     private ValidationService validationService;
@@ -74,7 +75,7 @@ public class UserModel {
         return isAdmin;
     }
 
-    public Map<String, List<String>> getErrors() {
+    public List<ValidationFailure> getErrors() {
         return errors;
     }
 
@@ -84,7 +85,7 @@ public class UserModel {
         if (model != null) {
             ValidationResult result = validationService.validate(resource, model);
             if (!result.isValid()) {
-                errors = result.getFailureMessages();
+                errors = result.getFailures();
             }
         }
     }

Modified: sling/trunk/bundles/extensions/validation/examples/src/main/java/org/apache/sling/validation/examples/servlets/ModifyUserServlet.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/validation/examples/src/main/java/org/apache/sling/validation/examples/servlets/ModifyUserServlet.java?rev=1720802&r1=1720801&r2=1720802&view=diff
==============================================================================
--- sling/trunk/bundles/extensions/validation/examples/src/main/java/org/apache/sling/validation/examples/servlets/ModifyUserServlet.java (original)
+++ sling/trunk/bundles/extensions/validation/examples/src/main/java/org/apache/sling/validation/examples/servlets/ModifyUserServlet.java Fri Dec 18 14:50:39 2015
@@ -34,6 +34,7 @@ import org.apache.sling.api.servlets.Sli
 import org.apache.sling.commons.json.JSONArray;
 import org.apache.sling.commons.json.JSONException;
 import org.apache.sling.commons.json.JSONObject;
+import org.apache.sling.validation.ValidationFailure;
 import org.apache.sling.validation.ValidationResult;
 import org.apache.sling.validation.ValidationService;
 import org.apache.sling.validation.model.ValidationModel;
@@ -70,16 +71,14 @@ public class ModifyUserServlet extends S
                     JSONObject json = new JSONObject();
                     try {
                         json.put("success", false);
-                        JSONObject messages = new JSONObject();
-                        for (Map.Entry<String, List<String>> entry : vr.getFailureMessages().entrySet()) {
-                            String key = entry.getKey();
-                            JSONArray errors = new JSONArray();
-                            for (String message : entry.getValue()) {
-                                errors.put(message);
-                            }
-                            messages.put(key, errors);
+                        JSONArray failures = new JSONArray();
+                        for (ValidationFailure failure : vr.getFailures()) {
+                            JSONObject failureJson = new JSONObject();
+                            failureJson.put("message", failure.getMessage());
+                            failureJson.put("location", failure.getLocation());
+                            failures.put(failureJson);
                         }
-                        json.put("messages", messages);
+                        json.put("failures", failures);
                         response.getWriter().print(json.toString());
                         response.setStatus(400);
                     } catch (JSONException e) {

Modified: sling/trunk/bundles/extensions/validation/examples/src/main/resources/SLING-INF/apps/validationdemo/components/user/user.jsp
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/validation/examples/src/main/resources/SLING-INF/apps/validationdemo/components/user/user.jsp?rev=1720802&r1=1720801&r2=1720802&view=diff
==============================================================================
--- sling/trunk/bundles/extensions/validation/examples/src/main/resources/SLING-INF/apps/validationdemo/components/user/user.jsp (original)
+++ sling/trunk/bundles/extensions/validation/examples/src/main/resources/SLING-INF/apps/validationdemo/components/user/user.jsp Fri Dec 18 14:50:39 2015
@@ -19,6 +19,7 @@
     java.util.Map,
     java.util.List,
     org.apache.sling.api.resource.Resource,
+    org.apache.sling.validation.ValidationFailure,
     org.apache.sling.validation.examples.models.UserModel
     "%>
 <%@taglib prefix="sling" uri="http://sling.apache.org/taglibs/sling" %>
@@ -46,14 +47,10 @@
 </table>
 <h3>Validation Errors</h3>
 <%
-    for (Map.Entry<String, List<String>> entry : user.getErrors().entrySet()) {
+    for (ValidationFailure error : user.getErrors()) {
 %>
-<span><strong>Key:</strong> <%= entry.getKey() %></span><br>
+<span><strong>Key:</strong> <%= error.getLocation() %></span><br>
+<span><%= error.getMessage() %></span><br>
 <%
-        for (String message : entry.getValue()) {
-%>
-<span><%= message %></span><br>
-<%
-        }
     }
 %>
\ No newline at end of file

Modified: sling/trunk/bundles/extensions/validation/test-services/src/main/java/org/apache/sling/validation/testservices/ValidationPostResponse.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/validation/test-services/src/main/java/org/apache/sling/validation/testservices/ValidationPostResponse.java?rev=1720802&r1=1720801&r2=1720802&view=diff
==============================================================================
--- sling/trunk/bundles/extensions/validation/test-services/src/main/java/org/apache/sling/validation/testservices/ValidationPostResponse.java (original)
+++ sling/trunk/bundles/extensions/validation/test-services/src/main/java/org/apache/sling/validation/testservices/ValidationPostResponse.java Fri Dec 18 14:50:39 2015
@@ -25,9 +25,11 @@ import java.util.Map;
 
 import javax.servlet.http.HttpServletResponse;
 
+import org.apache.sling.commons.json.JSONArray;
 import org.apache.sling.commons.json.JSONException;
 import org.apache.sling.commons.json.JSONObject;
 import org.apache.sling.servlets.post.AbstractPostResponse;
+import org.apache.sling.validation.ValidationFailure;
 import org.apache.sling.validation.ValidationResult;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -50,9 +52,14 @@ public class ValidationPostResponse exte
         if (validationResult != null) {
             try {
                 jsonResponse.put("valid", validationResult.isValid());
-                for (Map.Entry<String, List<String>> entry : validationResult.getFailureMessages().entrySet()) {
-                    jsonResponse.put(entry.getKey(), entry.getValue());
+                JSONArray failures = new JSONArray();
+                for (ValidationFailure failure : validationResult.getFailures()) {
+                    JSONObject failureJson = new JSONObject();
+                    failureJson.put("message", failure.getMessage());
+                    failureJson.put("location", failure.getLocation());
+                    failures.put(failureJson);
                 }
+                jsonResponse.put("failures", failures);
             } catch (JSONException e) {
                 LOG.error("JSON error during response send operation.", e);
             }