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);
+    }
+
 }


Reply via email to