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"
}
}
}