Author: mpetria
Date: Fri Dec 5 09:55:53 2014
New Revision: 1643219
URL: http://svn.apache.org/viewvc?rev=1643219&view=rev
Log:
SLING-3836: adding shallow distribution option to requests
Added:
sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/serialization/impl/vlt/VltUtils.java
Modified:
sling/trunk/contrib/extensions/distribution/api/src/main/java/org/apache/sling/distribution/communication/DistributionParameter.java
sling/trunk/contrib/extensions/distribution/api/src/main/java/org/apache/sling/distribution/communication/DistributionRequest.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/servlet/DistributionPackageExporterServlet.java
sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/util/RequestUtils.java
sling/trunk/contrib/extensions/distribution/it/src/test/java/org/apache/sling/distribution/it/DistributionUtils.java
sling/trunk/contrib/extensions/distribution/it/src/test/java/org/apache/sling/distribution/it/ForwardDistributionTest.java
Modified:
sling/trunk/contrib/extensions/distribution/api/src/main/java/org/apache/sling/distribution/communication/DistributionParameter.java
URL:
http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/distribution/api/src/main/java/org/apache/sling/distribution/communication/DistributionParameter.java?rev=1643219&r1=1643218&r2=1643219&view=diff
==============================================================================
---
sling/trunk/contrib/extensions/distribution/api/src/main/java/org/apache/sling/distribution/communication/DistributionParameter.java
(original)
+++
sling/trunk/contrib/extensions/distribution/api/src/main/java/org/apache/sling/distribution/communication/DistributionParameter.java
Fri Dec 5 09:55:53 2014
@@ -26,7 +26,8 @@ public enum DistributionParameter {
QUEUE("queue"),
TYPE("type"),
ACTION("action"),
- PATH("path");
+ PATH("path"),
+ DEEP("deep");
private final String name;
Modified:
sling/trunk/contrib/extensions/distribution/api/src/main/java/org/apache/sling/distribution/communication/DistributionRequest.java
URL:
http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/distribution/api/src/main/java/org/apache/sling/distribution/communication/DistributionRequest.java?rev=1643219&r1=1643218&r2=1643219&view=diff
==============================================================================
---
sling/trunk/contrib/extensions/distribution/api/src/main/java/org/apache/sling/distribution/communication/DistributionRequest.java
(original)
+++
sling/trunk/contrib/extensions/distribution/api/src/main/java/org/apache/sling/distribution/communication/DistributionRequest.java
Fri Dec 5 09:55:53 2014
@@ -28,22 +28,39 @@ import java.util.Arrays;
public final class DistributionRequest {
- private final DistributionRequestType actionType;
+ private final DistributionRequestType requestType;
+ private final boolean deep;
private final String[] paths;
- public DistributionRequest(@Nonnull DistributionRequestType actionType,
@Nonnull String... paths) {
- this.actionType = actionType;
+ /**
+ * Creates distribution request with "deep" or "shallow" paths.
+ * @param requestType the request type
+ * @param isDeep is <code>true</code> if all paths are "deep" and is
<code>false</code> if all paths are "shallow"
+ * @param paths the array of paths to be distributed
+ */
+ public DistributionRequest(@Nonnull DistributionRequestType requestType,
boolean isDeep, @Nonnull String... paths) {
+ this.requestType = requestType;
+ deep = isDeep;
this.paths = paths;
}
/**
+ * Creates a distribution request with "shallow" paths.
+ * @param requestType the request type
+ * @param paths the array of paths to be distributed
+ */
+ public DistributionRequest(@Nonnull DistributionRequestType requestType,
@Nonnull String... paths) {
+ this(requestType, false, paths);
+ }
+
+ /**
* get the {@link DistributionRequestType} associated with this request
*
- * @return the type of actionType for request as a {@link
DistributionRequestType}
+ * @return the type of the request as a {@link DistributionRequestType}
*/
public DistributionRequestType getRequestType() {
- return actionType;
+ return requestType;
}
/**
@@ -55,11 +72,22 @@ public final class DistributionRequest {
return paths;
}
+
+ /**
+ * Returns whether the paths are covering the entire subtree (deep) or
just the specified nodes (shallow)
+ * @return <code>true</code> if the paths are deep
+ */
+ public boolean isDeep() {
+ return deep;
+ }
+
@Override
public String toString() {
return "DistributionRequest{" +
- "actionType=" + actionType +
+ ", requestType=" + requestType +
", paths=" + Arrays.toString(paths) +
'}';
}
+
+
}
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=1643219&r1=1643218&r2=1643219&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
Fri Dec 5 09:55:53 2014
@@ -28,6 +28,7 @@ import java.util.UUID;
import org.apache.commons.io.IOUtils;
import org.apache.jackrabbit.vault.fs.api.ImportMode;
import org.apache.jackrabbit.vault.fs.api.PathFilterSet;
+import org.apache.jackrabbit.vault.fs.api.WorkspaceFilter;
import org.apache.jackrabbit.vault.fs.config.DefaultMetaInf;
import org.apache.jackrabbit.vault.fs.config.DefaultWorkspaceFilter;
import org.apache.jackrabbit.vault.fs.io.AccessControlHandling;
@@ -89,27 +90,15 @@ public class FileVaultDistributionPackag
// TODO : no tokens
final String[] paths = request.getPaths();
+ final boolean deep = request.isDeep();
- DefaultWorkspaceFilter filter = new DefaultWorkspaceFilter();
- DefaultMetaInf inf = new DefaultMetaInf();
- ExportOptions opts = new ExportOptions();
- for (String path : paths) {
- filter.add(new PathFilterSet(path));
- }
- inf.setFilter(filter);
-
- Properties props = new Properties();
String packageGroup = "sling/distribution";
- props.setProperty(VaultPackage.NAME_GROUP, packageGroup);
String packageName = PACKAGING_TYPE + "_" +
System.currentTimeMillis() + "_" + UUID.randomUUID();
- props.setProperty(VaultPackage.NAME_NAME, packageName);
- props.setProperty(VaultPackage.NAME_VERSION, VERSION);
- inf.setProperties(props);
- log.debug("assembling package {}", packageGroup + '/' +
packageName + "-" + VERSION);
+ WorkspaceFilter filter = VltUtils.createFilter(paths, deep);
+ ExportOptions opts = VltUtils.getExportOptions(filter,
packageGroup, packageName, VERSION);
- opts.setMetaInf(inf);
- opts.setRootPath("/");
+ log.debug("assembling package {}", packageGroup + '/' +
packageName + "-" + VERSION);
File tmpFile = File.createTempFile("rp-vlt-create-" +
System.nanoTime(), ".zip");
VaultPackage vaultPackage =
packaging.getPackageManager().assemble(session, opts, tmpFile);
return new FileVaultDistributionPackage(vaultPackage);
@@ -172,23 +161,9 @@ public class FileVaultDistributionPackag
File file = new File(distributionPackage.getId());
if (file.exists()) {
VaultPackage pkg = packaging.getPackageManager().open(file);
- ImportOptions opts = new ImportOptions();
- if (aclHandling != null) {
- opts.setAccessControlHandling(aclHandling);
- log.debug("using acl handling {}", aclHandling);
- }
- else {
- // default to overwrite
-
opts.setAccessControlHandling(AccessControlHandling.OVERWRITE);
- }
- if (importMode != null) {
- opts.setImportMode(importMode);
- log.debug("using import mode {}", importMode);
- }
- else {
- // default to replace
- opts.setImportMode(ImportMode.REPLACE);
- }
+ ImportOptions opts = VltUtils.getImportOptions(aclHandling,
importMode);
+
+ log.debug("using import mode {} and acl {}",
opts.getImportMode(), opts.getAccessControlHandling());
pkg.extract(session, opts);
return true;
}
Added:
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=1643219&view=auto
==============================================================================
---
sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/serialization/impl/vlt/VltUtils.java
(added)
+++
sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/serialization/impl/vlt/VltUtils.java
Fri Dec 5 09:55:53 2014
@@ -0,0 +1,101 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.sling.distribution.serialization.impl.vlt;
+
+
+
+import org.apache.jackrabbit.vault.fs.api.ImportMode;
+import org.apache.jackrabbit.vault.fs.api.PathFilterSet;
+import org.apache.jackrabbit.vault.fs.api.WorkspaceFilter;
+import org.apache.jackrabbit.vault.fs.config.DefaultMetaInf;
+import org.apache.jackrabbit.vault.fs.config.DefaultWorkspaceFilter;
+import org.apache.jackrabbit.vault.fs.filter.DefaultPathFilter;
+import org.apache.jackrabbit.vault.fs.io.AccessControlHandling;
+import org.apache.jackrabbit.vault.fs.io.ImportOptions;
+import org.apache.jackrabbit.vault.packaging.ExportOptions;
+import org.apache.jackrabbit.vault.packaging.VaultPackage;
+
+import java.util.Properties;
+
+/**
+ * Utility class for creating vlt filters and import/export options
+ */
+public class VltUtils {
+
+ public static WorkspaceFilter createFilter(String[] paths, boolean deep) {
+ DefaultWorkspaceFilter filter = new DefaultWorkspaceFilter();
+
+ for (String path : paths) {
+ PathFilterSet filterSet = createFilterSet(path, deep);
+ filter.add(filterSet);
+ }
+
+ return filter;
+ }
+
+ private static PathFilterSet createFilterSet(String path, boolean deep) {
+ PathFilterSet filterSet = new PathFilterSet(path);
+
+ if (!deep) {
+ filterSet.addInclude(new DefaultPathFilter(path));
+ }
+ return filterSet;
+ }
+
+ public static ExportOptions getExportOptions(WorkspaceFilter filter,
+ String packageGroup,
+ String packageName,
+ String packageVersion) {
+ DefaultMetaInf inf = new DefaultMetaInf();
+ ExportOptions opts = new ExportOptions();
+ inf.setFilter(filter);
+
+ Properties props = new Properties();
+ props.setProperty(VaultPackage.NAME_GROUP, packageGroup);
+ props.setProperty(VaultPackage.NAME_NAME, packageName);
+ props.setProperty(VaultPackage.NAME_VERSION, packageVersion);
+ inf.setProperties(props);
+
+ opts.setMetaInf(inf);
+ opts.setRootPath("/");
+
+ return opts;
+ }
+
+ public static ImportOptions getImportOptions(AccessControlHandling
aclHandling, ImportMode importMode) {
+ ImportOptions opts = new ImportOptions();
+ if (aclHandling != null) {
+ opts.setAccessControlHandling(aclHandling);
+ }
+ else {
+ // default to overwrite
+ opts.setAccessControlHandling(AccessControlHandling.OVERWRITE);
+ }
+ if (importMode != null) {
+ opts.setImportMode(importMode);
+ }
+ else {
+ // default to update
+ opts.setImportMode(ImportMode.UPDATE);
+ }
+
+ return opts;
+ }
+}
Modified:
sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/servlet/DistributionPackageExporterServlet.java
URL:
http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/servlet/DistributionPackageExporterServlet.java?rev=1643219&r1=1643218&r2=1643219&view=diff
==============================================================================
---
sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/servlet/DistributionPackageExporterServlet.java
(original)
+++
sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/servlet/DistributionPackageExporterServlet.java
Fri Dec 5 09:55:53 2014
@@ -73,6 +73,7 @@ public class DistributionPackageExporter
for (DistributionPackage distributionPackage :
distributionPackages) {
if (distributionPackage != null) {
+ consumed++;
InputStream inputStream = null;
int bytesCopied = -1;
try {
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=1643219&r1=1643218&r2=1643219&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
Fri Dec 5 09:55:53 2014
@@ -35,16 +35,27 @@ public class RequestUtils {
public static DistributionRequest fromServletRequest(HttpServletRequest
request) {
String action =
request.getParameter(DistributionParameter.ACTION.toString());
String[] paths =
request.getParameterValues(DistributionParameter.PATH.toString());
+ String deepParam =
request.getParameter(DistributionParameter.DEEP.toString());
- return new
DistributionRequest(DistributionRequestType.fromName(action), paths);
+ boolean deep = false;
+ if ("true".equals(deepParam)) {
+ deep = true;
+ }
+
+
+ return new
DistributionRequest(DistributionRequestType.fromName(action), deep, paths);
}
public static URI appendDistributionRequest(URI uri, DistributionRequest
distributionRequest) throws URISyntaxException {
URIBuilder uriBuilder = new URIBuilder(uri);
uriBuilder.addParameter(DistributionParameter.ACTION.toString(),
distributionRequest.getRequestType().name());
+ if (distributionRequest.isDeep()) {
+ uriBuilder.addParameter(DistributionParameter.DEEP.toString(),
"true");
+ }
for (String path : distributionRequest.getPaths()) {
uriBuilder.addParameter(DistributionParameter.PATH.toString(),
path);
}
+
return uriBuilder.build();
}
Modified:
sling/trunk/contrib/extensions/distribution/it/src/test/java/org/apache/sling/distribution/it/DistributionUtils.java
URL:
http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/distribution/it/src/test/java/org/apache/sling/distribution/it/DistributionUtils.java?rev=1643219&r1=1643218&r2=1643219&view=diff
==============================================================================
---
sling/trunk/contrib/extensions/distribution/it/src/test/java/org/apache/sling/distribution/it/DistributionUtils.java
(original)
+++
sling/trunk/contrib/extensions/distribution/it/src/test/java/org/apache/sling/distribution/it/DistributionUtils.java
Fri Dec 5 09:55:53 2014
@@ -105,15 +105,26 @@ public class DistributionUtils {
public static void distribute(SlingInstance slingInstance, String
agentName, DistributionRequestType action, String... paths) throws IOException {
String agentResource = agentUrl(agentName);
- executeDistributionRequest(slingInstance, 202, agentResource, action,
paths);
+ executeDistributionRequest(slingInstance, 202, agentResource, action,
false, paths);
}
- public static String executeDistributionRequest(SlingInstance
slingInstance, int status, String resource, DistributionRequestType action,
String... paths) throws IOException {
+ public static void distributeDeep(SlingInstance slingInstance, String
agentName, DistributionRequestType action, String... paths) throws IOException {
+ String agentResource = agentUrl(agentName);
+
+ executeDistributionRequest(slingInstance, 202, agentResource, action,
true, paths);
+ }
+
+ public static String executeDistributionRequest(SlingInstance
slingInstance, int status, String resource, DistributionRequestType action,
boolean deep, String... paths) throws IOException {
List<String> args = new ArrayList<String>();
args.add(DistributionParameter.ACTION.toString());
args.add(action.toString());
+ if (deep) {
+ args.add(DistributionParameter.DEEP.toString());
+ args.add("true");
+ }
+
if (paths != null) {
for (String path : paths) {
args.add(DistributionParameter.PATH.toString());
@@ -125,9 +136,9 @@ public class DistributionUtils {
}
public static String doExport(SlingInstance slingInstance, String
exporterName, DistributionRequestType action, String... paths) throws
IOException {
- String agentResource = exporterUrl(exporterName);
+ String exporterUrl = exporterUrl(exporterName);
- return executeDistributionRequest(slingInstance, 200, agentResource,
action, paths);
+ return executeDistributionRequest(slingInstance, 200, exporterUrl,
action, false, paths);
}
public static String doImport(SlingInstance slingInstance, String
importerName, byte[] bytes) throws IOException {
Modified:
sling/trunk/contrib/extensions/distribution/it/src/test/java/org/apache/sling/distribution/it/ForwardDistributionTest.java
URL:
http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/distribution/it/src/test/java/org/apache/sling/distribution/it/ForwardDistributionTest.java?rev=1643219&r1=1643218&r2=1643219&view=diff
==============================================================================
---
sling/trunk/contrib/extensions/distribution/it/src/test/java/org/apache/sling/distribution/it/ForwardDistributionTest.java
(original)
+++
sling/trunk/contrib/extensions/distribution/it/src/test/java/org/apache/sling/distribution/it/ForwardDistributionTest.java
Fri Dec 5 09:55:53 2014
@@ -25,6 +25,7 @@ import static org.apache.sling.distribut
import static
org.apache.sling.distribution.it.DistributionUtils.assertNotExists;
import static
org.apache.sling.distribution.it.DistributionUtils.createRandomNode;
import static org.apache.sling.distribution.it.DistributionUtils.distribute;
+import static
org.apache.sling.distribution.it.DistributionUtils.distributeDeep;
/**
* Integration test for forward distribution
@@ -47,4 +48,74 @@ public class ForwardDistributionTest ext
assertNotExists(publishClient, nodePath);
}
+ @Test
+ public void testShallowAddTreeContent() throws Exception {
+ String nodePath = createRandomNode(authorClient,
"/content/forward_add_" + System.nanoTime());
+ assertExists(authorClient, nodePath);
+
+ String childPath = nodePath + "/child";
+ authorClient.createNode(childPath);
+ assertExists(authorClient, childPath);
+
+ distribute(author, "publish", DistributionRequestType.ADD, nodePath);
+ assertExists(publishClient, nodePath);
+ assertNotExists(publishClient, childPath);
+ }
+
+ @Test
+ public void testDeepAddTreeContent() throws Exception {
+ String nodePath = createRandomNode(authorClient,
"/content/forward_add_" + System.nanoTime());
+ assertExists(authorClient, nodePath);
+
+ String childPath = nodePath + "/child";
+ authorClient.createNode(childPath);
+ assertExists(authorClient, childPath);
+
+ distributeDeep(author, "publish", DistributionRequestType.ADD,
nodePath);
+ assertExists(publishClient, nodePath);
+ assertExists(publishClient, childPath);
+ }
+
+
+ @Test
+ public void testShallowUpdateTreeContent() throws Exception {
+ String nodePath = createRandomNode(authorClient,
"/content/forward_add_" + System.nanoTime());
+ assertExists(authorClient, nodePath);
+
+ String child1Path = nodePath + "/child1";
+ authorClient.createNode(child1Path);
+ assertExists(authorClient, child1Path);
+
+ String child2Path = nodePath + "/child2";
+
+ publishClient.createNode(child2Path);
+ assertExists(publishClient, child2Path);
+
+ distribute(author, "publish", DistributionRequestType.ADD, child1Path);
+
+ assertExists(publishClient, child1Path);
+ assertExists(publishClient, child2Path);
+ }
+
+
+ @Test
+ public void testDeepUpdateTreeContent() throws Exception {
+ String nodePath = createRandomNode(authorClient,
"/content/forward_add_" + System.nanoTime());
+ assertExists(authorClient, nodePath);
+
+ String child1Path = nodePath + "/child1";
+ authorClient.createNode(child1Path);
+ assertExists(authorClient, child1Path);
+
+ String child2Path = nodePath + "/child2";
+
+ publishClient.createNode(child2Path);
+ assertExists(publishClient, child2Path);
+
+ distributeDeep(author, "publish", DistributionRequestType.ADD,
nodePath);
+ assertExists(publishClient, nodePath);
+ assertExists(publishClient, child1Path);
+ assertExists(publishClient, child2Path);
+ }
+
}