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/11/09 14:41:52 UTC

svn commit: r1713432 [1/2] - in /sling/trunk/contrib/extensions/distribution: core/src/main/java/org/apache/sling/distribution/agent/impl/ core/src/main/java/org/apache/sling/distribution/packaging/impl/ core/src/main/java/org/apache/sling/distribution...

Author: mpetria
Date: Mon Nov  9 13:41:52 2015
New Revision: 1713432

URL: http://svn.apache.org/viewvc?rev=1713432&view=rev
Log:
SLING-5281: allow execution with calling user session

Added:
    sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/util/impl/
    sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/util/impl/DistributionUtils.java
    sling/trunk/contrib/extensions/distribution/sample/src/main/resources/SLING-CONTENT/libs/sling/distribution/install.author/impersonate-publish/
    sling/trunk/contrib/extensions/distribution/sample/src/main/resources/SLING-CONTENT/libs/sling/distribution/install.author/impersonate-publish-reverse/
    sling/trunk/contrib/extensions/distribution/sample/src/main/resources/SLING-CONTENT/libs/sling/distribution/install.author/impersonate-publish-reverse/org.apache.sling.distribution.agent.impl.ReverseDistributionAgentFactory-impersonate-publish-reverse.json
    sling/trunk/contrib/extensions/distribution/sample/src/main/resources/SLING-CONTENT/libs/sling/distribution/install.author/impersonate-publish-reverse/org.apache.sling.distribution.trigger.impl.ScheduledDistributionTriggerFactory-impersonate-publish-reverse-scheduled.json
    sling/trunk/contrib/extensions/distribution/sample/src/main/resources/SLING-CONTENT/libs/sling/distribution/install.author/impersonate-publish/org.apache.sling.distribution.agent.impl.ForwardDistributionAgentFactory-impersonate-publish.json
    sling/trunk/contrib/extensions/distribution/sample/src/main/resources/SLING-CONTENT/libs/sling/distribution/install.publish/impersonate-reverse/
    sling/trunk/contrib/extensions/distribution/sample/src/main/resources/SLING-CONTENT/libs/sling/distribution/install.publish/impersonate-reverse/org.apache.sling.distribution.agent.impl.QueueDistributionAgentFactory-impersonate-reverse.json
    sling/trunk/contrib/extensions/distribution/sample/src/main/resources/SLING-CONTENT/libs/sling/distribution/install.publish/impersonate-reverse/org.apache.sling.distribution.packaging.impl.exporter.AgentDistributionPackageExporterFactory-impersonate-reverse.json
    sling/trunk/contrib/extensions/distribution/sample/src/main/resources/SLING-CONTENT/libs/sling/distribution/install.publish/reverse/org.apache.sling.distribution.packaging.impl.exporter.AgentDistributionPackageExporterFactory-reverse.json
    sling/trunk/contrib/extensions/distribution/sample/src/main/resources/SLING-CONTENT/libs/sling/distribution/install/org.apache.sling.serviceusermapping.impl.ServiceUserMapperImpl.amended-distributionAgentService.json
    sling/trunk/contrib/extensions/distribution/sample/src/main/resources/SLING-CONTENT/libs/sling/distribution/services.json
    sling/trunk/contrib/extensions/distribution/sample/src/main/resources/SLING-CONTENT/libs/sling/distribution/settings.json
Removed:
    sling/trunk/contrib/extensions/distribution/sample/src/main/resources/SLING-CONTENT/libs/sling/distribution/install.publish/org.apache.sling.distribution.packaging.impl.exporter.AgentDistributionPackageExporterFactory-reverse.json
Modified:
    sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/agent/impl/AbstractDistributionAgentFactory.java
    sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/agent/impl/SimpleDistributionAgent.java
    sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/packaging/impl/DistributionPackageUtils.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/servlet/DistributionTriggerServlet.java
    sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/trigger/DistributionRequestHandler.java
    sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/trigger/impl/AbstractJcrEventTrigger.java
    sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/trigger/impl/DistributionEventDistributeDistributionTrigger.java
    sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/trigger/impl/JcrEventDistributionTrigger.java
    sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/trigger/impl/JcrEventDistributionTriggerFactory.java
    sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/trigger/impl/PersistedJcrEventDistributionTrigger.java
    sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/trigger/impl/PersistedJcrEventDistributionTriggerFactory.java
    sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/trigger/impl/RemoteEventDistributionTrigger.java
    sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/trigger/impl/ResourceEventDistributionTrigger.java
    sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/trigger/impl/ScheduledDistributionTrigger.java
    sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/trigger/impl/ScheduledDistributionTriggerFactory.java
    sling/trunk/contrib/extensions/distribution/core/src/test/java/org/apache/sling/distribution/trigger/impl/JcrEventDistributionTriggerTest.java
    sling/trunk/contrib/extensions/distribution/core/src/test/java/org/apache/sling/distribution/trigger/impl/PersistingJcrEventDistributionTriggerTest.java
    sling/trunk/contrib/extensions/distribution/core/src/test/java/org/apache/sling/distribution/trigger/impl/ScheduledDistributionTriggerTest.java
    sling/trunk/contrib/extensions/distribution/it/pom.xml
    sling/trunk/contrib/extensions/distribution/it/src/test/java/org/apache/sling/distribution/it/DistributionIntegrationTestBase.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
    sling/trunk/contrib/extensions/distribution/it/src/test/java/org/apache/sling/distribution/it/ReverseDistributionTest.java
    sling/trunk/contrib/extensions/distribution/sample/src/main/java/org/apache/sling/distribution/test/Init.java

Modified: sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/agent/impl/AbstractDistributionAgentFactory.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/agent/impl/AbstractDistributionAgentFactory.java?rev=1713432&r1=1713431&r2=1713432&view=diff
==============================================================================
--- sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/agent/impl/AbstractDistributionAgentFactory.java (original)
+++ sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/agent/impl/AbstractDistributionAgentFactory.java Mon Nov  9 13:41:52 2015
@@ -28,6 +28,7 @@ import org.apache.sling.commons.osgi.Pro
 import org.apache.sling.distribution.agent.DistributionAgent;
 import org.apache.sling.distribution.component.impl.DistributionComponentConstants;
 import org.apache.sling.distribution.component.impl.DistributionComponentKind;
+import org.apache.sling.distribution.component.impl.SettingsUtils;
 import org.apache.sling.distribution.log.DistributionLog;
 import org.apache.sling.distribution.log.impl.DefaultDistributionLog;
 import org.apache.sling.distribution.resources.impl.OsgiUtils;
@@ -70,7 +71,7 @@ public abstract class AbstractDistributi
         Dictionary<String, Object> props = new Hashtable<String, Object>();
 
         boolean enabled = PropertiesUtil.toBoolean(config.get(ENABLED), true);
-        String triggersTarget = PropertiesUtil.toString(config.get(TRIGGERS_TARGET), null);
+        String triggersTarget = SettingsUtils.removeEmptyEntry(PropertiesUtil.toString(config.get(TRIGGERS_TARGET), null));
         triggersEnabled = triggersTarget != null && triggersTarget.trim().length() > 0;
         agentName = PropertiesUtil.toString(config.get(NAME), null);
 

Modified: sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/agent/impl/SimpleDistributionAgent.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/agent/impl/SimpleDistributionAgent.java?rev=1713432&r1=1713431&r2=1713432&view=diff
==============================================================================
--- sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/agent/impl/SimpleDistributionAgent.java (original)
+++ sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/agent/impl/SimpleDistributionAgent.java Mon Nov  9 13:41:52 2015
@@ -19,6 +19,7 @@
 package org.apache.sling.distribution.agent.impl;
 
 import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
 import java.util.Arrays;
 import java.util.Collection;
 import java.util.HashMap;
@@ -46,11 +47,9 @@ import org.apache.sling.distribution.Dis
 import org.apache.sling.distribution.impl.SimpleDistributionResponse;
 import org.apache.sling.distribution.log.DistributionLog;
 import org.apache.sling.distribution.log.impl.DefaultDistributionLog;
-import org.apache.sling.distribution.queue.impl.DistributionQueueUtils;
 import org.apache.sling.distribution.serialization.DistributionPackage;
 import org.apache.sling.distribution.packaging.DistributionPackageExporter;
 import org.apache.sling.distribution.packaging.DistributionPackageImporter;
-import org.apache.sling.distribution.serialization.DistributionPackageInfo;
 import org.apache.sling.distribution.packaging.impl.DistributionPackageUtils;
 import org.apache.sling.distribution.queue.DistributionQueue;
 import org.apache.sling.distribution.queue.DistributionQueueEntry;
@@ -70,6 +69,7 @@ import org.apache.sling.distribution.tri
  * Basic implementation of a {@link org.apache.sling.distribution.agent.DistributionAgent}
  */
 public class SimpleDistributionAgent implements DistributionAgent {
+    private final static String DEFAULT_AGENT_SERVICE = "defaultAgentService";
 
     private final DistributionQueueProvider queueProvider;
 
@@ -91,6 +91,7 @@ public class SimpleDistributionAgent imp
     private boolean active = false;
     private final Set<String> processingQueues;
     private final int retryAttempts;
+    private final boolean impersonateUser;
     private final DefaultDistributionLog log;
     private final DistributionRequestType[] allowedRequests;
     private final String[] allowedRoots;
@@ -116,12 +117,12 @@ public class SimpleDistributionAgent imp
         this.allowedRoots = allowedRoots;
         this.processingQueues = processingQueues;
         this.retryAttempts = retryAttempts;
+        this.impersonateUser = subServiceName == null;
 
         // check configuration is valid
         if (name == null
                 || (queueProcessingEnabled && distributionPackageImporter == null)
                 || distributionPackageExporter == null
-                || subServiceName == null
                 || distributionRequestAuthorizationStrategy == null
                 || queueProvider == null
                 || scheduleQueueStrategy == null
@@ -173,24 +174,24 @@ public class SimpleDistributionAgent imp
 
             boolean silent = DistributionRequestType.PULL.equals(distributionRequest.getRequestType());
 
-            log.info(silent, "starting request {}", distributionRequest);
+            String callingUser = resourceResolver.getUserID();
+
+            log.info(false, "starting request {} by user {}", distributionRequest, callingUser);
 
-            agentResourceResolver = getAgentResourceResolver();
 
             distributionRequestAuthorizationStrategy.checkPermission(resourceResolver, distributionRequest);
 
+            agentResourceResolver = getAgentResourceResolver(callingUser);
+
             List<DistributionPackage> distributionPackages = exportPackages(agentResourceResolver, distributionRequest);
 
             log.debug("exported packages {}", distributionPackages.size());
 
-            DistributionResponse distributionResponse = scheduleImportPackages(distributionPackages);
+            DistributionResponse distributionResponse = scheduleImportPackages(distributionPackages, callingUser);
 
             log.info(silent, "returning response {}", distributionResponse);
 
             return distributionResponse;
-        } catch (LoginException e) {
-            log.error("Error executing distribution request {} {}", distributionRequest, e);
-            throw new DistributionException(e);
         } finally {
             ungetAgentResourceResolver(agentResourceResolver);
         }
@@ -202,6 +203,8 @@ public class SimpleDistributionAgent imp
     }
 
     private List<DistributionPackage> exportPackages(ResourceResolver agentResourceResolver, DistributionRequest distributionRequest) throws DistributionException {
+        log.info("exporting packages for user {}", agentResourceResolver != null ?  agentResourceResolver.getUserID() : "dummy");
+
         List<DistributionPackage> distributionPackages = distributionPackageExporter.exportPackages(agentResourceResolver, distributionRequest);
 
         generatePackageEvent(DistributionEventTopics.AGENT_PACKAGE_CREATED);
@@ -209,21 +212,23 @@ public class SimpleDistributionAgent imp
         return distributionPackages;
     }
 
-    private DistributionResponse scheduleImportPackages(List<DistributionPackage> distributionPackages) {
+    private DistributionResponse scheduleImportPackages(List<DistributionPackage> distributionPackages, String callingUser) {
         List<DistributionResponse> distributionResponses = new LinkedList<DistributionResponse>();
 
         for (DistributionPackage distributionPackage : distributionPackages) {
-            Collection<SimpleDistributionResponse> distributionResponsesForPackage = scheduleImportPackage(distributionPackage);
+            Collection<SimpleDistributionResponse> distributionResponsesForPackage = scheduleImportPackage(distributionPackage, callingUser);
             distributionResponses.addAll(distributionResponsesForPackage);
         }
         return distributionResponses.size() == 1 ? distributionResponses.get(0) : new CompositeDistributionResponse(distributionResponses);
     }
 
-    private Collection<SimpleDistributionResponse> scheduleImportPackage(DistributionPackage distributionPackage) {
+    private Collection<SimpleDistributionResponse> scheduleImportPackage(DistributionPackage distributionPackage, String callingUser) {
         Collection<SimpleDistributionResponse> distributionResponses = new LinkedList<SimpleDistributionResponse>();
 
         // dispatch the distribution package to the queue distribution handler
         try {
+            distributionPackage.getInfo().put(DistributionPackageUtils.PACKAGE_INFO_PROPERTY_REQUEST_USER, callingUser);
+
             Iterable<DistributionQueueItemStatus> states = scheduleQueueStrategy.add(distributionPackage, queueProvider);
             for (DistributionQueueItemStatus state : states) {
                 DistributionRequestState requestState = getRequestStateFromQueueState(state.getItemState());
@@ -377,7 +382,8 @@ public class SimpleDistributionAgent imp
         DistributionQueueItemStatus queueItemStatus = queueEntry.getStatus();
         try {
 
-            agentResourceResolver = getAgentResourceResolver();
+            String callingUser = queueItem.get(DistributionPackageUtils.PACKAGE_INFO_PROPERTY_REQUEST_USER, String.class);
+            agentResourceResolver = getAgentResourceResolver(callingUser);
 
             distributionPackage = distributionPackageExporter.getPackage(agentResourceResolver, queueItem.getId());
 
@@ -398,9 +404,6 @@ public class SimpleDistributionAgent imp
                 success = true; // return success if package does not exist in order to clear the queue.
                 log.error("distribution package with id {} does not exist. the package will be skipped.", queueItem.getId());
             }
-
-        } catch (LoginException e) {
-            log.info("cannot obtain resource resolver", e);
         } finally {
             ungetAgentResourceResolver(agentResourceResolver);
             if (distributionPackage != null) {
@@ -439,14 +442,26 @@ public class SimpleDistributionAgent imp
         return true;
     }
 
-    private ResourceResolver getAgentResourceResolver() throws LoginException {
+    private ResourceResolver getAgentResourceResolver(String user) throws DistributionException {
         ResourceResolver resourceResolver;
 
-        Map<String, Object> authenticationInfo = new HashMap<String, Object>();
-        authenticationInfo.put(ResourceResolverFactory.SUBSERVICE, subServiceName);
-        resourceResolver = resourceResolverFactory.getServiceResourceResolver(authenticationInfo);
+        try {
+            Map<String, Object> authenticationInfo = new HashMap<String, Object>();
+
+            if (impersonateUser && user != null) {
+                authenticationInfo.put(ResourceResolverFactory.SUBSERVICE, DEFAULT_AGENT_SERVICE);
+                authenticationInfo.put(ResourceResolverFactory.USER_IMPERSONATION, user);
+            } else {
+                authenticationInfo.put(ResourceResolverFactory.SUBSERVICE, subServiceName);
+            }
+
+            resourceResolver = resourceResolverFactory.getServiceResourceResolver(authenticationInfo);
+
+            return resourceResolver;
+        } catch (LoginException le) {
+            throw new DistributionException(le);
 
-        return resourceResolver;
+        }
     }
 
     private void ungetAgentResourceResolver(ResourceResolver resourceResolver) {
@@ -540,22 +555,34 @@ public class SimpleDistributionAgent imp
             this.agent = agent;
         }
 
-        public void handle(@Nonnull DistributionRequest request) {
+        public void handle(@Nullable ResourceResolver resourceResolver, @Nonnull DistributionRequest request) {
 
             if (!active) {
                 log.warn("skipping agent handler as agent is disabled");
                 return;
             }
 
-            ResourceResolver agentResourceResolver = null;
-            try {
-                agentResourceResolver = getAgentResourceResolver();
-                agent.execute(agentResourceResolver, request);
-            } catch (Throwable e) {
-                log.error("Error executing handler", e);
-            } finally {
-                ungetAgentResourceResolver(agentResourceResolver);
+
+            if (resourceResolver != null) {
+                try {
+                    agent.execute(resourceResolver, request);
+                } catch (Throwable t) {
+                    log.error("Error executing handler", t);
+                }
+            } else {
+                ResourceResolver agentResourceResolver = null;
+
+                try {
+                    agentResourceResolver = getAgentResourceResolver(null);
+
+                    agent.execute(agentResourceResolver, request);
+                } catch (Throwable e) {
+                    log.error("Error executing handler", e);
+                } finally {
+                    ungetAgentResourceResolver(agentResourceResolver);
+                }
             }
+
         }
     }
 

Modified: sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/packaging/impl/DistributionPackageUtils.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/packaging/impl/DistributionPackageUtils.java?rev=1713432&r1=1713431&r2=1713432&view=diff
==============================================================================
--- sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/packaging/impl/DistributionPackageUtils.java (original)
+++ sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/packaging/impl/DistributionPackageUtils.java Mon Nov  9 13:41:52 2015
@@ -41,6 +41,12 @@ public class DistributionPackageUtils {
     public static String PACKAGE_INFO_PROPERTY_ORIGIN_QUEUE = "internal.origin.queue";
 
     /**
+     * distribution request user
+     */
+    public static String PACKAGE_INFO_PROPERTY_REQUEST_USER = "internal.request.user";
+
+
+    /**
      * Acquires the package if it's a {@link SharedDistributionPackage}, via {@link SharedDistributionPackage#acquire(String)}
      * @param distributionPackage a distribution package
      * @param queueName the name of the queue in which the package should be acquired

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=1713432&r1=1713431&r2=1713432&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 Mon Nov  9 13:41:52 2015
@@ -106,7 +106,7 @@ public class JcrVaultDistributionPackage
             WorkspaceFilter filter = VltUtils.createFilter(request, filters);
             ExportOptions opts = VltUtils.getExportOptions(filter, packageRoots, packageGroup, packageName, VERSION);
 
-            log.debug("assembling package {}", packageGroup + '/' + packageName + "-" + VERSION);
+            log.debug("assembling package {} user {}", packageGroup + '/' + packageName + "-" + VERSION, resourceResolver.getUserID());
 
             vaultPackage = VltUtils.createPackage(packaging.getPackageManager(), session, opts, tempDirectory);
 

Modified: sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/servlet/DistributionTriggerServlet.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/servlet/DistributionTriggerServlet.java?rev=1713432&r1=1713431&r2=1713432&view=diff
==============================================================================
--- sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/servlet/DistributionTriggerServlet.java (original)
+++ sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/servlet/DistributionTriggerServlet.java Mon Nov  9 13:41:52 2015
@@ -19,6 +19,7 @@
 package org.apache.sling.distribution.servlet;
 
 import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
 import javax.servlet.ServletException;
 import java.io.IOException;
 import java.io.PrintWriter;
@@ -27,6 +28,7 @@ import java.util.Arrays;
 import org.apache.felix.scr.annotations.sling.SlingServlet;
 import org.apache.sling.api.SlingHttpServletRequest;
 import org.apache.sling.api.SlingHttpServletResponse;
+import org.apache.sling.api.resource.ResourceResolver;
 import org.apache.sling.api.servlets.SlingAllMethodsServlet;
 import org.apache.sling.distribution.DistributionRequest;
 import org.apache.sling.distribution.DistributionException;
@@ -77,7 +79,7 @@ public class DistributionTriggerServlet
         final PrintWriter writer = response.getWriter();
 
         DistributionRequestHandler distributionRequestHandler = new DistributionRequestHandler() {
-            public void handle(@Nonnull DistributionRequest request) {
+            public void handle(@Nullable ResourceResolver resourceResolver, @Nonnull DistributionRequest request) {
                 writeEvent(writer, request);
             }
         };

Modified: sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/trigger/DistributionRequestHandler.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/trigger/DistributionRequestHandler.java?rev=1713432&r1=1713431&r2=1713432&view=diff
==============================================================================
--- sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/trigger/DistributionRequestHandler.java (original)
+++ sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/trigger/DistributionRequestHandler.java Mon Nov  9 13:41:52 2015
@@ -19,8 +19,10 @@
 package org.apache.sling.distribution.trigger;
 
 import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
 
 import aQute.bnd.annotation.ConsumerType;
+import org.apache.sling.api.resource.ResourceResolver;
 import org.apache.sling.distribution.DistributionRequest;
 
 /**
@@ -35,6 +37,6 @@ public interface DistributionRequestHand
      *
      * @param request a distribution request
      */
-    void handle(@Nonnull DistributionRequest request);
+    void handle(@Nullable ResourceResolver resourceResolver, @Nonnull DistributionRequest request);
 
 }

Modified: sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/trigger/impl/AbstractJcrEventTrigger.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/trigger/impl/AbstractJcrEventTrigger.java?rev=1713432&r1=1713431&r2=1713432&view=diff
==============================================================================
--- sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/trigger/impl/AbstractJcrEventTrigger.java (original)
+++ sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/trigger/impl/AbstractJcrEventTrigger.java Mon Nov  9 13:41:52 2015
@@ -32,6 +32,9 @@ import java.util.Set;
 import java.util.TreeSet;
 import java.util.concurrent.ConcurrentHashMap;
 
+import org.apache.sling.api.resource.LoginException;
+import org.apache.sling.api.resource.ResourceResolver;
+import org.apache.sling.api.resource.ResourceResolverFactory;
 import org.apache.sling.commons.scheduler.Scheduler;
 import org.apache.sling.distribution.DistributionRequest;
 import org.apache.sling.distribution.DistributionRequestType;
@@ -40,6 +43,7 @@ import org.apache.sling.distribution.Dis
 import org.apache.sling.distribution.trigger.DistributionRequestHandler;
 import org.apache.sling.distribution.trigger.DistributionTrigger;
 import org.apache.sling.distribution.util.DistributionJcrUtils;
+import org.apache.sling.distribution.util.impl.DistributionUtils;
 import org.apache.sling.jcr.api.SlingRepository;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -59,12 +63,14 @@ public abstract class AbstractJcrEventTr
     private final String serviceUser;
 
     private final SlingRepository repository;
+    private final ResourceResolverFactory resolverFactory;
 
     private Session cachedSession;
 
     private final Scheduler scheduler;
 
-    AbstractJcrEventTrigger(SlingRepository repository, Scheduler scheduler, String path, String serviceUser) {
+    AbstractJcrEventTrigger(SlingRepository repository, Scheduler scheduler, ResourceResolverFactory resolverFactory, String path, String serviceUser) {
+        this.resolverFactory = resolverFactory;
         if (path == null || serviceUser == null) {
             throw new IllegalArgumentException("path and service are required");
         }
@@ -252,7 +258,19 @@ public abstract class AbstractJcrEventTr
 
         public void run() {
             for (DistributionRequest request : requestList) {
-                requestHandler.handle(request);
+                if (serviceUser == null) {
+                    requestHandler.handle(null, request);
+                } else {
+                    ResourceResolver resourceResolver = null;
+                    try {
+                        resourceResolver = DistributionUtils.loginService(resolverFactory, serviceUser);
+                        requestHandler.handle(resourceResolver, request);
+                    } catch (LoginException le) {
+                        log.error("cannot obtain resource resolver for {}", serviceUser);
+                    } finally {
+                        DistributionUtils.logout(resourceResolver);
+                    }
+                }
             }
         }
     }

Modified: sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/trigger/impl/DistributionEventDistributeDistributionTrigger.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/trigger/impl/DistributionEventDistributeDistributionTrigger.java?rev=1713432&r1=1713431&r2=1713432&view=diff
==============================================================================
--- sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/trigger/impl/DistributionEventDistributeDistributionTrigger.java (original)
+++ sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/trigger/impl/DistributionEventDistributeDistributionTrigger.java Mon Nov  9 13:41:52 2015
@@ -114,7 +114,7 @@ public class DistributionEventDistribute
                         log.info("triggering chain distribution from event {}", event);
 
                         DistributionRequestType action = DistributionRequestType.valueOf(String.valueOf(actionProperty));
-                        requestHandler.handle(new SimpleDistributionRequest(action, paths));
+                        requestHandler.handle(null, new SimpleDistributionRequest(action, paths));
                         break;
                     }
                 }

Modified: sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/trigger/impl/JcrEventDistributionTrigger.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/trigger/impl/JcrEventDistributionTrigger.java?rev=1713432&r1=1713431&r2=1713432&view=diff
==============================================================================
--- sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/trigger/impl/JcrEventDistributionTrigger.java (original)
+++ sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/trigger/impl/JcrEventDistributionTrigger.java Mon Nov  9 13:41:52 2015
@@ -21,6 +21,7 @@ package org.apache.sling.distribution.tr
 import javax.jcr.RepositoryException;
 import javax.jcr.observation.Event;
 
+import org.apache.sling.api.resource.ResourceResolverFactory;
 import org.apache.sling.commons.scheduler.Scheduler;
 import org.apache.sling.distribution.DistributionRequest;
 import org.apache.sling.distribution.DistributionRequestType;
@@ -39,8 +40,8 @@ public class JcrEventDistributionTrigger
     private final Logger log = LoggerFactory.getLogger(this.getClass());
     private final String[] ignoredPathsPatterns;
 
-    public JcrEventDistributionTrigger(SlingRepository repository, Scheduler scheduler, String path, String serviceName, String[] ignoredPathsPatterns) {
-        super(repository, scheduler, path, serviceName);
+    public JcrEventDistributionTrigger(SlingRepository repository, Scheduler scheduler, ResourceResolverFactory resolverFactory, String path, String serviceName, String[] ignoredPathsPatterns) {
+        super(repository, scheduler, resolverFactory, path, serviceName);
         this.ignoredPathsPatterns = ignoredPathsPatterns;
     }
 

Modified: sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/trigger/impl/JcrEventDistributionTriggerFactory.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/trigger/impl/JcrEventDistributionTriggerFactory.java?rev=1713432&r1=1713431&r2=1713432&view=diff
==============================================================================
--- sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/trigger/impl/JcrEventDistributionTriggerFactory.java (original)
+++ sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/trigger/impl/JcrEventDistributionTriggerFactory.java Mon Nov  9 13:41:52 2015
@@ -28,6 +28,7 @@ import org.apache.felix.scr.annotations.
 import org.apache.felix.scr.annotations.Property;
 import org.apache.felix.scr.annotations.Reference;
 import org.apache.felix.scr.annotations.Service;
+import org.apache.sling.api.resource.ResourceResolverFactory;
 import org.apache.sling.commons.osgi.PropertiesUtil;
 import org.apache.sling.commons.scheduler.Scheduler;
 import org.apache.sling.distribution.component.impl.DistributionComponentConstants;
@@ -78,16 +79,19 @@ public class JcrEventDistributionTrigger
     @Reference
     private Scheduler scheduler;
 
+    @Reference
+    private ResourceResolverFactory resolverFactory;
+
 
     @Activate
     public void activate(BundleContext bundleContext, Map<String, Object> config) {
         String path = PropertiesUtil.toString(config.get(PATH), null);
-        String serviceName = PropertiesUtil.toString(config.get(SERVICE_NAME), null);
+        String serviceName = SettingsUtils.removeEmptyEntry(PropertiesUtil.toString(config.get(SERVICE_NAME), null));
         String[] ignoredPathsPatterns = PropertiesUtil.toStringArray(config.get(IGNORED_PATHS_PATTERNS), null);
         ignoredPathsPatterns = SettingsUtils.removeEmptyEntries(ignoredPathsPatterns);
 
 
-        trigger = new JcrEventDistributionTrigger(repository, scheduler, path, serviceName, ignoredPathsPatterns);
+        trigger = new JcrEventDistributionTrigger(repository, scheduler, resolverFactory, path, serviceName, ignoredPathsPatterns);
         trigger.enable();
     }
 

Modified: sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/trigger/impl/PersistedJcrEventDistributionTrigger.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/trigger/impl/PersistedJcrEventDistributionTrigger.java?rev=1713432&r1=1713431&r2=1713432&view=diff
==============================================================================
--- sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/trigger/impl/PersistedJcrEventDistributionTrigger.java (original)
+++ sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/trigger/impl/PersistedJcrEventDistributionTrigger.java Mon Nov  9 13:41:52 2015
@@ -27,6 +27,8 @@ import java.util.Collection;
 import java.util.Map;
 import java.util.Set;
 
+import org.apache.sling.api.resource.ResourceResolver;
+import org.apache.sling.api.resource.ResourceResolverFactory;
 import org.apache.sling.commons.scheduler.Scheduler;
 import org.apache.sling.distribution.DistributionRequest;
 import org.apache.sling.distribution.DistributionRequestType;
@@ -48,8 +50,8 @@ public class PersistedJcrEventDistributi
 
     private final String nuggetsPath;
 
-    public PersistedJcrEventDistributionTrigger(SlingRepository repository, Scheduler scheduler, String path, String servicename, String nuggetsPath) {
-        super(repository, scheduler, path, servicename);
+    public PersistedJcrEventDistributionTrigger(SlingRepository repository, Scheduler scheduler, ResourceResolverFactory resolverFactory, String path, String servicename, String nuggetsPath) {
+        super(repository, scheduler, resolverFactory, path, servicename);
         this.nuggetsPath = nuggetsPath == null || nuggetsPath.length() == 0 ? DEFAULT_NUGGETS_PATH : nuggetsPath;
     }
 

Modified: sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/trigger/impl/PersistedJcrEventDistributionTriggerFactory.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/trigger/impl/PersistedJcrEventDistributionTriggerFactory.java?rev=1713432&r1=1713431&r2=1713432&view=diff
==============================================================================
--- sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/trigger/impl/PersistedJcrEventDistributionTriggerFactory.java (original)
+++ sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/trigger/impl/PersistedJcrEventDistributionTriggerFactory.java Mon Nov  9 13:41:52 2015
@@ -28,10 +28,12 @@ import org.apache.felix.scr.annotations.
 import org.apache.felix.scr.annotations.Property;
 import org.apache.felix.scr.annotations.Reference;
 import org.apache.felix.scr.annotations.Service;
+import org.apache.sling.api.resource.ResourceResolverFactory;
 import org.apache.sling.commons.osgi.PropertiesUtil;
 import org.apache.sling.commons.scheduler.Scheduler;
 import org.apache.sling.distribution.component.impl.DistributionComponentConstants;
 import org.apache.sling.distribution.DistributionException;
+import org.apache.sling.distribution.component.impl.SettingsUtils;
 import org.apache.sling.distribution.trigger.DistributionRequestHandler;
 import org.apache.sling.distribution.trigger.DistributionTrigger;
 import org.apache.sling.jcr.api.SlingRepository;
@@ -78,15 +80,18 @@ public class PersistedJcrEventDistributi
     @Reference
     private Scheduler scheduler;
 
+    @Reference
+    private ResourceResolverFactory resolverFactory;
+
 
     @Activate
     public void activate(BundleContext bundleContext, Map<String, Object> config) {
 
         String path = PropertiesUtil.toString(config.get(PATH), null);
-        String serviceName = PropertiesUtil.toString(config.get(SERVICE_NAME), null);
+        String serviceName = SettingsUtils.removeEmptyEntry(PropertiesUtil.toString(config.get(SERVICE_NAME), null));
         String nuggetsPath = PropertiesUtil.toString(config.get(NUGGETS_PATH), null);
 
-        trigger = new PersistedJcrEventDistributionTrigger(repository, scheduler, path, serviceName, nuggetsPath);
+        trigger = new PersistedJcrEventDistributionTrigger(repository, scheduler, resolverFactory, path, serviceName, nuggetsPath);
         trigger.enable();
     }
 

Modified: sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/trigger/impl/RemoteEventDistributionTrigger.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/trigger/impl/RemoteEventDistributionTrigger.java?rev=1713432&r1=1713431&r2=1713432&view=diff
==============================================================================
--- sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/trigger/impl/RemoteEventDistributionTrigger.java (original)
+++ sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/trigger/impl/RemoteEventDistributionTrigger.java Mon Nov  9 13:41:52 2015
@@ -126,7 +126,7 @@ public class RemoteEventDistributionTrig
 
             // TODO : currently it always triggers pull request on /, should this be configurable?
             DistributionRequest distributionRequest = new SimpleDistributionRequest(DistributionRequestType.PULL, "/");
-            handler.handle(distributionRequest);
+            handler.handle(null, distributionRequest);
             log.info("distribution request to agent {} sent ({} {})", new Object[]{
                     handler,
                     distributionRequest.getRequestType(),

Modified: sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/trigger/impl/ResourceEventDistributionTrigger.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/trigger/impl/ResourceEventDistributionTrigger.java?rev=1713432&r1=1713431&r2=1713432&view=diff
==============================================================================
--- sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/trigger/impl/ResourceEventDistributionTrigger.java (original)
+++ sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/trigger/impl/ResourceEventDistributionTrigger.java Mon Nov  9 13:41:52 2015
@@ -122,7 +122,7 @@ public class ResourceEventDistributionTr
             Object pathProperty = event.getProperty("path");
             if (pathProperty != null) {
                 String distributingPath = String.valueOf(pathProperty);
-                requestHandler.handle(new SimpleDistributionRequest(action, distributingPath));
+                requestHandler.handle(null, new SimpleDistributionRequest(action, distributingPath));
             }
         }
     }

Modified: sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/trigger/impl/ScheduledDistributionTrigger.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/trigger/impl/ScheduledDistributionTrigger.java?rev=1713432&r1=1713431&r2=1713432&view=diff
==============================================================================
--- sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/trigger/impl/ScheduledDistributionTrigger.java (original)
+++ sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/trigger/impl/ScheduledDistributionTrigger.java Mon Nov  9 13:41:52 2015
@@ -20,16 +20,23 @@ package org.apache.sling.distribution.tr
 
 import javax.annotation.Nonnull;
 import java.util.Collections;
+import java.util.HashMap;
 import java.util.HashSet;
+import java.util.Map;
 import java.util.Set;
 
+import org.apache.sling.api.resource.LoginException;
+import org.apache.sling.api.resource.ResourceResolver;
+import org.apache.sling.api.resource.ResourceResolverFactory;
 import org.apache.sling.commons.scheduler.ScheduleOptions;
 import org.apache.sling.commons.scheduler.Scheduler;
 import org.apache.sling.distribution.DistributionRequestType;
 import org.apache.sling.distribution.SimpleDistributionRequest;
 import org.apache.sling.distribution.DistributionException;
+import org.apache.sling.distribution.packaging.impl.DistributionPackageUtils;
 import org.apache.sling.distribution.trigger.DistributionRequestHandler;
 import org.apache.sling.distribution.trigger.DistributionTrigger;
+import org.apache.sling.distribution.util.impl.DistributionUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -48,11 +55,15 @@ public class ScheduledDistributionTrigge
     private final int secondsInterval;
 
     private final Scheduler scheduler;
+    private final String serviceName;
+    private final ResourceResolverFactory resourceResolverFactory;
 
     private Set<String> registeredJobs = Collections.synchronizedSet(new HashSet<String>());
 
 
-    public ScheduledDistributionTrigger(String distributionActionName, String path, int secondsInterval, Scheduler scheduler) {
+    public ScheduledDistributionTrigger(String distributionActionName, String path, int secondsInterval, String serviceName, Scheduler scheduler, ResourceResolverFactory resourceResolverFactory) {
+        this.serviceName = serviceName;
+        this.resourceResolverFactory = resourceResolverFactory;
         this.distributionAction = DistributionRequestType.fromName(distributionActionName);
         this.path = path;
         this.secondsInterval = secondsInterval;
@@ -122,7 +133,19 @@ public class ScheduledDistributionTrigge
         public void run() {
             log.debug("agent {}: scheduling {} distribution of {}", new Object[]{requestHandler, distributionAction, path});
 
-            requestHandler.handle(new SimpleDistributionRequest(distributionAction, path));
+            if (serviceName == null) {
+                requestHandler.handle(null, new SimpleDistributionRequest(distributionAction, path));
+            } else {
+                ResourceResolver resourceResolver = null;
+                try {
+                    resourceResolver = DistributionUtils.loginService(resourceResolverFactory, serviceName);
+                    requestHandler.handle(resourceResolver, new SimpleDistributionRequest(distributionAction, path));
+                } catch (LoginException le) {
+                    log.error("cannot obtain resource resolver for {}", serviceName);
+                } finally {
+                    DistributionUtils.logout(resourceResolver);
+                }
+            }
         }
     }
 

Modified: sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/trigger/impl/ScheduledDistributionTriggerFactory.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/trigger/impl/ScheduledDistributionTriggerFactory.java?rev=1713432&r1=1713431&r2=1713432&view=diff
==============================================================================
--- sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/trigger/impl/ScheduledDistributionTriggerFactory.java (original)
+++ sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/trigger/impl/ScheduledDistributionTriggerFactory.java Mon Nov  9 13:41:52 2015
@@ -28,11 +28,14 @@ import org.apache.felix.scr.annotations.
 import org.apache.felix.scr.annotations.Property;
 import org.apache.felix.scr.annotations.Reference;
 import org.apache.felix.scr.annotations.Service;
+import org.apache.sling.api.resource.ResourceResolver;
+import org.apache.sling.api.resource.ResourceResolverFactory;
 import org.apache.sling.commons.osgi.PropertiesUtil;
 import org.apache.sling.commons.scheduler.Scheduler;
 import org.apache.sling.distribution.DistributionRequestType;
 import org.apache.sling.distribution.component.impl.DistributionComponentConstants;
 import org.apache.sling.distribution.DistributionException;
+import org.apache.sling.distribution.component.impl.SettingsUtils;
 import org.apache.sling.distribution.trigger.DistributionRequestHandler;
 import org.apache.sling.distribution.trigger.DistributionTrigger;
 import org.apache.sling.jcr.api.SlingRepository;
@@ -69,11 +72,13 @@ public class ScheduledDistributionTrigge
     @Property(label = "Interval in Seconds", description = "The number of seconds between executions")
     public static final String SECONDS = "seconds";
 
+    @Property(label = "Service Name", description = "The name of the service used to trigger the distribution requests.")
+    public static final String SERVICE_NAME = "serviceName";
 
     ScheduledDistributionTrigger trigger;
 
     @Reference
-    private SlingRepository repository;
+    private ResourceResolverFactory resolverFactory;
 
     @Reference
     private Scheduler scheduler;
@@ -84,8 +89,9 @@ public class ScheduledDistributionTrigge
         String action = PropertiesUtil.toString(config.get(ACTION), DistributionRequestType.PULL.name());
         String path = PropertiesUtil.toString(config.get(PATH), null);
         int interval = PropertiesUtil.toInteger(config.get(SECONDS), 30);
+        String serviceName = SettingsUtils.removeEmptyEntry(PropertiesUtil.toString(config.get(SERVICE_NAME), null));
 
-        trigger = new ScheduledDistributionTrigger(action, path, interval, scheduler);
+        trigger = new ScheduledDistributionTrigger(action, path, interval, serviceName, scheduler, resolverFactory);
     }
 
     @Deactivate

Added: sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/util/impl/DistributionUtils.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/util/impl/DistributionUtils.java?rev=1713432&view=auto
==============================================================================
--- sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/util/impl/DistributionUtils.java (added)
+++ sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/util/impl/DistributionUtils.java Mon Nov  9 13:41:52 2015
@@ -0,0 +1,47 @@
+/*
+ * 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.util.impl;
+
+import org.apache.sling.api.resource.LoginException;
+import org.apache.sling.api.resource.ResourceResolver;
+import org.apache.sling.api.resource.ResourceResolverFactory;
+
+import java.util.HashMap;
+import java.util.Map;
+
+
+public class DistributionUtils {
+
+    public static ResourceResolver loginService(ResourceResolverFactory resolverFactory, String serviceName) throws LoginException {
+        Map<String, Object> authInfo = new HashMap<String, Object>();
+
+        authInfo.put(ResourceResolverFactory.SUBSERVICE, serviceName);
+
+        ResourceResolver resourceResolver = resolverFactory.getServiceResourceResolver(authInfo);
+
+        return resourceResolver;
+    }
+
+    public static void logout(ResourceResolver resourceResolver) {
+        if (resourceResolver != null) {
+            resourceResolver.close();
+        }
+    }
+}

Modified: sling/trunk/contrib/extensions/distribution/core/src/test/java/org/apache/sling/distribution/trigger/impl/JcrEventDistributionTriggerTest.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/distribution/core/src/test/java/org/apache/sling/distribution/trigger/impl/JcrEventDistributionTriggerTest.java?rev=1713432&r1=1713431&r2=1713432&view=diff
==============================================================================
--- sling/trunk/contrib/extensions/distribution/core/src/test/java/org/apache/sling/distribution/trigger/impl/JcrEventDistributionTriggerTest.java (original)
+++ sling/trunk/contrib/extensions/distribution/core/src/test/java/org/apache/sling/distribution/trigger/impl/JcrEventDistributionTriggerTest.java Mon Nov  9 13:41:52 2015
@@ -20,6 +20,7 @@ package org.apache.sling.distribution.tr
 
 import javax.jcr.observation.Event;
 
+import org.apache.sling.api.resource.ResourceResolverFactory;
 import org.apache.sling.commons.scheduler.Scheduler;
 import org.apache.sling.distribution.DistributionRequest;
 import org.apache.sling.jcr.api.SlingRepository;
@@ -39,10 +40,11 @@ public class JcrEventDistributionTrigger
     public void testProcessEventWithoutPathProperty() throws Exception {
         SlingRepository repository = mock(SlingRepository.class);
         Scheduler scheduler = mock(Scheduler.class);
+        ResourceResolverFactory resolverFactory  = mock(ResourceResolverFactory.class);
 
         String path = "/some/path";
         String serviceName = "serviceId";
-        JcrEventDistributionTrigger jcrEventdistributionTrigger = new JcrEventDistributionTrigger(repository, scheduler, path, serviceName, null);
+        JcrEventDistributionTrigger jcrEventdistributionTrigger = new JcrEventDistributionTrigger(repository, scheduler, resolverFactory, path, serviceName, null);
         Event event = mock(Event.class);
         DistributionRequest distributionRequest = jcrEventdistributionTrigger.processEvent(event);
         assertNull(distributionRequest);
@@ -52,10 +54,11 @@ public class JcrEventDistributionTrigger
     public void testProcessEventWithPathProperty() throws Exception {
         SlingRepository repository = mock(SlingRepository.class);
         Scheduler scheduler = mock(Scheduler.class);
+        ResourceResolverFactory resolverFactory  = mock(ResourceResolverFactory.class);
 
         String path = "/some/path";
         String serviceName = "serviceId";
-        JcrEventDistributionTrigger jcrEventdistributionTrigger = new JcrEventDistributionTrigger(repository, scheduler, path, serviceName, null);
+        JcrEventDistributionTrigger jcrEventdistributionTrigger = new JcrEventDistributionTrigger(repository, scheduler, resolverFactory, path, serviceName, null);
         Event event = mock(Event.class);
         when(event.getPath()).thenReturn("/some/path/generating/event");
         DistributionRequest distributionRequest = jcrEventdistributionTrigger.processEvent(event);

Modified: sling/trunk/contrib/extensions/distribution/core/src/test/java/org/apache/sling/distribution/trigger/impl/PersistingJcrEventDistributionTriggerTest.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/distribution/core/src/test/java/org/apache/sling/distribution/trigger/impl/PersistingJcrEventDistributionTriggerTest.java?rev=1713432&r1=1713431&r2=1713432&view=diff
==============================================================================
--- sling/trunk/contrib/extensions/distribution/core/src/test/java/org/apache/sling/distribution/trigger/impl/PersistingJcrEventDistributionTriggerTest.java (original)
+++ sling/trunk/contrib/extensions/distribution/core/src/test/java/org/apache/sling/distribution/trigger/impl/PersistingJcrEventDistributionTriggerTest.java Mon Nov  9 13:41:52 2015
@@ -24,6 +24,7 @@ import javax.jcr.Workspace;
 import javax.jcr.observation.Event;
 import javax.jcr.observation.ObservationManager;
 
+import org.apache.sling.api.resource.ResourceResolverFactory;
 import org.apache.sling.commons.scheduler.Scheduler;
 import org.apache.sling.distribution.DistributionRequest;
 import org.apache.sling.distribution.trigger.DistributionRequestHandler;
@@ -51,11 +52,12 @@ public class PersistingJcrEventDistribut
         when(session.nodeExists("/var/nuggets")).thenReturn(true);
         SlingRepository repository = mock(SlingRepository.class);
         Scheduler scheduler = mock(Scheduler.class);
+        ResourceResolverFactory resolverFactory  = mock(ResourceResolverFactory.class);
         when(repository.loginService(serviceName, null)).thenReturn(session);
         String path = "/some/path";
         String nuggetsPath = "/var/nuggets";
         PersistedJcrEventDistributionTrigger persistingJcrEventdistributionTrigger = new PersistedJcrEventDistributionTrigger(
-                repository, scheduler, path, serviceName, nuggetsPath);
+                repository, scheduler, resolverFactory, path, serviceName, nuggetsPath);
         Event event = mock(Event.class);
         DistributionRequest distributionRequest = persistingJcrEventdistributionTrigger.processEvent(event);
         assertNull(distributionRequest);
@@ -77,11 +79,13 @@ public class PersistingJcrEventDistribut
         when(session.getRootNode()).thenReturn(rootNode);
         SlingRepository repository = mock(SlingRepository.class);
         Scheduler scheduler = mock(Scheduler.class);
+        ResourceResolverFactory resolverFactory  = mock(ResourceResolverFactory.class);
+
         when(repository.loginService(serviceName, null)).thenReturn(session);
         String path = "/some/path";
         String nuggetsPath = "/var/nuggets";
         PersistedJcrEventDistributionTrigger persistingJcrEventdistributionTrigger = new PersistedJcrEventDistributionTrigger(
-                repository, scheduler, path, serviceName, nuggetsPath);
+                repository, scheduler, resolverFactory, path, serviceName, nuggetsPath);
         Event event = mock(Event.class);
         DistributionRequest distributionRequest = persistingJcrEventdistributionTrigger.processEvent(event);
         assertNull(distributionRequest);
@@ -101,12 +105,13 @@ public class PersistingJcrEventDistribut
 
         SlingRepository repository = mock(SlingRepository.class);
         Scheduler scheduler = mock(Scheduler.class);
+        ResourceResolverFactory resolverFactory  = mock(ResourceResolverFactory.class);
 
         when(repository.loginService(serviceName, null)).thenReturn(session);
 
         String path = "/some/path";
         PersistedJcrEventDistributionTrigger persistingJcrEventdistributionTrigger = new PersistedJcrEventDistributionTrigger(
-                repository, scheduler, path, serviceName, nuggetsPath);
+                repository, scheduler, resolverFactory, path, serviceName, nuggetsPath);
         DistributionRequestHandler handler = mock(DistributionRequestHandler.class);
         persistingJcrEventdistributionTrigger.register(handler);
 
@@ -141,12 +146,14 @@ public class PersistingJcrEventDistribut
 
         SlingRepository repository = mock(SlingRepository.class);
         Scheduler scheduler = mock(Scheduler.class);
+        ResourceResolverFactory resolverFactory  = mock(ResourceResolverFactory.class);
+
 
         when(repository.loginService(serviceName, null)).thenReturn(session);
 
         String path = "/some/path";
         PersistedJcrEventDistributionTrigger persistingJcrEventdistributionTrigger = new PersistedJcrEventDistributionTrigger(
-                repository, scheduler, path, serviceName, nuggetsPath);
+                repository, scheduler, resolverFactory, path, serviceName, nuggetsPath);
         DistributionRequestHandler handler = mock(DistributionRequestHandler.class);
         persistingJcrEventdistributionTrigger.register(handler);
 

Modified: sling/trunk/contrib/extensions/distribution/core/src/test/java/org/apache/sling/distribution/trigger/impl/ScheduledDistributionTriggerTest.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/distribution/core/src/test/java/org/apache/sling/distribution/trigger/impl/ScheduledDistributionTriggerTest.java?rev=1713432&r1=1713431&r2=1713432&view=diff
==============================================================================
--- sling/trunk/contrib/extensions/distribution/core/src/test/java/org/apache/sling/distribution/trigger/impl/ScheduledDistributionTriggerTest.java (original)
+++ sling/trunk/contrib/extensions/distribution/core/src/test/java/org/apache/sling/distribution/trigger/impl/ScheduledDistributionTriggerTest.java Mon Nov  9 13:41:52 2015
@@ -18,6 +18,7 @@
  */
 package org.apache.sling.distribution.trigger.impl;
 
+import org.apache.sling.api.resource.ResourceResolverFactory;
 import org.apache.sling.commons.scheduler.ScheduleOptions;
 import org.apache.sling.commons.scheduler.Scheduler;
 import org.apache.sling.distribution.DistributionRequestType;
@@ -42,7 +43,7 @@ public class ScheduledDistributionTrigge
             ScheduleOptions options = mock(ScheduleOptions.class);
             when(scheduler.NOW(-1, interval)).thenReturn(options);
             when(options.name(handler.toString())).thenReturn(options);
-            ScheduledDistributionTrigger scheduleddistributionTrigger = new ScheduledDistributionTrigger(action.name(), path, interval, scheduler);
+            ScheduledDistributionTrigger scheduleddistributionTrigger = new ScheduledDistributionTrigger(action.name(), path, interval, null, scheduler, mock(ResourceResolverFactory.class));
             scheduleddistributionTrigger.register(handler);
         }
     }
@@ -53,7 +54,7 @@ public class ScheduledDistributionTrigge
             String path = "/path/to/somewhere";
             int interval = 10;
             Scheduler scheduler = mock(Scheduler.class);
-            ScheduledDistributionTrigger scheduleddistributionTrigger = new ScheduledDistributionTrigger(action.name(), path, interval, scheduler);
+            ScheduledDistributionTrigger scheduleddistributionTrigger = new ScheduledDistributionTrigger(action.name(), path, interval, null, scheduler, mock(ResourceResolverFactory.class));
             DistributionRequestHandler handlerId = mock(DistributionRequestHandler.class);
             scheduleddistributionTrigger.unregister(handlerId);
         }

Modified: sling/trunk/contrib/extensions/distribution/it/pom.xml
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/distribution/it/pom.xml?rev=1713432&r1=1713431&r2=1713432&view=diff
==============================================================================
--- sling/trunk/contrib/extensions/distribution/it/pom.xml (original)
+++ sling/trunk/contrib/extensions/distribution/it/pom.xml Mon Nov  9 13:41:52 2015
@@ -281,7 +281,8 @@
                         <sling.additional.bundle.1>httpcore-osgi</sling.additional.bundle.1>
                         <sling.additional.bundle.2>httpclient-osgi</sling.additional.bundle.2>
                         <sling.additional.bundle.30>org.apache.sling.jcr.resource</sling.additional.bundle.30>
-                        <sling.additional.bundle.3>org.apache.sling.discovery.impl</sling.additional.bundle.3>
+                        <sling.additional.bundle.31>org.apache.sling.discovery.impl</sling.additional.bundle.31>
+                        <sling.additional.bundle.32>org.apache.sling.serviceusermapper</sling.additional.bundle.32>
                         <sling.additional.bundle.4>org.apache.sling.hc.core</sling.additional.bundle.4>
                         <sling.additional.bundle.5>org.apache.jackrabbit.vault</sling.additional.bundle.5>
                         <sling.additional.bundle.6>org.apache.sling.distribution.api</sling.additional.bundle.6>
@@ -403,6 +404,11 @@
             <version>2.7.2</version>
         </dependency>
         <dependency>
+            <groupId>org.apache.sling</groupId>
+            <artifactId>org.apache.sling.serviceusermapper</artifactId>
+            <version>1.2.0</version>
+        </dependency>
+        <dependency>
             <groupId>javax.jcr</groupId>
             <artifactId>jcr</artifactId>
             <version>2.0</version>

Modified: sling/trunk/contrib/extensions/distribution/it/src/test/java/org/apache/sling/distribution/it/DistributionIntegrationTestBase.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/distribution/it/src/test/java/org/apache/sling/distribution/it/DistributionIntegrationTestBase.java?rev=1713432&r1=1713431&r2=1713432&view=diff
==============================================================================
--- sling/trunk/contrib/extensions/distribution/it/src/test/java/org/apache/sling/distribution/it/DistributionIntegrationTestBase.java (original)
+++ sling/trunk/contrib/extensions/distribution/it/src/test/java/org/apache/sling/distribution/it/DistributionIntegrationTestBase.java Mon Nov  9 13:41:52 2015
@@ -62,22 +62,14 @@ public abstract class DistributionIntegr
         try {
 
             String remoteImporterUrl = publish.getServerBaseUrl() + importerUrl("default");
-            String remoteExporterUrl = publish.getServerBaseUrl() + exporterUrl("reverse");
 
 
 
-            {
-                assertExists(authorClient, authorAgentConfigUrl("publish"));
-
-                authorClient.setProperties(authorAgentConfigUrl("publish"),
-                        "packageImporter.endpoints", remoteImporterUrl);
-
-
-                Thread.sleep(1000);
-
-                assertExists(authorClient, agentUrl("publish"));
-            }
+            registerPublish("publish", "default");
+            registerPublish("impersonate-publish", "default");
 
+            registerReverse("publish-reverse", "reverse");
+            registerReverse("impersonate-publish-reverse", "impersonate-reverse");
 
             {
                 assertExists(authorClient, authorAgentConfigUrl("publish-multiple"));
@@ -102,18 +94,7 @@ public abstract class DistributionIntegr
                 assertExists(authorClient, agentUrl("publish-selective"));
             }
 
-            {
-                assertExists(authorClient, authorAgentConfigUrl("publish-reverse"));
-
-                authorClient.setProperties(authorAgentConfigUrl("publish-reverse"), "packageExporter.endpoints", remoteExporterUrl);
 
-                Thread.sleep(1000);
-                assertExists(authorClient, agentUrl("publish-reverse"));
-
-                assertExists(publishClient, exporterUrl("reverse"));
-                assertExists(publishClient, exporterUrl("default"));
-                assertExists(publishClient, importerUrl("default"));
-            }
 
         } catch (Exception ex) {
             throw new RuntimeException(ex);
@@ -134,5 +115,34 @@ public abstract class DistributionIntegr
         assertEmptyFolder(author, authorClient, "/var/sling/distribution/packages/vlt/data");
         assertEmptyFolder(publish, publishClient, "/etc/packages/sling/distribution");
     }
-    
+
+    public static void registerPublish(String publishAgent, String remoteImporter) throws Exception {
+        String remoteImporterUrl = publish.getServerBaseUrl() + importerUrl(remoteImporter);
+
+
+        assertExists(authorClient, authorAgentConfigUrl(publishAgent));
+
+        authorClient.setProperties(authorAgentConfigUrl(publishAgent),
+                "packageImporter.endpoints", remoteImporterUrl);
+
+
+        Thread.sleep(1000);
+
+        assertExists(authorClient, agentUrl(publishAgent));
+        assertExists(publishClient, importerUrl(remoteImporter));
+    }
+
+    public static void registerReverse(String reverseAgent, String remoteExporter) throws Exception {
+        String remoteExporterUrl = publish.getServerBaseUrl() + exporterUrl(remoteExporter);
+
+        assertExists(authorClient, authorAgentConfigUrl(reverseAgent));
+
+        authorClient.setProperties(authorAgentConfigUrl(reverseAgent), "packageExporter.endpoints", remoteExporterUrl);
+
+        Thread.sleep(1000);
+        assertExists(authorClient, agentUrl(reverseAgent));
+        assertExists(publishClient, exporterUrl(remoteExporter));
+    }
+
+
 }

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=1713432&r1=1713431&r2=1713432&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 Mon Nov  9 13:41:52 2015
@@ -54,6 +54,9 @@ public class DistributionUtils {
 
     private static final String JSON_SELECTOR = ".json";
     private static final String DISTRIBUTION_ROOT_PATH = "/libs/sling/distribution";
+    private static final String DISTRIBUTOR_USER = "testDistributorUser";
+    private static final String DISTRIBUTOR_PASSWORD = "123";
+
 
     public static JSONObject getResource(SlingInstance slingInstance, String path) throws IOException, JSONException {
         if (!path.endsWith(JSON_SELECTOR)) {
@@ -90,7 +93,7 @@ public class DistributionUtils {
         }
 
         return slingInstance.getRequestExecutor().execute(
-                request.withCredentials(slingInstance.getServerUsername(), slingInstance.getServerPassword())
+                request.withCredentials(DISTRIBUTOR_USER, DISTRIBUTOR_PASSWORD)
         ).assertStatus(status).getContent();
     }
 

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=1713432&r1=1713431&r2=1713432&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 Mon Nov  9 13:41:52 2015
@@ -20,6 +20,11 @@ package org.apache.sling.distribution.it
 
 import org.apache.sling.distribution.DistributionRequestType;
 import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+
+import java.util.Arrays;
+import java.util.Collection;
 
 import static org.apache.sling.distribution.it.DistributionUtils.assertExists;
 import static org.apache.sling.distribution.it.DistributionUtils.assertNotExists;
@@ -30,13 +35,29 @@ import static org.apache.sling.distribut
 /**
  * Integration test for forward distribution
  */
+@RunWith(Parameterized.class)
 public class ForwardDistributionTest extends DistributionIntegrationTestBase {
 
+    private final String publishAgent;
+
+    @Parameterized.Parameters
+    public static Collection<Object[]> generateData() {
+        return Arrays.asList(new Object[][] {
+            { "publish"},
+            { "impersonate-publish"},
+        });
+    }
+
+    public ForwardDistributionTest(String publishAgent) {
+
+        this.publishAgent = publishAgent;
+    }
+
     @Test
     public void testAddContent() throws Exception {
         String nodePath = createRandomNode(authorClient, "/content/forward_add_" + System.nanoTime());
         assertExists(authorClient, nodePath);
-        distribute(author, "publish", DistributionRequestType.ADD, nodePath);
+        distribute(author, publishAgent, DistributionRequestType.ADD, nodePath);
         assertExists(publishClient, nodePath);
     }
 
@@ -44,7 +65,7 @@ public class ForwardDistributionTest ext
     public void testTestContent() throws Exception {
         String nodePath = createRandomNode(authorClient, "/content/forward_test_" + System.nanoTime());
         assertExists(authorClient, nodePath);
-        distribute(author, "publish", DistributionRequestType.TEST, nodePath);
+        distribute(author, publishAgent, DistributionRequestType.TEST, nodePath);
         Thread.sleep(10000);
         assertNotExists(publishClient, nodePath);
     }
@@ -53,7 +74,7 @@ public class ForwardDistributionTest ext
     public void testDeleteContent() throws Exception {
         String nodePath = createRandomNode(publishClient, "/content/forward_del_" + System.nanoTime());
         assertExists(publishClient, nodePath);
-        distribute(author, "publish", DistributionRequestType.DELETE, nodePath);
+        distribute(author, publishAgent, DistributionRequestType.DELETE, nodePath);
         assertNotExists(publishClient, nodePath);
     }
 
@@ -66,7 +87,7 @@ public class ForwardDistributionTest ext
         authorClient.createNode(childPath);
         assertExists(authorClient, childPath);
 
-        distribute(author, "publish", DistributionRequestType.ADD, nodePath);
+        distribute(author, publishAgent, DistributionRequestType.ADD, nodePath);
         assertExists(publishClient, nodePath);
         assertNotExists(publishClient, childPath);
     }
@@ -80,7 +101,7 @@ public class ForwardDistributionTest ext
         authorClient.createNode(childPath);
         assertExists(authorClient, childPath);
 
-        distributeDeep(author, "publish", DistributionRequestType.ADD, nodePath);
+        distributeDeep(author, publishAgent, DistributionRequestType.ADD, nodePath);
         assertExists(publishClient, nodePath);
         assertExists(publishClient, childPath);
     }
@@ -98,7 +119,7 @@ public class ForwardDistributionTest ext
         authorClient.createNode(excludedChildPath);
         assertExists(authorClient, excludedChildPath);
 
-        distributeDeep(author, "publish", DistributionRequestType.ADD, nodePath);
+        distributeDeep(author, publishAgent, DistributionRequestType.ADD, nodePath);
         assertExists(publishClient, nodePath);
         assertExists(publishClient, childPath);
         assertNotExists(publishClient, excludedChildPath);
@@ -120,7 +141,7 @@ public class ForwardDistributionTest ext
         publishClient.createNode(child2Path);
         assertExists(publishClient, child2Path);
 
-        distribute(author, "publish", DistributionRequestType.ADD, child1Path);
+        distribute(author, publishAgent, DistributionRequestType.ADD, child1Path);
 
         assertExists(publishClient, child1Path);
         assertExists(publishClient, child2Path);
@@ -141,7 +162,7 @@ public class ForwardDistributionTest ext
         publishClient.createNode(child2Path);
         assertExists(publishClient, child2Path);
 
-        distributeDeep(author, "publish", DistributionRequestType.ADD, nodePath);
+        distributeDeep(author, publishAgent, DistributionRequestType.ADD, nodePath);
         assertExists(publishClient, nodePath);
         assertExists(publishClient, child1Path);
         assertExists(publishClient, child2Path);

Modified: sling/trunk/contrib/extensions/distribution/it/src/test/java/org/apache/sling/distribution/it/ReverseDistributionTest.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/distribution/it/src/test/java/org/apache/sling/distribution/it/ReverseDistributionTest.java?rev=1713432&r1=1713431&r2=1713432&view=diff
==============================================================================
--- sling/trunk/contrib/extensions/distribution/it/src/test/java/org/apache/sling/distribution/it/ReverseDistributionTest.java (original)
+++ sling/trunk/contrib/extensions/distribution/it/src/test/java/org/apache/sling/distribution/it/ReverseDistributionTest.java Mon Nov  9 13:41:52 2015
@@ -20,6 +20,11 @@ package org.apache.sling.distribution.it
 
 import org.apache.sling.distribution.DistributionRequestType;
 import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+
+import java.util.Arrays;
+import java.util.Collection;
 
 import static org.apache.sling.distribution.it.DistributionUtils.assertExists;
 import static org.apache.sling.distribution.it.DistributionUtils.assertNotExists;
@@ -29,13 +34,31 @@ import static org.apache.sling.distribut
 /**
  * Integration test for reverse distribution
  */
+@RunWith(Parameterized.class)
 public class ReverseDistributionTest extends DistributionIntegrationTestBase {
 
+
+    private final String reverseAgent;
+
+    @Parameterized.Parameters
+    public static Collection<Object[]> generateData() {
+        return Arrays.asList(new Object[][]{
+                {"reverse"},
+                {"impersonate-reverse"},
+        });
+    }
+
+    public ReverseDistributionTest(String reverseAgent) {
+
+        this.reverseAgent = reverseAgent;
+    }
+
+
     @Test
     public void testAddContent() throws Exception {
         String nodePath = createRandomNode(publishClient, "/content/reverse_add_" + System.nanoTime());
         assertExists(publishClient, nodePath);
-        distribute(publish, "reverse", DistributionRequestType.ADD, nodePath);
+        distribute(publish, reverseAgent, DistributionRequestType.ADD, nodePath);
         assertExists(authorClient, nodePath);
     }
 
@@ -43,7 +66,7 @@ public class ReverseDistributionTest ext
     public void testDeleteContent() throws Exception {
         String nodePath = createRandomNode(authorClient, "/content/reverse_del_" + System.nanoTime());
         assertExists(authorClient, nodePath);
-        distribute(publish, "reverse", DistributionRequestType.DELETE, nodePath);
+        distribute(publish, reverseAgent, DistributionRequestType.DELETE, nodePath);
         assertNotExists(authorClient, nodePath);
     }
 }

Modified: sling/trunk/contrib/extensions/distribution/sample/src/main/java/org/apache/sling/distribution/test/Init.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/distribution/sample/src/main/java/org/apache/sling/distribution/test/Init.java?rev=1713432&r1=1713431&r2=1713432&view=diff
==============================================================================
--- sling/trunk/contrib/extensions/distribution/sample/src/main/java/org/apache/sling/distribution/test/Init.java (original)
+++ sling/trunk/contrib/extensions/distribution/sample/src/main/java/org/apache/sling/distribution/test/Init.java Mon Nov  9 13:41:52 2015
@@ -25,8 +25,11 @@ import org.apache.felix.scr.annotations.
 import org.apache.felix.scr.annotations.Reference;
 import org.apache.jackrabbit.api.JackrabbitSession;
 import org.apache.jackrabbit.api.security.user.Authorizable;
+import org.apache.jackrabbit.api.security.user.User;
 import org.apache.jackrabbit.api.security.user.UserManager;
 import javax.jcr.security.Privilege;
+
+import org.apache.jackrabbit.commons.JcrUtils;
 import org.apache.jackrabbit.commons.jackrabbit.authorization.AccessControlUtils;
 import org.apache.sling.jcr.api.SlingRepository;
 import org.slf4j.Logger;
@@ -48,41 +51,66 @@ public class Init {
     public void activate() throws Exception {
 
         try {
-            final String userName = "testDistributionUser";
+            final String defaultAgentUserName = "distribution-agent-user";
+            final String serviceUserName = "testDistributionUser";
+            final String distributorUserName = "testDistributorUser";
+
             Session session = slingRepository.loginAdministrative(null);
 
             JackrabbitSession jackrabittSession  = (JackrabbitSession) session;
             UserManager userManager = jackrabittSession.getUserManager();
-            Authorizable user = userManager.getAuthorizable(userName);
+            Authorizable serviceUser = userManager.getAuthorizable(serviceUserName);
 
-            if (user == null) {
+            if (serviceUser == null) {
                 try {
-                    user = userManager.createSystemUser(userName, null);
-                    log.error("created system user", user);
+                    serviceUser = userManager.createSystemUser(serviceUserName, null);
+                    log.info("created system user {}", serviceUserName);
 
                 } catch (Throwable t) {
-                    user = userManager.createUser(userName, "123");
-                    log.error("created regular user", user);
-
+                    serviceUser = userManager.createUser(serviceUserName, "123");
+                    log.info("created regular user {}", serviceUserName);
                 }
             }
 
-            if (user != null) {
-                AccessControlUtils.addAccessControlEntry(session, "/", user.getPrincipal(), new String[]{ Privilege.JCR_ALL }, true);
+            if (serviceUser != null) {
+                AccessControlUtils.addAccessControlEntry(session, "/var/sling/distribution/packages", serviceUser.getPrincipal(), new String[]{ Privilege.JCR_ALL }, true);
+                AccessControlUtils.addAccessControlEntry(session, "/content", serviceUser.getPrincipal(), new String[]{ Privilege.JCR_ALL }, true);
+                AccessControlUtils.addAccessControlEntry(session, null, serviceUser.getPrincipal(), new String[]{ Privilege.JCR_ALL }, true);
 
-                AccessControlUtils.addAccessControlEntry(session, null, user.getPrincipal(), new String[]{ Privilege.JCR_ALL }, true);
+            }
 
-                session.save();
+            Authorizable distributorUser = userManager.getAuthorizable(distributorUserName);
 
-                session.logout();
+            if (distributorUser == null) {
+                distributorUser = userManager.createUser(distributorUserName, "123");
+                log.info("created regular user {}", distributorUserName);
             }
 
-        } catch (Throwable t) {
-            log.error("cannot create user", t);
-        }
+            JcrUtils.getOrCreateByPath("/content", "sling:Folder", session);
 
+            if (distributorUser != null) {
+                AccessControlUtils.addAccessControlEntry(session, "/var/sling/distribution/packages", distributorUser.getPrincipal(), new String[]{ Privilege.JCR_ALL }, true);
+                AccessControlUtils.addAccessControlEntry(session, "/content", distributorUser.getPrincipal(), new String[]{ Privilege.JCR_ALL }, true);
+                AccessControlUtils.addAccessControlEntry(session, "/libs/sling/distribution", distributorUser.getPrincipal(), new String[]{ Privilege.JCR_ALL }, true);
 
+                AccessControlUtils.addAccessControlEntry(session, null, distributorUser.getPrincipal(), new String[]{ Privilege.JCR_ALL }, true);
 
+            }
+
+            Authorizable defaultAgentUser = userManager.getAuthorizable(defaultAgentUserName);
+
+            if (defaultAgentUser == null) {
+                defaultAgentUser = userManager.createUser(defaultAgentUserName, "123");
+                log.info("created regular user {}", defaultAgentUserName);
+                ((User) distributorUser).getImpersonation().grantImpersonation(defaultAgentUser.getPrincipal());
+                ((User) serviceUser).getImpersonation().grantImpersonation(defaultAgentUser.getPrincipal());
+            }
+
+            session.save();
+            session.logout();
+        } catch (Throwable t) {
+            log.error("cannot create user", t);
+        }
     }
 
 

Added: sling/trunk/contrib/extensions/distribution/sample/src/main/resources/SLING-CONTENT/libs/sling/distribution/install.author/impersonate-publish-reverse/org.apache.sling.distribution.agent.impl.ReverseDistributionAgentFactory-impersonate-publish-reverse.json
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/distribution/sample/src/main/resources/SLING-CONTENT/libs/sling/distribution/install.author/impersonate-publish-reverse/org.apache.sling.distribution.agent.impl.ReverseDistributionAgentFactory-impersonate-publish-reverse.json?rev=1713432&view=auto
==============================================================================
--- sling/trunk/contrib/extensions/distribution/sample/src/main/resources/SLING-CONTENT/libs/sling/distribution/install.author/impersonate-publish-reverse/org.apache.sling.distribution.agent.impl.ReverseDistributionAgentFactory-impersonate-publish-reverse.json (added)
+++ sling/trunk/contrib/extensions/distribution/sample/src/main/resources/SLING-CONTENT/libs/sling/distribution/install.author/impersonate-publish-reverse/org.apache.sling.distribution.agent.impl.ReverseDistributionAgentFactory-impersonate-publish-reverse.json Mon Nov  9 13:41:52 2015
@@ -0,0 +1,17 @@
+{
+    "jcr:primaryType": "sling:OsgiConfig",
+
+    "name": "impersonate-publish-reverse",
+
+    "requestAuthorizationStrategy.target" : "(name=privilegeRead)",
+
+    "packageBuilder.target": "(name=vlt)",
+
+    "transportSecretProvider.target" : "(name=publishAdmin)",
+
+    "packageExporter.endpoints": [
+        "http://localhost:4503/libs/sling/distribution/services/exporters/impersonate-reverse"
+    ],
+
+    "triggers.target": "(name=impersonate-publish-reverse-scheduled)"
+}
\ No newline at end of file

Added: sling/trunk/contrib/extensions/distribution/sample/src/main/resources/SLING-CONTENT/libs/sling/distribution/install.author/impersonate-publish-reverse/org.apache.sling.distribution.trigger.impl.ScheduledDistributionTriggerFactory-impersonate-publish-reverse-scheduled.json
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/distribution/sample/src/main/resources/SLING-CONTENT/libs/sling/distribution/install.author/impersonate-publish-reverse/org.apache.sling.distribution.trigger.impl.ScheduledDistributionTriggerFactory-impersonate-publish-reverse-scheduled.json?rev=1713432&view=auto
==============================================================================
--- sling/trunk/contrib/extensions/distribution/sample/src/main/resources/SLING-CONTENT/libs/sling/distribution/install.author/impersonate-publish-reverse/org.apache.sling.distribution.trigger.impl.ScheduledDistributionTriggerFactory-impersonate-publish-reverse-scheduled.json (added)
+++ sling/trunk/contrib/extensions/distribution/sample/src/main/resources/SLING-CONTENT/libs/sling/distribution/install.author/impersonate-publish-reverse/org.apache.sling.distribution.trigger.impl.ScheduledDistributionTriggerFactory-impersonate-publish-reverse-scheduled.json Mon Nov  9 13:41:52 2015
@@ -0,0 +1,9 @@
+{
+    "jcr:primaryType": "sling:OsgiConfig",
+
+    "name": "impersonate-publish-reverse-scheduled",
+    "action": "pull",
+    "seconds": "30",
+
+    "serviceName" : "distributionService"
+}
\ No newline at end of file

Added: sling/trunk/contrib/extensions/distribution/sample/src/main/resources/SLING-CONTENT/libs/sling/distribution/install.author/impersonate-publish/org.apache.sling.distribution.agent.impl.ForwardDistributionAgentFactory-impersonate-publish.json
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/distribution/sample/src/main/resources/SLING-CONTENT/libs/sling/distribution/install.author/impersonate-publish/org.apache.sling.distribution.agent.impl.ForwardDistributionAgentFactory-impersonate-publish.json?rev=1713432&view=auto
==============================================================================
--- sling/trunk/contrib/extensions/distribution/sample/src/main/resources/SLING-CONTENT/libs/sling/distribution/install.author/impersonate-publish/org.apache.sling.distribution.agent.impl.ForwardDistributionAgentFactory-impersonate-publish.json (added)
+++ sling/trunk/contrib/extensions/distribution/sample/src/main/resources/SLING-CONTENT/libs/sling/distribution/install.author/impersonate-publish/org.apache.sling.distribution.agent.impl.ForwardDistributionAgentFactory-impersonate-publish.json Mon Nov  9 13:41:52 2015
@@ -0,0 +1,13 @@
+{
+    "jcr:primaryType": "sling:OsgiConfig",
+
+    "name": "impersonate-publish",
+
+    "packageBuilder.target": "(name=vlt)",
+
+    "transportSecretProvider.target" : "(name=publishAdmin)",
+
+    "packageImporter.endpoints": [
+        "http://localhost:4503/libs/sling/distribution/services/importers/default"
+    ]
+}
\ No newline at end of file

Added: sling/trunk/contrib/extensions/distribution/sample/src/main/resources/SLING-CONTENT/libs/sling/distribution/install.publish/impersonate-reverse/org.apache.sling.distribution.agent.impl.QueueDistributionAgentFactory-impersonate-reverse.json
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/distribution/sample/src/main/resources/SLING-CONTENT/libs/sling/distribution/install.publish/impersonate-reverse/org.apache.sling.distribution.agent.impl.QueueDistributionAgentFactory-impersonate-reverse.json?rev=1713432&view=auto
==============================================================================
--- sling/trunk/contrib/extensions/distribution/sample/src/main/resources/SLING-CONTENT/libs/sling/distribution/install.publish/impersonate-reverse/org.apache.sling.distribution.agent.impl.QueueDistributionAgentFactory-impersonate-reverse.json (added)
+++ sling/trunk/contrib/extensions/distribution/sample/src/main/resources/SLING-CONTENT/libs/sling/distribution/install.publish/impersonate-reverse/org.apache.sling.distribution.agent.impl.QueueDistributionAgentFactory-impersonate-reverse.json Mon Nov  9 13:41:52 2015
@@ -0,0 +1,13 @@
+{
+    "jcr:primaryType": "sling:OsgiConfig",
+    "name": "impersonate-reverse",
+
+    "serviceName" : "distributionService",
+
+    "requestAuthorizationStrategy.target" : "(name=privilegeRead)",
+
+    "packageBuilder.target" : "(name=vlt)",
+
+    "triggers.target": "(name=reverse-userGeneratedContent)"
+
+}
\ No newline at end of file