You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by kw...@apache.org on 2016/04/20 19:53:43 UTC

svn commit: r1740178 - in /sling/trunk/bundles/extensions/validation/core/src: main/java/org/apache/sling/validation/impl/ValidationServiceImpl.java test/java/org/apache/sling/validation/impl/ValidationServiceImplTest.java

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