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>