You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by mp...@apache.org on 2015/12/09 16:47:02 UTC

svn commit: r1718890 - in /sling/trunk/contrib/extensions/distribution: api/src/main/java/org/apache/sling/distribution/ core/ core/src/main/java/org/apache/sling/distribution/serialization/ core/src/main/java/org/apache/sling/distribution/serializatio...

Author: mpetria
Date: Wed Dec  9 15:47:02 2015
New Revision: 1718890

URL: http://svn.apache.org/viewvc?rev=1718890&view=rev
Log:
SLING-5367: allow distribution request filters

Modified:
    sling/trunk/contrib/extensions/distribution/api/src/main/java/org/apache/sling/distribution/DistributionRequest.java
    sling/trunk/contrib/extensions/distribution/api/src/main/java/org/apache/sling/distribution/SimpleDistributionRequest.java
    sling/trunk/contrib/extensions/distribution/core/pom.xml
    sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/serialization/DistributionPackageInfo.java
    sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/serialization/impl/vlt/FileVaultDistributionPackageBuilder.java
    sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/serialization/impl/vlt/JcrVaultDistributionPackageBuilder.java
    sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/serialization/impl/vlt/VltUtils.java
    sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/util/RequestUtils.java
    sling/trunk/contrib/extensions/distribution/it/pom.xml

Modified: sling/trunk/contrib/extensions/distribution/api/src/main/java/org/apache/sling/distribution/DistributionRequest.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/distribution/api/src/main/java/org/apache/sling/distribution/DistributionRequest.java?rev=1718890&r1=1718889&r2=1718890&view=diff
==============================================================================
--- sling/trunk/contrib/extensions/distribution/api/src/main/java/org/apache/sling/distribution/DistributionRequest.java (original)
+++ sling/trunk/contrib/extensions/distribution/api/src/main/java/org/apache/sling/distribution/DistributionRequest.java Wed Dec  9 15:47:02 2015
@@ -23,6 +23,7 @@ import aQute.bnd.annotation.ProviderType
 import javax.annotation.CheckForNull;
 import javax.annotation.Nonnull;
 import java.util.Arrays;
+import java.util.Set;
 
 /**
  * A {@link org.apache.sling.distribution.DistributionRequest} represents the need from the caller to have
@@ -33,7 +34,7 @@ public interface DistributionRequest {
 
 
     /**
-     * get the {@link DistributionRequestType} associated with this request
+     * Get the {@link DistributionRequestType} associated with this request
      *
      * @return the type of the request as a {@link DistributionRequestType}
      */
@@ -41,14 +42,13 @@ public interface DistributionRequest {
     public DistributionRequestType getRequestType();
 
     /**
-     * get the paths for this distribution request
+     * Get the root paths for this distribution request
      *
      * @return an array of paths
      */
-    @CheckForNull
+    @Nonnull
     public String[] getPaths();
 
-
     /**
      * Returns whether the paths are covering the entire subtree (deep) or just the specified nodes (shallow)
      *
@@ -58,4 +58,16 @@ public interface DistributionRequest {
     public boolean isDeep(@Nonnull String path);
 
 
+
+    /**
+     * Get the filters applicable for a specific path
+     * +/foo/.* - include all content under /foo
+     * -/foo - exclude /foo node
+     *
+     * filters are checked in order and the last matched filter determines inclusion/exclusion
+     *
+     * @return an array of filters
+     */
+    @Nonnull
+    public String[] getFilters(String path);
 }

Modified: sling/trunk/contrib/extensions/distribution/api/src/main/java/org/apache/sling/distribution/SimpleDistributionRequest.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/distribution/api/src/main/java/org/apache/sling/distribution/SimpleDistributionRequest.java?rev=1718890&r1=1718889&r2=1718890&view=diff
==============================================================================
--- sling/trunk/contrib/extensions/distribution/api/src/main/java/org/apache/sling/distribution/SimpleDistributionRequest.java (original)
+++ sling/trunk/contrib/extensions/distribution/api/src/main/java/org/apache/sling/distribution/SimpleDistributionRequest.java Wed Dec  9 15:47:02 2015
@@ -22,7 +22,9 @@ import aQute.bnd.annotation.ProviderType
 
 import javax.annotation.Nonnull;
 import java.util.Arrays;
+import java.util.HashMap;
 import java.util.HashSet;
+import java.util.Map;
 import java.util.Set;
 
 /**
@@ -34,6 +36,7 @@ public final class SimpleDistributionReq
 
     private final DistributionRequestType requestType;
     private final Set<String> deepPaths;
+    private final Map<String, String[]> pathFilters;
     private final String[] paths;
 
     /**
@@ -57,15 +60,28 @@ public final class SimpleDistributionReq
 
 
     /**
-     * Creates a distribution request with "shallow" paths.
+     * Creates a distribution request with additional "deep" paths.
      * @param requestType the request type
      * @param paths the array of paths to be distributed
      * @param deepPaths the set of paths that are to be distributed in depth (with all their children)
      */
     public SimpleDistributionRequest(@Nonnull DistributionRequestType requestType, @Nonnull String[] paths, @Nonnull Set<String> deepPaths) {
+        this(requestType, paths, deepPaths, new HashMap<String, String[]>());
+    }
+
+
+    /**
+     * Creates a distribution request with "deep" paths and filters.
+     * @param requestType the request type
+     * @param paths the array of paths to be distributed
+     * @param deepPaths the set of paths that are to be distributed in depth (with all their children)
+     * @param pathFilters the filters applicable for each path
+     */
+    public SimpleDistributionRequest(@Nonnull DistributionRequestType requestType, @Nonnull String[] paths, @Nonnull Set<String> deepPaths, @Nonnull Map<String, String[]> pathFilters) {
         this.requestType = requestType;
         this.paths = paths;
         this.deepPaths = deepPaths;
+        this.pathFilters = pathFilters;
     }
 
     /**
@@ -96,12 +112,17 @@ public final class SimpleDistributionReq
         return deepPaths.contains(path);
     }
 
+    @Nonnull
+    public String[] getFilters(String path) {
+        String[] filters = pathFilters.get(path);
+        return filters != null ? filters : new String[0];
+    }
+
     @Override
     public String toString() {
         return "SimpleDistributionRequest{" +
                 "requestType=" + requestType +
                 ", paths=" + Arrays.toString(paths) +
-                ", deep=" + Arrays.toString(deepPaths.toArray(new String[0])) +
                 '}';
     }
 

Modified: sling/trunk/contrib/extensions/distribution/core/pom.xml
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/distribution/core/pom.xml?rev=1718890&r1=1718889&r2=1718890&view=diff
==============================================================================
--- sling/trunk/contrib/extensions/distribution/core/pom.xml (original)
+++ sling/trunk/contrib/extensions/distribution/core/pom.xml Wed Dec  9 15:47:02 2015
@@ -112,7 +112,7 @@
         <dependency>
             <groupId>org.apache.sling</groupId>
             <artifactId>org.apache.sling.distribution.api</artifactId>
-            <version>0.2.0</version>
+            <version>0.2.1-SNAPSHOT</version>
         </dependency>
         <dependency>
             <groupId>org.apache.sling</groupId>

Modified: sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/serialization/DistributionPackageInfo.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/serialization/DistributionPackageInfo.java?rev=1718890&r1=1718889&r2=1718890&view=diff
==============================================================================
--- sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/serialization/DistributionPackageInfo.java (original)
+++ sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/serialization/DistributionPackageInfo.java Wed Dec  9 15:47:02 2015
@@ -113,7 +113,6 @@ public final class DistributionPackageIn
         return "DistributionPackageInfo{" +
                 " request.type=" + get(PROPERTY_REQUEST_TYPE, DistributionRequestType.class) +
                 ", request.paths=" + Arrays.toString(get(PROPERTY_REQUEST_PATHS, String[].class)) +
-                ", request.deepPaths=" + Arrays.toString(get(PROPERTY_REQUEST_DEEP_PATHS, String[].class)) +
                 '}';
     }
 }

Modified: sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/serialization/impl/vlt/FileVaultDistributionPackageBuilder.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/serialization/impl/vlt/FileVaultDistributionPackageBuilder.java?rev=1718890&r1=1718889&r2=1718890&view=diff
==============================================================================
--- sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/serialization/impl/vlt/FileVaultDistributionPackageBuilder.java (original)
+++ sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/serialization/impl/vlt/FileVaultDistributionPackageBuilder.java Wed Dec  9 15:47:02 2015
@@ -23,6 +23,7 @@ import javax.jcr.Session;
 import java.io.File;
 import java.io.IOException;
 import java.io.InputStream;
+import java.util.List;
 import java.util.TreeMap;
 import java.util.UUID;
 
@@ -64,7 +65,7 @@ public class FileVaultDistributionPackag
 
     private final String[] packageRoots;
     private final File tempDirectory;
-    private final TreeMap<String, PathFilterSet> filters;
+    private final TreeMap<String, List<String>> filters;
 
     public FileVaultDistributionPackageBuilder(String type, Packaging packaging, ImportMode importMode, AccessControlHandling aclHandling, String[] packageRoots, String[] filterRules, String tempFilesFolder) {
         super(type);

Modified: sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/serialization/impl/vlt/JcrVaultDistributionPackageBuilder.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/serialization/impl/vlt/JcrVaultDistributionPackageBuilder.java?rev=1718890&r1=1718889&r2=1718890&view=diff
==============================================================================
--- sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/serialization/impl/vlt/JcrVaultDistributionPackageBuilder.java (original)
+++ sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/serialization/impl/vlt/JcrVaultDistributionPackageBuilder.java Wed Dec  9 15:47:02 2015
@@ -27,6 +27,7 @@ import javax.jcr.Session;
 import java.io.File;
 import java.io.IOException;
 import java.io.InputStream;
+import java.util.List;
 import java.util.Properties;
 import java.util.TreeMap;
 import java.util.UUID;
@@ -75,7 +76,7 @@ public class JcrVaultDistributionPackage
     private final String[] packageRoots;
     private final String tempPackagesNode;
     private final File tempDirectory;
-    private final TreeMap<String, PathFilterSet> filters;
+    private final TreeMap<String, List<String>> filters;
 
     public JcrVaultDistributionPackageBuilder(String type, Packaging packaging, ImportMode importMode, AccessControlHandling aclHandling, String[] packageRoots, String[] filterRules, String tempFilesFolder) {
         super(type);

Modified: sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/serialization/impl/vlt/VltUtils.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/serialization/impl/vlt/VltUtils.java?rev=1718890&r1=1718889&r2=1718890&view=diff
==============================================================================
--- sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/serialization/impl/vlt/VltUtils.java (original)
+++ sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/serialization/impl/vlt/VltUtils.java Wed Dec  9 15:47:02 2015
@@ -26,8 +26,11 @@ import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStream;
 import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashMap;
 import java.util.HashSet;
 import java.util.List;
+import java.util.Map;
 import java.util.NavigableMap;
 import java.util.Properties;
 import java.util.Set;
@@ -35,7 +38,9 @@ import java.util.TreeMap;
 
 import org.apache.commons.io.FileUtils;
 import org.apache.commons.io.IOUtils;
+import org.apache.jackrabbit.util.Text;
 import org.apache.jackrabbit.vault.fs.api.ImportMode;
+import org.apache.jackrabbit.vault.fs.api.PathFilter;
 import org.apache.jackrabbit.vault.fs.api.PathFilterSet;
 import org.apache.jackrabbit.vault.fs.api.WorkspaceFilter;
 import org.apache.jackrabbit.vault.fs.config.DefaultMetaInf;
@@ -62,12 +67,12 @@ public class VltUtils {
 
     final static Logger log = LoggerFactory.getLogger(VltUtils.class);
 
-    public static WorkspaceFilter createFilter(DistributionRequest distributionRequest, NavigableMap<String, PathFilterSet> filters) {
+    public static WorkspaceFilter createFilter(DistributionRequest distributionRequest, NavigableMap<String, List<String>> filters) {
         DefaultWorkspaceFilter filter = new DefaultWorkspaceFilter();
 
         for (String path : distributionRequest.getPaths()) {
-            boolean deep = distributionRequest.isDeep(path);
-            PathFilterSet filterSet = createFilterSet(path, deep, filters);
+
+            PathFilterSet filterSet = createFilterSet(path, filters, distributionRequest);
             filter.add(filterSet);
         }
 
@@ -92,24 +97,45 @@ public class VltUtils {
         return paths;
     }
 
-    private static PathFilterSet createFilterSet(String path, boolean deep, NavigableMap<String, PathFilterSet> filters) {
+    private static PathFilterSet createFilterSet(String path, NavigableMap<String, List<String>> globalFilters, DistributionRequest distributionRequest) {
+        boolean deep = distributionRequest.isDeep(path);
         PathFilterSet filterSet = new PathFilterSet(path);
 
         if (!deep) {
             filterSet.addInclude(new DefaultPathFilter(path));
-        } else {
+        }
 
-            // add the most specific filter rules
-            for (String key : filters.descendingKeySet()) {
-                if (path.startsWith(key)) {
-                    filterSet.addAll(filters.get(key));
-                    break;
-                }
+
+        List<String> patterns = new ArrayList<String>();
+
+        // add the most specific filter rules
+        for (String key : globalFilters.descendingKeySet()) {
+            if (path.startsWith(key)) {
+                patterns.addAll(globalFilters.get(key));
+                break;
+            }
+        }
+
+        String[] requestFilters = distributionRequest.getFilters(path);
+
+        if (requestFilters != null) {
+            patterns.addAll(Arrays.asList(requestFilters));
+        }
+
+        for (String pattern : patterns) {
+            PathFilterSet.Entry<DefaultPathFilter> entry = extractPathPattern(pattern);
+
+            if (entry.isInclude()) {
+                filterSet.addInclude(entry.getFilter());
+            } else {
+                filterSet.addExclude(entry.getFilter());
             }
         }
+
         return filterSet;
     }
 
+
     public static ExportOptions getExportOptions(WorkspaceFilter filter, String[] packageRoots,
                                                  String packageGroup,
                                                  String packageName,
@@ -271,9 +297,15 @@ public class VltUtils {
         return path.substring(0, idx);
     }
 
-    public static TreeMap<String, PathFilterSet> parseFilters(String[] filters) {
+    public static String appendMatchAll(String path) {
+        path = path.endsWith("/") ? path : path + "/";
+        path = path + ".*";
+        return path;
+    }
+
+    public static TreeMap<String, List<String>> parseFilters(String[] filters) {
 
-        TreeMap<String, PathFilterSet> result = new TreeMap<String, PathFilterSet>();
+        TreeMap<String, List<String>> result = new TreeMap<String, List<String>>();
 
         if (filters == null || filters.length == 0) {
             return result;
@@ -287,7 +319,7 @@ public class VltUtils {
                     continue;
                 }
 
-                PathFilterSet filterSet = new PathFilterSet();
+                List<String> filterSet = new ArrayList<String>();
 
                 for (int i = 1; i < filterParts.length; i++) {
                     String filterPart = SettingsUtils.removeEmptyEntry(filterParts[i]);
@@ -295,11 +327,7 @@ public class VltUtils {
                         continue;
                     }
 
-                    if (filterPart.startsWith("+")) {
-                        filterSet.addInclude(new DefaultPathFilter(filterPart.substring(1)));
-                    } else if (filterPart.startsWith("-")) {
-                        filterSet.addExclude(new DefaultPathFilter(filterPart.substring(1)));
-                    }
+                    filterSet.add(filterPart);
                 }
 
                 result.put(path, filterSet);
@@ -320,6 +348,9 @@ public class VltUtils {
 
         Set<String> deepPaths = new HashSet<String>();
         List<String> paths = new ArrayList<String>();
+        Map<String, String[]> filters = new HashMap<String, String[]>();
+
+
 
         for (String path : request.getPaths()) {
             if (VltUtils.findParent(path, "rep:policy") != null) {
@@ -338,8 +369,24 @@ public class VltUtils {
             } else {
                 paths.add(path);
             }
+
+            filters.put(path, request.getFilters(path));
         }
 
-        return new SimpleDistributionRequest(requestType, paths.toArray(new String[0]), deepPaths);
+        return new SimpleDistributionRequest(requestType, paths.toArray(new String[0]), deepPaths, filters);
+    }
+
+
+    public static PathFilterSet.Entry<DefaultPathFilter> extractPathPattern(String pattern) {
+        PathFilterSet.Entry<DefaultPathFilter> result = null;
+        if (pattern.startsWith("+")) {
+            result = new PathFilterSet.Entry<DefaultPathFilter>(new DefaultPathFilter(pattern.substring(1)), true);
+        } else if (pattern.startsWith("-")) {
+            result = new PathFilterSet.Entry<DefaultPathFilter>(new DefaultPathFilter(pattern.substring(1)), false);
+        } else {
+            result = new PathFilterSet.Entry<DefaultPathFilter>(new DefaultPathFilter(pattern), true);
+        }
+
+        return result;
     }
 }

Modified: sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/util/RequestUtils.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/util/RequestUtils.java?rev=1718890&r1=1718889&r2=1718890&view=diff
==============================================================================
--- sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/util/RequestUtils.java (original)
+++ sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/util/RequestUtils.java Wed Dec  9 15:47:02 2015
@@ -43,6 +43,10 @@ public class RequestUtils {
             deep = true;
         }
 
+        if (paths == null) {
+            paths = new String[0];
+        }
+
 
         return new SimpleDistributionRequest(DistributionRequestType.fromName(action), deep, paths);
     }

Modified: sling/trunk/contrib/extensions/distribution/it/pom.xml
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/distribution/it/pom.xml?rev=1718890&r1=1718889&r2=1718890&view=diff
==============================================================================
--- sling/trunk/contrib/extensions/distribution/it/pom.xml (original)
+++ sling/trunk/contrib/extensions/distribution/it/pom.xml Wed Dec  9 15:47:02 2015
@@ -428,7 +428,7 @@
         <dependency>
             <groupId>org.apache.sling</groupId>
             <artifactId>org.apache.sling.distribution.api</artifactId>
-            <version>0.2.0</version>
+            <version>0.2.1-SNAPSHOT</version>
         </dependency>
         <dependency>
             <groupId>org.apache.sling</groupId>