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/01/22 16:32:45 UTC

svn commit: r1653915 - in /sling/trunk/contrib/extensions/distribution: core/src/main/java/org/apache/sling/distribution/component/impl/ core/src/main/java/org/apache/sling/distribution/packaging/impl/exporter/ core/src/main/java/org/apache/sling/distr...

Author: mpetria
Date: Thu Jan 22 15:32:44 2015
New Revision: 1653915

URL: http://svn.apache.org/r1653915
Log:
SLING-4341: removing package also when a package is deleted from queue

Added:
    sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/serialization/DistributionPackageBuilderProvider.java
    sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/serialization/impl/DefaultDistributionPackageBuilderProvider.java
    sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/serialization/impl/SimpleDistributionPackage.java
    sling/trunk/contrib/extensions/distribution/core/src/test/java/org/apache/sling/distribution/serialization/impl/SimpleDistributionPackageTest.java
Removed:
    sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/serialization/impl/VoidDistributionPackage.java
    sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/serialization/impl/VoidDistributionPackageBuilder.java
    sling/trunk/contrib/extensions/distribution/core/src/test/java/org/apache/sling/distribution/serialization/impl/VoidDistributionPackageBuilderTest.java
    sling/trunk/contrib/extensions/distribution/core/src/test/java/org/apache/sling/distribution/serialization/impl/VoidDistributionPackageTest.java
Modified:
    sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/component/impl/DefaultDistributionComponentProvider.java
    sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/packaging/impl/exporter/AgentDistributionPackageExporter.java
    sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/packaging/impl/exporter/AgentDistributionPackageExporterFactory.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/serialization/DistributionPackageBuilder.java
    sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/serialization/impl/AbstractDistributionPackageBuilder.java
    sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/serialization/impl/ResourceSharedDistributionPackageBuilder.java
    sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/serialization/impl/vlt/FileVaultDistributionPackage.java
    sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/serialization/impl/vlt/FileVaultDistributionPackageBuilder.java
    sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/serialization/impl/vlt/JcrVaultDistributionPackageBuilder.java
    sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/serialization/impl/vlt/VaultDistributionPackageBuilderFactory.java
    sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/servlet/DistributionAgentQueueServlet.java
    sling/trunk/contrib/extensions/distribution/core/src/test/java/org/apache/sling/distribution/serialization/impl/vlt/FileVaultDistributionPackageBuilderTest.java
    sling/trunk/contrib/extensions/distribution/core/src/test/java/org/apache/sling/distribution/serialization/impl/vlt/FileVaultDistributionPackageTest.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/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/component/impl/DefaultDistributionComponentProvider.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/component/impl/DefaultDistributionComponentProvider.java?rev=1653915&r1=1653914&r2=1653915&view=diff
==============================================================================
--- sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/component/impl/DefaultDistributionComponentProvider.java (original)
+++ sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/component/impl/DefaultDistributionComponentProvider.java Thu Jan 22 15:32:44 2015
@@ -32,10 +32,12 @@ import org.apache.felix.scr.annotations.
 import org.apache.felix.scr.annotations.Service;
 import org.apache.sling.commons.osgi.PropertiesUtil;
 import org.apache.sling.distribution.agent.DistributionAgent;
+import org.apache.sling.distribution.packaging.DistributionPackage;
 import org.apache.sling.distribution.packaging.DistributionPackageExporter;
 import org.apache.sling.distribution.packaging.DistributionPackageImporter;
 import org.apache.sling.distribution.queue.impl.DistributionQueueDispatchingStrategy;
 import org.apache.sling.distribution.queue.DistributionQueueProvider;
+import org.apache.sling.distribution.serialization.DistributionPackageBuilder;
 import org.apache.sling.distribution.transport.DistributionTransportSecretProvider;
 import org.osgi.framework.BundleContext;
 import org.slf4j.Logger;
@@ -50,7 +52,8 @@ import org.slf4j.LoggerFactory;
         @Reference(name = "distributionPackageExporter", referenceInterface = DistributionPackageExporter.class, cardinality = ReferenceCardinality.OPTIONAL_MULTIPLE, policy = ReferencePolicy.DYNAMIC),
         @Reference(name = "distributionQueueProvider", referenceInterface = DistributionQueueProvider.class, cardinality = ReferenceCardinality.OPTIONAL_MULTIPLE, policy = ReferencePolicy.DYNAMIC),
         @Reference(name = "distributionQueueDistributionStrategy", referenceInterface = DistributionQueueDispatchingStrategy.class, cardinality = ReferenceCardinality.OPTIONAL_MULTIPLE, policy = ReferencePolicy.DYNAMIC),
-        @Reference(name = "distributionTransportSecretProvider", referenceInterface = DistributionTransportSecretProvider.class, cardinality = ReferenceCardinality.OPTIONAL_MULTIPLE, policy = ReferencePolicy.DYNAMIC)
+        @Reference(name = "distributionTransportSecretProvider", referenceInterface = DistributionTransportSecretProvider.class, cardinality = ReferenceCardinality.OPTIONAL_MULTIPLE, policy = ReferencePolicy.DYNAMIC),
+        @Reference(name = "distributionPackageBuilder", referenceInterface = DistributionPackageBuilder.class, cardinality = ReferenceCardinality.OPTIONAL_MULTIPLE, policy = ReferencePolicy.DYNAMIC),
 })
 @Service(DistributionComponentProvider.class)
 public class DefaultDistributionComponentProvider implements DistributionComponentProvider {
@@ -65,6 +68,8 @@ public class DefaultDistributionComponen
     private Map<String, DistributionComponent<DistributionTransportSecretProvider>> distributionTransportSecretProviderMap = new ConcurrentHashMap<String, DistributionComponent<DistributionTransportSecretProvider>>();
     private Map<String, DistributionComponent<DistributionPackageImporter>> distributionPackageImporterMap = new ConcurrentHashMap<String, DistributionComponent<DistributionPackageImporter>>();
     private Map<String, DistributionComponent<DistributionPackageExporter>> distributionPackageExporterMap = new ConcurrentHashMap<String, DistributionComponent<DistributionPackageExporter>>();
+    private Map<String, DistributionComponent<DistributionPackageBuilder>> distributionPackageBuilderMap = new ConcurrentHashMap<String, DistributionComponent<DistributionPackageBuilder>>();
+
     private BundleContext bundleContext;
 
 
@@ -107,6 +112,8 @@ public class DefaultDistributionComponen
             return (Map) distributionQueueDistributionStrategyMap;
         } else if (type.isAssignableFrom(DistributionTransportSecretProvider.class)) {
             return (Map) distributionTransportSecretProviderMap;
+        } else if (type.isAssignableFrom(DistributionPackageBuilder.class)) {
+            return (Map) distributionPackageBuilderMap;
         }
 
         return null;
@@ -175,6 +182,18 @@ public class DefaultDistributionComponen
 
     }
 
+
+    private void bindDistributionPackageBuilder(DistributionPackageBuilder distributionPackageBuilder, Map<String, Object> config) {
+
+        put(DistributionPackageBuilder.class, distributionPackageBuilder, config);
+    }
+
+    private void unbindDistributionPackageBuilder(DistributionPackageBuilder distributionPackageBuilder, Map<String, Object> config) {
+
+        remove(DistributionPackageBuilder.class, distributionPackageBuilder, config);
+
+    }
+
     private <ComponentType> void put(Class<ComponentType> typeClass, ComponentType service, Map<String, Object> config) {
         Map<String, DistributionComponent<ComponentType>> componentMap = getComponentMap(typeClass);
 

Modified: sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/packaging/impl/exporter/AgentDistributionPackageExporter.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/packaging/impl/exporter/AgentDistributionPackageExporter.java?rev=1653915&r1=1653914&r2=1653915&view=diff
==============================================================================
--- sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/packaging/impl/exporter/AgentDistributionPackageExporter.java (original)
+++ sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/packaging/impl/exporter/AgentDistributionPackageExporter.java Thu Jan 22 15:32:44 2015
@@ -30,25 +30,26 @@ import org.apache.sling.distribution.pac
 import org.apache.sling.distribution.queue.DistributionQueue;
 import org.apache.sling.distribution.queue.DistributionQueueItem;
 import org.apache.sling.distribution.serialization.DistributionPackageBuilder;
+import org.apache.sling.distribution.serialization.DistributionPackageBuilderProvider;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 public class AgentDistributionPackageExporter implements DistributionPackageExporter {
     private final Logger log = LoggerFactory.getLogger(getClass());
+    private final DistributionPackageBuilderProvider packageBuilderProvider;
 
 
     private DistributionAgent agent;
-    private final DistributionPackageBuilder packageBuilder;
     private String queueName;
 
-    public AgentDistributionPackageExporter(String queueName, DistributionAgent agent, DistributionPackageBuilder packageBuilder) {
+    public AgentDistributionPackageExporter(String queueName, DistributionAgent agent, DistributionPackageBuilderProvider packageBuilderProvider) {
+        this.packageBuilderProvider = packageBuilderProvider;
 
-        if (agent == null || packageBuilder == null) {
+        if (agent == null || packageBuilderProvider == null) {
             throw new IllegalArgumentException("Agent and package builder are required");
         }
         this.queueName = queueName;
         this.agent = agent;
-        this.packageBuilder = packageBuilder;
     }
 
     @Nonnull
@@ -62,12 +63,19 @@ public class AgentDistributionPackageExp
             DistributionQueueItem info = queue.getHead();
             DistributionPackage distributionPackage;
             if (info != null) {
-                distributionPackage = packageBuilder.getPackage(resourceResolver, info.getId());
-                DistributionQueueItem item = queue.remove(info.getId());
-                log.info("item {} fetched and removed from the queue", item);
-                if (distributionPackage != null) {
-                    result.add(distributionPackage);
+                DistributionPackageBuilder packageBuilder = packageBuilderProvider.getPackageBuilder(info.getType());
+
+                if (packageBuilder != null) {
+                    distributionPackage = packageBuilder.getPackage(resourceResolver, info.getId());
+                    DistributionQueueItem item = queue.remove(info.getId());
+                    log.info("item {} fetched and removed from the queue", item);
+                    if (distributionPackage != null) {
+                        result.add(distributionPackage);
+                    }
+                } else {
+                    log.warn("cannot find package builder with type {}", info.getType());
                 }
+
             }
 
         } catch (Exception ex) {

Modified: sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/packaging/impl/exporter/AgentDistributionPackageExporterFactory.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/packaging/impl/exporter/AgentDistributionPackageExporterFactory.java?rev=1653915&r1=1653914&r2=1653915&view=diff
==============================================================================
--- sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/packaging/impl/exporter/AgentDistributionPackageExporterFactory.java (original)
+++ sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/packaging/impl/exporter/AgentDistributionPackageExporterFactory.java Thu Jan 22 15:32:44 2015
@@ -37,6 +37,7 @@ import org.apache.sling.distribution.pac
 import org.apache.sling.distribution.packaging.DistributionPackageExportException;
 import org.apache.sling.distribution.packaging.DistributionPackageExporter;
 import org.apache.sling.distribution.serialization.DistributionPackageBuilder;
+import org.apache.sling.distribution.serialization.DistributionPackageBuilderProvider;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -64,10 +65,8 @@ public class AgentDistributionPackageExp
     private DistributionAgent agent;
 
 
-    @Property(name = "packageBuilder.target", label = "Package Builder", description = "The target reference for the DistributionPackageBuilder used to create distribution packages, " +
-            "e.g. use target=(name=...) to bind to services by name.")
-    @Reference(name = "packageBuilder")
-    private DistributionPackageBuilder packageBuilder;
+    @Reference
+    private DistributionPackageBuilderProvider packageBuilderProvider;
 
     private DistributionPackageExporter packageExporter;
 
@@ -77,7 +76,7 @@ public class AgentDistributionPackageExp
 
         String queueName = PropertiesUtil.toString(config.get(QUEUE_NAME), "");
 
-        packageExporter = new AgentDistributionPackageExporter(queueName, agent, packageBuilder);
+        packageExporter = new AgentDistributionPackageExporter(queueName, agent, packageBuilderProvider);
     }
 
     @Nonnull

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=1653915&r1=1653914&r2=1653915&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 Thu Jan 22 15:32:44 2015
@@ -61,7 +61,7 @@ public class JobHandlingDistributionQueu
     @Nonnull
     public DistributionQueue getQueue(@Nonnull String queueName) throws DistributionQueueException {
         String topic = JobHandlingDistributionQueue.DISTRIBUTION_QUEUE_TOPIC + '/' + name + "/" + queueName;
-        return new JobHandlingDistributionQueue(name, topic, jobManager);
+        return new JobHandlingDistributionQueue(queueName, topic, jobManager);
     }
 
 

Modified: sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/serialization/DistributionPackageBuilder.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/serialization/DistributionPackageBuilder.java?rev=1653915&r1=1653914&r2=1653915&view=diff
==============================================================================
--- sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/serialization/DistributionPackageBuilder.java (original)
+++ sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/serialization/DistributionPackageBuilder.java Thu Jan 22 15:32:44 2015
@@ -32,6 +32,12 @@ import org.apache.sling.distribution.pac
 public interface DistributionPackageBuilder {
 
     /**
+     * returns the type of a package. Only packages of this type will be accepted by the package builder.
+     * @return the package type.
+     */
+    String getType();
+
+    /**
      * creates a {@link org.apache.sling.distribution.packaging.DistributionPackage} for a specific {@link org.apache.sling.distribution.DistributionRequest}
      *
      * @param resourceResolver the resource resolver used to access the resources to be packaged

Added: sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/serialization/DistributionPackageBuilderProvider.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/serialization/DistributionPackageBuilderProvider.java?rev=1653915&view=auto
==============================================================================
--- sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/serialization/DistributionPackageBuilderProvider.java (added)
+++ sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/serialization/DistributionPackageBuilderProvider.java Thu Jan 22 15:32:44 2015
@@ -0,0 +1,16 @@
+package org.apache.sling.distribution.serialization;
+
+
+/**
+ * A helper interface to allow finding registered {@link org.apache.sling.distribution.serialization.DistributionPackageBuilder}s
+ */
+public interface DistributionPackageBuilderProvider {
+
+    /**
+     * Finds a package builder that has the specified package type.
+     * @param type the package type
+     * @return a {@link org.apache.sling.distribution.serialization.DistributionPackageBuilder} if one is already registered for that type
+     * or null otherwise
+     */
+    DistributionPackageBuilder getPackageBuilder(String type);
+}

Modified: sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/serialization/impl/AbstractDistributionPackageBuilder.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/serialization/impl/AbstractDistributionPackageBuilder.java?rev=1653915&r1=1653914&r2=1653915&view=diff
==============================================================================
--- sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/serialization/impl/AbstractDistributionPackageBuilder.java (original)
+++ sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/serialization/impl/AbstractDistributionPackageBuilder.java Thu Jan 22 15:32:44 2015
@@ -23,8 +23,6 @@ import javax.annotation.Nonnull;
 import javax.jcr.RepositoryException;
 import javax.jcr.Session;
 import java.io.BufferedInputStream;
-import java.io.ByteArrayInputStream;
-import java.io.IOException;
 import java.io.InputStream;
 
 import org.apache.sling.api.resource.ResourceResolver;
@@ -51,6 +49,11 @@ public abstract class AbstractDistributi
         this.type = type;
     }
 
+
+    public String getType() {
+        return type;
+    }
+
     @CheckForNull
     public DistributionPackage createPackage(@Nonnull ResourceResolver resourceResolver, @Nonnull DistributionRequest request)
             throws DistributionPackageBuildingException {
@@ -58,9 +61,9 @@ public abstract class AbstractDistributi
         if (DistributionRequestType.ADD.equals(request.getRequestType())) {
             distributionPackage = createPackageForAdd(resourceResolver, request);
         } else if (DistributionRequestType.DELETE.equals(request.getRequestType())) {
-            distributionPackage = new VoidDistributionPackage(request, type);
+            distributionPackage = new SimpleDistributionPackage(request, type);
         } else if (DistributionRequestType.PULL.equals(request.getRequestType())) {
-            distributionPackage = new VoidDistributionPackage(request, type);
+            distributionPackage = new SimpleDistributionPackage(request, type);
         } else {
             throw new DistributionPackageBuildingException("unknown action type "
                     + request.getRequestType());
@@ -78,21 +81,12 @@ public abstract class AbstractDistributi
         if (!stream.markSupported()) {
             stream = new BufferedInputStream(stream);
         }
-        try {
-            stream.mark(6);
-            byte[] buffer = new byte[6];
-            int bytesRead = stream.read(buffer, 0, 6);
-            stream.reset();
-            String s = new String(buffer, "UTF-8");
-            log.info("read {} bytes as {}", bytesRead, s);
+        distributionPackage = SimpleDistributionPackage.fromStream(stream);
+
 
-            if (bytesRead > 0 && buffer[0] > 0 && s.startsWith("DEL")) {
-                distributionPackage = VoidDistributionPackage.fromStream(stream);
-            }
-        } catch (Exception e) {
-            log.warn("cannot parse stream", e);
-        }
         stream.mark(-1);
+
+        // not a simple package
         if (distributionPackage == null) {
             distributionPackage = readPackageInternal(resourceResolver, stream);
         }
@@ -100,6 +94,7 @@ public abstract class AbstractDistributi
     }
 
     public boolean installPackage(@Nonnull ResourceResolver resourceResolver, @Nonnull DistributionPackage distributionPackage) throws DistributionPackageReadingException {
+
         DistributionRequestType actionType = distributionPackage.getInfo().getRequestType();
         boolean installed;
         if (DistributionRequestType.DELETE.equals(actionType)) {
@@ -134,13 +129,10 @@ public abstract class AbstractDistributi
     }
 
     public DistributionPackage getPackage(@Nonnull ResourceResolver resourceResolver, @Nonnull String id) {
-        DistributionPackage distributionPackage = null;
-        try {
-            distributionPackage = VoidDistributionPackage.fromStream(new ByteArrayInputStream(id.getBytes("UTF-8")));
-        } catch (IOException ex) {
-            // not a void package
-        }
+        DistributionPackage distributionPackage = SimpleDistributionPackage.fromIdString(id);
+
 
+        // not a simple package
         if (distributionPackage == null) {
             distributionPackage = getPackageInternal(resourceResolver, id);
         }

Added: sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/serialization/impl/DefaultDistributionPackageBuilderProvider.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/serialization/impl/DefaultDistributionPackageBuilderProvider.java?rev=1653915&view=auto
==============================================================================
--- sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/serialization/impl/DefaultDistributionPackageBuilderProvider.java (added)
+++ sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/serialization/impl/DefaultDistributionPackageBuilderProvider.java Thu Jan 22 15:32:44 2015
@@ -0,0 +1,52 @@
+package org.apache.sling.distribution.serialization.impl;
+
+
+
+import org.apache.felix.scr.annotations.Component;
+import org.apache.felix.scr.annotations.Reference;
+import org.apache.felix.scr.annotations.Service;
+import org.apache.sling.distribution.component.impl.DistributionComponent;
+import org.apache.sling.distribution.component.impl.DistributionComponentKind;
+import org.apache.sling.distribution.component.impl.DistributionComponentProvider;
+import org.apache.sling.distribution.component.impl.DistributionComponentUtils;
+import org.apache.sling.distribution.serialization.DistributionPackageBuilder;
+import org.apache.sling.distribution.serialization.DistributionPackageBuilderProvider;
+
+import java.util.List;
+
+@Component
+@Service(DistributionPackageBuilderProvider.class)
+public class DefaultDistributionPackageBuilderProvider implements DistributionPackageBuilderProvider {
+
+    @Reference
+    DistributionComponentProvider componentProvider;
+
+    public DistributionPackageBuilder getPackageBuilder(String type) {
+        List<DistributionComponent> componentList = componentProvider.getComponents(DistributionComponentKind.PACKAGE_BUILDER);
+        DistributionPackageBuilder packageBuilder = filterPackageBuildersByType(componentList, type);
+
+        return packageBuilder;
+    }
+
+
+    private static DistributionPackageBuilder filterPackageBuildersByType(List<DistributionComponent> componentList, String type) {
+
+        if (type == null) {
+            return null;
+        }
+
+        for (DistributionComponent component : componentList) {
+            Object service = component.getService();
+
+            if (service instanceof DistributionPackageBuilder) {
+                DistributionPackageBuilder packageBuilder = (DistributionPackageBuilder) service;
+
+                if (type.equals(packageBuilder.getType())) {
+                    return packageBuilder;
+                }
+            }
+        }
+
+        return null;
+    }
+}

Modified: sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/serialization/impl/ResourceSharedDistributionPackageBuilder.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/serialization/impl/ResourceSharedDistributionPackageBuilder.java?rev=1653915&r1=1653914&r2=1653915&view=diff
==============================================================================
--- sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/serialization/impl/ResourceSharedDistributionPackageBuilder.java (original)
+++ sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/serialization/impl/ResourceSharedDistributionPackageBuilder.java Thu Jan 22 15:32:44 2015
@@ -45,7 +45,7 @@ public class ResourceSharedDistributionP
     private final String PN_ORIGINAL_PATHS = "original.package.paths";
 
     private final String PACKAGE_NAME_PREFIX = "distrpackage";
-    private final String sharedPackagesRoot = "/var/sling/distribution/";
+    private final String SHARED_PACKAGES_ROOT = "/var/sling/distribution/packages";
 
     private final DistributionPackageBuilder distributionPackageBuilder;
 
@@ -53,6 +53,10 @@ public class ResourceSharedDistributionP
         this.distributionPackageBuilder = distributionPackageExporter;
     }
 
+    public String getType() {
+        return distributionPackageBuilder.getType();
+    }
+
     @CheckForNull
     public DistributionPackage createPackage(@Nonnull ResourceResolver resourceResolver, @Nonnull DistributionRequest request) throws DistributionPackageBuildingException {
         DistributionPackage distributionPackage = distributionPackageBuilder.createPackage(resourceResolver, request);
@@ -152,7 +156,7 @@ public class ResourceSharedDistributionP
     }
 
     private String getPathFromName(String name) {
-        String packagePath = sharedPackagesRoot + name;
+        String packagePath = SHARED_PACKAGES_ROOT + "/" + name;
         return packagePath;
     }
 

Added: sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/serialization/impl/SimpleDistributionPackage.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/serialization/impl/SimpleDistributionPackage.java?rev=1653915&view=auto
==============================================================================
--- sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/serialization/impl/SimpleDistributionPackage.java (added)
+++ sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/serialization/impl/SimpleDistributionPackage.java Thu Jan 22 15:32:44 2015
@@ -0,0 +1,166 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.sling.distribution.serialization.impl;
+
+import javax.annotation.Nonnull;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.regex.Pattern;
+
+import org.apache.commons.io.IOUtils;
+import org.apache.sling.distribution.DistributionRequest;
+import org.apache.sling.distribution.DistributionRequestType;
+import org.apache.sling.distribution.SimpleDistributionRequest;
+import org.apache.sling.distribution.packaging.DistributionPackage;
+
+/**
+ * A simple {@link org.apache.sling.distribution.packaging.DistributionPackage} is used for deletion of certain paths on the target instance
+ */
+public class SimpleDistributionPackage extends AbstractDistributionPackage implements DistributionPackage {
+
+    private final static String PACKAGE_START = "DSTRPCK:";
+    private final static String DELIM = "|";
+    private final static String PATH_DELIM = ",";
+
+
+    private final String type;
+
+    private final String[] paths;
+
+    private final String id;
+
+    private final DistributionRequestType requestType;
+
+
+    public SimpleDistributionPackage(DistributionRequest request, String type) {
+        this.type = type;
+        this.paths = request.getPaths();
+        this.requestType = request.getRequestType();
+        this.id = toIdString(request, type);
+
+        this.getInfo().setPaths(paths);
+        this.getInfo().setRequestType(requestType);
+    }
+
+    public static String toIdString(DistributionRequest request, String type) {
+
+        StringBuilder b = new StringBuilder();
+
+        b.append(PACKAGE_START);
+
+        b.append(request.getRequestType().toString());
+        b.append(DELIM);
+
+        String[] paths = request.getPaths();
+
+        if (paths == null || paths.length == 0) {
+            // do nothing
+        } else {
+            for (int i = 0; i < paths.length; i++) {
+                b.append(paths[i]);
+                if (i < paths.length-1) {
+                    b.append(PATH_DELIM);
+                }
+            }
+        }
+
+        b.append(DELIM);
+        b.append(type);
+
+
+        return b.toString();
+    }
+
+    public static SimpleDistributionPackage fromIdString(String id) {
+        if (!id.startsWith(PACKAGE_START)) {
+            return null;
+        }
+
+        id = id.substring(PACKAGE_START.length());
+
+
+        String[] parts = id.split(Pattern.quote(DELIM));
+
+        if (parts.length < 3) return null;
+
+        String actionString = parts[0];
+        String pathsString = parts[1];
+        String typeString = parts[2];
+
+
+        DistributionRequestType distributionRequestType = DistributionRequestType.fromName(actionString);
+
+        SimpleDistributionPackage distributionPackage = null;
+        if (distributionRequestType != null) {
+            String[] paths = pathsString.split(PATH_DELIM);
+
+            DistributionRequest request = new SimpleDistributionRequest(distributionRequestType, paths);
+            distributionPackage = new SimpleDistributionPackage(request, typeString);
+        }
+
+        return distributionPackage;
+    }
+
+
+    @Nonnull
+    public String getType() {
+        return type;
+    }
+
+    @Nonnull
+    public InputStream createInputStream() throws IOException {
+        return IOUtils.toInputStream(id, "UTF-8");
+    }
+
+    @Nonnull
+    public String getId() {
+        return id;
+    }
+
+    public void delete() {
+        // there's nothing to delete
+    }
+
+    @Override
+    public String toString() {
+        return id;
+    }
+
+    public static SimpleDistributionPackage fromStream(InputStream stream)  {
+
+        try {
+            int size = SimpleDistributionPackage.PACKAGE_START.getBytes("UTF-8").length;
+            stream.mark(size);
+            byte[] buffer = new byte[size];
+            int bytesRead = stream.read(buffer, 0, size);
+            stream.reset();
+            String s = new String(buffer, "UTF-8");
+
+            if (bytesRead > 0 && buffer[0] > 0 && s.startsWith(SimpleDistributionPackage.PACKAGE_START)) {
+                String streamString = IOUtils.toString(stream, "UTF-8");
+
+                return fromIdString(streamString);
+            }
+        } catch (Exception e) {
+
+        }
+
+        return null;
+    }
+}

Modified: sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/serialization/impl/vlt/FileVaultDistributionPackage.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/serialization/impl/vlt/FileVaultDistributionPackage.java?rev=1653915&r1=1653914&r2=1653915&view=diff
==============================================================================
--- sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/serialization/impl/vlt/FileVaultDistributionPackage.java (original)
+++ sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/serialization/impl/vlt/FileVaultDistributionPackage.java Thu Jan 22 15:32:44 2015
@@ -38,9 +38,11 @@ public class FileVaultDistributionPackag
 
     private final String id;
 
+    private final String type;
     private final VaultPackage pkg;
 
-    public FileVaultDistributionPackage(VaultPackage pkg) {
+    public FileVaultDistributionPackage(String type, VaultPackage pkg) {
+        this.type = type;
         this.pkg = pkg;
         String[] paths = VltUtils.getPaths(pkg.getMetaInf());
         this.getInfo().setPaths(paths);
@@ -60,7 +62,7 @@ public class FileVaultDistributionPackag
 
     @Nonnull
     public String getType() {
-        return FileVaultDistributionPackageBuilder.PACKAGING_TYPE;
+        return type;
     }
 
     public void close() {

Modified: sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/serialization/impl/vlt/FileVaultDistributionPackageBuilder.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/serialization/impl/vlt/FileVaultDistributionPackageBuilder.java?rev=1653915&r1=1653914&r2=1653915&view=diff
==============================================================================
--- sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/serialization/impl/vlt/FileVaultDistributionPackageBuilder.java (original)
+++ sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/serialization/impl/vlt/FileVaultDistributionPackageBuilder.java Thu Jan 22 15:32:44 2015
@@ -53,8 +53,6 @@ public class FileVaultDistributionPackag
 
     private static final String VERSION = "0.0.1";
 
-    public static final String PACKAGING_TYPE = "filevlt";
-
     private final Logger log = LoggerFactory.getLogger(getClass());
 
     private final Packaging packaging;
@@ -63,8 +61,8 @@ public class FileVaultDistributionPackag
 
     private AccessControlHandling aclHandling;
 
-    public FileVaultDistributionPackageBuilder(Packaging packaging, ImportMode importMode, AccessControlHandling aclHandling) {
-        super(PACKAGING_TYPE);
+    public FileVaultDistributionPackageBuilder(String type, Packaging packaging, ImportMode importMode, AccessControlHandling aclHandling) {
+        super(type);
         this.packaging = packaging;
         this.importMode = importMode;
         this.aclHandling = aclHandling;
@@ -82,7 +80,7 @@ public class FileVaultDistributionPackag
             final String[] paths = request.getPaths();
 
             String packageGroup = "sling/distribution";
-            String packageName = PACKAGING_TYPE + "_" + System.currentTimeMillis() + "_" +  UUID.randomUUID();
+            String packageName = getType() + "_" + System.currentTimeMillis() + "_" +  UUID.randomUUID();
 
             WorkspaceFilter filter = VltUtils.createFilter(request);
             ExportOptions opts = VltUtils.getExportOptions(filter, packageGroup, packageName, VERSION);
@@ -90,7 +88,7 @@ public class FileVaultDistributionPackag
             log.debug("assembling package {}", packageGroup + '/' + packageName + "-" + VERSION);
             File tmpFile = File.createTempFile("rp-vlt-create-" + System.nanoTime(), ".zip");
             VaultPackage vaultPackage = packaging.getPackageManager().assemble(session, opts, tmpFile);
-            return new FileVaultDistributionPackage(vaultPackage);
+            return new FileVaultDistributionPackage(getType(), vaultPackage);
         } catch (Exception e) {
             throw new DistributionPackageBuildingException(e);
         } finally {
@@ -112,7 +110,7 @@ public class FileVaultDistributionPackag
             VaultPackage vaultPackage = packaging.getPackageManager().open(tmpFile);
 
             if (vaultPackage != null) {
-                pkg = new FileVaultDistributionPackage(vaultPackage);
+                pkg = new FileVaultDistributionPackage(getType(), vaultPackage);
             } else {
                 log.warn("stream could not be read as a vlt package");
             }
@@ -131,7 +129,7 @@ public class FileVaultDistributionPackag
             File file = new File(id);
             if (file.exists()) {
                 VaultPackage pkg = packaging.getPackageManager().open(file);
-                distributionPackage = new FileVaultDistributionPackage(pkg);
+                distributionPackage = new FileVaultDistributionPackage(getType(), pkg);
             }
         } catch (Exception e) {
             log.warn("could not find a package with id : {}", id);
@@ -164,4 +162,6 @@ public class FileVaultDistributionPackag
         }
         return false;
     }
+
+
 }

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=1653915&r1=1653914&r2=1653915&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 Thu Jan 22 15:32:44 2015
@@ -37,13 +37,12 @@ public class JcrVaultDistributionPackage
     private static final String VERSION = "0.0.1";
     private static final String PACKAGE_GROUP = "sling/distribution";
 
-    public static final String PACKAGING_TYPE = "jcrvlt";
     private final Packaging packaging;
     private ImportMode importMode;
     private AccessControlHandling aclHandling;
 
-    public JcrVaultDistributionPackageBuilder(Packaging packaging, ImportMode importMode, AccessControlHandling aclHandling) {
-        super(PACKAGING_TYPE);
+    public JcrVaultDistributionPackageBuilder(String type, Packaging packaging, ImportMode importMode, AccessControlHandling aclHandling) {
+        super(type);
 
         this.packaging = packaging;
 
@@ -61,7 +60,7 @@ public class JcrVaultDistributionPackage
             final String[] paths = request.getPaths();
 
             String packageGroup = PACKAGE_GROUP;
-            String packageName = PACKAGING_TYPE + "_" + System.currentTimeMillis() + "_" +  UUID.randomUUID();
+            String packageName = getType() + "_" + System.currentTimeMillis() + "_" +  UUID.randomUUID();
 
 
             WorkspaceFilter filter = VltUtils.createFilter(request);
@@ -74,7 +73,7 @@ public class JcrVaultDistributionPackage
 
             log.debug("assembling package {}", packageGroup + '/' + packageName + "-" + VERSION);
             packageManager.assemble(jcrPackage, null);
-            return new JcrVaultDistributionPackage(PACKAGING_TYPE, jcrPackage, session);
+            return new JcrVaultDistributionPackage(getType(), jcrPackage, session);
         } catch (Exception e) {
             throw new DistributionPackageBuildingException(e);
         } finally {
@@ -91,7 +90,7 @@ public class JcrVaultDistributionPackage
 
             JcrPackage jcrPackage = packageManager.upload(stream, true);
 
-            return new JcrVaultDistributionPackage(PACKAGING_TYPE, jcrPackage, session);
+            return new JcrVaultDistributionPackage(getType(), jcrPackage, session);
         } catch (Exception e) {
             throw new DistributionPackageReadingException(e);
         } finally {
@@ -135,7 +134,7 @@ public class JcrVaultDistributionPackage
             if (jcrPackage == null) {
                 return null;
             }
-            return new JcrVaultDistributionPackage(PACKAGING_TYPE, jcrPackage, session);
+            return new JcrVaultDistributionPackage(getType(), jcrPackage, session);
         } catch (Exception e) {
             return null;
         } finally {

Modified: sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/serialization/impl/vlt/VaultDistributionPackageBuilderFactory.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/serialization/impl/vlt/VaultDistributionPackageBuilderFactory.java?rev=1653915&r1=1653914&r2=1653915&view=diff
==============================================================================
--- sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/serialization/impl/vlt/VaultDistributionPackageBuilderFactory.java (original)
+++ sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/serialization/impl/vlt/VaultDistributionPackageBuilderFactory.java Thu Jan 22 15:32:44 2015
@@ -96,6 +96,7 @@ public class VaultDistributionPackageBui
     @Activate
     public void activate(Map<String, Object> config) {
 
+        String name = PropertiesUtil.toString(config.get(NAME), null);
         String type = PropertiesUtil.toString(config.get(TYPE), null);
         String importModeString = PropertiesUtil.toString(config.get(IMPORT_MODE), null);
         String aclHandlingString = PropertiesUtil.toString(config.get(ACL_HANDLING), null);
@@ -109,14 +110,19 @@ public class VaultDistributionPackageBui
         if (aclHandlingString != null) {
             aclHandling= AccessControlHandling.valueOf(aclHandlingString);
         }
-        if (FileVaultDistributionPackageBuilder.PACKAGING_TYPE.equals(type)) {
-            packageBuilder = new ResourceSharedDistributionPackageBuilder(new FileVaultDistributionPackageBuilder(packaging, importMode, aclHandling));
+        if ("filevlt".equals(type)) {
+            packageBuilder = new ResourceSharedDistributionPackageBuilder(new FileVaultDistributionPackageBuilder(name, packaging, importMode, aclHandling));
         } else  {
-            packageBuilder = new ResourceSharedDistributionPackageBuilder(new JcrVaultDistributionPackageBuilder(packaging, importMode, aclHandling));
+            packageBuilder = new ResourceSharedDistributionPackageBuilder(new JcrVaultDistributionPackageBuilder(name, packaging, importMode, aclHandling));
         }
     }
 
 
+    public String getType() {
+        return packageBuilder.getType();
+    }
+
+
     public DistributionPackage createPackage(@Nonnull ResourceResolver resourceResolver, @Nonnull DistributionRequest request) throws DistributionPackageBuildingException {
         return packageBuilder.createPackage(resourceResolver, request);
     }

Modified: sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/servlet/DistributionAgentQueueServlet.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/servlet/DistributionAgentQueueServlet.java?rev=1653915&r1=1653914&r2=1653915&view=diff
==============================================================================
--- sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/servlet/DistributionAgentQueueServlet.java (original)
+++ sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/servlet/DistributionAgentQueueServlet.java Thu Jan 22 15:32:44 2015
@@ -20,14 +20,25 @@ package org.apache.sling.distribution.se
 
 import javax.servlet.ServletException;
 import java.io.IOException;
+import java.util.List;
 
+import org.apache.felix.scr.annotations.Reference;
 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.component.impl.DistributionComponent;
+import org.apache.sling.distribution.component.impl.DistributionComponentKind;
+import org.apache.sling.distribution.component.impl.DistributionComponentProvider;
+import org.apache.sling.distribution.component.impl.DistributionComponentUtils;
+import org.apache.sling.distribution.packaging.DistributionPackage;
+import org.apache.sling.distribution.packaging.SharedDistributionPackage;
 import org.apache.sling.distribution.queue.DistributionQueue;
 import org.apache.sling.distribution.queue.DistributionQueueItem;
 import org.apache.sling.distribution.resources.DistributionResourceTypes;
+import org.apache.sling.distribution.serialization.DistributionPackageBuilder;
+import org.apache.sling.distribution.serialization.DistributionPackageBuilderProvider;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -40,6 +51,10 @@ public class DistributionAgentQueueServl
     private final Logger log = LoggerFactory.getLogger(getClass());
 
 
+    @Reference
+    DistributionPackageBuilderProvider packageBuilderProvider;
+
+
     @Override
     protected void doPost(SlingHttpServletRequest request, SlingHttpServletResponse response)
             throws ServletException, IOException {
@@ -51,10 +66,12 @@ public class DistributionAgentQueueServl
         String limitParam = request.getParameter("limit");
         String[] idParam = request.getParameterValues("id");
 
+        ResourceResolver resourceResolver = request.getResourceResolver();
+
         if ("delete".equals(operation)) {
 
             if (idParam != null) {
-                deleteItem(queue, idParam);
+                deleteItems(resourceResolver, queue, idParam);
             }
             else {
                 int limit = 1;
@@ -64,20 +81,42 @@ public class DistributionAgentQueueServl
                 catch (NumberFormatException ex) {
 
                 }
-                deleteItems(queue, limit);
+                deleteItems(resourceResolver, queue, limit);
             }
         }
     }
 
-    protected void deleteItems(DistributionQueue queue, int limit) {
+    protected void deleteItems(ResourceResolver resourceResolver, DistributionQueue queue, int limit) {
        for(DistributionQueueItem item : queue.getItems(0, limit)) {
-           queue.remove(item.getId());
+            deleteItem(resourceResolver, queue, item);
        }
     }
 
-    protected void deleteItem(DistributionQueue queue, String[] ids) {
+    protected void deleteItems(ResourceResolver resourceResolver, DistributionQueue queue, String[] ids) {
         for(String id : ids) {
-            queue.remove(id);
+            DistributionQueueItem item = queue.getItem(id);
+            deleteItem(resourceResolver, queue, item);
+        }
+    }
+
+    protected void deleteItem(ResourceResolver resourceResolver, DistributionQueue queue, DistributionQueueItem item) {
+        String id = item.getId();
+        queue.remove(id);
+        String type = item.getType();
+
+        DistributionPackageBuilder packageBuilder = packageBuilderProvider.getPackageBuilder(type);
+
+        if (packageBuilder != null) {
+
+            DistributionPackage distributionPackage = packageBuilder.getPackage(resourceResolver, id);
+
+            if (distributionPackage != null) {
+                if (distributionPackage instanceof SharedDistributionPackage) {
+                    ((SharedDistributionPackage) distributionPackage).release(queue.getName());
+                } else {
+                    distributionPackage.delete();
+                }
+            }
         }
     }
 }

Added: sling/trunk/contrib/extensions/distribution/core/src/test/java/org/apache/sling/distribution/serialization/impl/SimpleDistributionPackageTest.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/distribution/core/src/test/java/org/apache/sling/distribution/serialization/impl/SimpleDistributionPackageTest.java?rev=1653915&view=auto
==============================================================================
--- sling/trunk/contrib/extensions/distribution/core/src/test/java/org/apache/sling/distribution/serialization/impl/SimpleDistributionPackageTest.java (added)
+++ sling/trunk/contrib/extensions/distribution/core/src/test/java/org/apache/sling/distribution/serialization/impl/SimpleDistributionPackageTest.java Thu Jan 22 15:32:44 2015
@@ -0,0 +1,49 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.sling.distribution.serialization.impl;
+
+import java.io.ByteArrayInputStream;
+import java.util.Arrays;
+
+import org.apache.commons.io.IOUtils;
+import org.apache.sling.distribution.DistributionRequest;
+import org.apache.sling.distribution.DistributionRequestType;
+import org.apache.sling.distribution.SimpleDistributionRequest;
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+/**
+ * Testcase for {@link SimpleDistributionPackage}
+ */
+public class SimpleDistributionPackageTest {
+
+    @Test
+    public void testCreatedAndReadPackagesEquality() throws Exception {
+        DistributionRequest request = new SimpleDistributionRequest(DistributionRequestType.DELETE, "/abc");
+        SimpleDistributionPackage createdPackage = new SimpleDistributionPackage(request, "VOID");
+        SimpleDistributionPackage readPackage = SimpleDistributionPackage.fromStream(new ByteArrayInputStream(("DSTRPCK:DELETE|/abc|VOID").getBytes()));
+        assertEquals(createdPackage.getType(), readPackage.getType());
+        assertEquals(createdPackage.getInfo().getRequestType(), readPackage.getInfo().getRequestType());
+        assertEquals(Arrays.toString(createdPackage.getInfo().getPaths()), Arrays.toString(readPackage.getInfo().getPaths()));
+        assertEquals(createdPackage.getId(), readPackage.getId());
+        assertTrue(IOUtils.contentEquals(createdPackage.createInputStream(), readPackage.createInputStream()));
+    }
+}

Modified: sling/trunk/contrib/extensions/distribution/core/src/test/java/org/apache/sling/distribution/serialization/impl/vlt/FileVaultDistributionPackageBuilderTest.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/distribution/core/src/test/java/org/apache/sling/distribution/serialization/impl/vlt/FileVaultDistributionPackageBuilderTest.java?rev=1653915&r1=1653914&r2=1653915&view=diff
==============================================================================
--- sling/trunk/contrib/extensions/distribution/core/src/test/java/org/apache/sling/distribution/serialization/impl/vlt/FileVaultDistributionPackageBuilderTest.java (original)
+++ sling/trunk/contrib/extensions/distribution/core/src/test/java/org/apache/sling/distribution/serialization/impl/vlt/FileVaultDistributionPackageBuilderTest.java Thu Jan 22 15:32:44 2015
@@ -76,7 +76,7 @@ public class FileVaultDistributionPackag
         when(resourceResolver.adaptTo(Session.class)).thenReturn(session);
 
 
-        FileVaultDistributionPackageBuilder fileVaultdistributionPackageBuilder = new FileVaultDistributionPackageBuilder(packaging, null, null);
+        FileVaultDistributionPackageBuilder fileVaultdistributionPackageBuilder = new FileVaultDistributionPackageBuilder("filevlt", packaging, null, null);
         DistributionRequest request = new SimpleDistributionRequest(DistributionRequestType.ADD, new String[]{"/"});
         DistributionPackage distributionPackage = fileVaultdistributionPackageBuilder.createPackageForAdd(resourceResolver, request);
         assertNotNull(distributionPackage);
@@ -88,7 +88,7 @@ public class FileVaultDistributionPackag
         PackageManager packageManager = mock(PackageManager.class);
         when(packaging.getPackageManager()).thenReturn(packageManager);
 
-        FileVaultDistributionPackageBuilder fileVaultdistributionPackageBuilder = new FileVaultDistributionPackageBuilder(packaging, null, null);
+        FileVaultDistributionPackageBuilder fileVaultdistributionPackageBuilder = new FileVaultDistributionPackageBuilder("filevlt", packaging, null, null);
 
         ResourceResolver resourceResolver = mock(ResourceResolver.class);
         InputStream stream = new ByteArrayInputStream("some binary".getBytes("UTF-8"));
@@ -102,7 +102,7 @@ public class FileVaultDistributionPackag
         PackageManager packageManager = mock(PackageManager.class);
         when(packaging.getPackageManager()).thenReturn(packageManager);
 
-        FileVaultDistributionPackageBuilder fileVaultdistributionPackageBuilder = new FileVaultDistributionPackageBuilder(packaging, null, null);
+        FileVaultDistributionPackageBuilder fileVaultdistributionPackageBuilder = new FileVaultDistributionPackageBuilder("filevlt", packaging, null, null);
 
         ResourceResolver resourceResolver = mock(ResourceResolver.class);
         String id = "some-id";
@@ -119,7 +119,7 @@ public class FileVaultDistributionPackag
         when(packageManager.open(tempFile)).thenReturn(vaultPackage);
         when(packaging.getPackageManager()).thenReturn(packageManager);
 
-        FileVaultDistributionPackageBuilder fileVaultdistributionPackageBuilder = new FileVaultDistributionPackageBuilder(packaging, null, null);
+        FileVaultDistributionPackageBuilder fileVaultdistributionPackageBuilder = new FileVaultDistributionPackageBuilder("filevlt", packaging, null, null);
 
         ResourceResolver resourceResolver = mock(ResourceResolver.class);
         Session session = mock(Session.class);
@@ -148,7 +148,7 @@ public class FileVaultDistributionPackag
         when(packageManager.open(tempFile)).thenReturn(vaultPackage);
         when(packaging.getPackageManager()).thenReturn(packageManager);
 
-        FileVaultDistributionPackageBuilder fileVaultdistributionPackageBuilder = new FileVaultDistributionPackageBuilder(packaging,
+        FileVaultDistributionPackageBuilder fileVaultdistributionPackageBuilder = new FileVaultDistributionPackageBuilder("filevlt", packaging,
                 ImportMode.MERGE, AccessControlHandling.MERGE);
 
         ResourceResolver resourceResolver = mock(ResourceResolver.class);

Modified: sling/trunk/contrib/extensions/distribution/core/src/test/java/org/apache/sling/distribution/serialization/impl/vlt/FileVaultDistributionPackageTest.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/distribution/core/src/test/java/org/apache/sling/distribution/serialization/impl/vlt/FileVaultDistributionPackageTest.java?rev=1653915&r1=1653914&r2=1653915&view=diff
==============================================================================
--- sling/trunk/contrib/extensions/distribution/core/src/test/java/org/apache/sling/distribution/serialization/impl/vlt/FileVaultDistributionPackageTest.java (original)
+++ sling/trunk/contrib/extensions/distribution/core/src/test/java/org/apache/sling/distribution/serialization/impl/vlt/FileVaultDistributionPackageTest.java Thu Jan 22 15:32:44 2015
@@ -39,7 +39,7 @@ public class FileVaultDistributionPackag
         File file = mock(File.class);
         when(file.getAbsolutePath()).thenReturn("/path/to/file.txt");
         when(vaultPackage.getFile()).thenReturn(file);
-        FileVaultDistributionPackage fileVaultdistributionPackage = new FileVaultDistributionPackage(vaultPackage);
+        FileVaultDistributionPackage fileVaultdistributionPackage = new FileVaultDistributionPackage("filevlt", vaultPackage);
         assertNotNull(fileVaultdistributionPackage.getId());
     }
 
@@ -49,7 +49,7 @@ public class FileVaultDistributionPackag
         File file = mock(File.class);
         when(file.getAbsolutePath()).thenReturn("/path/to/file.txt");
         when(vaultPackage.getFile()).thenReturn(file);
-        FileVaultDistributionPackage fileVaultdistributionPackage = new FileVaultDistributionPackage(vaultPackage);
+        FileVaultDistributionPackage fileVaultdistributionPackage = new FileVaultDistributionPackage("filevlt", vaultPackage);
         assertNull(fileVaultdistributionPackage.getInfo().getPaths());
     }
 
@@ -58,7 +58,7 @@ public class FileVaultDistributionPackag
         VaultPackage vaultPackage = mock(VaultPackage.class);
         File file = File.createTempFile("sample", "txt");
         when(vaultPackage.getFile()).thenReturn(file);
-        FileVaultDistributionPackage fileVaultdistributionPackage = new FileVaultDistributionPackage(vaultPackage);
+        FileVaultDistributionPackage fileVaultdistributionPackage = new FileVaultDistributionPackage("filevlt", vaultPackage);
         assertNotNull(fileVaultdistributionPackage.createInputStream());
     }
 
@@ -68,7 +68,7 @@ public class FileVaultDistributionPackag
         File file = mock(File.class);
         when(file.getAbsolutePath()).thenReturn("/path/to/file.txt");
         when(vaultPackage.getFile()).thenReturn(file);
-        FileVaultDistributionPackage fileVaultdistributionPackage = new FileVaultDistributionPackage(vaultPackage);
+        FileVaultDistributionPackage fileVaultdistributionPackage = new FileVaultDistributionPackage("filevlt", vaultPackage);
         assertNotNull(fileVaultdistributionPackage.getType());
     }
 
@@ -78,7 +78,7 @@ public class FileVaultDistributionPackag
         File file = mock(File.class);
         when(file.getAbsolutePath()).thenReturn("/path/to/file.txt");
         when(vaultPackage.getFile()).thenReturn(file);
-        FileVaultDistributionPackage fileVaultdistributionPackage = new FileVaultDistributionPackage(vaultPackage);
+        FileVaultDistributionPackage fileVaultdistributionPackage = new FileVaultDistributionPackage("filevlt", vaultPackage);
         assertNotNull(fileVaultdistributionPackage.getInfo().getRequestType());
     }
 
@@ -88,7 +88,7 @@ public class FileVaultDistributionPackag
         File file = mock(File.class);
         when(file.getAbsolutePath()).thenReturn("/path/to/file.txt");
         when(vaultPackage.getFile()).thenReturn(file);
-        FileVaultDistributionPackage fileVaultdistributionPackage = new FileVaultDistributionPackage(vaultPackage);
+        FileVaultDistributionPackage fileVaultdistributionPackage = new FileVaultDistributionPackage("filevlt", vaultPackage);
         fileVaultdistributionPackage.close();
     }
 
@@ -98,7 +98,7 @@ public class FileVaultDistributionPackag
         File file = mock(File.class);
         when(file.getAbsolutePath()).thenReturn("/path/to/file.txt");
         when(vaultPackage.getFile()).thenReturn(file);
-        FileVaultDistributionPackage fileVaultdistributionPackage = new FileVaultDistributionPackage(vaultPackage);
+        FileVaultDistributionPackage fileVaultdistributionPackage = new FileVaultDistributionPackage("filevlt", vaultPackage);
         fileVaultdistributionPackage.delete();
     }
 }
\ No newline at end of file

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=1653915&r1=1653914&r2=1653915&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 Thu Jan 22 15:32:44 2015
@@ -19,10 +19,14 @@
 package org.apache.sling.distribution.it;
 
 import java.io.IOException;
+import java.util.Iterator;
 
+import org.apache.sling.commons.json.JSONException;
+import org.apache.sling.commons.json.JSONObject;
 import org.apache.sling.testing.tools.sling.SlingClient;
 import org.apache.sling.testing.tools.sling.SlingInstance;
 import org.apache.sling.testing.tools.sling.SlingInstanceManager;
+import org.junit.AfterClass;
 import org.junit.BeforeClass;
 
 import static org.apache.sling.distribution.it.DistributionUtils.agentUrl;
@@ -30,8 +34,10 @@ import static org.apache.sling.distribut
 import static org.apache.sling.distribution.it.DistributionUtils.assertPostResourceWithParameters;
 import static org.apache.sling.distribution.it.DistributionUtils.authorAgentConfigUrl;
 import static org.apache.sling.distribution.it.DistributionUtils.exporterUrl;
+import static org.apache.sling.distribution.it.DistributionUtils.getResource;
 import static org.apache.sling.distribution.it.DistributionUtils.importerUrl;
 import static org.apache.sling.distribution.it.DistributionUtils.setArrayProperties;
+import static org.junit.Assert.assertFalse;
 
 /**
  * Integration test base class for distribution
@@ -96,5 +102,29 @@ public abstract class DistributionIntegr
         }
 
     }
+
+
+    @AfterClass
+    public static void checkNoPackagesLeft() throws IOException, JSONException {
+        if (authorClient.exists("/var/sling/distribution/packages")) {
+            JSONObject authorJson = getResource(author, "/var/sling/distribution/packages.1.json");
+            Iterator<String> it = authorJson.keys();
+            while (it.hasNext()) {
+                String key = it.next();
+                assertFalse(key.startsWith("distrpackage"));
+            }
+        }
+
+        if (publishClient.exists("/var/sling/distribution/packages")) {
+            JSONObject authorJson = getResource(publish, "/var/sling/distribution/packages.1.json");
+            Iterator<String> it = authorJson.keys();
+            while (it.hasNext()) {
+                String key = it.next();
+                assertFalse(key.startsWith("distrpackage"));
+            }
+        }
+
+
+    }
     
 }

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=1653915&r1=1653914&r2=1653915&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 Thu Jan 22 15:32:44 2015
@@ -19,19 +19,27 @@
 package org.apache.sling.distribution.it;
 
 import org.apache.sling.distribution.DistributionRequestType;
+import org.junit.After;
 import org.junit.Test;
 
+import java.io.IOException;
+
 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.queueUrl;
 
 /**
  * Integration test for forward distribution
  */
 public class MultipleForwardDistributionTest extends DistributionIntegrationTestBase {
 
+    final static String DELETE_LIMIT = "100";
+
+
     @Test
     public void testAddContent() throws Exception {
         String nodePath = createRandomNode(authorClient, "/content/forward_add_" + System.nanoTime());
@@ -48,4 +56,15 @@ public class MultipleForwardDistribution
         assertNotExists(publishClient, nodePath);
     }
 
+
+    @After
+    public void clean() throws IOException {
+        assertPostResourceWithParameters(author, 200, queueUrl("publish-multiple") + "/endpoint1",
+                "operation", "delete", "limit", DELETE_LIMIT);
+
+        assertPostResourceWithParameters(author, 200, queueUrl("publish-multiple") + "/endpoint2",
+                "operation", "delete", "limit", DELETE_LIMIT);
+
+    }
+
 }

Modified: 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
URL: http://svn.apache.org/viewvc/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?rev=1653915&r1=1653914&r2=1653915&view=diff
==============================================================================
--- 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 (original)
+++ 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 Thu Jan 22 15:32:44 2015
@@ -2,7 +2,5 @@
     "jcr:primaryType": "sling:OsgiConfig",
     "name": "reverse",
 
-    "packageBuilder.target" : "(name=vlt)",
-
     "agent.target": "(name=reverse)"
 }
\ No newline at end of file