Author: kwin Date: Wed Apr 20 17:53:43 2016 New Revision: 1740178 URL: http://svn.apache.org/viewvc?rev=1740178&view=rev Log: SLING-5674 prevent ISE being thrown when acting on NonExistingResources
Modified: sling/trunk/bundles/extensions/validation/core/src/main/java/org/apache/sling/validation/impl/ValidationServiceImpl.java sling/trunk/bundles/extensions/validation/core/src/test/java/org/apache/sling/validation/impl/ValidationServiceImplTest.java 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=1740178&r1=1740177&r2=1740178&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 Wed Apr 20 17:53:43 2016 @@ -20,6 +20,7 @@ package org.apache.sling.validation.impl import java.util.Arrays; import java.util.Collection; +import java.util.Collections; import java.util.List; import java.util.function.Predicate; import java.util.regex.Matcher; @@ -37,10 +38,12 @@ import org.apache.sling.api.resource.Log import org.apache.sling.api.resource.Resource; import org.apache.sling.api.resource.ResourceResolver; import org.apache.sling.api.resource.ResourceResolverFactory; +import org.apache.sling.api.resource.ResourceUtil; import org.apache.sling.api.resource.ValueMap; +import org.apache.sling.api.wrappers.ValueMapDecorator; +import org.apache.sling.validation.SlingValidationException; import org.apache.sling.validation.ValidationResult; import org.apache.sling.validation.ValidationService; -import org.apache.sling.validation.SlingValidationException; import org.apache.sling.validation.model.ChildResource; import org.apache.sling.validation.model.ParameterizedValidator; import org.apache.sling.validation.model.ResourceProperty; @@ -145,11 +148,18 @@ public class ValidationServiceImpl imple throw new IllegalArgumentException("ValidationService.validate - cannot accept null parameters"); } CompositeValidationResult result = new CompositeValidationResult(); + final ValueMap valueMap; + if (ResourceUtil.isNonExistingResource(resource)) { + // NonExistingResource can not adapt to a ValueMap, therefore just use the empty map here + valueMap = new ValueMapDecorator(Collections.emptyMap()); + } else { + valueMap = resource.adaptTo(ValueMap.class); + } // validate direct properties of the resource - validateValueMap(resource.adaptTo(ValueMap.class), resource, relativePath, model.getResourceProperties(), result ); + validateValueMap(valueMap, resource, relativePath, model.getResourceProperties(), result ); - // validate children resources, if any + // validate child resources, if any validateChildren(resource, relativePath, model.getChildren(), result); return result; } 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=1740178&r1=1740177&r2=1740178&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 Wed Apr 20 17:53:43 2016 @@ -32,6 +32,7 @@ import javax.jcr.RepositoryException; import org.apache.jackrabbit.JcrConstants; import org.apache.sling.api.resource.LoginException; import org.apache.sling.api.resource.ModifiableValueMap; +import org.apache.sling.api.resource.NonExistingResource; import org.apache.sling.api.resource.PersistenceException; import org.apache.sling.api.resource.Resource; import org.apache.sling.api.resource.ResourceResolver; @@ -190,6 +191,30 @@ public class ValidationServiceImplTest { Assert.assertThat(vr.getFailures(), Matchers.<ValidationFailure> hasItem(new DefaultValidationFailure("field2", 0, RegexValidator.I18N_KEY_PATTERN_DOES_NOT_MATCH, TEST_REGEX))); } + // see https://issues.apache.org/jira/browse/SLING-5674 + @Test + public void testNonExistingResource() throws Exception { + propertyBuilder.validator(new RegexValidator(), 0, RegexValidator.REGEX_PARAM, "\\d"); // accept any digits + ResourceProperty property = propertyBuilder.build("field1"); + modelBuilder.resourceProperty(property); + + ChildResource modelChild = new ChildResourceImpl("child", null, true, Collections.singletonList(property), Collections.emptyList()); + modelBuilder.childResource(modelChild); + + modelChild = new ChildResourceImpl("optionalChild", null, false, Collections.singletonList(property), Collections.emptyList()); + modelBuilder.childResource(modelChild); + + ValidationModel vm = modelBuilder.build("sometype"); + ResourceResolver rr = context.resourceResolver(); + Resource nonExistingResource = new NonExistingResource(rr, "non-existing-resource"); + ValidationResult vr = validationService.validate(nonExistingResource, vm); + Assert.assertFalse("resource should have been considered invalid", vr.isValid()); + Assert.assertThat(vr.getFailures(), Matchers.<ValidationFailure>containsInAnyOrder( + new DefaultValidationFailure("", 0, ValidationServiceImpl.I18N_KEY_MISSING_REQUIRED_PROPERTY_WITH_NAME, "field1"), + new DefaultValidationFailure("", 0, ValidationServiceImpl.I18N_KEY_MISSING_REQUIRED_CHILD_RESOURCE_WITH_NAME, "child") + )); + } + @Test public void testResourceWithMissingGrandChildProperty() throws Exception { propertyBuilder.validator(new RegexValidator(), 0, RegexValidator.REGEX_PARAM, "\\d"); // accept any digits @@ -443,6 +468,16 @@ public class ValidationServiceImplTest { new DefaultValidationFailure("child2", null, ValidationServiceImpl.I18N_KEY_MISSING_REQUIRED_PROPERTY_WITH_NAME, "field2"))); } + // see https://issues.apache.org/jira/browse/SLING-5674 + @Test + public void testValidateResourceRecursivelyOnNonExistingResource() throws Exception { + ResourceResolver rr = context.resourceResolver(); + Resource nonExistingResource = new NonExistingResource(rr, "non-existing-resource"); + + ValidationResult vr = validationService.validateResourceRecursively(nonExistingResource, true, null, true); + Assert.assertTrue("resource should have been considered valid", vr.isValid()); + } + @Test(expected = IllegalArgumentException.class) public void testValidateResourceRecursivelyWithMissingValidationModel() throws Exception { // set model retriever which never retrieves anything