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/04/20 15:27:21 UTC

svn commit: r1674843 - in /sling/trunk/contrib/extensions/distribution: core/src/main/java/org/apache/sling/distribution/agent/impl/ core/src/main/java/org/apache/sling/distribution/queue/ core/src/main/java/org/apache/sling/distribution/queue/impl/job...

Author: mpetria
Date: Mon Apr 20 13:27:20 2015
New Revision: 1674843

URL: http://svn.apache.org/r1674843
Log:
SLING-4629: allow configuration of passive queues, for which processing is not enabled

Added:
    sling/trunk/contrib/extensions/distribution/sample/src/main/java/
    sling/trunk/contrib/extensions/distribution/sample/src/main/java/org/
    sling/trunk/contrib/extensions/distribution/sample/src/main/java/org/apache/
    sling/trunk/contrib/extensions/distribution/sample/src/main/java/org/apache/sling/
    sling/trunk/contrib/extensions/distribution/sample/src/main/java/org/apache/sling/distribution/
    sling/trunk/contrib/extensions/distribution/sample/src/main/java/org/apache/sling/distribution/test/
    sling/trunk/contrib/extensions/distribution/sample/src/main/java/org/apache/sling/distribution/test/Init.java
    sling/trunk/contrib/extensions/distribution/sample/src/main/resources/SLING-CONTENT/libs/sling/distribution/install.author/publish-multiple/org.apache.sling.distribution.packaging.impl.exporter.AgentDistributionPackageExporterFactory-publish-multiple.json
Modified:
    sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/agent/impl/ForwardDistributionAgentFactory.java
    sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/agent/impl/QueueDistributionAgentFactory.java
    sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/agent/impl/ReverseDistributionAgentFactory.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/agent/impl/SimpleDistributionAgentFactory.java
    sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/agent/impl/SyncDistributionAgentFactory.java
    sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/queue/DistributionQueueProvider.java
    sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/queue/impl/jobhandling/JobHandlingDistributionQueue.java
    sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/queue/impl/jobhandling/JobHandlingDistributionQueueProvider.java
    sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/queue/impl/simple/SimpleDistributionQueueProvider.java
    sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/resources/impl/ExtendedDistributionServiceResourceProvider.java
    sling/trunk/contrib/extensions/distribution/core/src/test/java/org/apache/sling/distribution/agent/impl/SimpleDistributionAgentTest.java
    sling/trunk/contrib/extensions/distribution/core/src/test/java/org/apache/sling/distribution/queue/impl/jobhandling/JobHandlingDistributionQueueTest.java
    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/MultipleForwardDistributionTest.java
    sling/trunk/contrib/extensions/distribution/sample/pom.xml
    sling/trunk/contrib/extensions/distribution/sample/src/main/resources/SLING-CONTENT/libs/sling/distribution/install.author/publish-multiple/org.apache.sling.distribution.agent.impl.ForwardDistributionAgentFactory-publish-multiple.json
    sling/trunk/contrib/extensions/distribution/sample/src/main/resources/SLING-CONTENT/libs/sling/distribution/install/org.apache.sling.serviceusermapping.impl.ServiceUserMapperImpl.amended-distribution.json

Modified: sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/agent/impl/ForwardDistributionAgentFactory.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/agent/impl/ForwardDistributionAgentFactory.java?rev=1674843&r1=1674842&r2=1674843&view=diff
==============================================================================
--- sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/agent/impl/ForwardDistributionAgentFactory.java (original)
+++ sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/agent/impl/ForwardDistributionAgentFactory.java Mon Apr 20 13:27:20 2015
@@ -54,7 +54,11 @@ import org.osgi.framework.BundleContext;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import java.util.Arrays;
+import java.util.HashSet;
 import java.util.Map;
+import java.util.Set;
+import java.util.TreeSet;
 
 /**
  * An OSGi service factory for {@link org.apache.sling.distribution.agent.DistributionAgent}s which references already existing OSGi services.
@@ -118,6 +122,9 @@ public class ForwardDistributionAgentFac
             "If the queue names are not specified by importer endpoints definition then they are autogenerated.")
     public static final String USE_MULTIPLE_QUEUES = "useMultipleQueues";
 
+    @Property(cardinality = 100, label = "Passive queues", description = "List of queues that should be disabled." +
+            "These queues will gather all the packages until they are removed explicitly.")
+    public static final String PASSIVE_QUEUES = "passiveQueues";
 
 
     @Property(name = "requestAuthorizationStrategy.target", label = "Request Authorization Strategy", description = "The target reference for the DistributionRequestAuthorizationStrategy used to authorize the access to distribution process," +
@@ -184,6 +191,9 @@ public class ForwardDistributionAgentFac
 
         boolean queueProcessingEnabled = PropertiesUtil.toBoolean(config.get(QUEUE_PROCESSING_ENABLED), true);
 
+        String[] passiveQueues = PropertiesUtil.toStringArray(config.get(PASSIVE_QUEUES), new String[0]);
+        passiveQueues = SettingsUtils.removeEmptyEntries(passiveQueues);
+
 
 
         DistributionPackageExporter packageExporter = new LocalDistributionPackageExporter(packageBuilder);
@@ -195,8 +205,11 @@ public class ForwardDistributionAgentFac
         boolean useMultipleQueues = PropertiesUtil.toBoolean(config.get(USE_MULTIPLE_QUEUES), false);
 
         if (useMultipleQueues) {
-            java.util.Set<String> var = importerEndpointsMap.keySet();
-            String[] queueNames = var.toArray(new String[var.size()]);
+            Set<String> queuesMap = new TreeSet<String>();
+            queuesMap.addAll(importerEndpointsMap.keySet());
+            queuesMap.addAll(Arrays.asList(passiveQueues));
+
+            String[] queueNames = queuesMap.toArray(new String[0]);
             dispatchingStrategy = new MultipleQueueDispatchingStrategy(queueNames);
             packageImporter = new RemoteDistributionPackageImporter(distributionLog, transportSecretProvider, importerEndpointsMap, TransportEndpointStrategyType.One);
         } else {
@@ -207,8 +220,8 @@ public class ForwardDistributionAgentFac
         DistributionRequestType[] allowedRequests = new DistributionRequestType[] { DistributionRequestType.ADD, DistributionRequestType.DELETE };
 
 
-        return new SimpleDistributionAgent(agentName, queueProcessingEnabled, serviceName,
-                packageImporter, packageExporter, requestAuthorizationStrategy,
+        return new SimpleDistributionAgent(agentName, queueProcessingEnabled, passiveQueues,
+                serviceName, packageImporter, packageExporter, requestAuthorizationStrategy,
                 queueProvider, dispatchingStrategy, distributionEventFactory, resourceResolverFactory, distributionLog, allowedRequests, allowedRoots);
 
 

Modified: sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/agent/impl/QueueDistributionAgentFactory.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/agent/impl/QueueDistributionAgentFactory.java?rev=1674843&r1=1674842&r2=1674843&view=diff
==============================================================================
--- sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/agent/impl/QueueDistributionAgentFactory.java (original)
+++ sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/agent/impl/QueueDistributionAgentFactory.java Mon Apr 20 13:27:20 2015
@@ -160,8 +160,8 @@ public class QueueDistributionAgentFacto
         DistributionRequestType[] allowedRequests = new DistributionRequestType[] { DistributionRequestType.ADD, DistributionRequestType.DELETE };
 
 
-        return new SimpleDistributionAgent(agentName, false, serviceName,
-                null, packageExporter, requestAuthorizationStrategy,
+        return new SimpleDistributionAgent(agentName, false, null,
+                serviceName, null, packageExporter, requestAuthorizationStrategy,
                 queueProvider, dispatchingStrategy, distributionEventFactory, resourceResolverFactory, distributionLog, allowedRequests, allowedRoots);
     }
 }

Modified: sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/agent/impl/ReverseDistributionAgentFactory.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/agent/impl/ReverseDistributionAgentFactory.java?rev=1674843&r1=1674842&r2=1674843&view=diff
==============================================================================
--- sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/agent/impl/ReverseDistributionAgentFactory.java (original)
+++ sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/agent/impl/ReverseDistributionAgentFactory.java Mon Apr 20 13:27:20 2015
@@ -100,6 +100,9 @@ public class ReverseDistributionAgentFac
     @Property(boolValue = true, label = "Queue Processing Enabled", description = "Whether or not the distribution agent should process packages in the queues.")
     public static final String QUEUE_PROCESSING_ENABLED = "queue.processing.enabled";
 
+    @Property(cardinality = 100, label = "Passive queues", description = "List of queues that should be disabled." +
+            "These queues will gather all the packages until they are removed explicitly.")
+    public static final String PASSIVE_QUEUES = "passiveQueues";
 
     /**
      * endpoints property
@@ -175,6 +178,9 @@ public class ReverseDistributionAgentFac
         String serviceName = PropertiesUtil.toString(config.get(SERVICE_NAME), null);
         boolean queueProcessingEnabled = PropertiesUtil.toBoolean(config.get(QUEUE_PROCESSING_ENABLED), true);
 
+        String[] passiveQueues = PropertiesUtil.toStringArray(config.get(PASSIVE_QUEUES), new String[0]);
+        passiveQueues = SettingsUtils.removeEmptyEntries(passiveQueues);
+
 
         String[] exporterEndpoints = PropertiesUtil.toStringArray(config.get(EXPORTER_ENDPOINTS), new String[0]);
         exporterEndpoints = SettingsUtils.removeEmptyEntries(exporterEndpoints);
@@ -192,8 +198,8 @@ public class ReverseDistributionAgentFac
         DistributionRequestType[] allowedRequests = new DistributionRequestType[] { DistributionRequestType.PULL };
 
 
-        return new SimpleDistributionAgent(agentName, queueProcessingEnabled, serviceName,
-                packageImporter, packageExporter, requestAuthorizationStrategy,
+        return new SimpleDistributionAgent(agentName, queueProcessingEnabled, passiveQueues,
+                serviceName, packageImporter, packageExporter, requestAuthorizationStrategy,
                 queueProvider, dispatchingStrategy, distributionEventFactory, resourceResolverFactory, distributionLog, allowedRequests, 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=1674843&r1=1674842&r2=1674843&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 Apr 20 13:27:20 2015
@@ -19,12 +19,16 @@
 package org.apache.sling.distribution.agent.impl;
 
 import javax.annotation.Nonnull;
+import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
 import java.util.HashMap;
+import java.util.HashSet;
 import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
+import java.util.TreeSet;
 
 import org.apache.sling.api.resource.LoginException;
 import org.apache.sling.api.resource.PersistenceException;
@@ -90,9 +94,11 @@ public class SimpleDistributionAgent imp
     private final DefaultDistributionLog log;
     private final DistributionRequestType[] allowedRequests;
     private final String[] allowedRoots;
+    private final String[] passiveQueues;
 
     public SimpleDistributionAgent(String name,
                                    boolean queueProcessingEnabled,
+                                   String[] passiveQueues,
                                    String subServiceName,
                                    DistributionPackageImporter distributionPackageImporter,
                                    DistributionPackageExporter distributionPackageExporter,
@@ -107,6 +113,7 @@ public class SimpleDistributionAgent imp
         this.log = log;
         this.allowedRequests = allowedRequests;
         this.allowedRoots = allowedRoots;
+        this.passiveQueues = passiveQueues;
 
         // check configuration is valid
         if (name == null
@@ -306,7 +313,15 @@ public class SimpleDistributionAgent imp
 
         if (!isPassive()) {
             try {
-                queueProvider.enableQueueProcessing(new PackageQueueProcessor());
+
+                Set<String> allQueues = new HashSet<String>(queueDistributionStrategy.getQueueNames());
+
+                if (passiveQueues != null) {
+                    Set<String> passiveQueues = new HashSet<String>(Arrays.asList(this.passiveQueues));
+                    allQueues.removeAll(passiveQueues);
+                }
+
+                queueProvider.enableQueueProcessing(new PackageQueueProcessor(), allQueues.toArray(new String[0]));
             } catch (DistributionQueueException e) {
                 log.error("cannot enable queue processing", e);
             }
@@ -475,7 +490,6 @@ public class SimpleDistributionAgent imp
     class PackageQueueProcessor implements DistributionQueueProcessor {
         public boolean process(@Nonnull String queueName, @Nonnull DistributionQueueItem queueItem) {
             try {
-
                 log.debug("queue {} processing item {}", queueName, queueItem);
 
                 boolean success = processQueueItem(queueName, queueItem);

Modified: sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/agent/impl/SimpleDistributionAgentFactory.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/agent/impl/SimpleDistributionAgentFactory.java?rev=1674843&r1=1674842&r2=1674843&view=diff
==============================================================================
--- sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/agent/impl/SimpleDistributionAgentFactory.java (original)
+++ sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/agent/impl/SimpleDistributionAgentFactory.java Mon Apr 20 13:27:20 2015
@@ -32,6 +32,7 @@ import org.apache.felix.scr.annotations.
 import org.apache.sling.api.resource.ResourceResolverFactory;
 import org.apache.sling.commons.osgi.PropertiesUtil;
 import org.apache.sling.distribution.component.impl.DistributionComponentConstants;
+import org.apache.sling.distribution.component.impl.SettingsUtils;
 import org.apache.sling.distribution.event.impl.DistributionEventFactory;
 import org.apache.sling.distribution.log.impl.DefaultDistributionLog;
 import org.apache.sling.distribution.packaging.DistributionPackageExporter;
@@ -93,6 +94,10 @@ public class SimpleDistributionAgentFact
     @Property(boolValue = true, label = "Queue Processing Enabled", description = "Whether or not the distribution agent should process packages in the queues.")
     public static final String QUEUE_PROCESSING_ENABLED = "queue.processing.enabled";
 
+    @Property(cardinality = 100, label = "Passive queues", description = "List of queues that should be disabled." +
+            "These queues will gather all the packages until they are removed explicitly.")
+    public static final String PASSIVE_QUEUES = "passiveQueues";
+
 
     @Property(name = "packageExporter.target", label = "Exporter", description = "The target reference for the DistributionPackageExporter used to receive (export) the distribution packages," +
             "e.g. use target=(name=...) to bind to services by name.")
@@ -155,11 +160,13 @@ public class SimpleDistributionAgentFact
         String serviceName = PropertiesUtil.toString(config.get(SERVICE_NAME), null);
 
         boolean queueProcessingEnabled = PropertiesUtil.toBoolean(config.get(QUEUE_PROCESSING_ENABLED), true);
+        String[] passiveQueues = PropertiesUtil.toStringArray(config.get(PASSIVE_QUEUES), new String[0]);
+        passiveQueues = SettingsUtils.removeEmptyEntries(passiveQueues);
 
         DistributionQueueProvider queueProvider =  new JobHandlingDistributionQueueProvider(agentName, jobManager, context);
         DistributionQueueDispatchingStrategy dispatchingStrategy = new SingleQueueDispatchingStrategy();
-        return new SimpleDistributionAgent(agentName, queueProcessingEnabled, serviceName,
-                packageImporter, packageExporter, requestAuthorizationStrategy,
+        return new SimpleDistributionAgent(agentName, queueProcessingEnabled, passiveQueues,
+                serviceName, packageImporter, packageExporter, requestAuthorizationStrategy,
                 queueProvider, dispatchingStrategy, distributionEventFactory, resourceResolverFactory, distributionLog, null, null);
 
     }

Modified: sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/agent/impl/SyncDistributionAgentFactory.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/agent/impl/SyncDistributionAgentFactory.java?rev=1674843&r1=1674842&r2=1674843&view=diff
==============================================================================
--- sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/agent/impl/SyncDistributionAgentFactory.java (original)
+++ sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/agent/impl/SyncDistributionAgentFactory.java Mon Apr 20 13:27:20 2015
@@ -54,7 +54,11 @@ import org.osgi.framework.BundleContext;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import java.util.Arrays;
+import java.util.HashSet;
 import java.util.Map;
+import java.util.Set;
+import java.util.TreeSet;
 
 /**
  * An OSGi service factory for {@link org.apache.sling.distribution.agent.DistributionAgent}s which references already existing OSGi services.
@@ -101,6 +105,10 @@ public class SyncDistributionAgentFactor
     @Property(boolValue = true, label = "Queue Processing Enabled", description = "Whether or not the distribution agent should process packages in the queues.")
     public static final String QUEUE_PROCESSING_ENABLED = "queue.processing.enabled";
 
+    @Property(cardinality = 100, label = "Passive queues", description = "List of queues that should be disabled." +
+            "These queues will gather all the packages until they are removed explicitly.")
+    public static final String PASSIVE_QUEUES = "passiveQueues";
+
     /**
      * endpoints property
      */
@@ -120,6 +128,7 @@ public class SyncDistributionAgentFactor
             "If the queue names are not specified by importer endpoints definition then they are autogenerated.")
     public static final String USE_MULTIPLE_QUEUES = "useMultipleQueues";
 
+
     /**
      * no. of items to poll property
      */
@@ -188,6 +197,9 @@ public class SyncDistributionAgentFactor
         String serviceName = PropertiesUtil.toString(config.get(SERVICE_NAME), null);
         boolean queueProcessingEnabled = PropertiesUtil.toBoolean(config.get(QUEUE_PROCESSING_ENABLED), true);
 
+        String[] passiveQueues = PropertiesUtil.toStringArray(config.get(PASSIVE_QUEUES), new String[0]);
+        passiveQueues = SettingsUtils.removeEmptyEntries(passiveQueues);
+
 
 
         Object exporterEndpointsValue = config.get(EXPORTER_ENDPOINTS);
@@ -196,6 +208,7 @@ public class SyncDistributionAgentFactor
         String[] exporterEndpoints = PropertiesUtil.toStringArray(exporterEndpointsValue, new String[0]);
         exporterEndpoints = SettingsUtils.removeEmptyEntries(exporterEndpoints);
 
+
         Map<String, String> importerEndpointsMap = SettingsUtils.toUriMap(importerEndpointsValue);
 
         boolean useMultipleQueues = PropertiesUtil.toBoolean(config.get(USE_MULTIPLE_QUEUES), false);
@@ -206,8 +219,11 @@ public class SyncDistributionAgentFactor
         DistributionPackageImporter packageImporter;
 
         if (useMultipleQueues) {
-            java.util.Set<String> var = importerEndpointsMap.keySet();
-            String[] queueNames = var.toArray(new String[var.size()]);
+            Set<String> queuesMap = new TreeSet<String>();
+            queuesMap.addAll(importerEndpointsMap.keySet());
+            queuesMap.addAll(Arrays.asList(passiveQueues));
+
+            String[] queueNames = queuesMap.toArray(new String[0]);
             dispatchingStrategy = new MultipleQueueDispatchingStrategy(queueNames);
             packageImporter = new RemoteDistributionPackageImporter(distributionLog, transportSecretProvider, importerEndpointsMap, TransportEndpointStrategyType.One);
         } else {
@@ -219,8 +235,8 @@ public class SyncDistributionAgentFactor
         DistributionQueueProvider queueProvider =  new JobHandlingDistributionQueueProvider(agentName, jobManager, context);
         DistributionRequestType[] allowedRequests = new DistributionRequestType[] { DistributionRequestType.PULL };
 
-        return new SimpleDistributionAgent(agentName, queueProcessingEnabled, serviceName,
-                packageImporter, packageExporter, requestAuthorizationStrategy,
+        return new SimpleDistributionAgent(agentName, queueProcessingEnabled, passiveQueues,
+                serviceName, packageImporter, packageExporter, requestAuthorizationStrategy,
                 queueProvider, dispatchingStrategy, distributionEventFactory, resourceResolverFactory, distributionLog, allowedRequests, null);
 
     }

Modified: sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/queue/DistributionQueueProvider.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/queue/DistributionQueueProvider.java?rev=1674843&r1=1674842&r2=1674843&view=diff
==============================================================================
--- sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/queue/DistributionQueueProvider.java (original)
+++ sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/queue/DistributionQueueProvider.java Mon Apr 20 13:27:20 2015
@@ -43,7 +43,7 @@ public interface DistributionQueueProvid
      *
      * @param queueProcessor the queue processor to be used
      */
-    void enableQueueProcessing(@Nonnull DistributionQueueProcessor queueProcessor) throws DistributionQueueException;
+    void enableQueueProcessing(@Nonnull DistributionQueueProcessor queueProcessor, String... queueNames) throws DistributionQueueException;
 
 
     /**

Modified: sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/queue/impl/jobhandling/JobHandlingDistributionQueue.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/queue/impl/jobhandling/JobHandlingDistributionQueue.java?rev=1674843&r1=1674842&r2=1674843&view=diff
==============================================================================
--- sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/queue/impl/jobhandling/JobHandlingDistributionQueue.java (original)
+++ sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/queue/impl/jobhandling/JobHandlingDistributionQueue.java Mon Apr 20 13:27:20 2015
@@ -52,10 +52,13 @@ public class JobHandlingDistributionQueu
 
     private final JobManager jobManager;
 
-    JobHandlingDistributionQueue(String name, String topic, JobManager jobManager) {
+    private final boolean isActive;
+
+    JobHandlingDistributionQueue(String name, String topic, JobManager jobManager, boolean isActive) {
         this.name = name;
         this.topic = topic;
         this.jobManager = jobManager;
+        this.isActive = isActive;
     }
 
     @Nonnull
@@ -204,7 +207,11 @@ public class JobHandlingDistributionQueu
     }
 
     public DistributionQueueState getState() {
-        return DistributionQueueUtils.calculateState(this);
+        if (!isActive) {
+            return DistributionQueueState.PAUSED;
+        } else {
+            return DistributionQueueUtils.calculateState(this);
+        }
     }
 
 }

Modified: sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/queue/impl/jobhandling/JobHandlingDistributionQueueProvider.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/queue/impl/jobhandling/JobHandlingDistributionQueueProvider.java?rev=1674843&r1=1674842&r2=1674843&view=diff
==============================================================================
--- sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/queue/impl/jobhandling/JobHandlingDistributionQueueProvider.java (original)
+++ sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/queue/impl/jobhandling/JobHandlingDistributionQueueProvider.java Mon Apr 20 13:27:20 2015
@@ -19,8 +19,14 @@
 package org.apache.sling.distribution.queue.impl.jobhandling;
 
 import javax.annotation.Nonnull;
+import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.Dictionary;
+import java.util.HashSet;
 import java.util.Hashtable;
+import java.util.List;
+import java.util.Set;
+import java.util.concurrent.ConcurrentSkipListSet;
 
 import org.apache.sling.distribution.queue.DistributionQueue;
 import org.apache.sling.distribution.queue.DistributionQueueException;
@@ -47,6 +53,7 @@ public class JobHandlingDistributionQueu
     private ServiceRegistration jobConsumer = null;
 
     private BundleContext context;
+    private Set<String> processingQueueNames = null;
 
 
     public JobHandlingDistributionQueueProvider(String name, JobManager jobManager, BundleContext context) {
@@ -61,23 +68,39 @@ public class JobHandlingDistributionQueu
     @Nonnull
     public DistributionQueue getQueue(@Nonnull String queueName) throws DistributionQueueException {
         String topic = JobHandlingDistributionQueue.DISTRIBUTION_QUEUE_TOPIC + '/' + name + "/" + queueName;
-        return new JobHandlingDistributionQueue(queueName, topic, jobManager);
+        boolean isActive = jobConsumer != null && (processingQueueNames == null ||  processingQueueNames.contains(queueName));
+
+        return new JobHandlingDistributionQueue(queueName, topic, jobManager, isActive);
     }
 
 
-    public void enableQueueProcessing(@Nonnull DistributionQueueProcessor queueProcessor) throws DistributionQueueException {
+    public void enableQueueProcessing(@Nonnull DistributionQueueProcessor queueProcessor, String... queueNames) throws DistributionQueueException {
         if (jobConsumer != null) {
             throw new DistributionQueueException("job already registered");
         }
         // eventually register job consumer for sling job handling based queues
         Dictionary<String, Object> jobProps = new Hashtable<String, Object>();
-        String topic = JobHandlingDistributionQueue.DISTRIBUTION_QUEUE_TOPIC + '/' + name;
-        String childTopic = topic + "/*";
-        jobProps.put(JobConsumer.PROPERTY_TOPICS, new String[]{topic, childTopic});
+        String mainTopic = JobHandlingDistributionQueue.DISTRIBUTION_QUEUE_TOPIC + '/' + name;
+
+        List<String> topicList = new ArrayList<String>();
+        if (queueNames == null) {
+            topicList.add(mainTopic + "/*");
+            processingQueueNames = null;
+        } else {
+            for (String queueName : queueNames) {
+                topicList.add(mainTopic + "/" + queueName);
+            }
+            processingQueueNames = new HashSet<String>(Arrays.asList(queueNames));
+        }
+
+        jobProps.put(JobConsumer.PROPERTY_TOPICS, topicList.toArray(new String[0]));
+
         log.info("registering job consumer for agent {}", name);
         log.info("qp: {}, jp: {}", queueProcessor, jobProps);
         jobConsumer = context.registerService(JobConsumer.class.getName(), new DistributionAgentJobConsumer(queueProcessor), jobProps);
         log.info("job consumer for agent {} registered", name);
+
+
     }
 
     public void disableQueueProcessing() {
@@ -86,6 +109,7 @@ public class JobHandlingDistributionQueu
             log.info("job consumer for agent {} unregistered", name);
             jobConsumer = null;
         }
+        processingQueueNames = null;
         log.info("unregistering job consumer for agent {}", name);
 
     }

Modified: sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/queue/impl/simple/SimpleDistributionQueueProvider.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/queue/impl/simple/SimpleDistributionQueueProvider.java?rev=1674843&r1=1674842&r2=1674843&view=diff
==============================================================================
--- sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/queue/impl/simple/SimpleDistributionQueueProvider.java (original)
+++ sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/queue/impl/simple/SimpleDistributionQueueProvider.java Mon Apr 20 13:27:20 2015
@@ -77,7 +77,7 @@ public class SimpleDistributionQueueProv
         return queueMap.values();
     }
 
-    public void enableQueueProcessing(@Nonnull DistributionQueueProcessor queueProcessor) {
+    public void enableQueueProcessing(@Nonnull DistributionQueueProcessor queueProcessor, String... queueNames) {
         ScheduleOptions options = scheduler.NOW(-1, 10)
                 .canRunConcurrently(false)
                 .name(getJobName());

Modified: sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/resources/impl/ExtendedDistributionServiceResourceProvider.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/resources/impl/ExtendedDistributionServiceResourceProvider.java?rev=1674843&r1=1674842&r2=1674843&view=diff
==============================================================================
--- sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/resources/impl/ExtendedDistributionServiceResourceProvider.java (original)
+++ sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/resources/impl/ExtendedDistributionServiceResourceProvider.java Mon Apr 20 13:27:20 2015
@@ -131,17 +131,9 @@ public class ExtendedDistributionService
             try {
                 DistributionQueue queue = agent.getQueue(queueName);
 
-                DistributionAgentState agentState = agent.getState();
-
                 result.put(SLING_RESOURCE_TYPE, DistributionResourceTypes.AGENT_QUEUE_RESOURCE_TYPE);
 
-                // if the agent is paused report also the queues as paused.
-                // TODO: to this at java API level
-                if (DistributionAgentState.PAUSED.equals(agentState)) {
-                    result.put("state", DistributionQueueState.PAUSED.name());
-                } else {
-                    result.put("state", queue.getState().name());
-                }
+                result.put("state", queue.getState().name());
                 result.put("empty", queue.isEmpty());
                 result.put("itemsCount", queue.getItemsCount());
 

Modified: sling/trunk/contrib/extensions/distribution/core/src/test/java/org/apache/sling/distribution/agent/impl/SimpleDistributionAgentTest.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/distribution/core/src/test/java/org/apache/sling/distribution/agent/impl/SimpleDistributionAgentTest.java?rev=1674843&r1=1674842&r2=1674843&view=diff
==============================================================================
--- sling/trunk/contrib/extensions/distribution/core/src/test/java/org/apache/sling/distribution/agent/impl/SimpleDistributionAgentTest.java (original)
+++ sling/trunk/contrib/extensions/distribution/core/src/test/java/org/apache/sling/distribution/agent/impl/SimpleDistributionAgentTest.java Mon Apr 20 13:27:20 2015
@@ -69,7 +69,7 @@ public class SimpleDistributionAgentTest
         ResourceResolverFactory resolverFactory = mock(ResourceResolverFactory.class);
 
         SimpleDistributionAgent agent = new SimpleDistributionAgent(name,
-                false, "serviceName", packageImporter,
+                false, null, "serviceName", packageImporter,
                 packageExporter, packageExporterStrategy,
                 queueProvider, distributionHandler,
                 distributionEventFactory, resolverFactory, mock(DefaultDistributionLog.class), null, null);
@@ -99,7 +99,7 @@ public class SimpleDistributionAgentTest
         DistributionEventFactory distributionEventFactory = mock(DistributionEventFactory.class);
         ResourceResolverFactory resolverFactory = mock(ResourceResolverFactory.class);
         SimpleDistributionAgent agent = new SimpleDistributionAgent(name,
-                false, "subServiceName", packageImporter,
+                false, null, "subServiceName", packageImporter,
                 packageExporter, packageExporterStrategy,
                 queueProvider,
                 distributionHandler, distributionEventFactory, resolverFactory, mock(DefaultDistributionLog.class), null, null);
@@ -133,7 +133,7 @@ public class SimpleDistributionAgentTest
         ResourceResolverFactory resolverFactory = mock(ResourceResolverFactory.class);
 
         SimpleDistributionAgent agent = new SimpleDistributionAgent(name,
-                false, "serviceName", packageImporter,
+                false, null, "serviceName", packageImporter,
                 packageExporter, packageExporterStrategy,
                 queueProvider, distributionHandler,
                 distributionEventFactory, resolverFactory, mock(DefaultDistributionLog.class), null, null);
@@ -163,7 +163,7 @@ public class SimpleDistributionAgentTest
         ResourceResolverFactory resolverFactory = mock(ResourceResolverFactory.class);
 
         SimpleDistributionAgent agent = new SimpleDistributionAgent(name,
-                false, "serviceName", packageImporter,
+                false, null, "serviceName", packageImporter,
                 packageExporter, packageExporterStrategy,
                 queueProvider, distributionHandler,
                 distributionEventFactory, resolverFactory, mock(DefaultDistributionLog.class), null, null);
@@ -186,7 +186,7 @@ public class SimpleDistributionAgentTest
         ResourceResolverFactory resolverFactory = mock(ResourceResolverFactory.class);
 
         SimpleDistributionAgent agent = new SimpleDistributionAgent(name,
-                false, "serviceName", packageImporter,
+                false, null, "serviceName", packageImporter,
                 packageExporter, packageExporterStrategy,
                 queueProvider, distributionHandler,
                 distributionEventFactory, resolverFactory, mock(DefaultDistributionLog.class), null, null);
@@ -208,7 +208,7 @@ public class SimpleDistributionAgentTest
         ResourceResolverFactory resolverFactory = mock(ResourceResolverFactory.class);
 
         SimpleDistributionAgent agent = new SimpleDistributionAgent(name,
-                false, "serviceName", packageImporter,
+                false, null, "serviceName", packageImporter,
                 packageExporter, packageExporterStrategy,
                 queueProvider, distributionHandler,
                 distributionEventFactory, resolverFactory, mock(DefaultDistributionLog.class), null, null);
@@ -236,7 +236,7 @@ public class SimpleDistributionAgentTest
         ));
 
         SimpleDistributionAgent agent = new SimpleDistributionAgent(name,
-                false, "serviceName", packageImporter,
+                false, null, "serviceName", packageImporter,
                 packageExporter, packageExporterStrategy,
                 queueProvider, queueDistributionStrategy,
                 distributionEventFactory, resolverFactory, mock(DefaultDistributionLog.class), null, new String[] { "/content" });
@@ -275,7 +275,7 @@ public class SimpleDistributionAgentTest
         ));
 
         SimpleDistributionAgent agent = new SimpleDistributionAgent(name,
-                false, "serviceName", packageImporter,
+                false, null, "serviceName", packageImporter,
                 packageExporter, packageExporterStrategy,
                 queueProvider, queueDistributionStrategy,
                 distributionEventFactory, resolverFactory, mock(DefaultDistributionLog.class), null, new String[] { "/content" });

Modified: sling/trunk/contrib/extensions/distribution/core/src/test/java/org/apache/sling/distribution/queue/impl/jobhandling/JobHandlingDistributionQueueTest.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/distribution/core/src/test/java/org/apache/sling/distribution/queue/impl/jobhandling/JobHandlingDistributionQueueTest.java?rev=1674843&r1=1674842&r2=1674843&view=diff
==============================================================================
--- sling/trunk/contrib/extensions/distribution/core/src/test/java/org/apache/sling/distribution/queue/impl/jobhandling/JobHandlingDistributionQueueTest.java (original)
+++ sling/trunk/contrib/extensions/distribution/core/src/test/java/org/apache/sling/distribution/queue/impl/jobhandling/JobHandlingDistributionQueueTest.java Mon Apr 20 13:27:20 2015
@@ -58,7 +58,7 @@ public class JobHandlingDistributionQueu
         when(jobManager.createJob(topic)).thenReturn(builder);
         when(jobManager.findJobs(JobManager.QueryType.ALL, topic, -1)).thenReturn(Collections.<Job>emptySet());
         when(builder.properties(any(Map.class))).thenReturn(builder);
-        DistributionQueue queue = new JobHandlingDistributionQueue("aname", topic, jobManager);
+        DistributionQueue queue = new JobHandlingDistributionQueue("aname", topic, jobManager, true);
         DistributionQueueItem distributionQueueItem = mock(DistributionQueueItem.class);
         DistributionPackageInfo packageInfo = new DistributionPackageInfo();
         packageInfo.setPaths(new String[]{"/foo"});
@@ -80,7 +80,7 @@ public class JobHandlingDistributionQueu
         when(jobManager.createJob(topic)).thenReturn(builder);
         when(jobManager.findJobs(JobManager.QueryType.ALL, topic, -1)).thenReturn(Collections.<Job>emptySet());
         when(builder.properties(any(Map.class))).thenReturn(builder);
-        DistributionQueue queue = new JobHandlingDistributionQueue("aname", topic, jobManager);
+        DistributionQueue queue = new JobHandlingDistributionQueue("aname", topic, jobManager, true);
         DistributionQueueItem distributionQueueItem = mock(DistributionQueueItem.class);
         DistributionPackageInfo packageInfo = new DistributionPackageInfo();
         packageInfo.setPaths(new String[]{"/foo"});

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=1674843&r1=1674842&r2=1674843&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 Apr 20 13:27:20 2015
@@ -59,43 +59,50 @@ public abstract class DistributionIntegr
         publishClient = new SlingClient(publish.getServerBaseUrl(), publish.getServerUsername(), publish.getServerPassword());
 
         try {
-            assertExists(authorClient, authorAgentConfigUrl("publish"));
 
-            // change the url for publish agent and wait for it to start
             String remoteImporterUrl = publish.getServerBaseUrl() + importerUrl("default");
+            String remoteExporterUrl = publish.getServerBaseUrl() + exporterUrl("reverse");
 
 
-            authorClient.setProperties(authorAgentConfigUrl("publish"),
-                    "packageImporter.endpoints", remoteImporterUrl);
 
+            {
+                assertExists(authorClient, authorAgentConfigUrl("publish"));
 
-            Thread.sleep(3000);
+                authorClient.setProperties(authorAgentConfigUrl("publish"),
+                        "packageImporter.endpoints", remoteImporterUrl);
 
-            assertExists(authorClient, agentUrl("publish"));
 
+                Thread.sleep(3000);
 
-            assertExists(authorClient, authorAgentConfigUrl("publish-multiple"));
-            setArrayProperties(author, authorAgentConfigUrl("publish-multiple"),
-                    "packageImporter.endpoints", remoteImporterUrl, remoteImporterUrl + "badaddress");
+                assertExists(authorClient, agentUrl("publish"));
+            }
 
 
-            Thread.sleep(3000);
+            {
+                assertExists(authorClient, authorAgentConfigUrl("publish-multiple"));
+                setArrayProperties(author, authorAgentConfigUrl("publish-multiple"),
+                        "packageImporter.endpoints", remoteImporterUrl, remoteImporterUrl + "badaddress");
 
-            assertExists(authorClient, agentUrl("publish-multiple"));
 
-            assertExists(authorClient, authorAgentConfigUrl("publish-reverse"));
+                Thread.sleep(3000);
 
-            String remoteExporterUrl = publish.getServerBaseUrl() + exporterUrl("reverse");
+                assertExists(authorClient, agentUrl("publish-multiple"));
+                assertExists(authorClient, exporterUrl("publish-multiple-passivequeue1"));
+
+            }
 
-            authorClient.setProperties(authorAgentConfigUrl("publish-reverse"), "packageExporter.endpoints", remoteExporterUrl);
+            {
+                assertExists(authorClient, authorAgentConfigUrl("publish-reverse"));
 
-            Thread.sleep(3000);
-            assertExists(authorClient, agentUrl("publish-reverse"));
+                authorClient.setProperties(authorAgentConfigUrl("publish-reverse"), "packageExporter.endpoints", remoteExporterUrl);
 
-            assertExists(publishClient, exporterUrl("reverse"));
-            assertExists(publishClient, exporterUrl("default"));
-            assertExists(publishClient, importerUrl("default"));
+                Thread.sleep(3000);
+                assertExists(authorClient, agentUrl("publish-reverse"));
 
+                assertExists(publishClient, exporterUrl("reverse"));
+                assertExists(publishClient, exporterUrl("default"));
+                assertExists(publishClient, importerUrl("default"));
+            }
 
         } catch (Exception ex) {
             throw new RuntimeException(ex);

Modified: sling/trunk/contrib/extensions/distribution/it/src/test/java/org/apache/sling/distribution/it/MultipleForwardDistributionTest.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/distribution/it/src/test/java/org/apache/sling/distribution/it/MultipleForwardDistributionTest.java?rev=1674843&r1=1674842&r2=1674843&view=diff
==============================================================================
--- sling/trunk/contrib/extensions/distribution/it/src/test/java/org/apache/sling/distribution/it/MultipleForwardDistributionTest.java (original)
+++ sling/trunk/contrib/extensions/distribution/it/src/test/java/org/apache/sling/distribution/it/MultipleForwardDistributionTest.java Mon Apr 20 13:27:20 2015
@@ -18,18 +18,23 @@
  */
 package org.apache.sling.distribution.it;
 
+import org.apache.sling.commons.json.JSONArray;
+import org.apache.sling.commons.json.JSONObject;
 import org.apache.sling.distribution.DistributionRequestType;
 import org.junit.After;
 import org.junit.Test;
 
 import java.io.IOException;
 
+import static junit.framework.Assert.assertEquals;
 import static org.apache.sling.distribution.it.DistributionUtils.assertExists;
 import static org.apache.sling.distribution.it.DistributionUtils.assertNotExists;
 import static org.apache.sling.distribution.it.DistributionUtils.assertPostResourceWithParameters;
 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;
+import static org.apache.sling.distribution.it.DistributionUtils.doExport;
+import static org.apache.sling.distribution.it.DistributionUtils.getResource;
 import static org.apache.sling.distribution.it.DistributionUtils.queueUrl;
 
 /**
@@ -57,6 +62,36 @@ public class MultipleForwardDistribution
     }
 
 
+    @Test
+    public void testAddContentCheckPassiveQueue() throws Exception {
+        String nodePath = createRandomNode(authorClient, "/content/forward_add_" + System.nanoTime());
+        assertExists(authorClient, nodePath);
+        distribute(author, "publish-multiple", DistributionRequestType.ADD, nodePath);
+        assertExists(publishClient, nodePath);
+
+        {
+            JSONObject json = getResource(author, queueUrl("publish-multiple") + "/passivequeue1");
+
+            JSONArray queueItems = json.getJSONArray("items");
+            assertEquals(1, queueItems.length());
+            assertEquals(1, json.get("itemsCount"));
+        }
+
+
+        String content = doExport(author, "publish-multiple-passivequeue1", DistributionRequestType.PULL, null);
+
+        {
+            JSONObject json = getResource(author, queueUrl("publish-multiple") + "/passivequeue1");
+
+            JSONArray queueItems = json.getJSONArray("items");
+            assertEquals(0, queueItems.length());
+            assertEquals(0, json.get("itemsCount"));
+        }
+
+    }
+
+
+
     @After
     public void clean() throws IOException {
         assertPostResourceWithParameters(author, 200, queueUrl("publish-multiple") + "/endpoint1",
@@ -65,6 +100,9 @@ public class MultipleForwardDistribution
         assertPostResourceWithParameters(author, 200, queueUrl("publish-multiple") + "/endpoint2",
                 "operation", "delete", "limit", DELETE_LIMIT);
 
+        assertPostResourceWithParameters(author, 200, queueUrl("publish-multiple") + "/passivequeue1",
+                "operation", "delete", "limit", DELETE_LIMIT);
+
     }
 
 }

Modified: sling/trunk/contrib/extensions/distribution/sample/pom.xml
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/distribution/sample/pom.xml?rev=1674843&r1=1674842&r2=1674843&view=diff
==============================================================================
--- sling/trunk/contrib/extensions/distribution/sample/pom.xml (original)
+++ sling/trunk/contrib/extensions/distribution/sample/pom.xml Mon Apr 20 13:27:20 2015
@@ -93,7 +93,33 @@
             <artifactId>org.osgi.compendium</artifactId>
             <scope>provided</scope>
         </dependency>
-
+        <dependency>
+            <groupId>javax.jcr</groupId>
+            <artifactId>jcr</artifactId>
+            <version>2.0</version>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.jackrabbit</groupId>
+            <artifactId>jackrabbit-api</artifactId>
+            <version>2.9.0</version>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.sling</groupId>
+            <artifactId>org.apache.sling.jcr.api</artifactId>
+            <version>2.2.0</version>
+        </dependency>
+        <dependency>
+            <groupId>org.slf4j</groupId>
+            <artifactId>slf4j-api</artifactId>
+            <version>1.6.2</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.jackrabbit</groupId>
+            <artifactId>jackrabbit-jcr-commons</artifactId>
+            <version>2.9.0</version>
+        </dependency>
     </dependencies>
     <reporting>
         <plugins>

Added: 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=1674843&view=auto
==============================================================================
--- sling/trunk/contrib/extensions/distribution/sample/src/main/java/org/apache/sling/distribution/test/Init.java (added)
+++ sling/trunk/contrib/extensions/distribution/sample/src/main/java/org/apache/sling/distribution/test/Init.java Mon Apr 20 13:27:20 2015
@@ -0,0 +1,90 @@
+/*
+ * 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.test;
+
+import org.apache.felix.scr.annotations.Activate;
+import org.apache.felix.scr.annotations.Component;
+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.UserManager;
+import javax.jcr.security.Privilege;
+import org.apache.jackrabbit.commons.jackrabbit.authorization.AccessControlUtils;
+import org.apache.sling.jcr.api.SlingRepository;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+
+import javax.jcr.Session;
+
+
+@Component(immediate = true)
+public class Init {
+
+    Logger log = LoggerFactory.getLogger(getClass());
+
+    @Reference
+    SlingRepository slingRepository;
+
+    @Activate
+    public void activate() throws Exception {
+
+        try {
+            final String userName = "testDistributionUser";
+            Session session = slingRepository.loginAdministrative(null);
+
+            JackrabbitSession jackrabittSession  = (JackrabbitSession) session;
+            UserManager userManager = jackrabittSession.getUserManager();
+            Authorizable user = userManager.getAuthorizable(userName);
+
+            if (user == null) {
+                try {
+                    user = userManager.createSystemUser(userName, null);
+                    log.error("created system user", user);
+
+                } catch (Throwable t) {
+                    user = userManager.createUser(userName, "123");
+                    log.error("created regular user", user);
+
+                }
+            }
+
+            if (user != null) {
+                AccessControlUtils.addAccessControlEntry(session, "/", user.getPrincipal(), new String[]{ Privilege.JCR_ALL }, true);
+
+                AccessControlUtils.addAccessControlEntry(session, null, user.getPrincipal(), new String[]{ Privilege.JCR_ALL }, true);
+
+                session.save();
+
+                session.logout();
+            }
+
+        } catch (Throwable t) {
+            log.error("cannot create user", t);
+        }
+
+
+
+    }
+
+
+
+}

Modified: sling/trunk/contrib/extensions/distribution/sample/src/main/resources/SLING-CONTENT/libs/sling/distribution/install.author/publish-multiple/org.apache.sling.distribution.agent.impl.ForwardDistributionAgentFactory-publish-multiple.json
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/distribution/sample/src/main/resources/SLING-CONTENT/libs/sling/distribution/install.author/publish-multiple/org.apache.sling.distribution.agent.impl.ForwardDistributionAgentFactory-publish-multiple.json?rev=1674843&r1=1674842&r2=1674843&view=diff
==============================================================================
--- sling/trunk/contrib/extensions/distribution/sample/src/main/resources/SLING-CONTENT/libs/sling/distribution/install.author/publish-multiple/org.apache.sling.distribution.agent.impl.ForwardDistributionAgentFactory-publish-multiple.json (original)
+++ sling/trunk/contrib/extensions/distribution/sample/src/main/resources/SLING-CONTENT/libs/sling/distribution/install.author/publish-multiple/org.apache.sling.distribution.agent.impl.ForwardDistributionAgentFactory-publish-multiple.json Mon Apr 20 13:27:20 2015
@@ -16,5 +16,9 @@
     "packageImporter.endpoints" : [
         "endpoint1=http://localhost:4503/libs/sling/distribution/services/importers/default",
         "endpoint2=http://localhost:4503/libs/sling/distribution/services/importers/defaultbadaddress"
+    ],
+
+    "passiveQueues" : [
+        "passivequeue1"
     ]
 }
\ No newline at end of file

Added: sling/trunk/contrib/extensions/distribution/sample/src/main/resources/SLING-CONTENT/libs/sling/distribution/install.author/publish-multiple/org.apache.sling.distribution.packaging.impl.exporter.AgentDistributionPackageExporterFactory-publish-multiple.json
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/distribution/sample/src/main/resources/SLING-CONTENT/libs/sling/distribution/install.author/publish-multiple/org.apache.sling.distribution.packaging.impl.exporter.AgentDistributionPackageExporterFactory-publish-multiple.json?rev=1674843&view=auto
==============================================================================
--- sling/trunk/contrib/extensions/distribution/sample/src/main/resources/SLING-CONTENT/libs/sling/distribution/install.author/publish-multiple/org.apache.sling.distribution.packaging.impl.exporter.AgentDistributionPackageExporterFactory-publish-multiple.json (added)
+++ sling/trunk/contrib/extensions/distribution/sample/src/main/resources/SLING-CONTENT/libs/sling/distribution/install.author/publish-multiple/org.apache.sling.distribution.packaging.impl.exporter.AgentDistributionPackageExporterFactory-publish-multiple.json Mon Apr 20 13:27:20 2015
@@ -0,0 +1,8 @@
+{
+    "jcr:primaryType": "sling:OsgiConfig",
+    "name": "publish-multiple-passivequeue1",
+
+    "agent.target": "(name=publish-multiple)",
+
+    "queue": "passivequeue1"
+}
\ No newline at end of file

Modified: sling/trunk/contrib/extensions/distribution/sample/src/main/resources/SLING-CONTENT/libs/sling/distribution/install/org.apache.sling.serviceusermapping.impl.ServiceUserMapperImpl.amended-distribution.json
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/distribution/sample/src/main/resources/SLING-CONTENT/libs/sling/distribution/install/org.apache.sling.serviceusermapping.impl.ServiceUserMapperImpl.amended-distribution.json?rev=1674843&r1=1674842&r2=1674843&view=diff
==============================================================================
--- sling/trunk/contrib/extensions/distribution/sample/src/main/resources/SLING-CONTENT/libs/sling/distribution/install/org.apache.sling.serviceusermapping.impl.ServiceUserMapperImpl.amended-distribution.json (original)
+++ sling/trunk/contrib/extensions/distribution/sample/src/main/resources/SLING-CONTENT/libs/sling/distribution/install/org.apache.sling.serviceusermapping.impl.ServiceUserMapperImpl.amended-distribution.json Mon Apr 20 13:27:20 2015
@@ -1,5 +1,5 @@
 {
     "jcr:primaryType": "sling:OsgiConfig",
     "user.default": "",
-    "user.mapping": "org.apache.sling.distribution.core:distributionService=admin"
+    "user.mapping": "org.apache.sling.distribution.core:distributionService=testDistributionUser"
 }