You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by as...@apache.org on 2014/04/28 12:37:37 UTC

svn commit: r1590592 - in /sling/trunk/bundles/resourceresolver/src/main/java/org/apache/sling/resourceresolver/impl: ./ mapping/

Author: asanso
Date: Mon Apr 28 10:37:36 2014
New Revision: 1590592

URL: http://svn.apache.org/r1590592
Log:
SLING-3428 - vanity paths might be shadowed by url mappings

Modified:
    sling/trunk/bundles/resourceresolver/src/main/java/org/apache/sling/resourceresolver/impl/CommonResourceResolverFactoryImpl.java
    sling/trunk/bundles/resourceresolver/src/main/java/org/apache/sling/resourceresolver/impl/ResourceResolverFactoryActivator.java
    sling/trunk/bundles/resourceresolver/src/main/java/org/apache/sling/resourceresolver/impl/mapping/MapConfigurationProvider.java
    sling/trunk/bundles/resourceresolver/src/main/java/org/apache/sling/resourceresolver/impl/mapping/MapEntries.java

Modified: sling/trunk/bundles/resourceresolver/src/main/java/org/apache/sling/resourceresolver/impl/CommonResourceResolverFactoryImpl.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/resourceresolver/src/main/java/org/apache/sling/resourceresolver/impl/CommonResourceResolverFactoryImpl.java?rev=1590592&r1=1590591&r2=1590592&view=diff
==============================================================================
--- sling/trunk/bundles/resourceresolver/src/main/java/org/apache/sling/resourceresolver/impl/CommonResourceResolverFactoryImpl.java (original)
+++ sling/trunk/bundles/resourceresolver/src/main/java/org/apache/sling/resourceresolver/impl/CommonResourceResolverFactoryImpl.java Mon Apr 28 10:37:36 2014
@@ -199,6 +199,10 @@ public class CommonResourceResolverFacto
     public boolean isOptimizeAliasResolutionEnabled() {
         return this.activator.isOptimizeAliasResolutionEnabled();
     }
+    
+    public boolean hasVanityPathPrecedence() {
+        return this.activator.hasVanityPathPrecedence();
+    }
 
     public List<VanityPathConfig> getVanityPathConfig() {
         final String[] includes = this.activator.getVanityPathWhiteList();

Modified: sling/trunk/bundles/resourceresolver/src/main/java/org/apache/sling/resourceresolver/impl/ResourceResolverFactoryActivator.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/resourceresolver/src/main/java/org/apache/sling/resourceresolver/impl/ResourceResolverFactoryActivator.java?rev=1590592&r1=1590591&r2=1590592&view=diff
==============================================================================
--- sling/trunk/bundles/resourceresolver/src/main/java/org/apache/sling/resourceresolver/impl/ResourceResolverFactoryActivator.java (original)
+++ sling/trunk/bundles/resourceresolver/src/main/java/org/apache/sling/resourceresolver/impl/ResourceResolverFactoryActivator.java Mon Apr 28 10:37:36 2014
@@ -206,7 +206,14 @@ public class ResourceResolverFactoryActi
                     "such a list is configured,vanity paths from resources starting with this prefix " +
                     " are not considered. If the list is empty, all vanity paths are used.")
     private static final String PROP_DENIED_VANITY_PATH_PREFIX = "resource.resolver.vanitypath.blacklist";
-
+    
+    private static final boolean DEFAULT_VANITY_PATH_PRECEDENCE = false;
+    @Property(boolValue = DEFAULT_VANITY_PATH_PRECEDENCE ,
+              label = "Vanity Path Precedence",
+              description ="This flag controls whether vanity paths" +
+                      " will have precedence over existing /etc/map mapping")
+    private static final String PROP_VANITY_PATH_PRECEDENCE = "resource.resolver.vanity.precedence";
+ 
     /** Tracker for the resource decorators. */
     private final ResourceDecoratorTracker resourceDecoratorTracker = new ResourceDecoratorTracker();
 
@@ -252,6 +259,10 @@ public class ResourceResolverFactoryActi
 
     /** alias resource resolution optimization enabled? */
     private boolean enableOptimizeAliasResolution = DEFAULT_ENABLE_OPTIMIZE_ALIAS_RESOLUTION;
+    
+    /** vanity paths will have precedence over existing /etc/map mapping? */
+    private boolean vanityPathPrecedence = DEFAULT_VANITY_PATH_PRECEDENCE;
+
 
     /** Vanity path whitelist */
     private String[] vanityPathWhiteList;
@@ -332,6 +343,10 @@ public class ResourceResolverFactoryActi
     public String[] getVanityPathBlackList() {
         return this.vanityPathBlackList;
     }
+    
+    public boolean hasVanityPathPrecedence() {
+        return this.vanityPathPrecedence;
+    }
 
     // ---------- SCR Integration ---------------------------------------------
 
@@ -435,6 +450,8 @@ public class ResourceResolverFactoryActi
 
         this.enableOptimizeAliasResolution = PropertiesUtil.toBoolean(properties.get(PROP_ENABLE_OPTIMIZE_ALIAS_RESOLUTION), DEFAULT_ENABLE_OPTIMIZE_ALIAS_RESOLUTION);
 
+        this.vanityPathPrecedence = PropertiesUtil.toBoolean(properties.get(PROP_VANITY_PATH_PRECEDENCE), DEFAULT_VANITY_PATH_PRECEDENCE);
+        
         final BundleContext bc = componentContext.getBundleContext();
 
         // check for required property

Modified: sling/trunk/bundles/resourceresolver/src/main/java/org/apache/sling/resourceresolver/impl/mapping/MapConfigurationProvider.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/resourceresolver/src/main/java/org/apache/sling/resourceresolver/impl/mapping/MapConfigurationProvider.java?rev=1590592&r1=1590591&r2=1590592&view=diff
==============================================================================
--- sling/trunk/bundles/resourceresolver/src/main/java/org/apache/sling/resourceresolver/impl/mapping/MapConfigurationProvider.java (original)
+++ sling/trunk/bundles/resourceresolver/src/main/java/org/apache/sling/resourceresolver/impl/mapping/MapConfigurationProvider.java Mon Apr 28 10:37:36 2014
@@ -41,6 +41,8 @@ public interface MapConfigurationProvide
     boolean isVanityPathEnabled();
 
     boolean isOptimizeAliasResolutionEnabled();
+    
+    boolean hasVanityPathPrecedence();
 
     public class VanityPathConfig implements Comparable<VanityPathConfig> {
         public final boolean isExclude;

Modified: sling/trunk/bundles/resourceresolver/src/main/java/org/apache/sling/resourceresolver/impl/mapping/MapEntries.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/resourceresolver/src/main/java/org/apache/sling/resourceresolver/impl/mapping/MapEntries.java?rev=1590592&r1=1590591&r2=1590592&view=diff
==============================================================================
--- sling/trunk/bundles/resourceresolver/src/main/java/org/apache/sling/resourceresolver/impl/mapping/MapEntries.java (original)
+++ sling/trunk/bundles/resourceresolver/src/main/java/org/apache/sling/resourceresolver/impl/mapping/MapEntries.java Mon Apr 28 10:37:36 2014
@@ -112,6 +112,8 @@ public class MapEntries implements Event
     private final boolean enabledVanityPaths;
 
     private final boolean enableOptimizeAliasResolution;
+    
+    private final boolean vanityPathPrecedence;
 
     private final List<VanityPathConfig> vanityPathConfig;
 
@@ -130,6 +132,7 @@ public class MapEntries implements Event
         this.enabledVanityPaths = true;
         this.enableOptimizeAliasResolution = true;
         this.vanityPathConfig = null;
+        this.vanityPathPrecedence = false;
     }
 
     @SuppressWarnings("unchecked")
@@ -141,6 +144,7 @@ public class MapEntries implements Event
         this.enabledVanityPaths = factory.isVanityPathEnabled();
         this.vanityPathConfig = factory.getVanityPathConfig();
         this.enableOptimizeAliasResolution = factory.isOptimizeAliasResolutionEnabled();
+        this.vanityPathPrecedence = factory.hasVanityPathPrecedence();
         this.eventAdmin = eventAdmin;
 
         this.resolveMapsMap = Collections.singletonMap(GLOBAL_LIST_KEY, (List<MapEntry>)Collections.EMPTY_LIST);
@@ -342,7 +346,7 @@ public class MapEntries implements Event
             key = requestPath.substring(secondIndex);
         }
 
-        return new MapEntryIterator(key, resolveMapsMap);
+        return new MapEntryIterator(key, resolveMapsMap, vanityPathPrecedence);
     }
 
     public Collection<MapEntry> getMapMaps() {
@@ -851,11 +855,14 @@ public class MapEntries implements Event
 
         private Iterator<MapEntry> specialIterator;
         private MapEntry nextSpecial;
+        
+        private boolean vanityPathPrecedence;
 
-        public MapEntryIterator(final String startKey, final Map<String, List<MapEntry>> resolveMapsMap) {
+        public MapEntryIterator(final String startKey, final Map<String, List<MapEntry>> resolveMapsMap, final boolean vanityPathPrecedence) {
             this.key = startKey;
             this.resolveMapsMap = resolveMapsMap;
             this.globalListIterator = this.resolveMapsMap.get(GLOBAL_LIST_KEY).iterator();
+            this.vanityPathPrecedence = vanityPathPrecedence;
             this.seek();
         }
 
@@ -923,12 +930,18 @@ public class MapEntries implements Event
             if (this.nextSpecial == null) {
                 this.next = this.nextGlobal;
                 this.nextGlobal = null;
-            } else if (this.nextGlobal == null) {
-                this.next = this.nextSpecial;
-                this.nextSpecial = null;
-            } else if (this.nextGlobal.getPattern().length() >= this.nextSpecial.getPattern().length()) {
-                this.next = this.nextGlobal;
-                this.nextGlobal = null;
+            } else if (!this.vanityPathPrecedence){
+                if (this.nextGlobal == null) {
+                    this.next = this.nextSpecial;
+                    this.nextSpecial = null;
+                } else if (this.nextGlobal.getPattern().length() >= this.nextSpecial.getPattern().length()) {
+                    this.next = this.nextGlobal;
+                    this.nextGlobal = null;
+
+                }else {
+                    this.next = this.nextSpecial;
+                    this.nextSpecial = null;
+                }                
             } else {
                 this.next = this.nextSpecial;
                 this.nextSpecial = null;