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 2017/03/03 13:12:45 UTC

svn commit: r1785290 - in /sling/trunk/bundles/extensions/validation/core: ./ src/main/java/org/apache/sling/validation/impl/ src/main/java/org/apache/sling/validation/impl/util/ src/test/java/org/apache/sling/validation/core/it/tests/ src/test/java/or...

Author: kwin
Date: Fri Mar  3 13:12:44 2017
New Revision: 1785290

URL: http://svn.apache.org/viewvc?rev=1785290&view=rev
Log:
SLING-6581 use PatriciaTrie from commons collections and get rid of our own implementation

Removed:
    sling/trunk/bundles/extensions/validation/core/src/main/java/org/apache/sling/validation/impl/util/Trie.java
    sling/trunk/bundles/extensions/validation/core/src/main/java/org/apache/sling/validation/impl/util/TrieNode.java
    sling/trunk/bundles/extensions/validation/core/src/test/java/org/apache/sling/validation/impl/util/TrieTest.java
Modified:
    sling/trunk/bundles/extensions/validation/core/pom.xml
    sling/trunk/bundles/extensions/validation/core/src/main/java/org/apache/sling/validation/impl/ValidationModelRetrieverImpl.java
    sling/trunk/bundles/extensions/validation/core/src/test/java/org/apache/sling/validation/core/it/tests/ValidationTestSupport.java
    sling/trunk/bundles/extensions/validation/core/src/test/java/org/apache/sling/validation/impl/ValidationModelRetrieverImplTest.java

Modified: sling/trunk/bundles/extensions/validation/core/pom.xml
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/validation/core/pom.xml?rev=1785290&r1=1785289&r2=1785290&view=diff
==============================================================================
--- sling/trunk/bundles/extensions/validation/core/pom.xml (original)
+++ sling/trunk/bundles/extensions/validation/core/pom.xml Fri Mar  3 13:12:44 2017
@@ -133,6 +133,12 @@
             <scope>provided</scope>
         </dependency>
         <dependency>
+            <groupId>org.apache.commons</groupId>
+            <artifactId>commons-collections4</artifactId>
+            <version>4.1</version>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
             <groupId>org.apache.sling</groupId>
             <artifactId>org.apache.sling.serviceusermapper</artifactId>
             <version>1.2.0</version>
@@ -216,12 +222,6 @@
             <artifactId>slf4j-simple</artifactId>
              <scope>test</scope>
          </dependency>
-         <dependency>
-            <groupId>org.apache.commons</groupId>
-            <artifactId>commons-collections4</artifactId>
-            <version>4.1</version>
-            <scope>test</scope>
-        </dependency>
 
         <!-- Apache Felix -->
         <dependency>

Modified: sling/trunk/bundles/extensions/validation/core/src/main/java/org/apache/sling/validation/impl/ValidationModelRetrieverImpl.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/validation/core/src/main/java/org/apache/sling/validation/impl/ValidationModelRetrieverImpl.java?rev=1785290&r1=1785289&r2=1785290&view=diff
==============================================================================
--- sling/trunk/bundles/extensions/validation/core/src/main/java/org/apache/sling/validation/impl/ValidationModelRetrieverImpl.java (original)
+++ sling/trunk/bundles/extensions/validation/core/src/main/java/org/apache/sling/validation/impl/ValidationModelRetrieverImpl.java Fri Mar  3 13:12:44 2017
@@ -22,16 +22,18 @@ import java.util.ArrayList;
 import java.util.Collection;
 import java.util.List;
 import java.util.Map;
+import java.util.SortedMap;
 import java.util.concurrent.ConcurrentHashMap;
 
 import javax.annotation.CheckForNull;
 import javax.annotation.Nonnull;
 
+import org.apache.commons.collections4.trie.PatriciaTrie;
+import org.apache.commons.lang3.StringUtils;
 import org.apache.sling.api.resource.LoginException;
 import org.apache.sling.api.resource.ResourceResolver;
 import org.apache.sling.api.resource.ResourceResolverFactory;
 import org.apache.sling.validation.impl.model.MergedValidationModel;
-import org.apache.sling.validation.impl.util.Trie;
 import org.apache.sling.validation.model.ValidationModel;
 import org.apache.sling.validation.model.spi.ValidationModelProvider;
 import org.apache.sling.validation.spi.Validator;
@@ -114,20 +116,28 @@ public class ValidationModelRetrieverImp
     }
 
     private @CheckForNull ValidationModel getModel(@Nonnull String resourceType, String resourcePath) {
+        PatriciaTrie<ValidationModel> modelsForResourceType = fillTrieForResourceType(resourceType);
         ValidationModel model = null;
-        Trie<ValidationModel> modelsForResourceType = fillTrieForResourceType(resourceType);
-
-        model = modelsForResourceType.getElementForLongestMatchingKey(resourcePath).getValue();
+        // for empty/null resource paths, always return the entry stored for ""
+        if (StringUtils.isEmpty(resourcePath)) {
+            model = modelsForResourceType.get("");
+        } else {
+            // get longest prefix entry, which still matches
+            SortedMap<String, ValidationModel> modelMap = modelsForResourceType.subMap("", resourcePath + "/");
+            if (!modelMap.isEmpty()) {
+                model =  modelMap.get(modelMap.lastKey());
+            }
+        }
         if (model == null && !modelsForResourceType.isEmpty()) {
-            LOG.warn("Although model for resource type {} is available, it is not allowed for path {}", resourceType,
+            LOG.warn("Although at least one model for resource type '{}' is available, none of them are allowed to be applied to path {}", resourceType,
                     resourcePath);
         }
         return model;
     }
 
-    private @Nonnull Trie<ValidationModel> fillTrieForResourceType(@Nonnull String resourceType) {
+    private @Nonnull PatriciaTrie<ValidationModel> fillTrieForResourceType(@Nonnull String resourceType) {
         // create a new (empty) trie
-        Trie<ValidationModel> modelsForResourceType = new Trie<ValidationModel>();
+        PatriciaTrie<ValidationModel> modelsForResourceType = new PatriciaTrie<ValidationModel>();
 
         // fill trie with data from model providers (all models for the given resource type, independent of resource path)
         // lowest ranked model provider inserts first (i.e. higher ranked should overwrite)
@@ -137,7 +147,7 @@ public class ValidationModelRetrieverImp
             for (ValidationModel model : models) {
                 for (String applicablePath : model.getApplicablePaths()) {
                     LOG.debug("Found validation model for resource type {} for applicable path {}", resourceType, applicablePath);
-                    modelsForResourceType.insert(applicablePath, model);
+                    modelsForResourceType.put(applicablePath, model);
                 }
             }
             if (models.isEmpty()) {

Modified: sling/trunk/bundles/extensions/validation/core/src/test/java/org/apache/sling/validation/core/it/tests/ValidationTestSupport.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/validation/core/src/test/java/org/apache/sling/validation/core/it/tests/ValidationTestSupport.java?rev=1785290&r1=1785289&r2=1785290&view=diff
==============================================================================
--- sling/trunk/bundles/extensions/validation/core/src/test/java/org/apache/sling/validation/core/it/tests/ValidationTestSupport.java (original)
+++ sling/trunk/bundles/extensions/validation/core/src/test/java/org/apache/sling/validation/core/it/tests/ValidationTestSupport.java Fri Mar  3 13:12:44 2017
@@ -87,7 +87,8 @@ public class ValidationTestSupport exten
         return composite(
             slingLaunchpadOakTar(workingDirectory, httpPort),
             slingExtensionI18n(),
-            slingInstallerProviderJcr()
+            slingInstallerProviderJcr(),
+            mavenBundle().groupId("org.apache.commons").artifactId("commons-collections4").versionAsInProject()
         );
     }
 

Modified: sling/trunk/bundles/extensions/validation/core/src/test/java/org/apache/sling/validation/impl/ValidationModelRetrieverImplTest.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/validation/core/src/test/java/org/apache/sling/validation/impl/ValidationModelRetrieverImplTest.java?rev=1785290&r1=1785289&r2=1785290&view=diff
==============================================================================
--- sling/trunk/bundles/extensions/validation/core/src/test/java/org/apache/sling/validation/impl/ValidationModelRetrieverImplTest.java (original)
+++ sling/trunk/bundles/extensions/validation/core/src/test/java/org/apache/sling/validation/impl/ValidationModelRetrieverImplTest.java Fri Mar  3 13:12:44 2017
@@ -166,17 +166,28 @@ public class ValidationModelRetrieverImp
         applicablePathPerResourceType.put("test/type", "/content/site1");
         applicablePathPerResourceType.put("test/type", "/content/site1/subnode/test");
         applicablePathPerResourceType.put("test/type", "/content/site1/subnode");
+        applicablePathPerResourceType.put("test/type", "/content/site1/subnode/test/somepage/within");
+        applicablePathPerResourceType.put("test/type", "/content/site1/subnode/test/testoutside");
 
-        ValidationModel model = validationModelRetriever.getModel("test/type", "/content/site1/subnode/test/somepage",
-                false);
+        ValidationModel model = validationModelRetriever.getModel("test/type", "/content/site1/subnode/test/somepage", false);
         Assert.assertNotNull(model);
         Assert.assertThat(model.getApplicablePaths(), Matchers.contains("/content/site1/subnode/test"));
     }
+    
+    @Test
+    public void testGetModelWithExactlyMatchingApplicablePath() {
+        applicablePathPerResourceType.put("test/type", "/content/site1/subnode/test/somepage");
+        applicablePathPerResourceType.put("test/type", "/content/site1/subnode/test/somepage/");
+
+        ValidationModel model = validationModelRetriever.getModel("test/type", "/content/site1/subnode/test/somepage", false);
+        Assert.assertNotNull(model);
+        Assert.assertThat(model.getApplicablePaths(), Matchers.contains("/content/site1/subnode/test/somepage"));
+    }
 
     @Test
     public void testGetModelWithNullApplicablePathPath() {
         applicablePathPerResourceType.put("test/type", "/content/site1");
-        applicablePathPerResourceType.put("test/type", null);
+        applicablePathPerResourceType.put("test/type", "");
         applicablePathPerResourceType.put("test/type", "/content/site1/subnode");
 
         ValidationModel model = validationModelRetriever.getModel("test/type", null, false);