You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jackrabbit.apache.org by tr...@apache.org on 2016/12/14 09:15:26 UTC

svn commit: r1774151 - in /jackrabbit/commons/filevault/trunk/vault-core/src/main/java/org/apache/jackrabbit/vault/packaging: events/ events/impl/ impl/

Author: tripod
Date: Wed Dec 14 09:15:26 2016
New Revision: 1774151

URL: http://svn.apache.org/viewvc?rev=1774151&view=rev
Log:
JCRVLT-139 Add support for package installation listeners

Added:
    jackrabbit/commons/filevault/trunk/vault-core/src/main/java/org/apache/jackrabbit/vault/packaging/events/
    jackrabbit/commons/filevault/trunk/vault-core/src/main/java/org/apache/jackrabbit/vault/packaging/events/PackageEvent.java
    jackrabbit/commons/filevault/trunk/vault-core/src/main/java/org/apache/jackrabbit/vault/packaging/events/PackageEventListener.java
    jackrabbit/commons/filevault/trunk/vault-core/src/main/java/org/apache/jackrabbit/vault/packaging/events/impl/
    jackrabbit/commons/filevault/trunk/vault-core/src/main/java/org/apache/jackrabbit/vault/packaging/events/impl/PackageEventDispatcher.java
    jackrabbit/commons/filevault/trunk/vault-core/src/main/java/org/apache/jackrabbit/vault/packaging/events/impl/PackageEventDispatcherImpl.java
    jackrabbit/commons/filevault/trunk/vault-core/src/main/java/org/apache/jackrabbit/vault/packaging/events/package-info.java
Modified:
    jackrabbit/commons/filevault/trunk/vault-core/src/main/java/org/apache/jackrabbit/vault/packaging/impl/JcrPackageImpl.java
    jackrabbit/commons/filevault/trunk/vault-core/src/main/java/org/apache/jackrabbit/vault/packaging/impl/JcrPackageManagerImpl.java
    jackrabbit/commons/filevault/trunk/vault-core/src/main/java/org/apache/jackrabbit/vault/packaging/impl/PackageManagerImpl.java
    jackrabbit/commons/filevault/trunk/vault-core/src/main/java/org/apache/jackrabbit/vault/packaging/impl/PackagingImpl.java

Added: jackrabbit/commons/filevault/trunk/vault-core/src/main/java/org/apache/jackrabbit/vault/packaging/events/PackageEvent.java
URL: http://svn.apache.org/viewvc/jackrabbit/commons/filevault/trunk/vault-core/src/main/java/org/apache/jackrabbit/vault/packaging/events/PackageEvent.java?rev=1774151&view=auto
==============================================================================
--- jackrabbit/commons/filevault/trunk/vault-core/src/main/java/org/apache/jackrabbit/vault/packaging/events/PackageEvent.java (added)
+++ jackrabbit/commons/filevault/trunk/vault-core/src/main/java/org/apache/jackrabbit/vault/packaging/events/PackageEvent.java Wed Dec 14 09:15:26 2016
@@ -0,0 +1,55 @@
+/*
+ * 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.jackrabbit.vault.packaging.events;
+
+import javax.annotation.CheckForNull;
+import javax.annotation.Nonnull;
+
+import org.apache.jackrabbit.vault.packaging.PackageId;
+
+import aQute.bnd.annotation.ProviderType;
+
+/**
+ * Event that is sent via the packaging listeners.
+ */
+@ProviderType
+public interface PackageEvent {
+
+    /**
+     * Event type
+     */
+    enum Type {
+        UPLOAD,
+        INSTALL,
+        EXTRACT,
+        UNINSTALL,
+        CREATE,
+        REMOVE,
+        ASSEMBLE,
+        REWRAPP,
+        RENAME,
+        EXTRACT_SUB_PACKAGES,
+        SNAPSHOT
+    }
+
+    @Nonnull Type getType();
+
+    @Nonnull PackageId getId();
+
+    @CheckForNull PackageId getRelatedId();
+
+}
\ No newline at end of file

Added: jackrabbit/commons/filevault/trunk/vault-core/src/main/java/org/apache/jackrabbit/vault/packaging/events/PackageEventListener.java
URL: http://svn.apache.org/viewvc/jackrabbit/commons/filevault/trunk/vault-core/src/main/java/org/apache/jackrabbit/vault/packaging/events/PackageEventListener.java?rev=1774151&view=auto
==============================================================================
--- jackrabbit/commons/filevault/trunk/vault-core/src/main/java/org/apache/jackrabbit/vault/packaging/events/PackageEventListener.java (added)
+++ jackrabbit/commons/filevault/trunk/vault-core/src/main/java/org/apache/jackrabbit/vault/packaging/events/PackageEventListener.java Wed Dec 14 09:15:26 2016
@@ -0,0 +1,33 @@
+/*
+ * 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.jackrabbit.vault.packaging.events;
+
+import javax.annotation.Nonnull;
+
+import org.apache.jackrabbit.vault.packaging.PackageId;
+
+import aQute.bnd.annotation.ConsumerType;
+
+/**
+ * Listener that can receive packaging events. Listeners are registered via OSGi.
+ */
+@ConsumerType
+public interface PackageEventListener {
+
+    void onPackageEvent(@Nonnull PackageEvent event);
+
+}
\ No newline at end of file

Added: jackrabbit/commons/filevault/trunk/vault-core/src/main/java/org/apache/jackrabbit/vault/packaging/events/impl/PackageEventDispatcher.java
URL: http://svn.apache.org/viewvc/jackrabbit/commons/filevault/trunk/vault-core/src/main/java/org/apache/jackrabbit/vault/packaging/events/impl/PackageEventDispatcher.java?rev=1774151&view=auto
==============================================================================
--- jackrabbit/commons/filevault/trunk/vault-core/src/main/java/org/apache/jackrabbit/vault/packaging/events/impl/PackageEventDispatcher.java (added)
+++ jackrabbit/commons/filevault/trunk/vault-core/src/main/java/org/apache/jackrabbit/vault/packaging/events/impl/PackageEventDispatcher.java Wed Dec 14 09:15:26 2016
@@ -0,0 +1,41 @@
+/*
+ * 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.jackrabbit.vault.packaging.events.impl;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
+import org.apache.jackrabbit.vault.packaging.PackageId;
+import org.apache.jackrabbit.vault.packaging.events.PackageEvent;
+
+import aQute.bnd.annotation.ProviderType;
+
+/**
+ * Internal service that is used to dispatch packaging events.
+ */
+@ProviderType
+public interface PackageEventDispatcher {
+
+    /**
+     * Dispatches the events to the listeners.
+     * @param type Event type
+     * @param id package id
+     * @param related related id
+     */
+    void dispatch(@Nonnull PackageEvent.Type type, @Nonnull PackageId id, @Nullable PackageId related);
+
+}
\ No newline at end of file

Added: jackrabbit/commons/filevault/trunk/vault-core/src/main/java/org/apache/jackrabbit/vault/packaging/events/impl/PackageEventDispatcherImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/commons/filevault/trunk/vault-core/src/main/java/org/apache/jackrabbit/vault/packaging/events/impl/PackageEventDispatcherImpl.java?rev=1774151&view=auto
==============================================================================
--- jackrabbit/commons/filevault/trunk/vault-core/src/main/java/org/apache/jackrabbit/vault/packaging/events/impl/PackageEventDispatcherImpl.java (added)
+++ jackrabbit/commons/filevault/trunk/vault-core/src/main/java/org/apache/jackrabbit/vault/packaging/events/impl/PackageEventDispatcherImpl.java Wed Dec 14 09:15:26 2016
@@ -0,0 +1,129 @@
+/*
+ * 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.jackrabbit.vault.packaging.events.impl;
+
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+
+import javax.annotation.CheckForNull;
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
+import org.apache.felix.scr.annotations.Component;
+import org.apache.felix.scr.annotations.Reference;
+import org.apache.felix.scr.annotations.ReferenceCardinality;
+import org.apache.felix.scr.annotations.ReferencePolicy;
+import org.apache.felix.scr.annotations.References;
+import org.apache.felix.scr.annotations.Service;
+import org.apache.jackrabbit.vault.packaging.PackageId;
+import org.apache.jackrabbit.vault.packaging.events.PackageEvent;
+import org.apache.jackrabbit.vault.packaging.events.PackageEventListener;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Packaging observation helper
+ */
+@Component(immediate=true)
+@References({
+        @Reference(name="packageEventListener",
+                referenceInterface = PackageEventListener.class,
+                cardinality = ReferenceCardinality.OPTIONAL_MULTIPLE,
+                policy = ReferencePolicy.DYNAMIC)
+})
+@Service
+public class PackageEventDispatcherImpl implements PackageEventDispatcher {
+
+    /**
+     * default logger
+     */
+    private static final Logger log = LoggerFactory.getLogger(PackageEventDispatcherImpl.class);
+
+    /**
+     * the registered listener
+     */
+    private ConcurrentHashMap<Object, PackageEventListener> listeners = new ConcurrentHashMap<Object, PackageEventListener>();
+
+    /**
+     * Bind a new listener
+     * @param listener the processor
+     * @param props service properties
+     */
+    protected void bindPackageEventListener(PackageEventListener listener, Map<String, Object> props) {
+        listeners.put(props.get("component.id"), listener);
+        log.info("Registering package event listener {}", listener.getClass().getName());
+    }
+
+    /**
+     * Unbinds a listener
+     * @param listener the processor
+     * @param props service properties
+     */
+    protected void unbindPackageEventListener(PackageEventListener listener, Map<String, Object> props) {
+        if (listeners.remove(props.get("component.id")) != null) {
+            log.info("Unregistering package event listener {}", listener.getClass().getName());
+        } else {
+            log.warn("unable to unregister package event listener {}", listener.getClass().getName());
+        }
+    }
+
+    public void dispatch(@Nonnull PackageEvent.Type type, @Nonnull PackageId id, @Nullable PackageId related) {
+        final EventImpl event = new EventImpl(type, id, related);
+        for (PackageEventListener l: listeners.values()) {
+            try {
+                l.onPackageEvent(event);
+            } catch (Throwable e) {
+                // ignore
+            }
+        }
+    }
+
+    private static final class EventImpl implements PackageEvent {
+
+        private final Type type;
+
+        private final PackageId id;
+
+        private final PackageId related;
+
+        public EventImpl(Type type, PackageId id, PackageId related) {
+            this.type = type;
+            this.id = id;
+            this.related = related;
+        }
+
+        @Nonnull
+        @Override
+        public Type getType() {
+            return type;
+        }
+
+        @Nonnull
+        @Override
+        public PackageId getId() {
+            return id;
+        }
+
+        @CheckForNull
+        @Override
+        public PackageId getRelatedId() {
+            return related;
+        }
+    }
+
+}
+

Added: jackrabbit/commons/filevault/trunk/vault-core/src/main/java/org/apache/jackrabbit/vault/packaging/events/package-info.java
URL: http://svn.apache.org/viewvc/jackrabbit/commons/filevault/trunk/vault-core/src/main/java/org/apache/jackrabbit/vault/packaging/events/package-info.java?rev=1774151&view=auto
==============================================================================
--- jackrabbit/commons/filevault/trunk/vault-core/src/main/java/org/apache/jackrabbit/vault/packaging/events/package-info.java (added)
+++ jackrabbit/commons/filevault/trunk/vault-core/src/main/java/org/apache/jackrabbit/vault/packaging/events/package-info.java Wed Dec 14 09:15:26 2016
@@ -0,0 +1,21 @@
+/*
+ * 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.
+ */
+
+@Version("1.0.0")
+package org.apache.jackrabbit.vault.packaging.events;
+
+import aQute.bnd.annotation.Version;

Modified: jackrabbit/commons/filevault/trunk/vault-core/src/main/java/org/apache/jackrabbit/vault/packaging/impl/JcrPackageImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/commons/filevault/trunk/vault-core/src/main/java/org/apache/jackrabbit/vault/packaging/impl/JcrPackageImpl.java?rev=1774151&r1=1774150&r2=1774151&view=diff
==============================================================================
--- jackrabbit/commons/filevault/trunk/vault-core/src/main/java/org/apache/jackrabbit/vault/packaging/impl/JcrPackageImpl.java (original)
+++ jackrabbit/commons/filevault/trunk/vault-core/src/main/java/org/apache/jackrabbit/vault/packaging/impl/JcrPackageImpl.java Wed Dec 14 09:15:26 2016
@@ -63,6 +63,7 @@ import org.apache.jackrabbit.vault.packa
 import org.apache.jackrabbit.vault.packaging.SubPackageHandling;
 import org.apache.jackrabbit.vault.packaging.VaultPackage;
 import org.apache.jackrabbit.vault.packaging.Version;
+import org.apache.jackrabbit.vault.packaging.events.PackageEvent;
 import org.apache.jackrabbit.vault.util.JcrConstants;
 import org.apache.jackrabbit.vault.util.Text;
 import org.slf4j.Logger;
@@ -498,6 +499,12 @@ public class JcrPackageImpl implements J
                 s.save();
             }
         }
+
+        if (createSnapshot) {
+            mgr.dispatch(PackageEvent.Type.INSTALL, def.getId(), null);
+        } else {
+            mgr.dispatch(PackageEvent.Type.EXTRACT, def.getId(), null);
+        }
     }
 
     /**
@@ -509,6 +516,7 @@ public class JcrPackageImpl implements J
             throws RepositoryException, PackageException, IOException {
         Set<PackageId> processed = new HashSet<PackageId>();
         extractSubpackages(opts, processed);
+        mgr.dispatch(PackageEvent.Type.EXTRACT_SUB_PACKAGES, getDefinition().getId(), null);
         PackageId[] ret = processed.toArray(new PackageId[processed.size()]);
         Arrays.sort(ret);
         return ret;
@@ -779,6 +787,7 @@ public class JcrPackageImpl implements J
         }
         packMgr.assemble(snap.getNode(), snapDef, opts.getListener());
         log.info("Creating snapshot for {} completed.", id);
+        mgr.dispatch(PackageEvent.Type.SNAPSHOT, id, null);
         return snap;
     }
 
@@ -906,6 +915,9 @@ public class JcrPackageImpl implements J
         // revert installed flags on this package
         JcrPackageDefinitionImpl def = (JcrPackageDefinitionImpl) getDefinition();
         def.clearLastUnpacked(true);
+
+        mgr.dispatch(PackageEvent.Type.UNINSTALL, def.getId(), null);
+
     }
 
     /**

Modified: jackrabbit/commons/filevault/trunk/vault-core/src/main/java/org/apache/jackrabbit/vault/packaging/impl/JcrPackageManagerImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/commons/filevault/trunk/vault-core/src/main/java/org/apache/jackrabbit/vault/packaging/impl/JcrPackageManagerImpl.java?rev=1774151&r1=1774150&r2=1774151&view=diff
==============================================================================
--- jackrabbit/commons/filevault/trunk/vault-core/src/main/java/org/apache/jackrabbit/vault/packaging/impl/JcrPackageManagerImpl.java (original)
+++ jackrabbit/commons/filevault/trunk/vault-core/src/main/java/org/apache/jackrabbit/vault/packaging/impl/JcrPackageManagerImpl.java Wed Dec 14 09:15:26 2016
@@ -57,6 +57,8 @@ import org.apache.jackrabbit.vault.packa
 import org.apache.jackrabbit.vault.packaging.PackageId;
 import org.apache.jackrabbit.vault.packaging.VaultPackage;
 import org.apache.jackrabbit.vault.packaging.Version;
+import org.apache.jackrabbit.vault.packaging.events.PackageEvent;
+import org.apache.jackrabbit.vault.packaging.events.impl.PackageEventDispatcher;
 import org.apache.jackrabbit.vault.util.InputStreamPump;
 import org.apache.jackrabbit.vault.util.JcrConstants;
 import org.apache.jackrabbit.vault.util.Text;
@@ -276,6 +278,7 @@ public class JcrPackageManagerImpl exten
             if (state != null) {
                 def.setState(state);
             }
+            dispatch(PackageEvent.Type.UPLOAD, pid, null);
             return jcrPack;
         } finally {
             bin.dispose();
@@ -356,6 +359,7 @@ public class JcrPackageManagerImpl exten
             if (state != null) {
                 def.setState(state);
             }
+            dispatch(PackageEvent.Type.UPLOAD, pid, null);
             return jcrPack;
         } finally {
             if (jcrPack == null) {
@@ -450,6 +454,7 @@ public class JcrPackageManagerImpl exten
         } finally {
             IOUtils.closeQuietly(in);
         }
+        dispatch(PackageEvent.Type.CREATE, pid, null);
         return new JcrPackageImpl(this, node, (ZipVaultPackage) pack);
     }
 
@@ -482,6 +487,7 @@ public class JcrPackageManagerImpl exten
         content.setProperty(JcrConstants.JCR_MIMETYPE, JcrPackage.MIME_TYPE);
         content.setProperty(JcrConstants.JCR_DATA, bin);
         def.unwrap(archive, false);
+        dispatch(PackageEvent.Type.CREATE, pid, null);
         return new JcrPackageImpl(this, node);
     }
 
@@ -491,12 +497,14 @@ public class JcrPackageManagerImpl exten
      */
     @Override
     public void remove(JcrPackage pack) throws RepositoryException {
+        PackageId pid = pack.getDefinition().getId();
         JcrPackage snap = pack.getSnapshot();
         if (snap != null) {
             snap.getNode().remove();
         }
         pack.getNode().remove();
         session.save();
+        dispatch(PackageEvent.Type.REMOVE, pid, null);
     }
 
     /**
@@ -550,6 +558,7 @@ public class JcrPackageManagerImpl exten
 
         session.save();
         Node newNode = session.getNode(dstPath);
+        dispatch(PackageEvent.Type.RENAME, id, newId);
         return open(newNode);
     }
 
@@ -581,6 +590,7 @@ public class JcrPackageManagerImpl exten
         opts.setPostProcessor(def.getInjectProcessor());
 
         VaultPackage pack = assemble(packNode.getSession(), opts, (File) null);
+        PackageId id = pack.getId();
 
         // update this content
         Node contentNode = packNode.getNode(JcrConstants.JCR_CONTENT);
@@ -597,6 +607,7 @@ public class JcrPackageManagerImpl exten
         contentNode.setProperty(JcrConstants.JCR_MIMETYPE, JcrPackage.MIME_TYPE);
         packNode.getSession().save();
         pack.close();
+        dispatch(PackageEvent.Type.ASSEMBLE, id, null);
     }
 
     /**

Modified: jackrabbit/commons/filevault/trunk/vault-core/src/main/java/org/apache/jackrabbit/vault/packaging/impl/PackageManagerImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/commons/filevault/trunk/vault-core/src/main/java/org/apache/jackrabbit/vault/packaging/impl/PackageManagerImpl.java?rev=1774151&r1=1774150&r2=1774151&view=diff
==============================================================================
--- jackrabbit/commons/filevault/trunk/vault-core/src/main/java/org/apache/jackrabbit/vault/packaging/impl/PackageManagerImpl.java (original)
+++ jackrabbit/commons/filevault/trunk/vault-core/src/main/java/org/apache/jackrabbit/vault/packaging/impl/PackageManagerImpl.java Wed Dec 14 09:15:26 2016
@@ -29,6 +29,8 @@ import java.util.Set;
 import java.util.zip.ZipEntry;
 import java.util.zip.ZipFile;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
 import javax.jcr.RepositoryException;
 import javax.jcr.Session;
 
@@ -44,9 +46,12 @@ import org.apache.jackrabbit.vault.fs.im
 import org.apache.jackrabbit.vault.fs.io.JarExporter;
 import org.apache.jackrabbit.vault.fs.spi.ProgressTracker;
 import org.apache.jackrabbit.vault.packaging.ExportOptions;
+import org.apache.jackrabbit.vault.packaging.PackageId;
 import org.apache.jackrabbit.vault.packaging.PackageManager;
 import org.apache.jackrabbit.vault.packaging.PackageProperties;
 import org.apache.jackrabbit.vault.packaging.VaultPackage;
+import org.apache.jackrabbit.vault.packaging.events.PackageEvent;
+import org.apache.jackrabbit.vault.packaging.events.impl.PackageEventDispatcher;
 import org.apache.jackrabbit.vault.util.Constants;
 
 /**
@@ -55,6 +60,12 @@ import org.apache.jackrabbit.vault.util.
 public class PackageManagerImpl implements PackageManager {
 
     /**
+     * event dispatcher
+     */
+    @Nullable
+    private PackageEventDispatcher dispatcher;
+
+    /**
      * {@inheritDoc}
      */
     public VaultPackage open(File file) throws IOException {
@@ -154,7 +165,9 @@ public class PackageManagerImpl implemen
             rewrap(opts, src, out);
             IOUtils.closeQuietly(out);
             success = true;
-            return new ZipVaultPackage(file, isTmp);
+            VaultPackage pack =  new ZipVaultPackage(file, isTmp);
+            dispatch(PackageEvent.Type.REWRAPP, pack.getId(), null);
+            return pack;
         } finally {
             IOUtils.closeQuietly(out);
             if (isTmp && !success) {
@@ -225,4 +238,21 @@ public class PackageManagerImpl implemen
         exporter.close();
     }
 
+    @Nullable
+    PackageEventDispatcher getDispatcher() {
+        return dispatcher;
+    }
+
+    void setDispatcher(@Nullable PackageEventDispatcher dispatcher) {
+        this.dispatcher = dispatcher;
+    }
+
+    void dispatch(@Nonnull PackageEvent.Type type, @Nonnull PackageId id, @Nullable PackageId related) {
+        if (dispatcher == null) {
+            return;
+        }
+        dispatcher.dispatch(type, id, related);
+    }
+
+
 }
\ No newline at end of file

Modified: jackrabbit/commons/filevault/trunk/vault-core/src/main/java/org/apache/jackrabbit/vault/packaging/impl/PackagingImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/commons/filevault/trunk/vault-core/src/main/java/org/apache/jackrabbit/vault/packaging/impl/PackagingImpl.java?rev=1774151&r1=1774150&r2=1774151&view=diff
==============================================================================
--- jackrabbit/commons/filevault/trunk/vault-core/src/main/java/org/apache/jackrabbit/vault/packaging/impl/PackagingImpl.java (original)
+++ jackrabbit/commons/filevault/trunk/vault-core/src/main/java/org/apache/jackrabbit/vault/packaging/impl/PackagingImpl.java Wed Dec 14 09:15:26 2016
@@ -21,12 +21,14 @@ import javax.jcr.RepositoryException;
 import javax.jcr.Session;
 
 import org.apache.felix.scr.annotations.Component;
+import org.apache.felix.scr.annotations.Reference;
 import org.apache.felix.scr.annotations.Service;
 import org.apache.jackrabbit.vault.packaging.JcrPackage;
 import org.apache.jackrabbit.vault.packaging.JcrPackageDefinition;
 import org.apache.jackrabbit.vault.packaging.JcrPackageManager;
 import org.apache.jackrabbit.vault.packaging.PackageManager;
 import org.apache.jackrabbit.vault.packaging.Packaging;
+import org.apache.jackrabbit.vault.packaging.events.impl.PackageEventDispatcher;
 
 /**
  * {@code PackagingImpl}...
@@ -35,10 +37,17 @@ import org.apache.jackrabbit.vault.packa
 @Service(value = Packaging.class)
 public class PackagingImpl implements Packaging {
 
+    @Reference
+    private PackageEventDispatcher eventDispatcher;
+
     /**
      * package manager is a singleton
      */
-    private final PackageManager pkgManager = new PackageManagerImpl();
+    private final PackageManagerImpl pkgManager = new PackageManagerImpl();
+
+    public PackagingImpl() {
+        pkgManager.setDispatcher(eventDispatcher);
+    }
 
     /**
      * {@inheritDoc}
@@ -51,7 +60,9 @@ public class PackagingImpl implements Pa
      * {@inheritDoc}
      */
     public JcrPackageManager getPackageManager(Session session) {
-        return new JcrPackageManagerImpl(session);
+        JcrPackageManagerImpl mgr = new JcrPackageManagerImpl(session);
+        mgr.setDispatcher(eventDispatcher);
+        return mgr;
     }
 
     /**