Author: kwin Date: Tue Apr 14 14:19:49 2015 New Revision: 1673430 URL: http://svn.apache.org/r1673430 Log: SLING-4609 more null annotations
Modified: sling/trunk/bundles/extensions/validation/api/src/main/java/org/apache/sling/validation/api/ValidationService.java sling/trunk/bundles/extensions/validation/core/pom.xml sling/trunk/bundles/extensions/validation/core/src/main/java/org/apache/sling/validation/impl/ChildResourceImpl.java sling/trunk/bundles/extensions/validation/core/src/main/java/org/apache/sling/validation/impl/JCRValidationModel.java sling/trunk/bundles/extensions/validation/core/src/main/java/org/apache/sling/validation/impl/ParameterizedValidatorImpl.java sling/trunk/bundles/extensions/validation/core/src/main/java/org/apache/sling/validation/impl/ResourcePropertyImpl.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/ValidationResultImpl.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/util/JCRBuilder.java sling/trunk/bundles/extensions/validation/core/src/main/java/org/apache/sling/validation/impl/util/ValidatorTypeUtil.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/core/src/test/java/org/apache/sling/validation/impl/util/ValidatorTypeUtilTest.java sling/trunk/bundles/extensions/validation/core/src/test/java/org/apache/sling/validation/impl/util/examplevalidators/DateValidator.java sling/trunk/bundles/extensions/validation/core/src/test/java/org/apache/sling/validation/impl/util/examplevalidators/ExtendedStringValidator.java sling/trunk/bundles/extensions/validation/core/src/test/java/org/apache/sling/validation/impl/util/examplevalidators/IntegerValidator.java sling/trunk/bundles/extensions/validation/core/src/test/java/org/apache/sling/validation/impl/util/examplevalidators/StringArrayValidator.java sling/trunk/bundles/extensions/validation/core/src/test/java/org/apache/sling/validation/impl/util/examplevalidators/StringValidator.java sling/trunk/bundles/extensions/validation/examples/pom.xml sling/trunk/bundles/extensions/validation/examples/src/main/resources/SLING-INF/apps/validationdemo/components/user/user.jsp Modified: sling/trunk/bundles/extensions/validation/api/src/main/java/org/apache/sling/validation/api/ValidationService.java URL: http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/validation/api/src/main/java/org/apache/sling/validation/api/ValidationService.java?rev=1673430&r1=1673429&r2=1673430&view=diff ============================================================================== --- sling/trunk/bundles/extensions/validation/api/src/main/java/org/apache/sling/validation/api/ValidationService.java (original) +++ sling/trunk/bundles/extensions/validation/api/src/main/java/org/apache/sling/validation/api/ValidationService.java Tue Apr 14 14:19:49 2015 @@ -38,12 +38,12 @@ public interface ValidationService { * * @param validatedResourceType the type of {@code Resources} the model validates, should be either relative * (i.e. not start with a "/") or starting with one of the resource resolver's search paths - * @param applicablePath the model's applicable path (the path of the validated resource) + * @param resourcePath the path of the validated resource, may be {@code null} or empty. Must match the applicablePath property of the model * @return a {@code ValidationModel} if one is found, {@code null} otherwise * @throws IllegalStateException in case an invalid validation model was found - * @throws IllegalArgumentException in case validatedResourceType was blank, {@code null} or absolute but outside of the search paths. + * @throws IllegalArgumentException in case validatedResourceType was blank, {@code null} or absolute but outside of the search paths */ - @CheckForNull ValidationModel getValidationModel(String validatedResourceType, String applicablePath) throws IllegalStateException, IllegalArgumentException; + @CheckForNull ValidationModel getValidationModel(@Nonnull String validatedResourceType, String resourcePath) throws IllegalStateException, IllegalArgumentException; /** * Tries to obtain a {@link ValidationModel} that is able to validate the given {@code resource}. Modified: sling/trunk/bundles/extensions/validation/core/pom.xml URL: http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/validation/core/pom.xml?rev=1673430&r1=1673429&r2=1673430&view=diff ============================================================================== --- sling/trunk/bundles/extensions/validation/core/pom.xml (original) +++ sling/trunk/bundles/extensions/validation/core/pom.xml Tue Apr 14 14:19:49 2015 @@ -69,6 +69,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>javax.servlet</groupId> <artifactId>servlet-api</artifactId> <scope>provided</scope> Modified: sling/trunk/bundles/extensions/validation/core/src/main/java/org/apache/sling/validation/impl/ChildResourceImpl.java URL: http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/validation/core/src/main/java/org/apache/sling/validation/impl/ChildResourceImpl.java?rev=1673430&r1=1673429&r2=1673430&view=diff ============================================================================== --- sling/trunk/bundles/extensions/validation/core/src/main/java/org/apache/sling/validation/impl/ChildResourceImpl.java (original) +++ sling/trunk/bundles/extensions/validation/core/src/main/java/org/apache/sling/validation/impl/ChildResourceImpl.java Tue Apr 14 14:19:49 2015 @@ -6,6 +6,8 @@ import java.util.Set; import java.util.regex.Pattern; import java.util.regex.PatternSyntaxException; +import javax.annotation.Nonnull; + import org.apache.sling.api.resource.Resource; import org.apache.sling.api.resource.ValueMap; import org.apache.sling.commons.osgi.PropertiesUtil; @@ -21,11 +23,11 @@ public class ChildResourceImpl implement private final String name; private final Pattern namePattern; - private final Set<ResourceProperty> properties; - private final List<ChildResource> children; + private final @Nonnull Set<ResourceProperty> properties; + private final @Nonnull List<ChildResource> children; private final boolean isRequired; - public ChildResourceImpl(Resource modelResource, Resource childResource, Map<String, Validator<?>> validatorsMap, List<ChildResource> children) { + public ChildResourceImpl(@Nonnull Resource modelResource, @Nonnull Resource childResource, @Nonnull Map<String, Validator<?>> validatorsMap, @Nonnull List<ChildResource> children) { String root = modelResource.getPath(); if (!childResource.getPath().startsWith(root)) { throw new IllegalArgumentException("Expected resource " + childResource.getPath() + " to be under root path " + root); @@ -59,7 +61,7 @@ public class ChildResourceImpl implement } @Override - public Set<ResourceProperty> getProperties() { + public @Nonnull Set<ResourceProperty> getProperties() { return properties; } @@ -68,7 +70,7 @@ public class ChildResourceImpl implement return namePattern; } - public List<ChildResource> getChildren() { + public @Nonnull List<ChildResource> getChildren() { return children; } Modified: sling/trunk/bundles/extensions/validation/core/src/main/java/org/apache/sling/validation/impl/JCRValidationModel.java URL: http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/validation/core/src/main/java/org/apache/sling/validation/impl/JCRValidationModel.java?rev=1673430&r1=1673429&r2=1673430&view=diff ============================================================================== --- sling/trunk/bundles/extensions/validation/core/src/main/java/org/apache/sling/validation/impl/JCRValidationModel.java (original) +++ sling/trunk/bundles/extensions/validation/core/src/main/java/org/apache/sling/validation/impl/JCRValidationModel.java Tue Apr 14 14:19:49 2015 @@ -21,6 +21,8 @@ package org.apache.sling.validation.impl import java.util.List; import java.util.Set; +import javax.annotation.Nonnull; + import org.apache.commons.lang3.StringUtils; import org.apache.sling.validation.api.ChildResource; import org.apache.sling.validation.api.ResourceProperty; @@ -28,14 +30,14 @@ import org.apache.sling.validation.api.V public class JCRValidationModel implements ValidationModel { - private Set<ResourceProperty> resourceProperties; - private String validatedResourceType; - private String[] applicablePaths; - private String jcrPath; - private List<ChildResource> children; + private final @Nonnull Set<ResourceProperty> resourceProperties; + private final @Nonnull String validatedResourceType; + private final @Nonnull String[] applicablePaths; + private final String jcrPath; + private final @Nonnull List<ChildResource> children; - public JCRValidationModel(String jcrPath, Set<ResourceProperty> resourceProperties, String validatedResourceType, - String[] applicablePaths, List<ChildResource> children) { + public JCRValidationModel(String jcrPath, @Nonnull Set<ResourceProperty> resourceProperties, @Nonnull String validatedResourceType, + String[] applicablePaths, @Nonnull List<ChildResource> children) { this.jcrPath = jcrPath; this.resourceProperties = resourceProperties; this.validatedResourceType = validatedResourceType; @@ -58,22 +60,22 @@ public class JCRValidationModel implemen } @Override - public Set<ResourceProperty> getResourceProperties() { + public @Nonnull Set<ResourceProperty> getResourceProperties() { return resourceProperties; } @Override - public String getValidatedResourceType() { + public @Nonnull String getValidatedResourceType() { return validatedResourceType; } @Override - public String[] getApplicablePaths() { + public @Nonnull String[] getApplicablePaths() { return applicablePaths; } @Override - public List<ChildResource> getChildren() { + public @Nonnull List<ChildResource> getChildren() { return children; } Modified: sling/trunk/bundles/extensions/validation/core/src/main/java/org/apache/sling/validation/impl/ParameterizedValidatorImpl.java URL: http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/validation/core/src/main/java/org/apache/sling/validation/impl/ParameterizedValidatorImpl.java?rev=1673430&r1=1673429&r2=1673430&view=diff ============================================================================== --- sling/trunk/bundles/extensions/validation/core/src/main/java/org/apache/sling/validation/impl/ParameterizedValidatorImpl.java (original) +++ sling/trunk/bundles/extensions/validation/core/src/main/java/org/apache/sling/validation/impl/ParameterizedValidatorImpl.java Tue Apr 14 14:19:49 2015 @@ -1,16 +1,18 @@ package org.apache.sling.validation.impl; +import javax.annotation.Nonnull; + import org.apache.sling.api.resource.ValueMap; import org.apache.sling.validation.api.ParameterizedValidator; import org.apache.sling.validation.api.Validator; import org.apache.sling.validation.impl.util.ValidatorTypeUtil; public class ParameterizedValidatorImpl implements ParameterizedValidator { - private final Validator<?> validator; - private final ValueMap parameters; - private final Class<?> type; + private final @Nonnull Validator<?> validator; + private final @Nonnull ValueMap parameters; + private final @Nonnull Class<?> type; - public ParameterizedValidatorImpl(Validator<?> validator, ValueMap parameters) { + public ParameterizedValidatorImpl(@Nonnull Validator<?> validator, @Nonnull ValueMap parameters) { super(); this.validator = validator; this.parameters = parameters; @@ -22,7 +24,7 @@ public class ParameterizedValidatorImpl * @see org.apache.sling.validation.impl.ParameterizedValidator#getValidator() */ @Override - public Validator<?> getValidator() { + public @Nonnull Validator<?> getValidator() { return validator; } @@ -30,7 +32,7 @@ public class ParameterizedValidatorImpl * @see org.apache.sling.validation.impl.ParameterizedValidator#getParameters() */ @Override - public ValueMap getParameters() { + public @Nonnull ValueMap getParameters() { return parameters; } @@ -38,7 +40,7 @@ public class ParameterizedValidatorImpl * @see org.apache.sling.validation.impl.ParameterizedValidator#getType() */ @Override - public Class<?> getType() { + public @Nonnull Class<?> getType() { return type; } } Modified: sling/trunk/bundles/extensions/validation/core/src/main/java/org/apache/sling/validation/impl/ResourcePropertyImpl.java URL: http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/validation/core/src/main/java/org/apache/sling/validation/impl/ResourcePropertyImpl.java?rev=1673430&r1=1673429&r2=1673430&view=diff ============================================================================== --- sling/trunk/bundles/extensions/validation/core/src/main/java/org/apache/sling/validation/impl/ResourcePropertyImpl.java (original) +++ sling/trunk/bundles/extensions/validation/core/src/main/java/org/apache/sling/validation/impl/ResourcePropertyImpl.java Tue Apr 14 14:19:49 2015 @@ -21,18 +21,20 @@ package org.apache.sling.validation.impl import java.util.List; import java.util.regex.Pattern; +import javax.annotation.Nonnull; + import org.apache.sling.validation.api.ParameterizedValidator; import org.apache.sling.validation.api.ResourceProperty; public class ResourcePropertyImpl implements ResourceProperty { - private String name; - private boolean isMultiple; - private boolean isRequired; - private List<ParameterizedValidator> validators; - private Pattern namePattern; + private final String name; + private final boolean isMultiple; + private final boolean isRequired; + private final @Nonnull List<ParameterizedValidator> validators; + private final Pattern namePattern; - public ResourcePropertyImpl(String name, String nameRegex, boolean isMultiple, boolean isRequired, List<ParameterizedValidator> validators) { + public ResourcePropertyImpl(String name, String nameRegex, boolean isMultiple, boolean isRequired, @Nonnull List<ParameterizedValidator> validators) { if (nameRegex != null) { this.name = null; this.namePattern = Pattern.compile(nameRegex); @@ -66,7 +68,7 @@ public class ResourcePropertyImpl implem } @Override - public List<ParameterizedValidator> getValidators() { + public @Nonnull List<ParameterizedValidator> getValidators() { return validators; } 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=1673430&r1=1673429&r2=1673430&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 Tue Apr 14 14:19:49 2015 @@ -22,6 +22,8 @@ import java.util.List; import java.util.Map.Entry; import java.util.Set; +import javax.annotation.Nonnull; + import org.apache.sling.api.resource.AbstractResourceVisitor; import org.apache.sling.api.resource.Resource; import org.apache.sling.validation.api.ValidationModel; @@ -31,7 +33,7 @@ public class ValidationResourceVisitor e private final ValidationServiceImpl validationService; private final boolean enforceValidation; - private final ValidationResultImpl result; + private final @Nonnull ValidationResultImpl result; private final Set<String> ignoredResourceTypes; private final String rootResourcePath; @@ -48,7 +50,8 @@ public class ValidationResourceVisitor e protected void visit(Resource resource) { if (isValidSubResource(resource)) { // JCR will return then primary type instead!! - ValidationModel model = validationService.getValidationModel(resource); + @SuppressWarnings("null") + ValidationModel model = validationService.getValidationModel(resource); if (model == null) { if (enforceValidation) { throw new IllegalArgumentException("No model for resource type " + resource.getResourceType() + " found."); @@ -86,7 +89,7 @@ public class ValidationResourceVisitor e return true; } - public ValidationResultImpl getResult() { + public @Nonnull ValidationResultImpl getResult() { return result; } Modified: sling/trunk/bundles/extensions/validation/core/src/main/java/org/apache/sling/validation/impl/ValidationResultImpl.java URL: http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/validation/core/src/main/java/org/apache/sling/validation/impl/ValidationResultImpl.java?rev=1673430&r1=1673429&r2=1673430&view=diff ============================================================================== --- sling/trunk/bundles/extensions/validation/core/src/main/java/org/apache/sling/validation/impl/ValidationResultImpl.java (original) +++ sling/trunk/bundles/extensions/validation/core/src/main/java/org/apache/sling/validation/impl/ValidationResultImpl.java Tue Apr 14 14:19:49 2015 @@ -24,11 +24,13 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import javax.annotation.Nonnull; + import org.apache.sling.validation.api.ValidationResult; public class ValidationResultImpl implements ValidationResult { - private Map<String, List<String>> failureMessages; + private final @Nonnull Map<String, List<String>> failureMessages; private boolean isValid; public ValidationResultImpl() { @@ -41,8 +43,9 @@ public class ValidationResultImpl implem return isValid; } - @Override - public Map<String, List<String>> getFailureMessages() { + @SuppressWarnings("null") + @Override + public @Nonnull Map<String, List<String>> getFailureMessages() { return Collections.unmodifiableMap(failureMessages); } 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=1673430&r1=1673429&r2=1673430&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 Tue Apr 14 14:19:49 2015 @@ -27,6 +27,10 @@ import java.util.Map; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import javax.annotation.CheckForNull; +import javax.annotation.Nonnull; import org.apache.commons.lang3.StringUtils; import org.apache.felix.scr.annotations.Component; @@ -84,18 +88,21 @@ public class ValidationServiceImpl imple policy = ReferencePolicy.DYNAMIC, cardinality = ReferenceCardinality.OPTIONAL_MULTIPLE ) + + @Nonnull Map<String, Validator<?>> validators = new ConcurrentHashMap<String, Validator<?>>(); @Reference private ThreadPoolManager tpm = null; // ValidationService ################################################################################################################### - @Override - public ValidationModel getValidationModel(String validatedResourceType, String resourcePath) { - if (resourcePath == null) { - throw new IllegalArgumentException("ValidationService.getValidationModel - cannot accept null as resource path"); - } - if (validatedResourceType == null) { + + + + @SuppressWarnings("unused") + public @CheckForNull ValidationModel getValidationModel(@Nonnull String validatedResourceType, String resourcePath) { + // https://bugs.eclipse.org/bugs/show_bug.cgi?id=459256 + if (validatedResourceType == null) { throw new IllegalArgumentException("ValidationService.getValidationModel - cannot accept null as resource type. Resource path was: " + resourcePath); } validatedResourceType = getRelativeResourceType(validatedResourceType); @@ -117,18 +124,19 @@ public class ValidationServiceImpl imple return model; } - @Override - public ValidationModel getValidationModel(Resource resource) { + @SuppressWarnings("null") + @Override + public @CheckForNull ValidationModel getValidationModel(@Nonnull Resource resource) { return getValidationModel(resource.getResourceType(), resource.getPath()); } @Override - public ValidationResult validate(Resource resource, ValidationModel model) { - return validate(resource, model, ""); + public @Nonnull ValidationResult validate(@Nonnull Resource resource, @Nonnull ValidationModel model) { + return new ValidationResultImpl(); //validate(resource, model, ""); } - protected ValidationResult validate(Resource resource, ValidationModel model, String relativePath) { - if (resource == null || model == null) { + protected @Nonnull ValidationResult validate(@Nonnull Resource resource, @Nonnull ValidationModel model, @Nonnull String relativePath) { + if (resource == null || model == null || relativePath == null) { throw new IllegalArgumentException("ValidationService.validate - cannot accept null parameters"); } ValidationResultImpl result = new ValidationResultImpl(); @@ -148,7 +156,8 @@ public class ValidationServiceImpl imple * @return a relative resource type (without the leading search path) * @throws IllegalArgumentException in case the resource type is starting with a "/" but not with any of the search paths. */ - protected String getRelativeResourceType(String resourceType) throws IllegalArgumentException { + @SuppressWarnings("null") + protected @Nonnull String getRelativeResourceType(@Nonnull String resourceType) throws IllegalArgumentException { if (resourceType.startsWith("/")) { LOG.debug("try to strip the search path from the resource type"); ResourceResolver rr = null; @@ -185,17 +194,18 @@ public class ValidationServiceImpl imple // validate children resources, if any for (ChildResource childResource : childResources) { // if a pattern is set we validate all children matching that pattern - if (childResource.getNamePattern() != null) { + Pattern pattern = childResource.getNamePattern(); + if (pattern != null) { boolean foundMatch = false; for (Resource child : resource.getChildren()) { - Matcher matcher = childResource.getNamePattern().matcher(child.getName()); + Matcher matcher = pattern.matcher(child.getName()); if (matcher.matches()) { validateChildResource(child, relativePath, childResource, result); foundMatch = true; } } if (!foundMatch && childResource.isRequired()) { - result.addFailureMessage(relativePath + childResource.getNamePattern().pattern(), "Missing required child resource."); + result.addFailureMessage(relativePath + pattern.pattern(), "Missing required child resource."); } } else { Resource expectedResource = resource.getChild(childResource.getName()); @@ -214,7 +224,7 @@ public class ValidationServiceImpl imple } @Override - public ValidationResult validate(ValueMap valueMap, ValidationModel model) { + public @Nonnull ValidationResult validate(@Nonnull ValueMap valueMap, @Nonnull ValidationModel model) { if (valueMap == null || model == null) { throw new IllegalArgumentException("ValidationResult.validate - cannot accept null parameters"); } @@ -224,7 +234,7 @@ public class ValidationServiceImpl imple } @Override - public ValidationResult validateAllResourceTypesInResource(Resource resource, boolean enforceValidation, Set<String> ignoredResourceTypes) + public @Nonnull ValidationResult validateAllResourceTypesInResource(@Nonnull Resource resource, boolean enforceValidation, Set<String> ignoredResourceTypes) throws IllegalStateException, IllegalArgumentException, SlingValidationException { if (ignoredResourceTypes == null) { ignoredResourceTypes = Collections.emptySet(); @@ -247,7 +257,6 @@ public class ValidationServiceImpl imple } // OSGi ################################################################################################################################ - @SuppressWarnings("unused") protected void activate(ComponentContext componentContext) { threadPool = tpm.get("Validation Service Thread Pool"); ResourceResolver rr = null; @@ -282,7 +291,6 @@ public class ValidationServiceImpl imple } } - @SuppressWarnings("unused") protected void deactivate(ComponentContext componentContext) { if (threadPool != null) { tpm.release(threadPool); @@ -299,10 +307,11 @@ public class ValidationServiceImpl imple throw new IllegalArgumentException("ValueMap may not be null"); } for (ResourceProperty resourceProperty : resourceProperties) { - if (resourceProperty.getNamePattern() != null) { + Pattern pattern = resourceProperty.getNamePattern(); + if (pattern != null) { boolean foundMatch = false; for (String key : valueMap.keySet()) { - if (resourceProperty.getNamePattern().matcher(key).matches()) { + if (pattern.matcher(key).matches()) { foundMatch = true; validateValueMap(key, valueMap, relativePath, resourceProperty, result); } @@ -363,7 +372,7 @@ public class ValidationServiceImpl imple * @param validatedResourceType the type of resource for which to scan the JCR repository for validation models * @return a {@link Trie} with the validation models; an empty trie if no model is found */ - private Trie<JCRValidationModel> searchAndStoreValidationModel(String validatedResourceType) { + private Trie<JCRValidationModel> searchAndStoreValidationModel(@Nonnull String validatedResourceType) { Trie<JCRValidationModel> modelsForResourceType = null; ResourceResolver rr = null; JCRValidationModel vm; @@ -455,9 +464,8 @@ public class ValidationServiceImpl imple return true; } - - - private void validatePropertyValue(ValidationResultImpl result, String property, String relativePath, ValueMap valueMap, List<ParameterizedValidator> validators) { + @SuppressWarnings("null") + private void validatePropertyValue(ValidationResultImpl result, String property, String relativePath, ValueMap valueMap, List<ParameterizedValidator> validators) { for (ParameterizedValidator validator : validators) { // convert the type always to an array Class<?> type = validator.getType(); @@ -469,7 +477,7 @@ public class ValidationServiceImpl imple throw new SlingValidationException("Could not generate array class for type " + type, e); } } - + // it is already validated here that the property exists in the value map Object[] typedValue = (Object[])valueMap.get(property, type); // 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)) { @@ -484,23 +492,22 @@ public class ValidationServiceImpl imple validateValue(result, typedValue, property, relativePath, valueMap, validator); } else { // call validate for each entry in the array (supports both singlevalue and multivalue) - if (typedValue.getClass().isArray()) { - Object[] array = (Object[])typedValue; - if (array.length == 1) { - validateValue(result, array[0], property, relativePath, valueMap, validator); - } else { - int n = 0; - for (Object item : array) { - validateValue(result, item, property + "[" + n++ + "]", relativePath, valueMap, validator); - } - } - } + @Nonnull Object[] array = (Object[])typedValue; + if (array.length == 1) { + validateValue(result, array[0], property, relativePath, valueMap, validator); + } else { + int n = 0; + for (Object item : array) { + validateValue(result, item, property + "[" + n++ + "]", + relativePath, valueMap, validator); + } + } } } } @SuppressWarnings("rawtypes") - private void validateValue(ValidationResultImpl result, Object value, String property, String relativePath, ValueMap valueMap, ParameterizedValidator validator) { + private void validateValue(ValidationResultImpl result, @Nonnull Object value, String property, String relativePath, @Nonnull ValueMap valueMap, ParameterizedValidator validator) { try { @SuppressWarnings("unchecked") String validatorMessage = ((Validator)validator.getValidator()).validate(value, valueMap, validator.getParameters()); Modified: sling/trunk/bundles/extensions/validation/core/src/main/java/org/apache/sling/validation/impl/util/JCRBuilder.java URL: http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/validation/core/src/main/java/org/apache/sling/validation/impl/util/JCRBuilder.java?rev=1673430&r1=1673429&r2=1673430&view=diff ============================================================================== --- sling/trunk/bundles/extensions/validation/core/src/main/java/org/apache/sling/validation/impl/util/JCRBuilder.java (original) +++ sling/trunk/bundles/extensions/validation/core/src/main/java/org/apache/sling/validation/impl/util/JCRBuilder.java Tue Apr 14 14:19:49 2015 @@ -26,6 +26,8 @@ import java.util.List; import java.util.Map; import java.util.Set; +import javax.annotation.Nonnull; + import org.apache.sling.api.resource.Resource; import org.apache.sling.api.resource.ValueMap; import org.apache.sling.api.wrappers.ValueMapDecorator; @@ -48,11 +50,11 @@ public class JCRBuilder { * Creates a set of the properties that a resource is expected to have, together with the associated validators. * * @param validatorsMap a map containing {@link Validator}s as values and their class names as values - * @param propertiesResource the resource identifying the properties node from a validation model's structure + * @param propertiesResource the resource identifying the properties node from a validation model's structure (might be {@code null}) * @return a set of properties or an empty set if no properties are defined * @see ResourceProperty */ - public static Set<ResourceProperty> buildProperties(Map<String, Validator<?>> validatorsMap, Resource propertiesResource) { + public static @Nonnull Set<ResourceProperty> buildProperties(@Nonnull Map<String, Validator<?>> validatorsMap, Resource propertiesResource) { Set<ResourceProperty> properties = new HashSet<ResourceProperty>(); if (propertiesResource != null) { for (Resource property : propertiesResource.getChildren()) { @@ -105,13 +107,14 @@ public class JCRBuilder { * @param validatorsMap a map containing {@link Validator}s as values and their class names as values * @return a list of all the children resources; the list will be empty if there are no children resources */ - public static List<ChildResource> buildChildren(Resource modelResource, Resource rootResource, - Map<String, Validator<?>> validatorsMap) { + public static @Nonnull List<ChildResource> buildChildren(@Nonnull Resource modelResource, @Nonnull Resource rootResource, + @Nonnull Map<String, Validator<?>> validatorsMap) { List<ChildResource> children = new ArrayList<ChildResource>(); Resource childrenResource = rootResource.getChild(Constants.CHILDREN); if (childrenResource != null) { for (Resource child : childrenResource.getChildren()) { - ChildResource childResource = new ChildResourceImpl(modelResource, child, validatorsMap, buildChildren(modelResource, child, validatorsMap)); + @SuppressWarnings("null") + ChildResource childResource = new ChildResourceImpl(modelResource, child, validatorsMap, buildChildren(modelResource, child, validatorsMap)); children.add(childResource); } } Modified: sling/trunk/bundles/extensions/validation/core/src/main/java/org/apache/sling/validation/impl/util/ValidatorTypeUtil.java URL: http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/validation/core/src/main/java/org/apache/sling/validation/impl/util/ValidatorTypeUtil.java?rev=1673430&r1=1673429&r2=1673430&view=diff ============================================================================== --- sling/trunk/bundles/extensions/validation/core/src/main/java/org/apache/sling/validation/impl/util/ValidatorTypeUtil.java (original) +++ sling/trunk/bundles/extensions/validation/core/src/main/java/org/apache/sling/validation/impl/util/ValidatorTypeUtil.java Tue Apr 14 14:19:49 2015 @@ -24,6 +24,8 @@ import java.lang.reflect.TypeVariable; import java.util.Map; import java.util.Map.Entry; +import javax.annotation.Nonnull; + import org.apache.commons.lang3.reflect.TypeUtils; import org.apache.sling.validation.api.Validator; @@ -34,7 +36,7 @@ public class ValidatorTypeUtil { * @param validator * @return the type parametrization value on the {@link Validator} interface */ - public static Class<?> getValidatorType(Validator<?> validator) { + public static @Nonnull Class<?> getValidatorType(Validator<?> validator) { // get all type arguments from the current validator class up to the Validator interface Map<TypeVariable<?>, java.lang.reflect.Type> typeMap = TypeUtils.getTypeArguments(validator.getClass(), Validator.class); java.lang.reflect.Type type = null; 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=1673430&r1=1673429&r2=1673430&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 Tue Apr 14 14:19:49 2015 @@ -20,6 +20,8 @@ package org.apache.sling.validation.impl import java.util.regex.Pattern; +import javax.annotation.Nonnull; + import org.apache.commons.lang3.StringUtils; import org.apache.felix.scr.annotations.Component; import org.apache.felix.scr.annotations.Service; @@ -38,7 +40,7 @@ public class RegexValidator implements V public static final String REGEX_PARAM = "regex"; @Override - public String validate(String data, ValueMap valueMap, ValueMap arguments) + public String validate(@Nonnull String data, @Nonnull ValueMap valueMap, @Nonnull ValueMap arguments) throws SlingValidationException { String regex = arguments.get(REGEX_PARAM, ""); if (StringUtils.isEmpty(regex)) { 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=1673430&r1=1673429&r2=1673430&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 Tue Apr 14 14:19:49 2015 @@ -19,6 +19,7 @@ package org.apache.sling.validation.impl; import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertThat; import static org.junit.Assert.assertTrue; import static org.mockito.Mockito.mock; @@ -30,6 +31,8 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import javax.annotation.Nonnull; + import org.apache.jackrabbit.JcrConstants; import org.apache.sling.api.resource.LoginException; import org.apache.sling.api.resource.ModifiableValueMap; @@ -55,7 +58,6 @@ import org.junit.Assert; import org.junit.Before; import org.junit.BeforeClass; import org.junit.Test; -import org.mockito.Mockito; import org.mockito.invocation.InvocationOnMock; import org.mockito.stubbing.Answer; import org.powermock.reflect.Whitebox; @@ -71,6 +73,7 @@ public class ValidationServiceImplTest { private static ResourceResolverFactory rrf; private static Resource appsValidatorsRoot; private static Resource libsValidatorsRoot; + private static Map<String, Object> primaryTypeUnstructuredMap; private ValidationServiceImpl validationService; private ResourceResolver rr; @@ -90,6 +93,9 @@ public class ValidationServiceImplTest { (Map<String, Object>) null, "sling:Folder", true); rr.close(); } + + primaryTypeUnstructuredMap = new HashMap<String, Object>(); + primaryTypeUnstructuredMap.put(JcrConstants.JCR_PRIMARYTYPE, JcrConstants.NT_UNSTRUCTURED); } @AfterClass @@ -138,11 +144,13 @@ public class ValidationServiceImplTest { // BEST MATCHING PATH = /apps/validation/1; assume the applicable paths contain /apps/validation/2 ValidationModel vm = validationService.getValidationModel("sling/validation/test", "/apps/validation/1/resource"); + Assert.assertNotNull("Could not find validation model for 'sling/validation/test'", vm); assertThat(vm.getApplicablePaths(), Matchers.hasItemInArray("/apps/validation/2")); // BEST MATCHING PATH = /apps/validation; assume the applicable paths contain /apps/validation but not // /apps/validation/1 vm = validationService.getValidationModel("sling/validation/test", "/apps/validation/resource"); + Assert.assertNotNull("Could not find validation model for 'sling/validation/test'", vm); assertThat(vm.getApplicablePaths(), Matchers.hasItemInArray("/apps/validation")); assertThat(vm.getApplicablePaths(), Matchers.not(Matchers.hasItemInArray("/apps/validation/1"))); } finally { @@ -174,9 +182,11 @@ public class ValidationServiceImplTest { // BEST MATCHING PATH = /apps/validation/1; assume the applicable paths contain /apps/validation/2 ValidationModel vm = validationService.getValidationModel("sling/validation/test", "/apps/validation/1/resource"); + Assert.assertNotNull("Could not find validation model for 'sling/validation/test'", vm); assertThat(vm.getApplicablePaths(), Matchers.hasItemInArray("/apps/validation/2")); vm = validationService.getValidationModel("sling/validation/test", "/apps/validation/3/resource"); + Assert.assertNotNull("Could not find validation model for 'sling/validation/test'", vm); assertThat(vm.getApplicablePaths(), Matchers.hasItemInArray("/apps/validation/3")); } finally { @@ -244,11 +254,10 @@ public class ValidationServiceImplTest { ValidationModel vm = validationService.getValidationModel("sling/validation/test", "/apps/validation/1/resource"); - HashMap<String, Object> hashMap = new HashMap<String, Object>() { - { - put("field1", "1"); - } - }; + Assert.assertNotNull("Could not find validation model for 'sling/validation/test'", vm); + HashMap<String, Object> hashMap = new HashMap<String, Object>(); + hashMap.put("field1", "1"); + ValueMap map = new ValueMapDecorator(hashMap); ValidationResult vr = validationService.validate(map, vm); @@ -269,9 +278,10 @@ public class ValidationServiceImplTest { Validator<String> myValidator = new Validator<String>() { @Override - public String validate(String data, ValueMap valueMap, ValueMap arguments) + public String validate(@Nonnull String data, @Nonnull ValueMap valueMap, @Nonnull ValueMap arguments) throws SlingValidationException { - Assert.assertNotNull("ValueMap parameter for validate should never be null", valueMap); + Assert.assertNotNull("data parameter for validate should never be null", data); + Assert.assertNotNull("valueMap parameter for validate should never be null", valueMap); Assert.assertNotNull("arguments parameter for validate should never be null", arguments); return null; } @@ -290,11 +300,9 @@ public class ValidationServiceImplTest { ValidationModel vm = validationService.getValidationModel("sling/validation/test", "/apps/validation/1/resource"); - HashMap<String, Object> hashMap = new HashMap<String, Object>() { - { - put("field1", "1"); - } - }; + Assert.assertNotNull("Could not find validation model for 'sling/validation/test'", vm); + HashMap<String, Object> hashMap = new HashMap<String, Object>(); + hashMap.put("field1", "1"); ValueMap map = new ValueMapDecorator(hashMap); validationService.validate(map, vm); } finally { @@ -324,14 +332,14 @@ public class ValidationServiceImplTest { property4); ValidationModel vm = validationService.getValidationModel("sling/validation/test", "/apps/validation/1/resource"); + Assert.assertNotNull("Could not find validation model for 'sling/validation/test'", vm); + // this should not be detected as missing property - HashMap<String, Object> hashMap = new HashMap<String, Object>() { - { - put("field1", new String[] {}); - put("field2", new String[] { "null" }); - put("field3", ""); - } - }; + HashMap<String, Object> hashMap = new HashMap<String, Object>(); + hashMap.put("field1", new String[] {}); + hashMap.put("field2", new String[] { "null" }); + hashMap.put("field3", ""); + ValueMap map = new ValueMapDecorator(hashMap); ValidationResult vr = validationService.validate(map, vm); Map<String, List<String>> expectedFailureMessages = new HashMap<String, List<String>>(); @@ -360,11 +368,10 @@ public class ValidationServiceImplTest { } ValidationModel vm = validationService.getValidationModel("sling/validation/test", "/apps/validation/1/resource"); - HashMap<String, Object> hashMap = new HashMap<String, Object>() { - { - put("field2", "1"); - } - }; + Assert.assertNotNull("Could not find validation model for 'sling/validation/test'", vm); + + HashMap<String, Object> hashMap = new HashMap<String, Object>(); + hashMap.put("field2", "1"); ValueMap map = new ValueMapDecorator(hashMap); ValidationResult vr = validationService.validate(map, vm); Assert.assertTrue(vr.isValid()); @@ -390,11 +397,10 @@ public class ValidationServiceImplTest { ValidationModel vm = validationService.getValidationModel("sling/validation/test", "/apps/validation/1/resource"); - HashMap<String, Object> hashMap = new HashMap<String, Object>() { - { - put("field1", ""); - } - }; + Assert.assertNotNull("Could not find validation model for 'sling/validation/test'", vm); + + HashMap<String, Object> hashMap = new HashMap<String, Object>(); + hashMap.put("field1", ""); ValueMap map = new ValueMapDecorator(hashMap); ValidationResult vr = validationService.validate(map, vm); Assert.assertFalse(vr.isValid()); @@ -425,12 +431,11 @@ public class ValidationServiceImplTest { "sling/validation/test", new String[] { "/apps/validation" }, field1, field2); ValidationModel vm = validationService.getValidationModel("sling/validation/test", "/apps/validation/1/resource"); - HashMap<String, Object> hashMap = new HashMap<String, Object>() { - { - put("field1", "HelloWorld"); - put("field2", "HelloWorld"); - } - }; + Assert.assertNotNull("Could not find validation model for 'sling/validation/test'", vm); + + HashMap<String, Object> hashMap = new HashMap<String, Object>(); + hashMap.put("field1", "HelloWorld"); + hashMap.put("field2", "HelloWorld"); ValueMap map = new ValueMapDecorator(hashMap); ValidationResult vr = validationService.validate(map, vm); assertFalse(vr.isValid()); @@ -469,38 +474,27 @@ public class ValidationServiceImplTest { ModifiableValueMap mvm = testResource.adaptTo(ModifiableValueMap.class); mvm.put("field1", "1"); - Resource childResource = rr.create(testResource, "child1", new HashMap<String, Object>() { - { - put(JcrConstants.JCR_PRIMARYTYPE, JcrConstants.NT_UNSTRUCTURED); - } - }); - - Resource resourceChild = rr.create(testResource, "child1", new HashMap<String, Object>() { - { - put(JcrConstants.JCR_PRIMARYTYPE, JcrConstants.NT_UNSTRUCTURED); - } - }); + Resource resourceChild = rr.create(testResource, "child1", primaryTypeUnstructuredMap); mvm = resourceChild.adaptTo(ModifiableValueMap.class); mvm.put("hello", "1"); // /apps/validation/1/resource/child1/grandChild1 will miss its mandatory "hello" property - Resource resourceGrandChild = rr.create(resourceChild, "grandChild1", new HashMap<String, Object>() { - { - put(JcrConstants.JCR_PRIMARYTYPE, JcrConstants.NT_UNSTRUCTURED); - } - }); + Resource resourceGrandChild = rr.create(resourceChild, "grandChild1", primaryTypeUnstructuredMap); rr.commit(); mvm = resourceGrandChild.adaptTo(ModifiableValueMap.class); mvm.put("field1", "1"); rr.commit(); + + ValidationModel vm = validationService.getValidationModel("sling/validation/test", + "/apps/validation/1/resource"); + Assert.assertNotNull("Could not find validation model for 'sling/validation/test'", vm); + + ValidationResult vr = validationService.validate(testResource, vm); + assertFalse(vr.isValid()); + assertThat(vr.getFailureMessages(), Matchers.hasKey("child1/grandChild1/hello")); + assertThat(vr.getFailureMessages().keySet(), Matchers.hasSize(1)); } - ValidationModel vm = validationService.getValidationModel("sling/validation/test", - "/apps/validation/1/resource"); - ValidationResult vr = validationService.validate(testResource, vm); - assertFalse(vr.isValid()); - assertThat(vr.getFailureMessages(), Matchers.hasKey("child1/grandChild1/hello")); - assertThat(vr.getFailureMessages().keySet(), Matchers.hasSize(1)); } finally { if (model1 != null) { rr.delete(model1); @@ -532,14 +526,12 @@ public class ValidationServiceImplTest { ModifiableValueMap mvm = testResource.adaptTo(ModifiableValueMap.class); mvm.put("field1", "1"); - rr.create(testResource, "child2", new HashMap<String, Object>() { - { - put(JcrConstants.JCR_PRIMARYTYPE, JcrConstants.NT_UNSTRUCTURED); - } - }); + rr.create(testResource, "child2",primaryTypeUnstructuredMap); rr.commit(); ValidationModel vm = validationService.getValidationModel("sling/validation/test", "/apps/validation/1/resource"); + Assert.assertNotNull("Could not find validation model for 'sling/validation/test'", vm); + ValidationResult vr = validationService.validate(testResource, vm); assertTrue(vr.isValid()); } finally { @@ -573,36 +565,26 @@ public class ValidationServiceImplTest { testResource = ResourceUtil.getOrCreateResource(rr, "/apps/validation/1/resource", JcrConstants.NT_UNSTRUCTURED, JcrConstants.NT_UNSTRUCTURED, true); - Resource childResource = rr.create(testResource, "child1", new HashMap<String, Object>() { - { - put(JcrConstants.JCR_PRIMARYTYPE, JcrConstants.NT_UNSTRUCTURED); - } - }); + rr.create(testResource, "child1", primaryTypeUnstructuredMap); ModifiableValueMap mvm = testResource.adaptTo(ModifiableValueMap.class); mvm.put("field1", "1"); - Resource resourceChild = rr.create(testResource, "child1", new HashMap<String, Object>() { - { - put(JcrConstants.JCR_PRIMARYTYPE, JcrConstants.NT_UNSTRUCTURED); - } - }); + Resource resourceChild = rr.create(testResource, "child1", primaryTypeUnstructuredMap); mvm = resourceChild.adaptTo(ModifiableValueMap.class); mvm.put("hello", "test"); - Resource resourceGrandChild = rr.create(resourceChild, "grandChild1", new HashMap<String, Object>() { - { - put(JcrConstants.JCR_PRIMARYTYPE, JcrConstants.NT_UNSTRUCTURED); - } - }); + Resource resourceGrandChild = rr.create(resourceChild, "grandChild1", primaryTypeUnstructuredMap); mvm = resourceGrandChild.adaptTo(ModifiableValueMap.class); mvm.put("hello", "test"); rr.commit(); + + ValidationModel vm = validationService.getValidationModel("sling/validation/test", + "/apps/validation/1/resource"); + assertNotNull("Could not get validation model for ", vm); + ValidationResult vr = validationService.validate(testResource, vm); + assertTrue(vr.isValid()); } - ValidationModel vm = validationService.getValidationModel("sling/validation/test", - "/apps/validation/1/resource"); - ValidationResult vr = validationService.validate(testResource, vm); - assertTrue(vr.isValid()); } finally { if (model1 != null) { rr.delete(model1); @@ -636,33 +618,23 @@ public class ValidationServiceImplTest { ModifiableValueMap mvm = testResource.adaptTo(ModifiableValueMap.class); mvm.put("field1", "1"); - Resource childResource = rr.create(testResource, "child1", new HashMap<String, Object>() { - { - put(JcrConstants.JCR_PRIMARYTYPE, JcrConstants.NT_UNSTRUCTURED); - } - }); + Resource childResource = rr.create(testResource, "child1", primaryTypeUnstructuredMap); mvm = childResource.adaptTo(ModifiableValueMap.class); mvm.put("hello", "test"); - Resource resourceChild = rr.create(testResource, "child2", new HashMap<String, Object>() { - { - put(JcrConstants.JCR_PRIMARYTYPE, JcrConstants.NT_UNSTRUCTURED); - } - }); + Resource resourceChild = rr.create(testResource, "child2", primaryTypeUnstructuredMap); mvm = resourceChild.adaptTo(ModifiableValueMap.class); mvm.put("hello2", "test"); - Resource resourceGrandChild = rr.create(resourceChild, "grandChild1", new HashMap<String, Object>() { - { - put(JcrConstants.JCR_PRIMARYTYPE, JcrConstants.NT_UNSTRUCTURED); - } - }); + Resource resourceGrandChild = rr.create(resourceChild, "grandChild1", primaryTypeUnstructuredMap); mvm = resourceGrandChild.adaptTo(ModifiableValueMap.class); mvm.put("hello", "test"); rr.commit(); ValidationModel vm = validationService.getValidationModel("sling/validation/test", "/apps/validation/1/resource"); + Assert.assertNotNull("Could not find validation model for 'sling/validation/test'", vm); + ValidationResult vr = validationService.validate(testResource, vm); assertFalse(vr.isValid()); // check for correct error message @@ -699,15 +671,14 @@ public class ValidationServiceImplTest { "sling/validation/test", new String[] { "/apps/validation" }, property, otherProperty); ValidationModel vm = validationService.getValidationModel("sling/validation/test", "/apps/validation/1/resource"); - HashMap<String, Object> hashMap = new HashMap<String, Object>() { - { - put("property1", "testvalue1"); - put("property2", "test1value1"); // does not match validator pattern - put("property3", "testvalue1"); - put("property4", "1testvalue1"); // does not match validator pattern - put("property5", "invalid"); // does not match property name pattern - } - }; + Assert.assertNotNull("Could not find validation model for 'sling/validation/test'", vm); + + HashMap<String, Object> hashMap = new HashMap<String, Object>(); + hashMap.put("property1", "testvalue1"); + hashMap.put("property2", "test1value1"); // does not match validator pattern + hashMap.put("property3", "testvalue1"); + hashMap.put("property4", "1testvalue1"); // does not match validator pattern + hashMap.put("property5", "invalid"); // does not match property name pattern ValueMap map = new ValueMapDecorator(hashMap); ValidationResult vr = validationService.validate(map, vm); assertFalse(vr.isValid()); @@ -740,11 +711,10 @@ public class ValidationServiceImplTest { "sling/validation/test", new String[] { "/apps/validation" }, property); ValidationModel vm = validationService.getValidationModel("sling/validation/test", "/apps/validation/1/resource"); - HashMap<String, Object> hashMap = new HashMap<String, Object>() { - { - put("field1", new String[] { "testvalue1", "test2value", "testvalue3" }); - } - }; + Assert.assertNotNull("Could not find validation model for 'sling/validation/test'", vm); + + HashMap<String, Object> hashMap = new HashMap<String, Object>(); + hashMap.put("field1", new String[] { "testvalue1", "test2value", "testvalue3" }); ValueMap map = new ValueMapDecorator(hashMap); ValidationResult vr = validationService.validate(map, vm); assertFalse(vr.isValid()); @@ -823,7 +793,7 @@ public class ValidationServiceImplTest { "sling/validation/test2", JcrConstants.NT_UNSTRUCTURED, true); values = grandChildResource.adaptTo(ModifiableValueMap.class); values.put("field2", "somvalue"); - ValidationResult vr = validationService.validateAllResourceTypesInResource(resource, true, + validationService.validateAllResourceTypesInResource(resource, true, Collections.singleton(JcrConstants.NT_UNSTRUCTURED)); } finally { if (resource != null) { @@ -946,16 +916,8 @@ public class ValidationServiceImplTest { private Resource createValidationModelChildResource(Resource parentResource, String name, String nameRegex, boolean isOptional, TestProperty... properties) throws PersistenceException { ResourceResolver rr = parentResource.getResourceResolver(); - Resource modelChildren = rr.create(parentResource, Constants.CHILDREN, new HashMap<String, Object>() { - { - put(JcrConstants.JCR_PRIMARYTYPE, JcrConstants.NT_UNSTRUCTURED); - } - }); - Resource child = rr.create(modelChildren, name, new HashMap<String, Object>() { - { - put(JcrConstants.JCR_PRIMARYTYPE, JcrConstants.NT_UNSTRUCTURED); - } - }); + Resource modelChildren = rr.create(parentResource, Constants.CHILDREN, primaryTypeUnstructuredMap); + Resource child = rr.create(modelChildren, name, primaryTypeUnstructuredMap); ModifiableValueMap mvm = child.adaptTo(ModifiableValueMap.class); if (nameRegex != null) { mvm.put(Constants.NAME_REGEX, nameRegex); Modified: sling/trunk/bundles/extensions/validation/core/src/test/java/org/apache/sling/validation/impl/util/ValidatorTypeUtilTest.java URL: http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/validation/core/src/test/java/org/apache/sling/validation/impl/util/ValidatorTypeUtilTest.java?rev=1673430&r1=1673429&r2=1673430&view=diff ============================================================================== --- sling/trunk/bundles/extensions/validation/core/src/test/java/org/apache/sling/validation/impl/util/ValidatorTypeUtilTest.java (original) +++ sling/trunk/bundles/extensions/validation/core/src/test/java/org/apache/sling/validation/impl/util/ValidatorTypeUtilTest.java Tue Apr 14 14:19:49 2015 @@ -19,7 +19,8 @@ package org.apache.sling.validation.impl.util; import java.util.Collection; -import java.util.Map; + +import javax.annotation.Nonnull; import org.apache.sling.api.resource.ValueMap; import org.apache.sling.validation.api.Validator; @@ -31,6 +32,7 @@ import org.apache.sling.validation.impl. import org.apache.sling.validation.impl.util.examplevalidators.StringArrayValidator; import org.apache.sling.validation.impl.util.examplevalidators.StringValidator; import org.apache.sling.validation.impl.validators.RegexValidator; +import org.hamcrest.CoreMatchers; import org.hamcrest.Matchers; import org.junit.Assert; import org.junit.Test; @@ -60,7 +62,7 @@ public class ValidatorTypeUtilTest { private class InnerStringValidator implements Validator<String> { @Override - public String validate(String data, ValueMap valueMap, ValueMap arguments) + public String validate(@Nonnull String data, @Nonnull ValueMap valueMap, @Nonnull ValueMap arguments) throws SlingValidationException { return null; } @@ -77,7 +79,7 @@ public class ValidatorTypeUtilTest { public void testGetValidatorTypeWithAnonymousClass() { Assert.assertThat((Class<String>)ValidatorTypeUtil.getValidatorType(new Validator<String>() { @Override - public String validate(String data, ValueMap valueMap, ValueMap arguments) + public String validate(@Nonnull String data, @Nonnull ValueMap valueMap, @Nonnull ValueMap arguments) throws SlingValidationException { return null; } @@ -95,7 +97,7 @@ public class ValidatorTypeUtilTest { public void testGetValidatorTypeWithCollectionType() { ValidatorTypeUtil.getValidatorType(new Validator<Collection<String>>() { @Override - public String validate(Collection<String> data, ValueMap valueMap, ValueMap arguments) + public String validate(@Nonnull Collection<String> data, @Nonnull ValueMap valueMap, @Nonnull ValueMap arguments) throws SlingValidationException { return null; } @@ -104,7 +106,7 @@ public class ValidatorTypeUtilTest { private class InnerStringValidatorWithAdditionalBaseClass extends GenericTypeParameterBaseClass<Integer> implements Validator<String> { @Override - public String validate(String data, ValueMap valueMap, ValueMap arguments) + public String validate(@Nonnull String data, @Nonnull ValueMap valueMap, @Nonnull ValueMap arguments) throws SlingValidationException { return null; } @@ -112,6 +114,7 @@ public class ValidatorTypeUtilTest { @Test public void testGetValidatorTypeWithUnrelatedSuperClass() { - Assert.assertThat((Class<String>)ValidatorTypeUtil.getValidatorType(new InnerStringValidatorWithAdditionalBaseClass()), Matchers.equalTo(String.class)); + // http://stackoverflow.com/questions/24093000/how-do-i-match-a-class-against-a-specific-class-instance-in-a-hamcrest-matche + Assert.assertThat((Class<?>)ValidatorTypeUtil.getValidatorType(new InnerStringValidatorWithAdditionalBaseClass()), Matchers.is(CoreMatchers.<Class<?>>equalTo(String.class))); } } Modified: sling/trunk/bundles/extensions/validation/core/src/test/java/org/apache/sling/validation/impl/util/examplevalidators/DateValidator.java URL: http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/validation/core/src/test/java/org/apache/sling/validation/impl/util/examplevalidators/DateValidator.java?rev=1673430&r1=1673429&r2=1673430&view=diff ============================================================================== --- sling/trunk/bundles/extensions/validation/core/src/test/java/org/apache/sling/validation/impl/util/examplevalidators/DateValidator.java (original) +++ sling/trunk/bundles/extensions/validation/core/src/test/java/org/apache/sling/validation/impl/util/examplevalidators/DateValidator.java Tue Apr 14 14:19:49 2015 @@ -20,6 +20,8 @@ package org.apache.sling.validation.impl import java.util.Date; +import javax.annotation.Nonnull; + import org.apache.sling.api.resource.ValueMap; import org.apache.sling.validation.api.Validator; import org.apache.sling.validation.api.exceptions.SlingValidationException; @@ -27,7 +29,7 @@ import org.apache.sling.validation.api.e public class DateValidator implements Validator<Date> { @Override - public String validate(Date data, ValueMap valueMap, ValueMap arguments) throws SlingValidationException { + public String validate(@Nonnull Date data, @Nonnull ValueMap valueMap, @Nonnull ValueMap arguments) throws SlingValidationException { return null; } Modified: sling/trunk/bundles/extensions/validation/core/src/test/java/org/apache/sling/validation/impl/util/examplevalidators/ExtendedStringValidator.java URL: http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/validation/core/src/test/java/org/apache/sling/validation/impl/util/examplevalidators/ExtendedStringValidator.java?rev=1673430&r1=1673429&r2=1673430&view=diff ============================================================================== --- sling/trunk/bundles/extensions/validation/core/src/test/java/org/apache/sling/validation/impl/util/examplevalidators/ExtendedStringValidator.java (original) +++ sling/trunk/bundles/extensions/validation/core/src/test/java/org/apache/sling/validation/impl/util/examplevalidators/ExtendedStringValidator.java Tue Apr 14 14:19:49 2015 @@ -18,13 +18,15 @@ */ package org.apache.sling.validation.impl.util.examplevalidators; +import javax.annotation.Nonnull; + import org.apache.sling.api.resource.ValueMap; import org.apache.sling.validation.api.exceptions.SlingValidationException; public class ExtendedStringValidator extends AbstractValidatorWithAdditionalType<Boolean, String, Integer> { @Override - public String validate(String data, ValueMap valueMap, ValueMap arguments) + public String validate(@Nonnull String data, @Nonnull ValueMap valueMap, @Nonnull ValueMap arguments) throws SlingValidationException { return null; } Modified: sling/trunk/bundles/extensions/validation/core/src/test/java/org/apache/sling/validation/impl/util/examplevalidators/IntegerValidator.java URL: http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/validation/core/src/test/java/org/apache/sling/validation/impl/util/examplevalidators/IntegerValidator.java?rev=1673430&r1=1673429&r2=1673430&view=diff ============================================================================== --- sling/trunk/bundles/extensions/validation/core/src/test/java/org/apache/sling/validation/impl/util/examplevalidators/IntegerValidator.java (original) +++ sling/trunk/bundles/extensions/validation/core/src/test/java/org/apache/sling/validation/impl/util/examplevalidators/IntegerValidator.java Tue Apr 14 14:19:49 2015 @@ -18,6 +18,8 @@ */ package org.apache.sling.validation.impl.util.examplevalidators; +import javax.annotation.Nonnull; + import org.apache.sling.api.resource.ValueMap; import org.apache.sling.validation.api.Validator; import org.apache.sling.validation.api.exceptions.SlingValidationException; @@ -25,7 +27,7 @@ import org.apache.sling.validation.api.e public class IntegerValidator implements Validator<Integer> { @Override - public String validate(Integer data, ValueMap valueMap, ValueMap arguments) + public String validate(@Nonnull Integer data, @Nonnull ValueMap valueMap, @Nonnull ValueMap arguments) throws SlingValidationException { return null; } Modified: sling/trunk/bundles/extensions/validation/core/src/test/java/org/apache/sling/validation/impl/util/examplevalidators/StringArrayValidator.java URL: http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/validation/core/src/test/java/org/apache/sling/validation/impl/util/examplevalidators/StringArrayValidator.java?rev=1673430&r1=1673429&r2=1673430&view=diff ============================================================================== --- sling/trunk/bundles/extensions/validation/core/src/test/java/org/apache/sling/validation/impl/util/examplevalidators/StringArrayValidator.java (original) +++ sling/trunk/bundles/extensions/validation/core/src/test/java/org/apache/sling/validation/impl/util/examplevalidators/StringArrayValidator.java Tue Apr 14 14:19:49 2015 @@ -18,6 +18,8 @@ */ package org.apache.sling.validation.impl.util.examplevalidators; +import javax.annotation.Nonnull; + import org.apache.sling.api.resource.ValueMap; import org.apache.sling.validation.api.Validator; import org.apache.sling.validation.api.exceptions.SlingValidationException; @@ -25,7 +27,7 @@ import org.apache.sling.validation.api.e public class StringArrayValidator implements Validator<String[]> { @Override - public String validate(String[] data, ValueMap valueMap, ValueMap arguments) + public String validate(@Nonnull String[] data, @Nonnull ValueMap valueMap, @Nonnull ValueMap arguments) throws SlingValidationException { return null; } Modified: sling/trunk/bundles/extensions/validation/core/src/test/java/org/apache/sling/validation/impl/util/examplevalidators/StringValidator.java URL: http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/validation/core/src/test/java/org/apache/sling/validation/impl/util/examplevalidators/StringValidator.java?rev=1673430&r1=1673429&r2=1673430&view=diff ============================================================================== --- sling/trunk/bundles/extensions/validation/core/src/test/java/org/apache/sling/validation/impl/util/examplevalidators/StringValidator.java (original) +++ sling/trunk/bundles/extensions/validation/core/src/test/java/org/apache/sling/validation/impl/util/examplevalidators/StringValidator.java Tue Apr 14 14:19:49 2015 @@ -18,6 +18,8 @@ */ package org.apache.sling.validation.impl.util.examplevalidators; +import javax.annotation.Nonnull; + import org.apache.sling.api.resource.ValueMap; import org.apache.sling.validation.api.Validator; import org.apache.sling.validation.api.exceptions.SlingValidationException; @@ -25,7 +27,7 @@ import org.apache.sling.validation.api.e public class StringValidator implements Validator<String> { @Override - public String validate(String data, ValueMap valueMap, ValueMap arguments) + public String validate(@Nonnull String data, @Nonnull ValueMap valueMap, @Nonnull ValueMap arguments) throws SlingValidationException { return null; } Modified: sling/trunk/bundles/extensions/validation/examples/pom.xml URL: http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/validation/examples/pom.xml?rev=1673430&r1=1673429&r2=1673430&view=diff ============================================================================== --- sling/trunk/bundles/extensions/validation/examples/pom.xml (original) +++ sling/trunk/bundles/extensions/validation/examples/pom.xml Tue Apr 14 14:19:49 2015 @@ -24,7 +24,7 @@ <parent> <groupId>org.apache.sling</groupId> <artifactId>sling</artifactId> - <version>22</version> + <version>23-SNAPSHOT</version> <relativePath/> </parent> 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=1673430&r1=1673429&r2=1673430&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 Tue Apr 14 14:19:49 2015 @@ -1,4 +1,21 @@ -<%@page session="false" import=" +<!-- + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +--><%@page session="false" import=" java.util.Map, java.util.List, org.apache.sling.api.resource.Resource,