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


Reply via email to