Author: kwin
Date: Fri Jan  8 08:51:00 2016
New Revision: 1723664

URL: http://svn.apache.org/viewvc?rev=1723664&view=rev
Log:
SLING-4213 leverage sling-i18n for validation failure messages

Added:
    sling/trunk/bundles/extensions/validation/core/src/main/resources/SLING-INF/
    
sling/trunk/bundles/extensions/validation/core/src/main/resources/SLING-INF/libs/
    
sling/trunk/bundles/extensions/validation/core/src/main/resources/SLING-INF/libs/sling/
    
sling/trunk/bundles/extensions/validation/core/src/main/resources/SLING-INF/libs/sling/validation/
    
sling/trunk/bundles/extensions/validation/core/src/main/resources/SLING-INF/libs/sling/validation/i18n/
    
sling/trunk/bundles/extensions/validation/core/src/main/resources/SLING-INF/libs/sling/validation/i18n/en.json
Modified:
    sling/trunk/bundles/extensions/validation/api/pom.xml
    
sling/trunk/bundles/extensions/validation/api/src/main/java/org/apache/sling/validation/ValidationFailure.java
    
sling/trunk/bundles/extensions/validation/api/src/main/java/org/apache/sling/validation/spi/DefaultValidationFailure.java
    
sling/trunk/bundles/extensions/validation/api/src/main/java/org/apache/sling/validation/spi/DefaultValidationResult.java
    
sling/trunk/bundles/extensions/validation/api/src/main/java/org/apache/sling/validation/spi/ValidationContext.java
    sling/trunk/bundles/extensions/validation/core/pom.xml
    
sling/trunk/bundles/extensions/validation/core/src/main/java/org/apache/sling/validation/impl/CompositeValidationResult.java
    
sling/trunk/bundles/extensions/validation/core/src/main/java/org/apache/sling/validation/impl/ValidationResourceVisitor.java
    
sling/trunk/bundles/extensions/validation/core/src/main/java/org/apache/sling/validation/impl/ValidationServiceImpl.java
    
sling/trunk/bundles/extensions/validation/core/src/main/java/org/apache/sling/validation/impl/resourcemodel/ResourceValidationModelProviderImpl.java
    
sling/trunk/bundles/extensions/validation/core/src/main/java/org/apache/sling/validation/impl/validators/RegexValidator.java
    
sling/trunk/bundles/extensions/validation/core/src/test/java/org/apache/sling/validation/impl/ValidationServiceImplTest.java
    
sling/trunk/bundles/extensions/validation/examples/src/main/java/org/apache/sling/validation/examples/servlets/ModifyUserServlet.java
    
sling/trunk/bundles/extensions/validation/examples/src/main/resources/SLING-INF/apps/validationdemo/components/user/user.jsp
    sling/trunk/bundles/extensions/validation/it-http/pom.xml
    
sling/trunk/bundles/extensions/validation/it-http/src/test/java/org/apache/sling/validation/testservices/ValidationServiceTest.java
    sling/trunk/bundles/extensions/validation/test-services/pom.xml
    
sling/trunk/bundles/extensions/validation/test-services/src/main/java/org/apache/sling/validation/testservices/ValidationPostResponse.java
    
sling/trunk/bundles/extensions/validation/test-services/src/main/java/org/apache/sling/validation/testservices/ValidationPostResponseCreator.java
    
sling/trunk/bundles/extensions/validation/test-services/src/main/resources/SLING-CONTENT/apps/sling/validation/models/model1.json

Modified: sling/trunk/bundles/extensions/validation/api/pom.xml
URL: 
http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/validation/api/pom.xml?rev=1723664&r1=1723663&r2=1723664&view=diff
==============================================================================
--- sling/trunk/bundles/extensions/validation/api/pom.xml (original)
+++ sling/trunk/bundles/extensions/validation/api/pom.xml Fri Jan  8 08:51:00 
2016
@@ -72,5 +72,12 @@
             <version>3.2.1</version>
             <scope>provided</scope>
         </dependency>
+        
+        <dependency>
+            <groupId>commons-lang</groupId>
+            <artifactId>commons-lang</artifactId>
+            <version>2.4</version>
+            <scope>provided</scope>
+        </dependency>
     </dependencies>
 </project>

Modified: 
sling/trunk/bundles/extensions/validation/api/src/main/java/org/apache/sling/validation/ValidationFailure.java
URL: 
http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/validation/api/src/main/java/org/apache/sling/validation/ValidationFailure.java?rev=1723664&r1=1723663&r2=1723664&view=diff
==============================================================================
--- 
sling/trunk/bundles/extensions/validation/api/src/main/java/org/apache/sling/validation/ValidationFailure.java
 (original)
+++ 
sling/trunk/bundles/extensions/validation/api/src/main/java/org/apache/sling/validation/ValidationFailure.java
 Fri Jan  8 08:51:00 2016
@@ -18,6 +18,8 @@
  */
 package org.apache.sling.validation;
 
+import java.util.ResourceBundle;
+
 import javax.annotation.Nonnull;
 
 import aQute.bnd.annotation.ProviderType;
@@ -26,9 +28,10 @@ import aQute.bnd.annotation.ProviderType
 public interface ValidationFailure {
 
     /**
+     * @param ResourceBundle resourceBundle in which to look up the according 
message (used for i18n)
      * @return the failure message
      */
-    public @Nonnull String getMessage();
+    public @Nonnull String getMessage(@Nonnull ResourceBundle resourceBundle);
     
     /**
      * Returns the relative location of the property/resource/value which 
triggered this validation failure.
@@ -40,5 +43,4 @@ public interface ValidationFailure {
      * @return the location (usually the validated resource's property path).
      */
     public @Nonnull String getLocation();
-    
 }

Modified: 
sling/trunk/bundles/extensions/validation/api/src/main/java/org/apache/sling/validation/spi/DefaultValidationFailure.java
URL: 
http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/validation/api/src/main/java/org/apache/sling/validation/spi/DefaultValidationFailure.java?rev=1723664&r1=1723663&r2=1723664&view=diff
==============================================================================
--- 
sling/trunk/bundles/extensions/validation/api/src/main/java/org/apache/sling/validation/spi/DefaultValidationFailure.java
 (original)
+++ 
sling/trunk/bundles/extensions/validation/api/src/main/java/org/apache/sling/validation/spi/DefaultValidationFailure.java
 Fri Jan  8 08:51:00 2016
@@ -18,23 +18,42 @@
  */
 package org.apache.sling.validation.spi;
 
+import java.text.MessageFormat;
+import java.util.Arrays;
+import java.util.ResourceBundle;
+
 import javax.annotation.Nonnull;
 
+import org.apache.commons.lang.StringUtils;
 import org.apache.sling.validation.ValidationFailure;
 
+/**
+ * Wraps a message key (being looked up in a {@link ResourceBundle}), 
messageArguments (being used with {@link MessageFormat#format(String, 
Object...)}
+ * and the location where the validation failure occurred.
+ */
 public class DefaultValidationFailure implements ValidationFailure {
 
-    private final @Nonnull String message;
     private final @Nonnull String location;
+    private final @Nonnull String messageKey;
+    private final Object[] messageArguments;
 
-    public DefaultValidationFailure(@Nonnull String message, @Nonnull String 
location) {
-        this.message = message;
+    /**
+     * Constructor of a validation failure. The message is constructed by 
looking up the given messageKey from a resourceBundle.
+     * and formatting it using the given messageArguments via {@link 
MessageFormat#format(String, Object...)}.
+     * @param location the location
+     * @param messageKey the key to look up in the resource bundle
+     * @param messageArguments the arguments to be used with the looked up 
value from the resource bundle (given in {@link #getMessage(ResourceBundle)}
+     */
+    public DefaultValidationFailure(@Nonnull String location, @Nonnull String 
messageKey, Object... messageArguments) {
         this.location = location;
+        this.messageKey = messageKey;
+        this.messageArguments = messageArguments;
     }
 
+    @SuppressWarnings("null")
     @Override
-    public @Nonnull String getMessage() {
-        return message;
+    public @Nonnull String getMessage(@Nonnull ResourceBundle resourceBundle) {
+        return MessageFormat.format(resourceBundle.getString(messageKey), 
messageArguments);
     }
 
     @Override
@@ -44,7 +63,7 @@ public class DefaultValidationFailure im
 
     @Override
     public String toString() {
-        return "DefaultValidationFailure [message=" + message + ", location=" 
+ location + "]";
+        return "DefaultValidationFailure [location=" + location + ", 
messageKey=" + messageKey + ", messageArguments=" + 
StringUtils.join(messageArguments) + "]";
     }
 
     @Override
@@ -52,7 +71,8 @@ public class DefaultValidationFailure im
         final int prime = 31;
         int result = 1;
         result = prime * result + ((location == null) ? 0 : 
location.hashCode());
-        result = prime * result + ((message == null) ? 0 : message.hashCode());
+        result = prime * result + Arrays.hashCode(messageArguments);
+        result = prime * result + ((messageKey == null) ? 0 : 
messageKey.hashCode());
         return result;
     }
 
@@ -62,7 +82,7 @@ public class DefaultValidationFailure im
             return true;
         if (obj == null)
             return false;
-        if (!(obj instanceof DefaultValidationFailure))
+        if (getClass() != obj.getClass())
             return false;
         DefaultValidationFailure other = (DefaultValidationFailure) obj;
         if (location == null) {
@@ -70,11 +90,14 @@ public class DefaultValidationFailure im
                 return false;
         } else if (!location.equals(other.location))
             return false;
-        if (message == null) {
-            if (other.message != null)
+        if (!Arrays.equals(messageArguments, other.messageArguments))
+            return false;
+        if (messageKey == null) {
+            if (other.messageKey != null)
                 return false;
-        } else if (!message.equals(other.message))
+        } else if (!messageKey.equals(other.messageKey))
             return false;
         return true;
     }
+
 }

Modified: 
sling/trunk/bundles/extensions/validation/api/src/main/java/org/apache/sling/validation/spi/DefaultValidationResult.java
URL: 
http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/validation/api/src/main/java/org/apache/sling/validation/spi/DefaultValidationResult.java?rev=1723664&r1=1723663&r2=1723664&view=diff
==============================================================================
--- 
sling/trunk/bundles/extensions/validation/api/src/main/java/org/apache/sling/validation/spi/DefaultValidationResult.java
 (original)
+++ 
sling/trunk/bundles/extensions/validation/api/src/main/java/org/apache/sling/validation/spi/DefaultValidationResult.java
 Fri Jan  8 08:51:00 2016
@@ -18,6 +18,7 @@
  */
 package org.apache.sling.validation.spi;
 
+import java.text.MessageFormat;
 import java.util.Arrays;
 import java.util.Collections;
 import java.util.List;
@@ -38,13 +39,15 @@ public class DefaultValidationResult imp
     }
 
     /** 
-     * Constructs a result with one failure message and an according location
-     * @param message the failure message
-     * @param location the location
+     * Constructs a result with one failure message. The message is 
constructed by looking up the given messageKey from a resourceBundle.
+     * and formatting it using the given messageArguments via {@link 
MessageFormat#format(String, Object...)}.
+     * @param location the location.
+     * @param messageKey the message key used for looking up a value in the 
resource bundle given in {@link 
ValidationFailure#getMessage(java.util.ResourceBundle)}.
+     * @param messageArguments optional number of arguments being used in 
{@link MessageFormat#format(String, Object...)}
      */
-    public DefaultValidationResult(@Nonnull String message, String location) {
+    public DefaultValidationResult(@Nonnull String location, @Nonnull String 
messageKey, Object... messageArguments) {
         this.isValid = false;
-        this.failures = Collections.<ValidationFailure>singletonList(new 
DefaultValidationFailure(message, location));
+        this.failures = Collections.<ValidationFailure>singletonList(new 
DefaultValidationFailure(location, messageKey, messageArguments));
     }
 
     public DefaultValidationResult(ValidationFailure... failures) {

Modified: 
sling/trunk/bundles/extensions/validation/api/src/main/java/org/apache/sling/validation/spi/ValidationContext.java
URL: 
http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/validation/api/src/main/java/org/apache/sling/validation/spi/ValidationContext.java?rev=1723664&r1=1723663&r2=1723664&view=diff
==============================================================================
--- 
sling/trunk/bundles/extensions/validation/api/src/main/java/org/apache/sling/validation/spi/ValidationContext.java
 (original)
+++ 
sling/trunk/bundles/extensions/validation/api/src/main/java/org/apache/sling/validation/spi/ValidationContext.java
 Fri Jan  8 08:51:00 2016
@@ -40,8 +40,7 @@ public interface ValidationContext {
     @Nonnull String getLocation();
 
     /**
-     * all properties of the validated resource/valuemap (only used for 
validations considering multiple properties), never {@code null}.
-     * @return
+     * @return all properties of the validated resource/valuemap (only used 
for validations considering multiple properties), never {@code null}.
      */
     @Nonnull ValueMap getValueMap();
 
@@ -49,6 +48,4 @@ public interface ValidationContext {
      * @return the resource on which the validation was triggered. {@code 
null} in case the validation was triggered on a {@link ValueMap} (via {@link 
ValidationService#validate(ValueMap, 
org.apache.sling.validation.model.ValidationModel)}).
      */
     @CheckForNull Resource getResource();
-    
-    
 }

Modified: sling/trunk/bundles/extensions/validation/core/pom.xml
URL: 
http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/validation/core/pom.xml?rev=1723664&r1=1723663&r2=1723664&view=diff
==============================================================================
--- sling/trunk/bundles/extensions/validation/core/pom.xml (original)
+++ sling/trunk/bundles/extensions/validation/core/pom.xml Fri Jan  8 08:51:00 
2016
@@ -55,6 +55,8 @@
                         <!-- embed the commons.osgi bundle as described in 
http://njbartlett.name/2014/05/26/static-linking.html, 
                              to make this bundle compatible with older 
versions of Sling -->
                         
<Conditional-Package>org.apache.sling.commons.osgi</Conditional-Package>
+                        <Bundle-Category>sling</Bundle-Category>
+                        
<Sling-Initial-Content>SLING-INF;overwrite=true</Sling-Initial-Content>
                     </instructions>
                 </configuration>
             </plugin>

Modified: 
sling/trunk/bundles/extensions/validation/core/src/main/java/org/apache/sling/validation/impl/CompositeValidationResult.java
URL: 
http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/validation/core/src/main/java/org/apache/sling/validation/impl/CompositeValidationResult.java?rev=1723664&r1=1723663&r2=1723664&view=diff
==============================================================================
--- 
sling/trunk/bundles/extensions/validation/core/src/main/java/org/apache/sling/validation/impl/CompositeValidationResult.java
 (original)
+++ 
sling/trunk/bundles/extensions/validation/core/src/main/java/org/apache/sling/validation/impl/CompositeValidationResult.java
 Fri Jan  8 08:51:00 2016
@@ -39,12 +39,12 @@ public class CompositeValidationResult i
         results = new ArrayList<ValidationResult>();
     }
 
-    public void addValidationResult(ValidationResult result) {
+    public void addValidationResult(@Nonnull ValidationResult result) {
         results.add(result);
     }
 
-    public void addFailure(@Nonnull String message, String location) {
-        results.add(new DefaultValidationResult(message, location));
+    public void addFailure(@Nonnull String location, @Nonnull String message, 
Object... messageArguments) {
+        results.add(new DefaultValidationResult(location, message, 
messageArguments));
     }
 
     @Override

Modified: 
sling/trunk/bundles/extensions/validation/core/src/main/java/org/apache/sling/validation/impl/ValidationResourceVisitor.java
URL: 
http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/validation/core/src/main/java/org/apache/sling/validation/impl/ValidationResourceVisitor.java?rev=1723664&r1=1723663&r2=1723664&view=diff
==============================================================================
--- 
sling/trunk/bundles/extensions/validation/core/src/main/java/org/apache/sling/validation/impl/ValidationResourceVisitor.java
 (original)
+++ 
sling/trunk/bundles/extensions/validation/core/src/main/java/org/apache/sling/validation/impl/ValidationResourceVisitor.java
 Fri Jan  8 08:51:00 2016
@@ -58,10 +58,10 @@ public class ValidationResourceVisitor e
                 return;
             }
             // calculate the property name correctly from the root
-            // the relative path must end with a slash and not start with a 
slash
+            // the relative path must not end with a slash and not start with 
a slash
             final String relativePath;
             if (resource.getPath().startsWith(rootResourcePath)) {
-                relativePath = 
resource.getPath().substring(rootResourcePath.length()) + "/";
+                relativePath = 
resource.getPath().substring(rootResourcePath.length());
             } else {
                 relativePath = "";
             }

Modified: 
sling/trunk/bundles/extensions/validation/core/src/main/java/org/apache/sling/validation/impl/ValidationServiceImpl.java
URL: 
http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/validation/core/src/main/java/org/apache/sling/validation/impl/ValidationServiceImpl.java?rev=1723664&r1=1723663&r2=1723664&view=diff
==============================================================================
--- 
sling/trunk/bundles/extensions/validation/core/src/main/java/org/apache/sling/validation/impl/ValidationServiceImpl.java
 (original)
+++ 
sling/trunk/bundles/extensions/validation/core/src/main/java/org/apache/sling/validation/impl/ValidationServiceImpl.java
 Fri Jan  8 08:51:00 2016
@@ -54,6 +54,15 @@ import org.slf4j.LoggerFactory;
 @Service()
 public class ValidationServiceImpl implements ValidationService{
 
+    /** Keys whose values are defined in the JCR resource bundle contained in 
the content-repository section of this bundle */
+    protected static final String I18N_KEY_WRONG_PROPERTY_TYPE = 
"sling.validator.wrong-property-type";
+    protected static final String I18N_KEY_EXPECTED_MULTIVALUE_PROPERTY = 
"sling.validator.multi-value-property-required";
+    protected static final String I18N_KEY_MISSING_REQUIRED_PROPERTY_WITH_NAME 
= "sling.validator.missing-required-property-with-name";
+    protected static final String 
I18N_KEY_MISSING_REQUIRED_PROPERTY_MATCHING_PATTERN = 
"sling.validator.missing-required-property-matching-pattern";
+    protected static final String 
I18N_KEY_MISSING_REQUIRED_CHILD_RESOURCE_WITH_NAME = 
"sling.validator.missing-required-child-resource-with-name";
+    protected static final String 
I18N_KEY_MISSING_REQUIRED_CHILD_RESOURCE_MATCHING_PATTERN = 
"sling.validator.missing-required-child-resource-matching-pattern";
+    
+
     private static final Logger LOG = 
LoggerFactory.getLogger(ValidationServiceImpl.class);
     
     @Reference
@@ -169,22 +178,28 @@ public class ValidationServiceImpl imple
                     }
                 }
                 if (!foundMatch && childResource.isRequired()) {
-                    result.addFailure("Missing required child resource.", 
relativePath + pattern.pattern());
+                    result.addFailure(relativePath, 
I18N_KEY_MISSING_REQUIRED_CHILD_RESOURCE_MATCHING_PATTERN, pattern.toString());
                 }
             } else {
                 Resource expectedResource = 
resource.getChild(childResource.getName());
                 if (expectedResource != null) {
                     validateChildResource(expectedResource, relativePath, 
childResource, result);
                 } else if (childResource.isRequired()) {
-                    result.addFailure("Missing required child resource.", 
relativePath + childResource.getName());
+                    result.addFailure(relativePath, 
I18N_KEY_MISSING_REQUIRED_CHILD_RESOURCE_WITH_NAME, childResource.getName());
                 }
             } 
         }
     }
 
-    private void validateChildResource(Resource resource, String relativePath, 
ChildResource childResource, CompositeValidationResult result) {
-        validateValueMap(resource.adaptTo(ValueMap.class), resource, 
relativePath + resource.getName() + "/", childResource.getProperties(), result);
-        validateChildren(resource, relativePath + resource.getName() + "/", 
childResource.getChildren(), result);
+    private void validateChildResource(Resource resource, String 
relativePathOfParent, ChildResource childResource, CompositeValidationResult 
result) {
+        final String relativePath;
+        if (relativePathOfParent.isEmpty()) {
+            relativePath = resource.getName();
+        } else {
+            relativePath = relativePathOfParent +  "/" + resource.getName();
+        }
+        validateValueMap(resource.adaptTo(ValueMap.class), resource, 
relativePath, childResource.getProperties(), result);
+        validateChildren(resource, relativePath, childResource.getChildren(), 
result);
     }
 
     @Override
@@ -221,7 +236,7 @@ public class ValidationServiceImpl imple
                     }
                 }
                 if (!foundMatch && resourceProperty.isRequired()) {
-                    result.addFailure("Missing required property.", 
relativePath + resourceProperty.getNamePattern());
+                    result.addFailure(relativePath, 
I18N_KEY_MISSING_REQUIRED_PROPERTY_MATCHING_PATTERN, pattern.toString());
                 }
             } else {
                 validatePropertyValue(resourceProperty.getName(), valueMap, 
resource, relativePath, resourceProperty, result);
@@ -233,14 +248,14 @@ public class ValidationServiceImpl imple
         Object fieldValues = valueMap.get(property);
         if (fieldValues == null) {
             if (resourceProperty.isRequired()) {
-                result.addFailure("Missing required property.", relativePath + 
property);
+                result.addFailure(relativePath, 
I18N_KEY_MISSING_REQUIRED_PROPERTY_WITH_NAME, property);
             }
             return;
         }
         List<ParameterizedValidator> validators = 
resourceProperty.getValidators();
         if (resourceProperty.isMultiple()) {
             if (!fieldValues.getClass().isArray()) {
-                result.addFailure("Expected multiple-valued property.", 
relativePath + property);
+                result.addFailure(relativePath + property, 
I18N_KEY_EXPECTED_MULTIVALUE_PROPERTY);
                 return;
             }
         }
@@ -261,7 +276,7 @@ public class ValidationServiceImpl imple
             // see https://issues.apache.org/jira/browse/SLING-4178 for why 
the second check is necessary
             if (typedValue == null || (typedValue.length > 0 && typedValue[0] 
== null)) {
                 // here the missing required property case was already treated 
in validateValueMap
-                result.addFailure("Property was expected to be of type '" + 
validator.getType() + "' but cannot be converted to that type.", property);
+                result.addFailure(relativePath + property, 
I18N_KEY_WRONG_PROPERTY_TYPE, validator.getType());
                 return;
             }
             

Modified: 
sling/trunk/bundles/extensions/validation/core/src/main/java/org/apache/sling/validation/impl/resourcemodel/ResourceValidationModelProviderImpl.java
URL: 
http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/validation/core/src/main/java/org/apache/sling/validation/impl/resourcemodel/ResourceValidationModelProviderImpl.java?rev=1723664&r1=1723663&r2=1723664&view=diff
==============================================================================
--- 
sling/trunk/bundles/extensions/validation/core/src/main/java/org/apache/sling/validation/impl/resourcemodel/ResourceValidationModelProviderImpl.java
 (original)
+++ 
sling/trunk/bundles/extensions/validation/core/src/main/java/org/apache/sling/validation/impl/resourcemodel/ResourceValidationModelProviderImpl.java
 Fri Jan  8 08:51:00 2016
@@ -78,7 +78,6 @@ public class ResourceValidationModelProv
     public static final String VALIDATORS = "validators";
     public static final String OPTIONAL = "optional";
     public static final String PROPERTY_MULTIPLE = "propertyMultiple";
-    public static final String PROPERTY_TYPE = "propertyType";
     public static final String PROPERTIES = "properties";
     public static final String VALIDATION_MODEL_RESOURCE_TYPE = 
"sling/validation/model";
     public static final String MODELS_HOME = "validation/";

Modified: 
sling/trunk/bundles/extensions/validation/core/src/main/java/org/apache/sling/validation/impl/validators/RegexValidator.java
URL: 
http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/validation/core/src/main/java/org/apache/sling/validation/impl/validators/RegexValidator.java?rev=1723664&r1=1723663&r2=1723664&view=diff
==============================================================================
--- 
sling/trunk/bundles/extensions/validation/core/src/main/java/org/apache/sling/validation/impl/validators/RegexValidator.java
 (original)
+++ 
sling/trunk/bundles/extensions/validation/core/src/main/java/org/apache/sling/validation/impl/validators/RegexValidator.java
 Fri Jan  8 08:51:00 2016
@@ -19,6 +19,7 @@
 package org.apache.sling.validation.impl.validators;
 
 import java.util.regex.Pattern;
+import java.util.regex.PatternSyntaxException;
 
 import javax.annotation.Nonnull;
 
@@ -40,6 +41,7 @@ import org.apache.sling.validation.spi.V
 @Service(Validator.class)
 public class RegexValidator implements Validator<String> {
 
+    public static final String I18N_KEY_PATTERN_DOES_NOT_MATCH = 
"sling.validator.regex.pattern-does-not-match";
     public static final String REGEX_PARAM = "regex";
 
     @Override
@@ -47,13 +49,17 @@ public class RegexValidator implements V
             throws SlingValidationException {
         String regex = arguments.get(REGEX_PARAM, "");
         if (StringUtils.isEmpty(regex)) {
-            throw new SlingValidationException("Mandatory " + REGEX_PARAM + " 
is missing from the arguments map.");
+            throw new SlingValidationException("Mandatory argument '" + 
REGEX_PARAM + "' is missing from the arguments map.");
         }
-        Pattern pattern = Pattern.compile(regex);
-        if (pattern.matcher((String)data).matches()) {
-            return DefaultValidationResult.VALID;
+        try {
+            Pattern pattern = Pattern.compile(regex);
+            if (pattern.matcher((String)data).matches()) {
+                return DefaultValidationResult.VALID;
+            }
+            return new DefaultValidationResult(context.getLocation(), 
I18N_KEY_PATTERN_DOES_NOT_MATCH, regex);
+        } catch (PatternSyntaxException e) {
+            throw new SlingValidationException("Given pattern in argument '" + 
REGEX_PARAM + "' is invalid", e);
         }
-        return new DefaultValidationResult("Property does not match the 
pattern '" + regex + "'", context.getLocation());
     }
 
 }

Added: 
sling/trunk/bundles/extensions/validation/core/src/main/resources/SLING-INF/libs/sling/validation/i18n/en.json
URL: 
http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/validation/core/src/main/resources/SLING-INF/libs/sling/validation/i18n/en.json?rev=1723664&view=auto
==============================================================================
--- 
sling/trunk/bundles/extensions/validation/core/src/main/resources/SLING-INF/libs/sling/validation/i18n/en.json
 (added)
+++ 
sling/trunk/bundles/extensions/validation/core/src/main/resources/SLING-INF/libs/sling/validation/i18n/en.json
 Fri Jan  8 08:51:00 2016
@@ -0,0 +1,33 @@
+{
+       "jcr:primaryType": "nt:folder",
+       "jcr:mixinTypes": ["mix:language"],
+       "jcr:language": "en",
+       "sling.validator.regex.pattern-does-not-match" : {
+               "jcr:primaryType": "sling:MessageEntry",
+               "sling:message": "Property does not match the pattern \"{0}\"."
+       },
+       "sling.validator.missing-required-child-resource-with-name" : {
+               "jcr:primaryType": "sling:MessageEntry",
+               "sling:message": "Missing required child resource with name 
\"{0}\"."
+       },
+       "sling.validator.missing-required-child-resource-matching-pattern" : {
+               "jcr:primaryType": "sling:MessageEntry",
+               "sling:message": "Missing required child resource matching 
regular expression pattern \"{0}\"."
+       },
+       "sling.validator.missing-required-property-with-name" : {
+               "jcr:primaryType": "sling:MessageEntry",
+               "sling:message": "Missing required property with name \"{0}\"."
+       },
+       "sling.validator.missing-required-property-matching-pattern" : {
+               "jcr:primaryType": "sling:MessageEntry",
+               "sling:message": "Missing required property matching regular 
expression pattern \"{0}\"."
+       },
+       "sling.validator.multi-value-property-required" : {
+               "jcr:primaryType": "sling:MessageEntry",
+               "sling:message": "Expected multi-value property but found only 
a single value property."
+       },
+       "sling.validator.wrong-property-type" : {
+               "jcr:primaryType": "sling:MessageEntry",
+               "sling:message": "Property was expected to be of type \"{0}\" 
but it cannot be converted to that type."
+       }
+}
\ No newline at end of file

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=1723664&r1=1723663&r2=1723664&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 Jan  8 08:51:00 2016
@@ -20,9 +20,10 @@ package org.apache.sling.validation.impl
 
 import java.util.Arrays;
 import java.util.Collections;
+import java.util.Date;
 import java.util.HashMap;
-import java.util.List;
 import java.util.Map;
+import java.util.regex.Pattern;
 
 import javax.annotation.CheckForNull;
 import javax.annotation.Nonnull;
@@ -97,7 +98,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.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")));
+        Assert.assertThat(vr.getFailures(), 
Matchers.<ValidationFailure>contains(new DefaultValidationFailure("field1", 
ValidationServiceImpl.I18N_KEY_WRONG_PROPERTY_TYPE, Date.class)));
     }
 
     @Test
@@ -140,7 +141,7 @@ public class ValidationServiceImplTest {
         hashMap.put("field3", "");
 
         ValidationResult vr = validationService.validate(new 
ValueMapDecorator(hashMap), vm);
-        Assert.assertThat(vr.getFailures(), 
Matchers.<ValidationFailure>contains(new DefaultValidationFailure("Missing 
required property.", "field4")));
+        Assert.assertThat(vr.getFailures(), 
Matchers.<ValidationFailure>contains(new DefaultValidationFailure("", 
ValidationServiceImpl.I18N_KEY_MISSING_REQUIRED_PROPERTY_WITH_NAME, "field4")));
     }
 
     @Test()
@@ -167,7 +168,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.getFailures(), 
Matchers.<ValidationFailure>contains(new DefaultValidationFailure("Property 
does not match the pattern 'abc'", "field1")));
+        Assert.assertThat(vr.getFailures(), 
Matchers.<ValidationFailure>contains(new DefaultValidationFailure("field1", 
RegexValidator.I18N_KEY_PATTERN_DOES_NOT_MATCH, "abc")));
     }
 
     @Test
@@ -187,7 +188,7 @@ public class ValidationServiceImplTest {
         ValidationResult vr = validationService.validate(new 
ValueMapDecorator(hashMap), vm);
 
         Assert.assertFalse(vr.isValid());
-        Assert.assertThat(vr.getFailures(), Matchers.<ValidationFailure> 
hasItem(new DefaultValidationFailure("Property does not match the pattern '" + 
TEST_REGEX + "'", "field2")));
+        Assert.assertThat(vr.getFailures(), Matchers.<ValidationFailure> 
hasItem(new DefaultValidationFailure("field2", 
RegexValidator.I18N_KEY_PATTERN_DOES_NOT_MATCH, TEST_REGEX)));
     }
 
     @Test
@@ -219,7 +220,7 @@ public class ValidationServiceImplTest {
 
         ValidationResult vr = validationService.validate(testResource, vm);
         Assert.assertFalse("resource should have been considered invalid", 
vr.isValid());
-        Assert.assertThat(vr.getFailures(), 
Matchers.<ValidationFailure>contains(new DefaultValidationFailure("Missing 
required property.", "child/grandchild/field1")));
+        Assert.assertThat(vr.getFailures(), 
Matchers.<ValidationFailure>contains(new 
DefaultValidationFailure("child/grandchild", 
ValidationServiceImpl.I18N_KEY_MISSING_REQUIRED_PROPERTY_WITH_NAME, "field1")));
     }
 
     @Test
@@ -332,10 +333,10 @@ public class ValidationServiceImplTest {
         Assert.assertFalse("resource should have been considered invalid", 
vr.isValid());
         
         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.*")));
+                new DefaultValidationFailure("child2", 
ValidationServiceImpl.I18N_KEY_MISSING_REQUIRED_CHILD_RESOURCE_MATCHING_PATTERN,
 "grandchild.*"),
+                new DefaultValidationFailure("child3", 
ValidationServiceImpl.I18N_KEY_MISSING_REQUIRED_CHILD_RESOURCE_MATCHING_PATTERN,
 "grandchild.*"),
+                new DefaultValidationFailure("child3", 
ValidationServiceImpl.I18N_KEY_MISSING_REQUIRED_PROPERTY_WITH_NAME, "field1"),
+                new DefaultValidationFailure("", 
ValidationServiceImpl.I18N_KEY_MISSING_REQUIRED_CHILD_RESOURCE_MATCHING_PATTERN,
 "siblingchild.*")));
     }
 
     @Test
@@ -363,8 +364,8 @@ public class ValidationServiceImplTest {
         Assert.assertFalse("resource should have been considered invalid", 
vr.isValid());
         
         Assert.assertThat(vr.getFailures(), 
Matchers.<ValidationFailure>contains(
-                new DefaultValidationFailure("Property does not match the 
pattern '\\d'", "field3"),
-                new DefaultValidationFailure("Missing required property.", 
"otherfield.*")));
+                new DefaultValidationFailure("field3", 
RegexValidator.I18N_KEY_PATTERN_DOES_NOT_MATCH, "\\d"),
+                new DefaultValidationFailure("", 
ValidationServiceImpl.I18N_KEY_MISSING_REQUIRED_PROPERTY_MATCHING_PATTERN, 
"otherfield.*")));
     }
 
     @Test
@@ -382,7 +383,7 @@ public class ValidationServiceImplTest {
 
         ValidationResult vr = validationService.validate(testResource, vm);
         Assert.assertFalse("resource should have been considered invalid", 
vr.isValid());
-        Assert.assertThat(vr.getFailures(), 
Matchers.<ValidationFailure>contains(new DefaultValidationFailure("Property 
does not match the pattern '\\d'", "field[1]")));
+        Assert.assertThat(vr.getFailures(), 
Matchers.<ValidationFailure>contains(new DefaultValidationFailure("field[1]", 
RegexValidator.I18N_KEY_PATTERN_DOES_NOT_MATCH, "\\d")));
     }
 
     @Test()
@@ -443,8 +444,8 @@ public class ValidationServiceImplTest {
         ValidationResult vr = 
validationService.validateResourceRecursively(testResource, true, 
ignoreResourceType3Filter, false);
         Assert.assertFalse("resource should have been considered invalid", 
vr.isValid());
         Assert.assertThat(vr.getFailures(), 
Matchers.<ValidationFailure>contains(
-                new DefaultValidationFailure("Missing required property.", 
"field1"),
-                new DefaultValidationFailure("Missing required property.", 
"child2/field2")));
+                new DefaultValidationFailure("", 
ValidationServiceImpl.I18N_KEY_MISSING_REQUIRED_PROPERTY_WITH_NAME, "field1"),
+                new DefaultValidationFailure("child2", 
ValidationServiceImpl.I18N_KEY_MISSING_REQUIRED_PROPERTY_WITH_NAME, "field2")));
     }
 
     @Test(expected = IllegalArgumentException.class)

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=1723664&r1=1723663&r2=1723664&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 Jan  8 08:51:00 2016
@@ -20,6 +20,7 @@ package org.apache.sling.validation.exam
 
 import java.io.IOException;
 import java.util.List;
+import java.util.Locale;
 import java.util.Map;
 
 import javax.servlet.ServletException;
@@ -74,7 +75,7 @@ public class ModifyUserServlet extends S
                         JSONArray failures = new JSONArray();
                         for (ValidationFailure failure : vr.getFailures()) {
                             JSONObject failureJson = new JSONObject();
-                            failureJson.put("message", failure.getMessage());
+                            failureJson.put("message", 
failure.getMessage(request.getResourceBundle(Locale.US)));
                             failureJson.put("location", failure.getLocation());
                             failures.put(failureJson);
                         }

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=1723664&r1=1723663&r2=1723664&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 Jan  8 08:51:00 2016
@@ -18,6 +18,7 @@
 --><%@page session="false" import="
     java.util.Map,
     java.util.List,
+    java.util.Locale,
     org.apache.sling.api.resource.Resource,
     org.apache.sling.validation.ValidationFailure,
     org.apache.sling.validation.examples.models.UserModel
@@ -49,8 +50,8 @@
 <%
     for (ValidationFailure error : user.getErrors()) {
 %>
-<span><strong>Key:</strong> <%= error.getLocation() %></span><br>
-<span><%= error.getMessage() %></span><br>
+<span><strong>Location:</strong> <%= error.getLocation() %></span><br>
+<span><%= error.getMessage(slingRequest.getResourceBundle(Locale.US)) 
%></span><br>
 <%
     }
 %>
\ No newline at end of file

Modified: sling/trunk/bundles/extensions/validation/it-http/pom.xml
URL: 
http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/validation/it-http/pom.xml?rev=1723664&r1=1723663&r2=1723664&view=diff
==============================================================================
--- sling/trunk/bundles/extensions/validation/it-http/pom.xml (original)
+++ sling/trunk/bundles/extensions/validation/it-http/pom.xml Fri Jan  8 
08:51:00 2016
@@ -232,6 +232,7 @@
                         
<sling.additional.bundle.1>org.apache.sling.validation.api</sling.additional.bundle.1>
                         
<sling.additional.bundle.2>org.apache.sling.validation.core</sling.additional.bundle.2>
                         
<sling.additional.bundle.3>org.apache.sling.validation.test-services</sling.additional.bundle.3>
+                        <!-- TODO: add Sling i18n bundle -->
                     </systemPropertyVariables>
                 </configuration>
             </plugin>
@@ -268,8 +269,7 @@
         <dependency>
             <groupId>org.apache.sling</groupId>
             <artifactId>org.apache.sling.launchpad</artifactId>
-            <classifier>standalone</classifier>
-            <version>7</version>
+            <version>8</version>
         </dependency>
         <dependency>
             <groupId>org.apache.sling</groupId>

Modified: 
sling/trunk/bundles/extensions/validation/it-http/src/test/java/org/apache/sling/validation/testservices/ValidationServiceTest.java
URL: 
http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/validation/it-http/src/test/java/org/apache/sling/validation/testservices/ValidationServiceTest.java?rev=1723664&r1=1723663&r2=1723664&view=diff
==============================================================================
--- 
sling/trunk/bundles/extensions/validation/it-http/src/test/java/org/apache/sling/validation/testservices/ValidationServiceTest.java
 (original)
+++ 
sling/trunk/bundles/extensions/validation/it-http/src/test/java/org/apache/sling/validation/testservices/ValidationServiceTest.java
 Fri Jan  8 08:51:00 2016
@@ -29,16 +29,22 @@ import org.junit.Test;
 
 import java.io.IOException;
 
+import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertTrue;
 
+/**
+ * These tests leverage the {@link ValidationPostOperation} to validate the 
given request parameters.
+ * The according validation model enforces the properties "field1" matching 
regex=^\\\p{Upper}+$ and "field2" (having an arbitrary value).
+ *
+ */
 public class ValidationServiceTest extends SlingTestBase {
 
     @Test
     public void testValidRequestModel1() throws IOException, JSONException {
         MultipartEntity entity = new MultipartEntity();
         entity.addPart("sling:resourceType", new 
StringBody("validation/test/resourceType1"));
-        entity.addPart("field1", new StringBody("HelloWorld"));
+        entity.addPart("field1", new StringBody("HELLOWORLD"));
         entity.addPart("field2", new StringBody("30.01.1988"));
         entity.addPart(SlingPostConstants.RP_OPERATION, new 
StringBody("validation"));
         RequestExecutor re = 
getRequestExecutor().execute(getRequestBuilder().buildPostRequest
@@ -58,5 +64,12 @@ public class ValidationServiceTest exten
         String content = re.getContent();
         JSONObject jsonResponse = new JSONObject(content);
         assertFalse(jsonResponse.getBoolean("valid"));
+        // TODO: check validation failure
+        JSONObject failure = 
jsonResponse.getJSONArray("failures").getJSONObject(0);
+        assertEquals("Property does not match the pattern \"^\\p{Upper}+$\".", 
failure.get("message"));
+        assertEquals("field1", failure.get("location"));
+        failure = jsonResponse.getJSONArray("failures").getJSONObject(1);
+        assertEquals("Missing required property with name \"field2\".", 
failure.get("message"));
+        assertEquals("", failure.get("location")); // location is empty as the 
property is not found (property name is part of the message rather)
     }
 }

Modified: sling/trunk/bundles/extensions/validation/test-services/pom.xml
URL: 
http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/validation/test-services/pom.xml?rev=1723664&r1=1723663&r2=1723664&view=diff
==============================================================================
--- sling/trunk/bundles/extensions/validation/test-services/pom.xml (original)
+++ sling/trunk/bundles/extensions/validation/test-services/pom.xml Fri Jan  8 
08:51:00 2016
@@ -87,6 +87,12 @@
             <scope>provided</scope>
         </dependency>
         <dependency>
+            <groupId>com.google.code.findbugs</groupId>
+            <artifactId>jsr305</artifactId>
+            <version>3.0.0</version>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
             <groupId>org.apache.sling</groupId>
             <artifactId>org.apache.sling.api</artifactId>
             <version>2.4.2</version>

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=1723664&r1=1723663&r2=1723664&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 Jan  8 08:51:00 2016
@@ -20,9 +20,9 @@ package org.apache.sling.validation.test
 
 import java.io.IOException;
 import java.io.PrintWriter;
-import java.util.List;
-import java.util.Map;
+import java.util.ResourceBundle;
 
+import javax.annotation.Nonnull;
 import javax.servlet.http.HttpServletResponse;
 
 import org.apache.sling.commons.json.JSONArray;
@@ -37,8 +37,13 @@ import org.slf4j.LoggerFactory;
 public class ValidationPostResponse extends AbstractPostResponse {
 
     private ValidationResult validationResult;
+    private final ResourceBundle resourceBundle;
     private static final Logger LOG = 
LoggerFactory.getLogger(ValidationPostResponse.class);
 
+    public ValidationPostResponse(@Nonnull ResourceBundle resourceBundle) {
+        this.resourceBundle = resourceBundle;
+    }
+
     public void setValidationResult(ValidationResult validationResult) {
         this.validationResult = validationResult;
     }
@@ -55,7 +60,7 @@ public class ValidationPostResponse exte
                 JSONArray failures = new JSONArray();
                 for (ValidationFailure failure : 
validationResult.getFailures()) {
                     JSONObject failureJson = new JSONObject();
-                    failureJson.put("message", failure.getMessage());
+                    failureJson.put("message", 
failure.getMessage(resourceBundle));
                     failureJson.put("location", failure.getLocation());
                     failures.put(failureJson);
                 }

Modified: 
sling/trunk/bundles/extensions/validation/test-services/src/main/java/org/apache/sling/validation/testservices/ValidationPostResponseCreator.java
URL: 
http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/validation/test-services/src/main/java/org/apache/sling/validation/testservices/ValidationPostResponseCreator.java?rev=1723664&r1=1723663&r2=1723664&view=diff
==============================================================================
--- 
sling/trunk/bundles/extensions/validation/test-services/src/main/java/org/apache/sling/validation/testservices/ValidationPostResponseCreator.java
 (original)
+++ 
sling/trunk/bundles/extensions/validation/test-services/src/main/java/org/apache/sling/validation/testservices/ValidationPostResponseCreator.java
 Fri Jan  8 08:51:00 2016
@@ -18,6 +18,8 @@
  */
  package org.apache.sling.validation.testservices;
 
+import java.util.Locale;
+
 import org.apache.felix.scr.annotations.Component;
 import org.apache.felix.scr.annotations.Service;
 import org.apache.sling.api.SlingHttpServletRequest;
@@ -33,7 +35,7 @@ public class ValidationPostResponseCreat
     public PostResponse createPostResponse(SlingHttpServletRequest request) {
         String operation = 
request.getParameter(SlingPostConstants.RP_OPERATION);
         if (operation != null && "validation".equals(operation)) {
-            return new ValidationPostResponse();
+            return new 
ValidationPostResponse(request.getResourceBundle(Locale.US));
         }
         return null;
     }

Modified: 
sling/trunk/bundles/extensions/validation/test-services/src/main/resources/SLING-CONTENT/apps/sling/validation/models/model1.json
URL: 
http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/validation/test-services/src/main/resources/SLING-CONTENT/apps/sling/validation/models/model1.json?rev=1723664&r1=1723663&r2=1723664&view=diff
==============================================================================
--- 
sling/trunk/bundles/extensions/validation/test-services/src/main/resources/SLING-CONTENT/apps/sling/validation/models/model1.json
 (original)
+++ 
sling/trunk/bundles/extensions/validation/test-services/src/main/resources/SLING-CONTENT/apps/sling/validation/models/model1.json
 Fri Jan  8 08:51:00 2016
@@ -13,13 +13,12 @@
                 "jcr:primaryType" : "nt:unstructured",
                 "org.apache.sling.validation.impl.validators.RegexValidator": {
                     "jcr:primaryType" : "nt:unstructured",
-                    "validatorArguments" : ["regex=^\\p{L}+$"]
+                    "validatorArguments" : ["regex=^\\\p{Upper}+$"]
                 }
             }
         },
         "field2" : {
-            "jcr:primaryType" : "nt:unstructured",
-            "propertyType" : "date"
+            "jcr:primaryType" : "nt:unstructured"
         }
     }
 }


Reply via email to