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>