You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@karaf.apache.org by jb...@apache.org on 2016/07/11 08:34:05 UTC

karaf-cellar git commit: [KARAF-4602] Now define source node in all cluster events, and introduce "local" attribute

Repository: karaf-cellar
Updated Branches:
  refs/heads/master 130525c55 -> 1d05e8c4c


[KARAF-4602] Now define source node in all cluster events, and introduce "local" attribute


Project: http://git-wip-us.apache.org/repos/asf/karaf-cellar/repo
Commit: http://git-wip-us.apache.org/repos/asf/karaf-cellar/commit/1d05e8c4
Tree: http://git-wip-us.apache.org/repos/asf/karaf-cellar/tree/1d05e8c4
Diff: http://git-wip-us.apache.org/repos/asf/karaf-cellar/diff/1d05e8c4

Branch: refs/heads/master
Commit: 1d05e8c4c87b9152eb274748a574ac982429292a
Parents: 130525c
Author: Jean-Baptiste Onofr� <jb...@apache.org>
Authored: Mon Jul 11 10:33:24 2016 +0200
Committer: Jean-Baptiste Onofr� <jb...@apache.org>
Committed: Mon Jul 11 10:33:24 2016 +0200

----------------------------------------------------------------------
 .../apache/karaf/cellar/bundle/BundleEventHandler.java  |  2 +-
 .../apache/karaf/cellar/bundle/BundleSynchronizer.java  |  2 ++
 .../apache/karaf/cellar/bundle/ClusterBundleEvent.java  |  9 +++++++++
 .../apache/karaf/cellar/bundle/LocalBundleListener.java |  1 +
 .../management/internal/CellarBundleMBeanImpl.java      |  5 +++++
 .../karaf/cellar/bundle/shell/InstallBundleCommand.java |  2 ++
 .../karaf/cellar/bundle/shell/StartBundleCommand.java   |  1 +
 .../karaf/cellar/bundle/shell/StopBundleCommand.java    |  1 +
 .../cellar/bundle/shell/UninstallBundleCommand.java     |  1 +
 .../karaf/cellar/config/ClusterConfigurationEvent.java  | 12 +++++++++++-
 .../karaf/cellar/config/ConfigurationEventHandler.java  |  2 +-
 .../karaf/cellar/config/ConfigurationSynchronizer.java  |  2 ++
 .../karaf/cellar/config/LocalConfigurationListener.java |  2 ++
 .../management/internal/CellarConfigMBeanImpl.java      |  4 ++++
 .../apache/karaf/cellar/config/shell/DeleteCommand.java |  1 +
 .../karaf/cellar/config/shell/PropAppendCommand.java    |  1 +
 .../karaf/cellar/config/shell/PropDelCommand.java       |  1 +
 .../karaf/cellar/config/shell/PropSetCommand.java       |  1 +
 .../org/apache/karaf/cellar/event/ClusterEvent.java     | 10 ++++++++++
 .../apache/karaf/cellar/event/ClusterEventHandler.java  |  6 ++++++
 .../apache/karaf/cellar/event/LocalEventListener.java   |  2 ++
 .../karaf/cellar/features/ClusterFeaturesEvent.java     |  9 +++++++++
 .../karaf/cellar/features/ClusterRepositoryEvent.java   | 10 ++++++++++
 .../karaf/cellar/features/FeaturesEventHandler.java     |  2 +-
 .../karaf/cellar/features/FeaturesSynchronizer.java     |  2 ++
 .../karaf/cellar/features/LocalFeaturesListener.java    |  2 ++
 .../karaf/cellar/features/RepositoryEventHandler.java   |  6 ++++++
 .../management/internal/CellarFeaturesMBeanImpl.java    |  3 +++
 .../karaf/cellar/features/shell/RepoAddCommand.java     |  1 +
 .../karaf/cellar/features/shell/RepoRefreshCommand.java |  1 +
 .../karaf/cellar/features/shell/RepoRemoveCommand.java  |  1 +
 .../cellar/http/balancer/BalancerEventHandler.java      |  2 +-
 .../cellar/http/balancer/ClusterBalancerEvent.java      |  9 +++++++++
 .../cellar/http/balancer/LocalServletListener.java      |  2 ++
 .../karaf/cellar/http/balancer/ServletSynchronizer.java |  1 +
 .../apache/karaf/cellar/obr/ClusterObrBundleEvent.java  | 10 ++++++++++
 .../org/apache/karaf/cellar/obr/ClusterObrUrlEvent.java | 10 ++++++++++
 .../apache/karaf/cellar/obr/ObrBundleEventHandler.java  |  2 +-
 .../org/apache/karaf/cellar/obr/ObrUrlEventHandler.java |  2 +-
 .../org/apache/karaf/cellar/obr/ObrUrlSynchronizer.java |  1 +
 .../obr/management/internal/CellarOBRMBeanImpl.java     |  3 +++
 .../apache/karaf/cellar/obr/shell/ObrAddUrlCommand.java |  1 +
 .../apache/karaf/cellar/obr/shell/ObrDeployCommand.java |  1 +
 .../karaf/cellar/obr/shell/ObrRemoveUrlCommand.java     |  1 +
 44 files changed, 143 insertions(+), 7 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/karaf-cellar/blob/1d05e8c4/bundle/src/main/java/org/apache/karaf/cellar/bundle/BundleEventHandler.java
----------------------------------------------------------------------
diff --git a/bundle/src/main/java/org/apache/karaf/cellar/bundle/BundleEventHandler.java b/bundle/src/main/java/org/apache/karaf/cellar/bundle/BundleEventHandler.java
index 589fda4..8c4a349 100644
--- a/bundle/src/main/java/org/apache/karaf/cellar/bundle/BundleEventHandler.java
+++ b/bundle/src/main/java/org/apache/karaf/cellar/bundle/BundleEventHandler.java
@@ -67,7 +67,7 @@ public class BundleEventHandler extends BundleSupport implements EventHandler<Cl
 
         try {
             // check if it's not a "local" event
-            if (event.getSourceNode() != null && event.getSourceNode().getId().equalsIgnoreCase(clusterManager.getNode().getId())) {
+            if (event.getLocal() != null && event.getLocal().getId().equalsIgnoreCase(clusterManager.getNode().getId())) {
                 LOGGER.trace("CELLAR BUNDLE: cluster event is local (coming from local synchronizer or listener)");
                 return;
             }

http://git-wip-us.apache.org/repos/asf/karaf-cellar/blob/1d05e8c4/bundle/src/main/java/org/apache/karaf/cellar/bundle/BundleSynchronizer.java
----------------------------------------------------------------------
diff --git a/bundle/src/main/java/org/apache/karaf/cellar/bundle/BundleSynchronizer.java b/bundle/src/main/java/org/apache/karaf/cellar/bundle/BundleSynchronizer.java
index aee5a26..6771d53 100644
--- a/bundle/src/main/java/org/apache/karaf/cellar/bundle/BundleSynchronizer.java
+++ b/bundle/src/main/java/org/apache/karaf/cellar/bundle/BundleSynchronizer.java
@@ -214,6 +214,7 @@ public class BundleSynchronizer extends BundleSupport implements Synchronizer {
                             ClusterBundleEvent clusterEvent = new ClusterBundleEvent(symbolicName, version, bundleLocation, status);
                             clusterEvent.setSourceGroup(group);
                             clusterEvent.setSourceNode(clusterManager.getNode());
+                            clusterEvent.setLocal(clusterManager.getNode());
                             eventProducer.produce(clusterEvent);
                         } else {
                             BundleState bundleState = clusterBundles.get(id);
@@ -226,6 +227,7 @@ public class BundleSynchronizer extends BundleSupport implements Synchronizer {
                                 ClusterBundleEvent clusterEvent = new ClusterBundleEvent(symbolicName, version, bundleLocation, status);
                                 clusterEvent.setSourceGroup(group);
                                 clusterEvent.setSourceNode(clusterManager.getNode());
+                                clusterEvent.setLocal(clusterManager.getNode());
                                 eventProducer.produce(clusterEvent);
                             }
                         }

http://git-wip-us.apache.org/repos/asf/karaf-cellar/blob/1d05e8c4/bundle/src/main/java/org/apache/karaf/cellar/bundle/ClusterBundleEvent.java
----------------------------------------------------------------------
diff --git a/bundle/src/main/java/org/apache/karaf/cellar/bundle/ClusterBundleEvent.java b/bundle/src/main/java/org/apache/karaf/cellar/bundle/ClusterBundleEvent.java
index a043fb3..938c4ef 100644
--- a/bundle/src/main/java/org/apache/karaf/cellar/bundle/ClusterBundleEvent.java
+++ b/bundle/src/main/java/org/apache/karaf/cellar/bundle/ClusterBundleEvent.java
@@ -13,6 +13,7 @@
  */
 package org.apache.karaf.cellar.bundle;
 
+import org.apache.karaf.cellar.core.Node;
 import org.apache.karaf.cellar.core.event.Event;
 
 /**
@@ -24,6 +25,7 @@ public class ClusterBundleEvent extends Event {
     private String version;
     private String location;
     private int type;
+    private Node local;
 
     public ClusterBundleEvent(String symbolicName, String version, String location, int type) {
         super(symbolicName + "/" + version);
@@ -65,4 +67,11 @@ public class ClusterBundleEvent extends Event {
         this.type = type;
     }
 
+    public Node getLocal() {
+        return local;
+    }
+
+    public void setLocal(Node local) {
+        this.local = local;
+    }
 }

http://git-wip-us.apache.org/repos/asf/karaf-cellar/blob/1d05e8c4/bundle/src/main/java/org/apache/karaf/cellar/bundle/LocalBundleListener.java
----------------------------------------------------------------------
diff --git a/bundle/src/main/java/org/apache/karaf/cellar/bundle/LocalBundleListener.java b/bundle/src/main/java/org/apache/karaf/cellar/bundle/LocalBundleListener.java
index c418c60..72d8caf 100644
--- a/bundle/src/main/java/org/apache/karaf/cellar/bundle/LocalBundleListener.java
+++ b/bundle/src/main/java/org/apache/karaf/cellar/bundle/LocalBundleListener.java
@@ -128,6 +128,7 @@ public class LocalBundleListener extends BundleSupport implements SynchronousBun
                             ClusterBundleEvent clusterBundleEvent = new ClusterBundleEvent(symbolicName, version, bundleLocation, status);
                             clusterBundleEvent.setSourceGroup(group);
                             clusterBundleEvent.setSourceNode(clusterManager.getNode());
+                            clusterBundleEvent.setLocal(clusterManager.getNode());
                             eventProducer.produce(clusterBundleEvent);
                         } catch (Exception e) {
                         	LOGGER.error("CELLAR BUNDLE: failed to create bundle event", e);

http://git-wip-us.apache.org/repos/asf/karaf-cellar/blob/1d05e8c4/bundle/src/main/java/org/apache/karaf/cellar/bundle/management/internal/CellarBundleMBeanImpl.java
----------------------------------------------------------------------
diff --git a/bundle/src/main/java/org/apache/karaf/cellar/bundle/management/internal/CellarBundleMBeanImpl.java b/bundle/src/main/java/org/apache/karaf/cellar/bundle/management/internal/CellarBundleMBeanImpl.java
index ec87ed9..8efe1a0 100644
--- a/bundle/src/main/java/org/apache/karaf/cellar/bundle/management/internal/CellarBundleMBeanImpl.java
+++ b/bundle/src/main/java/org/apache/karaf/cellar/bundle/management/internal/CellarBundleMBeanImpl.java
@@ -158,9 +158,11 @@ public class CellarBundleMBeanImpl extends StandardMBean implements CellarBundle
         // broadcast the event
         ClusterBundleEvent event = new ClusterBundleEvent(symbolicName, version, location, Bundle.INSTALLED);
         event.setSourceGroup(group);
+        event.setSourceNode(clusterManager.getNode());
         if (start) {
             event = new ClusterBundleEvent(symbolicName, version, location, Bundle.ACTIVE);
             event.setSourceGroup(group);
+            event.setSourceNode(clusterManager.getNode());
         }
         eventProducer.produce(event);
     }
@@ -211,6 +213,7 @@ public class CellarBundleMBeanImpl extends StandardMBean implements CellarBundle
                 String[] split = bundle.split("/");
                 ClusterBundleEvent event = new ClusterBundleEvent(split[0], split[1], location, Bundle.UNINSTALLED);
                 event.setSourceGroup(group);
+                event.setSourceNode(clusterManager.getNode());
                 eventProducer.produce(event);
             }
         } finally {
@@ -267,6 +270,7 @@ public class CellarBundleMBeanImpl extends StandardMBean implements CellarBundle
                 String[] split = bundle.split("/");
                 ClusterBundleEvent event = new ClusterBundleEvent(split[0], split[1], location, Bundle.ACTIVE);
                 event.setSourceGroup(group);
+                event.setSourceNode(clusterManager.getNode());
                 eventProducer.produce(event);
             }
         } finally {
@@ -320,6 +324,7 @@ public class CellarBundleMBeanImpl extends StandardMBean implements CellarBundle
                 String[] split = bundle.split("/");
                 ClusterBundleEvent event = new ClusterBundleEvent(split[0], split[1], location, Bundle.RESOLVED);
                 event.setSourceGroup(group);
+                event.setSourceNode(clusterManager.getNode());
                 eventProducer.produce(event);
             }
         } finally {

http://git-wip-us.apache.org/repos/asf/karaf-cellar/blob/1d05e8c4/bundle/src/main/java/org/apache/karaf/cellar/bundle/shell/InstallBundleCommand.java
----------------------------------------------------------------------
diff --git a/bundle/src/main/java/org/apache/karaf/cellar/bundle/shell/InstallBundleCommand.java b/bundle/src/main/java/org/apache/karaf/cellar/bundle/shell/InstallBundleCommand.java
index a347ae5..fe79aa8 100644
--- a/bundle/src/main/java/org/apache/karaf/cellar/bundle/shell/InstallBundleCommand.java
+++ b/bundle/src/main/java/org/apache/karaf/cellar/bundle/shell/InstallBundleCommand.java
@@ -124,9 +124,11 @@ public class InstallBundleCommand extends CellarCommandSupport {
                 if (start) {
                     event = new ClusterBundleEvent(symbolicName, version, url, Bundle.ACTIVE);
                     event.setSourceGroup(group);
+                    event.setSourceNode(clusterManager.getNode());
                 } else {
                     event = new ClusterBundleEvent(symbolicName, version, url, Bundle.INSTALLED);
                     event.setSourceGroup(group);
+                    event.setSourceNode(clusterManager.getNode());
                 }
                 eventProducer.produce(event);
             } else {

http://git-wip-us.apache.org/repos/asf/karaf-cellar/blob/1d05e8c4/bundle/src/main/java/org/apache/karaf/cellar/bundle/shell/StartBundleCommand.java
----------------------------------------------------------------------
diff --git a/bundle/src/main/java/org/apache/karaf/cellar/bundle/shell/StartBundleCommand.java b/bundle/src/main/java/org/apache/karaf/cellar/bundle/shell/StartBundleCommand.java
index eba376d..059da85 100644
--- a/bundle/src/main/java/org/apache/karaf/cellar/bundle/shell/StartBundleCommand.java
+++ b/bundle/src/main/java/org/apache/karaf/cellar/bundle/shell/StartBundleCommand.java
@@ -85,6 +85,7 @@ public class StartBundleCommand extends BundleCommandSupport {
                 String[] split = bundle.split("/");
                 ClusterBundleEvent event = new ClusterBundleEvent(split[0], split[1], location, Bundle.ACTIVE);
                 event.setSourceGroup(group);
+                event.setSourceNode(clusterManager.getNode());
                 eventProducer.produce(event);
             }
         } finally {

http://git-wip-us.apache.org/repos/asf/karaf-cellar/blob/1d05e8c4/bundle/src/main/java/org/apache/karaf/cellar/bundle/shell/StopBundleCommand.java
----------------------------------------------------------------------
diff --git a/bundle/src/main/java/org/apache/karaf/cellar/bundle/shell/StopBundleCommand.java b/bundle/src/main/java/org/apache/karaf/cellar/bundle/shell/StopBundleCommand.java
index 5fd70f8..4faf095 100644
--- a/bundle/src/main/java/org/apache/karaf/cellar/bundle/shell/StopBundleCommand.java
+++ b/bundle/src/main/java/org/apache/karaf/cellar/bundle/shell/StopBundleCommand.java
@@ -85,6 +85,7 @@ public class StopBundleCommand extends BundleCommandSupport {
                 String[] split = bundle.split("/");
                 ClusterBundleEvent event = new ClusterBundleEvent(split[0], split[1], location, Bundle.RESOLVED);
                 event.setSourceGroup(group);
+                event.setSourceNode(clusterManager.getNode());
                 eventProducer.produce(event);
             }
         } finally {

http://git-wip-us.apache.org/repos/asf/karaf-cellar/blob/1d05e8c4/bundle/src/main/java/org/apache/karaf/cellar/bundle/shell/UninstallBundleCommand.java
----------------------------------------------------------------------
diff --git a/bundle/src/main/java/org/apache/karaf/cellar/bundle/shell/UninstallBundleCommand.java b/bundle/src/main/java/org/apache/karaf/cellar/bundle/shell/UninstallBundleCommand.java
index a6616f3..8584a39 100644
--- a/bundle/src/main/java/org/apache/karaf/cellar/bundle/shell/UninstallBundleCommand.java
+++ b/bundle/src/main/java/org/apache/karaf/cellar/bundle/shell/UninstallBundleCommand.java
@@ -84,6 +84,7 @@ public class UninstallBundleCommand extends BundleCommandSupport {
                 String[] split = bundle.split("/");
                 ClusterBundleEvent event = new ClusterBundleEvent(split[0], split[1], location, Bundle.UNINSTALLED);
                 event.setSourceGroup(group);
+                event.setSourceNode(clusterManager.getNode());
                 eventProducer.produce(event);
             }
         } finally {

http://git-wip-us.apache.org/repos/asf/karaf-cellar/blob/1d05e8c4/config/src/main/java/org/apache/karaf/cellar/config/ClusterConfigurationEvent.java
----------------------------------------------------------------------
diff --git a/config/src/main/java/org/apache/karaf/cellar/config/ClusterConfigurationEvent.java b/config/src/main/java/org/apache/karaf/cellar/config/ClusterConfigurationEvent.java
index 9c51e44..cf0ffa4 100644
--- a/config/src/main/java/org/apache/karaf/cellar/config/ClusterConfigurationEvent.java
+++ b/config/src/main/java/org/apache/karaf/cellar/config/ClusterConfigurationEvent.java
@@ -13,6 +13,7 @@
  */
 package org.apache.karaf.cellar.config;
 
+import org.apache.karaf.cellar.core.Node;
 import org.apache.karaf.cellar.core.event.Event;
 
 /**
@@ -21,6 +22,7 @@ import org.apache.karaf.cellar.core.event.Event;
 public class ClusterConfigurationEvent extends Event {
 
 	private Integer type;
+    private Node local;
 
     public ClusterConfigurationEvent(String id) {
         super(id);
@@ -34,7 +36,15 @@ public class ClusterConfigurationEvent extends Event {
         this.type = type;
     }
 
-	@Override
+    public Node getLocal() {
+        return local;
+    }
+
+    public void setLocal(Node local) {
+        this.local = local;
+    }
+
+    @Override
 	public String toString() {
 		return "ClusterConfigurationEvent [type=" + type + ", id=" + id
 				+ ", sourceNode=" + sourceNode + ", sourceGroup=" + sourceGroup

http://git-wip-us.apache.org/repos/asf/karaf-cellar/blob/1d05e8c4/config/src/main/java/org/apache/karaf/cellar/config/ConfigurationEventHandler.java
----------------------------------------------------------------------
diff --git a/config/src/main/java/org/apache/karaf/cellar/config/ConfigurationEventHandler.java b/config/src/main/java/org/apache/karaf/cellar/config/ConfigurationEventHandler.java
index 682bc2c..910cb7a 100644
--- a/config/src/main/java/org/apache/karaf/cellar/config/ConfigurationEventHandler.java
+++ b/config/src/main/java/org/apache/karaf/cellar/config/ConfigurationEventHandler.java
@@ -63,7 +63,7 @@ public class ConfigurationEventHandler extends ConfigurationSupport implements E
         }
 
         // check if it's not a "local" event
-        if (event.getSourceNode() != null && event.getSourceNode().getId().equalsIgnoreCase(clusterManager.getNode().getId())) {
+        if (event.getLocal() != null && event.getLocal().getId().equalsIgnoreCase(clusterManager.getNode().getId())) {
             LOGGER.trace("CELLAR CONFIG: cluster event is local (coming from local synchronizer or listener)");
             return;
         }

http://git-wip-us.apache.org/repos/asf/karaf-cellar/blob/1d05e8c4/config/src/main/java/org/apache/karaf/cellar/config/ConfigurationSynchronizer.java
----------------------------------------------------------------------
diff --git a/config/src/main/java/org/apache/karaf/cellar/config/ConfigurationSynchronizer.java b/config/src/main/java/org/apache/karaf/cellar/config/ConfigurationSynchronizer.java
index 79b0ade..75cb4c3 100644
--- a/config/src/main/java/org/apache/karaf/cellar/config/ConfigurationSynchronizer.java
+++ b/config/src/main/java/org/apache/karaf/cellar/config/ConfigurationSynchronizer.java
@@ -176,6 +176,7 @@ public class ConfigurationSynchronizer extends ConfigurationSupport implements S
                                 ClusterConfigurationEvent event = new ClusterConfigurationEvent(pid);
                                 event.setSourceGroup(group);
                                 event.setSourceNode(clusterManager.getNode());
+                                event.setLocal(clusterManager.getNode());
                                 eventProducer.produce(event);
                             } else {
                                 Dictionary clusterDictionary = clusterConfigurations.get(pid);
@@ -186,6 +187,7 @@ public class ConfigurationSynchronizer extends ConfigurationSupport implements S
                                     // send cluster event
                                     ClusterConfigurationEvent event = new ClusterConfigurationEvent(pid);
                                     event.setSourceGroup(group);
+                                    event.setLocal(clusterManager.getNode());
                                     event.setSourceNode(clusterManager.getNode());
                                     eventProducer.produce(event);
                                 }

http://git-wip-us.apache.org/repos/asf/karaf-cellar/blob/1d05e8c4/config/src/main/java/org/apache/karaf/cellar/config/LocalConfigurationListener.java
----------------------------------------------------------------------
diff --git a/config/src/main/java/org/apache/karaf/cellar/config/LocalConfigurationListener.java b/config/src/main/java/org/apache/karaf/cellar/config/LocalConfigurationListener.java
index 67fb201..20ce8c5 100644
--- a/config/src/main/java/org/apache/karaf/cellar/config/LocalConfigurationListener.java
+++ b/config/src/main/java/org/apache/karaf/cellar/config/LocalConfigurationListener.java
@@ -77,6 +77,7 @@ public class LocalConfigurationListener extends ConfigurationSupport implements
                                 clusterConfigurationEvent.setType(event.getType());
                                 clusterConfigurationEvent.setSourceNode(clusterManager.getNode());
                                 clusterConfigurationEvent.setSourceGroup(group);
+                                clusterConfigurationEvent.setLocal(clusterManager.getNode());
                                 eventProducer.produce(clusterConfigurationEvent);
                             }
 
@@ -95,6 +96,7 @@ public class LocalConfigurationListener extends ConfigurationSupport implements
                                 ClusterConfigurationEvent clusterConfigurationEvent = new ClusterConfigurationEvent(pid);
                                 clusterConfigurationEvent.setSourceGroup(group);
                                 clusterConfigurationEvent.setSourceNode(clusterManager.getNode());
+                                clusterConfigurationEvent.setLocal(clusterManager.getNode());
                                 eventProducer.produce(clusterConfigurationEvent);
                             }
                         }

http://git-wip-us.apache.org/repos/asf/karaf-cellar/blob/1d05e8c4/config/src/main/java/org/apache/karaf/cellar/config/management/internal/CellarConfigMBeanImpl.java
----------------------------------------------------------------------
diff --git a/config/src/main/java/org/apache/karaf/cellar/config/management/internal/CellarConfigMBeanImpl.java b/config/src/main/java/org/apache/karaf/cellar/config/management/internal/CellarConfigMBeanImpl.java
index d6101b3..01c497c 100644
--- a/config/src/main/java/org/apache/karaf/cellar/config/management/internal/CellarConfigMBeanImpl.java
+++ b/config/src/main/java/org/apache/karaf/cellar/config/management/internal/CellarConfigMBeanImpl.java
@@ -91,6 +91,7 @@ public class CellarConfigMBeanImpl extends StandardMBean implements CellarConfig
             // broadcast the cluster event
             ClusterConfigurationEvent event = new ClusterConfigurationEvent(pid);
             event.setSourceGroup(group);
+            event.setSourceNode(clusterManager.getNode());
             event.setType(ConfigurationEvent.CM_DELETED);
             eventProducer.produce(event);
         } else {
@@ -150,6 +151,7 @@ public class CellarConfigMBeanImpl extends StandardMBean implements CellarConfig
             // broadcast the cluster event
             ClusterConfigurationEvent event = new ClusterConfigurationEvent(pid);
             event.setSourceGroup(group);
+            event.setSourceNode(clusterManager.getNode());
             eventProducer.produce(event);
         } else {
             throw new IllegalArgumentException("No configuration found in cluster group " + groupName);
@@ -198,6 +200,7 @@ public class CellarConfigMBeanImpl extends StandardMBean implements CellarConfig
             // broadcast the cluster event
             ClusterConfigurationEvent event = new ClusterConfigurationEvent(pid);
             event.setSourceGroup(group);
+            event.setSourceNode(clusterManager.getNode());
             eventProducer.produce(event);
         } else {
             throw new IllegalArgumentException("No configuration found in cluster group " + groupName);
@@ -236,6 +239,7 @@ public class CellarConfigMBeanImpl extends StandardMBean implements CellarConfig
                 // broadcast the cluster event
                 ClusterConfigurationEvent event = new ClusterConfigurationEvent(pid);
                 event.setSourceGroup(group);
+                event.setSourceNode(clusterManager.getNode());
                 eventProducer.produce(event);
             }
         } else {

http://git-wip-us.apache.org/repos/asf/karaf-cellar/blob/1d05e8c4/config/src/main/java/org/apache/karaf/cellar/config/shell/DeleteCommand.java
----------------------------------------------------------------------
diff --git a/config/src/main/java/org/apache/karaf/cellar/config/shell/DeleteCommand.java b/config/src/main/java/org/apache/karaf/cellar/config/shell/DeleteCommand.java
index 0ce9994..b87150b 100644
--- a/config/src/main/java/org/apache/karaf/cellar/config/shell/DeleteCommand.java
+++ b/config/src/main/java/org/apache/karaf/cellar/config/shell/DeleteCommand.java
@@ -76,6 +76,7 @@ public class DeleteCommand extends ConfigCommandSupport {
             // broadcast a cluster event
             ClusterConfigurationEvent event = new ClusterConfigurationEvent(pid);
             event.setSourceGroup(group);
+            event.setSourceNode(clusterManager.getNode());
             event.setType(ConfigurationEvent.CM_DELETED);
             eventProducer.produce(event);
 

http://git-wip-us.apache.org/repos/asf/karaf-cellar/blob/1d05e8c4/config/src/main/java/org/apache/karaf/cellar/config/shell/PropAppendCommand.java
----------------------------------------------------------------------
diff --git a/config/src/main/java/org/apache/karaf/cellar/config/shell/PropAppendCommand.java b/config/src/main/java/org/apache/karaf/cellar/config/shell/PropAppendCommand.java
index 7728840..92d3e7e 100644
--- a/config/src/main/java/org/apache/karaf/cellar/config/shell/PropAppendCommand.java
+++ b/config/src/main/java/org/apache/karaf/cellar/config/shell/PropAppendCommand.java
@@ -94,6 +94,7 @@ public class PropAppendCommand extends ConfigCommandSupport {
             // broadcast the cluster event
             ClusterConfigurationEvent event = new ClusterConfigurationEvent(pid);
             event.setSourceGroup(group);
+            event.setSourceNode(clusterManager.getNode());
             eventProducer.produce(event);
         } else {
             System.out.println("No configuration found in cluster group " + groupName);

http://git-wip-us.apache.org/repos/asf/karaf-cellar/blob/1d05e8c4/config/src/main/java/org/apache/karaf/cellar/config/shell/PropDelCommand.java
----------------------------------------------------------------------
diff --git a/config/src/main/java/org/apache/karaf/cellar/config/shell/PropDelCommand.java b/config/src/main/java/org/apache/karaf/cellar/config/shell/PropDelCommand.java
index daa87f5..d704db2 100644
--- a/config/src/main/java/org/apache/karaf/cellar/config/shell/PropDelCommand.java
+++ b/config/src/main/java/org/apache/karaf/cellar/config/shell/PropDelCommand.java
@@ -81,6 +81,7 @@ public class PropDelCommand extends ConfigCommandSupport {
                 // broadcast the cluster event
                 ClusterConfigurationEvent event = new ClusterConfigurationEvent(pid);
                 event.setSourceGroup(group);
+                event.setSourceNode(clusterManager.getNode());
                 eventProducer.produce(event);
             }
         } else {

http://git-wip-us.apache.org/repos/asf/karaf-cellar/blob/1d05e8c4/config/src/main/java/org/apache/karaf/cellar/config/shell/PropSetCommand.java
----------------------------------------------------------------------
diff --git a/config/src/main/java/org/apache/karaf/cellar/config/shell/PropSetCommand.java b/config/src/main/java/org/apache/karaf/cellar/config/shell/PropSetCommand.java
index ac25f9c..e1f2d16 100644
--- a/config/src/main/java/org/apache/karaf/cellar/config/shell/PropSetCommand.java
+++ b/config/src/main/java/org/apache/karaf/cellar/config/shell/PropSetCommand.java
@@ -86,6 +86,7 @@ public class PropSetCommand extends ConfigCommandSupport {
             // broadcast the cluster event
             ClusterConfigurationEvent event = new ClusterConfigurationEvent(pid);
             event.setSourceGroup(group);
+            event.setSourceNode(clusterManager.getNode());
             eventProducer.produce(event);
         } else {
             System.out.println("No configuration found in cluster group " + groupName);

http://git-wip-us.apache.org/repos/asf/karaf-cellar/blob/1d05e8c4/event/src/main/java/org/apache/karaf/cellar/event/ClusterEvent.java
----------------------------------------------------------------------
diff --git a/event/src/main/java/org/apache/karaf/cellar/event/ClusterEvent.java b/event/src/main/java/org/apache/karaf/cellar/event/ClusterEvent.java
index c5076fc..286c845 100644
--- a/event/src/main/java/org/apache/karaf/cellar/event/ClusterEvent.java
+++ b/event/src/main/java/org/apache/karaf/cellar/event/ClusterEvent.java
@@ -13,6 +13,7 @@
  */
 package org.apache.karaf.cellar.event;
 
+import org.apache.karaf.cellar.core.Node;
 import org.apache.karaf.cellar.core.event.Event;
 
 import java.io.Serializable;
@@ -25,6 +26,7 @@ public class ClusterEvent extends Event {
 
     private String topicName;
     private Map<String, Serializable> properties;
+    private Node local;
 
     public ClusterEvent(String topicName, Map<String, Serializable> properties) {
         super(topicName);
@@ -48,4 +50,12 @@ public class ClusterEvent extends Event {
         this.properties = properties;
     }
 
+    public Node getLocal() {
+        return local;
+    }
+
+    public void setLocal(Node local) {
+        this.local = local;
+    }
+
 }

http://git-wip-us.apache.org/repos/asf/karaf-cellar/blob/1d05e8c4/event/src/main/java/org/apache/karaf/cellar/event/ClusterEventHandler.java
----------------------------------------------------------------------
diff --git a/event/src/main/java/org/apache/karaf/cellar/event/ClusterEventHandler.java b/event/src/main/java/org/apache/karaf/cellar/event/ClusterEventHandler.java
index 0013115..1cef5ae 100644
--- a/event/src/main/java/org/apache/karaf/cellar/event/ClusterEventHandler.java
+++ b/event/src/main/java/org/apache/karaf/cellar/event/ClusterEventHandler.java
@@ -57,6 +57,12 @@ public class ClusterEventHandler extends EventSupport implements EventHandler<Cl
             return;
         }
 
+        // check if the event is not local
+        if (event.getLocal() != null && event.getLocal().getId().equals(clusterManager.getNode().getId())) {
+            LOGGER.trace("CELLAR EVENT: cluster event is local (coming from local listener)");
+            return;
+        }
+
         try {
             if (isAllowed(event.getSourceGroup(), Constants.CATEGORY, event.getTopicName(), EventType.INBOUND)) {
                 Map<String, Serializable> properties = event.getProperties();

http://git-wip-us.apache.org/repos/asf/karaf-cellar/blob/1d05e8c4/event/src/main/java/org/apache/karaf/cellar/event/LocalEventListener.java
----------------------------------------------------------------------
diff --git a/event/src/main/java/org/apache/karaf/cellar/event/LocalEventListener.java b/event/src/main/java/org/apache/karaf/cellar/event/LocalEventListener.java
index 1683b72..3a8a158 100644
--- a/event/src/main/java/org/apache/karaf/cellar/event/LocalEventListener.java
+++ b/event/src/main/java/org/apache/karaf/cellar/event/LocalEventListener.java
@@ -71,6 +71,8 @@ public class LocalEventListener extends EventSupport implements EventHandler {
                             // broadcast the event
                             ClusterEvent clusterEvent = new ClusterEvent(topicName, properties);
                             clusterEvent.setSourceGroup(group);
+                            clusterEvent.setSourceNode(clusterManager.getNode());
+                            clusterEvent.setLocal(clusterManager.getNode());
                             eventProducer.produce(clusterEvent);
                         } else LOGGER.trace("CELLAR EVENT: event {} is marked as BLOCKED OUTBOUND for cluster group {}", topicName, group.getName());
                     }

http://git-wip-us.apache.org/repos/asf/karaf-cellar/blob/1d05e8c4/features/src/main/java/org/apache/karaf/cellar/features/ClusterFeaturesEvent.java
----------------------------------------------------------------------
diff --git a/features/src/main/java/org/apache/karaf/cellar/features/ClusterFeaturesEvent.java b/features/src/main/java/org/apache/karaf/cellar/features/ClusterFeaturesEvent.java
index 0d56efc..13866c5 100644
--- a/features/src/main/java/org/apache/karaf/cellar/features/ClusterFeaturesEvent.java
+++ b/features/src/main/java/org/apache/karaf/cellar/features/ClusterFeaturesEvent.java
@@ -13,6 +13,7 @@
  */
 package org.apache.karaf.cellar.features;
 
+import org.apache.karaf.cellar.core.Node;
 import org.apache.karaf.cellar.core.event.Event;
 import org.apache.karaf.features.FeatureEvent.EventType;
 
@@ -28,6 +29,7 @@ public class ClusterFeaturesEvent extends Event {
     private Boolean noRefresh;
     private Boolean noStart;
     private EventType type;
+    private Node local;
 
     public ClusterFeaturesEvent(String name, String version, EventType type) {
         super(name + separator + version);
@@ -67,4 +69,11 @@ public class ClusterFeaturesEvent extends Event {
         return type;
     }
 
+    public Node getLocal() {
+        return local;
+    }
+
+    public void setLocal(Node local) {
+        this.local = local;
+    }
 }

http://git-wip-us.apache.org/repos/asf/karaf-cellar/blob/1d05e8c4/features/src/main/java/org/apache/karaf/cellar/features/ClusterRepositoryEvent.java
----------------------------------------------------------------------
diff --git a/features/src/main/java/org/apache/karaf/cellar/features/ClusterRepositoryEvent.java b/features/src/main/java/org/apache/karaf/cellar/features/ClusterRepositoryEvent.java
index 784c492..39ed0bd 100644
--- a/features/src/main/java/org/apache/karaf/cellar/features/ClusterRepositoryEvent.java
+++ b/features/src/main/java/org/apache/karaf/cellar/features/ClusterRepositoryEvent.java
@@ -13,6 +13,7 @@
  */
 package org.apache.karaf.cellar.features;
 
+import org.apache.karaf.cellar.core.Node;
 import org.apache.karaf.cellar.core.event.Event;
 import org.apache.karaf.features.RepositoryEvent.EventType;
 
@@ -25,6 +26,7 @@ public class ClusterRepositoryEvent extends Event {
     private Boolean install;
     private Boolean uninstall;
     private Boolean refresh;
+    private Node local;
 
     public ClusterRepositoryEvent(String id, EventType type) {
         super(id);
@@ -59,6 +61,14 @@ public class ClusterRepositoryEvent extends Event {
         this.refresh = refresh;
     }
 
+    public Node getLocal() {
+        return local;
+    }
+
+    public void setLocal(Node local) {
+        this.local = local;
+    }
+
     @Override
 	public String toString() {
 		return "ClusterRepositoryEvent [type=" + type + ", id=" + id

http://git-wip-us.apache.org/repos/asf/karaf-cellar/blob/1d05e8c4/features/src/main/java/org/apache/karaf/cellar/features/FeaturesEventHandler.java
----------------------------------------------------------------------
diff --git a/features/src/main/java/org/apache/karaf/cellar/features/FeaturesEventHandler.java b/features/src/main/java/org/apache/karaf/cellar/features/FeaturesEventHandler.java
index 2fead83..af56749 100644
--- a/features/src/main/java/org/apache/karaf/cellar/features/FeaturesEventHandler.java
+++ b/features/src/main/java/org/apache/karaf/cellar/features/FeaturesEventHandler.java
@@ -73,7 +73,7 @@ public class FeaturesEventHandler extends FeaturesSupport implements EventHandle
         }
 
         // check if it's not a "local" event
-        if (event.getSourceNode() != null && event.getSourceNode().getId().equalsIgnoreCase(clusterManager.getNode().getId())) {
+        if (event.getLocal() != null && event.getLocal().getId().equalsIgnoreCase(clusterManager.getNode().getId())) {
             LOGGER.trace("CELLAR FEATURE: cluster event is local (coming from local synchronizer or listener)");
             return;
         }

http://git-wip-us.apache.org/repos/asf/karaf-cellar/blob/1d05e8c4/features/src/main/java/org/apache/karaf/cellar/features/FeaturesSynchronizer.java
----------------------------------------------------------------------
diff --git a/features/src/main/java/org/apache/karaf/cellar/features/FeaturesSynchronizer.java b/features/src/main/java/org/apache/karaf/cellar/features/FeaturesSynchronizer.java
index d5efe38..be4df54 100644
--- a/features/src/main/java/org/apache/karaf/cellar/features/FeaturesSynchronizer.java
+++ b/features/src/main/java/org/apache/karaf/cellar/features/FeaturesSynchronizer.java
@@ -215,6 +215,7 @@ public class FeaturesSynchronizer extends FeaturesSupport implements Synchronize
                                 ClusterRepositoryEvent event = new ClusterRepositoryEvent(repository.getURI().toString(), RepositoryEvent.EventType.RepositoryAdded);
                                 event.setSourceGroup(group);
                                 event.setSourceNode(clusterManager.getNode());
+                                event.setLocal(clusterManager.getNode());
                                 eventProducer.produce(event);
                             } else {
                                 LOGGER.debug("CELLAR FEATURE: repository {} is already in cluster group {}", repository.getName(), groupName);
@@ -249,6 +250,7 @@ public class FeaturesSynchronizer extends FeaturesSupport implements Synchronize
                                 }
                                 event.setSourceGroup(group);
                                 event.setSourceNode(clusterManager.getNode());
+                                event.setLocal(clusterManager.getNode());
                                 eventProducer.produce(event);
 
                             } else {

http://git-wip-us.apache.org/repos/asf/karaf-cellar/blob/1d05e8c4/features/src/main/java/org/apache/karaf/cellar/features/LocalFeaturesListener.java
----------------------------------------------------------------------
diff --git a/features/src/main/java/org/apache/karaf/cellar/features/LocalFeaturesListener.java b/features/src/main/java/org/apache/karaf/cellar/features/LocalFeaturesListener.java
index a3a104b..ada4c6b 100644
--- a/features/src/main/java/org/apache/karaf/cellar/features/LocalFeaturesListener.java
+++ b/features/src/main/java/org/apache/karaf/cellar/features/LocalFeaturesListener.java
@@ -96,6 +96,7 @@ public class LocalFeaturesListener extends FeaturesSupport implements org.apache
                         ClusterFeaturesEvent featureEvent = new ClusterFeaturesEvent(name, version, type);
                         featureEvent.setSourceGroup(group);
                         featureEvent.setSourceNode(clusterManager.getNode());
+                        featureEvent.setLocal(clusterManager.getNode());
                         eventProducer.produce(featureEvent);
                     } else LOGGER.trace("CELLAR FEATURE: feature {} is marked BLOCKED OUTBOUND for cluster group {}", name, group.getName());
                 }
@@ -133,6 +134,7 @@ public class LocalFeaturesListener extends FeaturesSupport implements org.apache
                         ClusterRepositoryEvent clusterRepositoryEvent = new ClusterRepositoryEvent(event.getRepository().getURI().toString(), event.getType());
                         clusterRepositoryEvent.setSourceGroup(group);
                         clusterRepositoryEvent.setSourceNode(clusterManager.getNode());
+                        clusterRepositoryEvent.setLocal(clusterManager.getNode());
                         clusterRepositoryEvent.setInstall(false);
                         clusterRepositoryEvent.setUninstall(false);
                         clusterRepositoryEvent.setRefresh(false);

http://git-wip-us.apache.org/repos/asf/karaf-cellar/blob/1d05e8c4/features/src/main/java/org/apache/karaf/cellar/features/RepositoryEventHandler.java
----------------------------------------------------------------------
diff --git a/features/src/main/java/org/apache/karaf/cellar/features/RepositoryEventHandler.java b/features/src/main/java/org/apache/karaf/cellar/features/RepositoryEventHandler.java
index 4f95578..7acf1a2 100644
--- a/features/src/main/java/org/apache/karaf/cellar/features/RepositoryEventHandler.java
+++ b/features/src/main/java/org/apache/karaf/cellar/features/RepositoryEventHandler.java
@@ -70,6 +70,12 @@ public class RepositoryEventHandler extends FeaturesSupport implements EventHand
             return;
         }
 
+        // check if the event is not "local"
+        if (event.getLocal() != null && event.getLocal().getId().equals(clusterManager.getNode().getId())) {
+            LOGGER.trace("CELLAR FEATURE: event is local (coming from synchronizer or listener)");
+            return;
+        }
+
         String uri = event.getId();
         RepositoryEvent.EventType type = event.getType();
         try {

http://git-wip-us.apache.org/repos/asf/karaf-cellar/blob/1d05e8c4/features/src/main/java/org/apache/karaf/cellar/features/management/internal/CellarFeaturesMBeanImpl.java
----------------------------------------------------------------------
diff --git a/features/src/main/java/org/apache/karaf/cellar/features/management/internal/CellarFeaturesMBeanImpl.java b/features/src/main/java/org/apache/karaf/cellar/features/management/internal/CellarFeaturesMBeanImpl.java
index 696802c..f694fb8 100644
--- a/features/src/main/java/org/apache/karaf/cellar/features/management/internal/CellarFeaturesMBeanImpl.java
+++ b/features/src/main/java/org/apache/karaf/cellar/features/management/internal/CellarFeaturesMBeanImpl.java
@@ -459,6 +459,7 @@ public class CellarFeaturesMBeanImpl extends StandardMBean implements CellarFeat
                 ClusterRepositoryEvent event = new ClusterRepositoryEvent(uri.toString(), RepositoryEvent.EventType.RepositoryAdded);
                 event.setInstall(install);
                 event.setSourceGroup(group);
+                event.setSourceNode(clusterManager.getNode());
                 eventProducer.produce(event);
             } else {
                 throw new IllegalArgumentException("Features repository URL " + uri + " already registered");
@@ -500,6 +501,7 @@ public class CellarFeaturesMBeanImpl extends StandardMBean implements CellarFeat
             ClusterRepositoryEvent event = new ClusterRepositoryEvent(uri.toString(), RepositoryEvent.EventType.RepositoryAdded);
             event.setRefresh(true);
             event.setSourceGroup(group);
+            event.setSourceNode(clusterManager.getNode());
             eventProducer.produce(event);
         } finally {
             Thread.currentThread().setContextClassLoader(originalClassLoader);
@@ -582,6 +584,7 @@ public class CellarFeaturesMBeanImpl extends StandardMBean implements CellarFeat
                     ClusterRepositoryEvent event = new ClusterRepositoryEvent(url, RepositoryEvent.EventType.RepositoryRemoved);
                     event.setUninstall(uninstall);
                     event.setSourceGroup(group);
+                    event.setSourceNode(clusterManager.getNode());
                     eventProducer.produce(event);
                 } else {
                     throw new IllegalArgumentException("Features repository URL " + url + " not found in cluster group " + groupName);

http://git-wip-us.apache.org/repos/asf/karaf-cellar/blob/1d05e8c4/features/src/main/java/org/apache/karaf/cellar/features/shell/RepoAddCommand.java
----------------------------------------------------------------------
diff --git a/features/src/main/java/org/apache/karaf/cellar/features/shell/RepoAddCommand.java b/features/src/main/java/org/apache/karaf/cellar/features/shell/RepoAddCommand.java
index 549e887..1a97df6 100644
--- a/features/src/main/java/org/apache/karaf/cellar/features/shell/RepoAddCommand.java
+++ b/features/src/main/java/org/apache/karaf/cellar/features/shell/RepoAddCommand.java
@@ -120,6 +120,7 @@ public class RepoAddCommand extends CellarCommandSupport {
                 ClusterRepositoryEvent event = new ClusterRepositoryEvent(uri.toString(), RepositoryEvent.EventType.RepositoryAdded);
                 event.setInstall(install);
                 event.setSourceGroup(group);
+                event.setSourceNode(clusterManager.getNode());
                 eventProducer.produce(event);
             } else {
                 System.err.println("Features repository URL " + uri + " already registered");

http://git-wip-us.apache.org/repos/asf/karaf-cellar/blob/1d05e8c4/features/src/main/java/org/apache/karaf/cellar/features/shell/RepoRefreshCommand.java
----------------------------------------------------------------------
diff --git a/features/src/main/java/org/apache/karaf/cellar/features/shell/RepoRefreshCommand.java b/features/src/main/java/org/apache/karaf/cellar/features/shell/RepoRefreshCommand.java
index 9b183bf..3b4033d 100644
--- a/features/src/main/java/org/apache/karaf/cellar/features/shell/RepoRefreshCommand.java
+++ b/features/src/main/java/org/apache/karaf/cellar/features/shell/RepoRefreshCommand.java
@@ -89,6 +89,7 @@ public class RepoRefreshCommand extends CellarCommandSupport {
             ClusterRepositoryEvent event = new ClusterRepositoryEvent(uri.toString(), RepositoryEvent.EventType.RepositoryAdded);
             event.setRefresh(true);
             event.setSourceGroup(group);
+            event.setSourceNode(clusterManager.getNode());
             eventProducer.produce(event);
         } finally {
             Thread.currentThread().setContextClassLoader(originalClassLoader);

http://git-wip-us.apache.org/repos/asf/karaf-cellar/blob/1d05e8c4/features/src/main/java/org/apache/karaf/cellar/features/shell/RepoRemoveCommand.java
----------------------------------------------------------------------
diff --git a/features/src/main/java/org/apache/karaf/cellar/features/shell/RepoRemoveCommand.java b/features/src/main/java/org/apache/karaf/cellar/features/shell/RepoRemoveCommand.java
index 65bd6df..5ef2322 100644
--- a/features/src/main/java/org/apache/karaf/cellar/features/shell/RepoRemoveCommand.java
+++ b/features/src/main/java/org/apache/karaf/cellar/features/shell/RepoRemoveCommand.java
@@ -137,6 +137,7 @@ public class RepoRemoveCommand extends CellarCommandSupport {
                     ClusterRepositoryEvent event = new ClusterRepositoryEvent(url, RepositoryEvent.EventType.RepositoryRemoved);
                     event.setUninstall(uninstall);
                     event.setSourceGroup(group);
+                    event.setSourceNode(clusterManager.getNode());
                     eventProducer.produce(event);
                 } else {
                     System.err.println("Features repository URL " + url + " not found in cluster group " + groupName);

http://git-wip-us.apache.org/repos/asf/karaf-cellar/blob/1d05e8c4/http/balancer/src/main/java/org/apache/karaf/cellar/http/balancer/BalancerEventHandler.java
----------------------------------------------------------------------
diff --git a/http/balancer/src/main/java/org/apache/karaf/cellar/http/balancer/BalancerEventHandler.java b/http/balancer/src/main/java/org/apache/karaf/cellar/http/balancer/BalancerEventHandler.java
index 32ca80e..8498daf 100644
--- a/http/balancer/src/main/java/org/apache/karaf/cellar/http/balancer/BalancerEventHandler.java
+++ b/http/balancer/src/main/java/org/apache/karaf/cellar/http/balancer/BalancerEventHandler.java
@@ -64,7 +64,7 @@ public class BalancerEventHandler implements EventHandler<ClusterBalancerEvent>
         }
 
         // check if it's not a "local" event
-        if (event.getSourceNode() != null && event.getSourceNode().getId().equalsIgnoreCase(clusterManager.getNode().getId())) {
+        if (event.getLocal() != null && event.getLocal().getId().equalsIgnoreCase(clusterManager.getNode().getId())) {
             LOGGER.trace("CELLAR HTTP BALANCER: cluster event is local (coming from local synchronizer or listener)");
             return;
         }

http://git-wip-us.apache.org/repos/asf/karaf-cellar/blob/1d05e8c4/http/balancer/src/main/java/org/apache/karaf/cellar/http/balancer/ClusterBalancerEvent.java
----------------------------------------------------------------------
diff --git a/http/balancer/src/main/java/org/apache/karaf/cellar/http/balancer/ClusterBalancerEvent.java b/http/balancer/src/main/java/org/apache/karaf/cellar/http/balancer/ClusterBalancerEvent.java
index 4713a09..2e173c3 100644
--- a/http/balancer/src/main/java/org/apache/karaf/cellar/http/balancer/ClusterBalancerEvent.java
+++ b/http/balancer/src/main/java/org/apache/karaf/cellar/http/balancer/ClusterBalancerEvent.java
@@ -13,6 +13,7 @@
  */
 package org.apache.karaf.cellar.http.balancer;
 
+import org.apache.karaf.cellar.core.Node;
 import org.apache.karaf.cellar.core.event.Event;
 
 import java.util.List;
@@ -22,6 +23,7 @@ public class ClusterBalancerEvent extends Event {
     private String alias;
     private int type;
     private List<String> locations;
+    private Node local;
 
     public static int ADDING = 0;
     public static int REMOVING = 1;
@@ -57,4 +59,11 @@ public class ClusterBalancerEvent extends Event {
         this.locations = locations;
     }
 
+    public Node getLocal() {
+        return local;
+    }
+
+    public void setLocal(Node local) {
+        this.local = local;
+    }
 }

http://git-wip-us.apache.org/repos/asf/karaf-cellar/blob/1d05e8c4/http/balancer/src/main/java/org/apache/karaf/cellar/http/balancer/LocalServletListener.java
----------------------------------------------------------------------
diff --git a/http/balancer/src/main/java/org/apache/karaf/cellar/http/balancer/LocalServletListener.java b/http/balancer/src/main/java/org/apache/karaf/cellar/http/balancer/LocalServletListener.java
index 04e7331..d05d403 100644
--- a/http/balancer/src/main/java/org/apache/karaf/cellar/http/balancer/LocalServletListener.java
+++ b/http/balancer/src/main/java/org/apache/karaf/cellar/http/balancer/LocalServletListener.java
@@ -81,6 +81,7 @@ public class LocalServletListener implements ServletListener {
                     ClusterBalancerEvent event = new ClusterBalancerEvent(alias, ClusterBalancerEvent.ADDING, locations);
                     event.setSourceGroup(group);
                     event.setSourceNode(clusterManager.getNode());
+                    event.setLocal(clusterManager.getNode());
                     eventProducer.produce(event);
                 } else {
                     LOGGER.debug("CELLAR HTTP BALANCER: location {} already defined for servlet {} on cluster", location, alias);
@@ -98,6 +99,7 @@ public class LocalServletListener implements ServletListener {
                     ClusterBalancerEvent event = new ClusterBalancerEvent(alias, ClusterBalancerEvent.REMOVING, locations);
                     event.setSourceGroup(group);
                     event.setSourceNode(clusterManager.getNode());
+                    event.setLocal(clusterManager.getNode());
                     eventProducer.produce(event);
                 }
                 if (locations.isEmpty()) {

http://git-wip-us.apache.org/repos/asf/karaf-cellar/blob/1d05e8c4/http/balancer/src/main/java/org/apache/karaf/cellar/http/balancer/ServletSynchronizer.java
----------------------------------------------------------------------
diff --git a/http/balancer/src/main/java/org/apache/karaf/cellar/http/balancer/ServletSynchronizer.java b/http/balancer/src/main/java/org/apache/karaf/cellar/http/balancer/ServletSynchronizer.java
index d3714a0..20fdf81 100644
--- a/http/balancer/src/main/java/org/apache/karaf/cellar/http/balancer/ServletSynchronizer.java
+++ b/http/balancer/src/main/java/org/apache/karaf/cellar/http/balancer/ServletSynchronizer.java
@@ -141,6 +141,7 @@ public class ServletSynchronizer implements Synchronizer {
                                 ClusterBalancerEvent event = new ClusterBalancerEvent(alias, ClusterBalancerEvent.ADDING, locations);
                                 event.setSourceGroup(group);
                                 event.setSourceNode(clusterManager.getNode());
+                                event.setLocal(clusterManager.getNode());
                                 eventProducer.produce(event);
                             } else {
                                 LOGGER.debug("CELLAR HTTP BALANCER: location {} already defined for servlet {} on cluster", location, alias);

http://git-wip-us.apache.org/repos/asf/karaf-cellar/blob/1d05e8c4/obr/src/main/java/org/apache/karaf/cellar/obr/ClusterObrBundleEvent.java
----------------------------------------------------------------------
diff --git a/obr/src/main/java/org/apache/karaf/cellar/obr/ClusterObrBundleEvent.java b/obr/src/main/java/org/apache/karaf/cellar/obr/ClusterObrBundleEvent.java
index 4d6d61d..9aa7197 100644
--- a/obr/src/main/java/org/apache/karaf/cellar/obr/ClusterObrBundleEvent.java
+++ b/obr/src/main/java/org/apache/karaf/cellar/obr/ClusterObrBundleEvent.java
@@ -13,6 +13,7 @@
  */
 package org.apache.karaf.cellar.obr;
 
+import org.apache.karaf.cellar.core.Node;
 import org.apache.karaf.cellar.core.event.Event;
 
 /**
@@ -23,6 +24,7 @@ public class ClusterObrBundleEvent extends Event {
     private String bundleId;
     private Boolean start;
     private Boolean deployOptional;
+    private Node local;
 
     public ClusterObrBundleEvent(String bundleId, boolean start, boolean deployOptional) {
         super(bundleId);
@@ -43,4 +45,12 @@ public class ClusterObrBundleEvent extends Event {
         return this.deployOptional;
     }
 
+    public Node getLocal() {
+        return local;
+    }
+
+    public void setLocal(Node local) {
+        this.local = local;
+    }
+
 }

http://git-wip-us.apache.org/repos/asf/karaf-cellar/blob/1d05e8c4/obr/src/main/java/org/apache/karaf/cellar/obr/ClusterObrUrlEvent.java
----------------------------------------------------------------------
diff --git a/obr/src/main/java/org/apache/karaf/cellar/obr/ClusterObrUrlEvent.java b/obr/src/main/java/org/apache/karaf/cellar/obr/ClusterObrUrlEvent.java
index c1fc67f..b763d9f 100644
--- a/obr/src/main/java/org/apache/karaf/cellar/obr/ClusterObrUrlEvent.java
+++ b/obr/src/main/java/org/apache/karaf/cellar/obr/ClusterObrUrlEvent.java
@@ -13,6 +13,7 @@
  */
 package org.apache.karaf.cellar.obr;
 
+import org.apache.karaf.cellar.core.Node;
 import org.apache.karaf.cellar.core.event.Event;
 
 /**
@@ -22,6 +23,7 @@ public class ClusterObrUrlEvent extends Event {
 
     private String url;
     private int type;
+    private Node local;
 
     public ClusterObrUrlEvent(String url, int type) {
         super(url);
@@ -37,4 +39,12 @@ public class ClusterObrUrlEvent extends Event {
         return this.type;
     }
 
+    public Node getLocal() {
+        return local;
+    }
+
+    public void setLocal(Node local) {
+        this.local = local;
+    }
+
 }

http://git-wip-us.apache.org/repos/asf/karaf-cellar/blob/1d05e8c4/obr/src/main/java/org/apache/karaf/cellar/obr/ObrBundleEventHandler.java
----------------------------------------------------------------------
diff --git a/obr/src/main/java/org/apache/karaf/cellar/obr/ObrBundleEventHandler.java b/obr/src/main/java/org/apache/karaf/cellar/obr/ObrBundleEventHandler.java
index 02cbf1a..5927284 100644
--- a/obr/src/main/java/org/apache/karaf/cellar/obr/ObrBundleEventHandler.java
+++ b/obr/src/main/java/org/apache/karaf/cellar/obr/ObrBundleEventHandler.java
@@ -132,7 +132,7 @@ public class ObrBundleEventHandler extends ObrSupport implements EventHandler<Cl
         }
 
         // check if it's not a "local" event
-        if (event.getSourceNode() != null && event.getSourceNode().getId().equalsIgnoreCase(clusterManager.getNode().getId())) {
+        if (event.getLocal() != null && event.getLocal().getId().equalsIgnoreCase(clusterManager.getNode().getId())) {
             LOGGER.trace("CELLAR OBR: cluster event is local (coming from local synchronizer or listener)");
             return;
         }

http://git-wip-us.apache.org/repos/asf/karaf-cellar/blob/1d05e8c4/obr/src/main/java/org/apache/karaf/cellar/obr/ObrUrlEventHandler.java
----------------------------------------------------------------------
diff --git a/obr/src/main/java/org/apache/karaf/cellar/obr/ObrUrlEventHandler.java b/obr/src/main/java/org/apache/karaf/cellar/obr/ObrUrlEventHandler.java
index 6f435aa..19ca432 100644
--- a/obr/src/main/java/org/apache/karaf/cellar/obr/ObrUrlEventHandler.java
+++ b/obr/src/main/java/org/apache/karaf/cellar/obr/ObrUrlEventHandler.java
@@ -71,7 +71,7 @@ public class ObrUrlEventHandler extends ObrSupport implements EventHandler<Clust
         }
 
         // check if it's not a "local" event
-        if (event.getSourceNode() != null && event.getSourceNode().getId().equalsIgnoreCase(clusterManager.getNode().getId())) {
+        if (event.getLocal() != null && event.getLocal().getId().equalsIgnoreCase(clusterManager.getNode().getId())) {
             LOGGER.trace("CELLAR OBR: cluster event is local (coming from local synchronizer or listener)");
             return;
         }

http://git-wip-us.apache.org/repos/asf/karaf-cellar/blob/1d05e8c4/obr/src/main/java/org/apache/karaf/cellar/obr/ObrUrlSynchronizer.java
----------------------------------------------------------------------
diff --git a/obr/src/main/java/org/apache/karaf/cellar/obr/ObrUrlSynchronizer.java b/obr/src/main/java/org/apache/karaf/cellar/obr/ObrUrlSynchronizer.java
index d5f7d7d..2937618 100644
--- a/obr/src/main/java/org/apache/karaf/cellar/obr/ObrUrlSynchronizer.java
+++ b/obr/src/main/java/org/apache/karaf/cellar/obr/ObrUrlSynchronizer.java
@@ -149,6 +149,7 @@ public class ObrUrlSynchronizer extends ObrSupport implements Synchronizer {
                         ClusterObrUrlEvent urlEvent = new ClusterObrUrlEvent(repository.getURI().toString(), Constants.URL_ADD_EVENT_TYPE);
                         urlEvent.setSourceGroup(group);
                         urlEvent.setSourceNode(clusterManager.getNode());
+                        urlEvent.setLocal(clusterManager.getNode());
                         eventProducer.produce(urlEvent);
                         // update OBR bundles in the cluster group
                         Set<ObrBundleInfo> clusterBundles = clusterManager.getSet(Constants.BUNDLES_DISTRIBUTED_SET_NAME + Configurations.SEPARATOR + groupName);

http://git-wip-us.apache.org/repos/asf/karaf-cellar/blob/1d05e8c4/obr/src/main/java/org/apache/karaf/cellar/obr/management/internal/CellarOBRMBeanImpl.java
----------------------------------------------------------------------
diff --git a/obr/src/main/java/org/apache/karaf/cellar/obr/management/internal/CellarOBRMBeanImpl.java b/obr/src/main/java/org/apache/karaf/cellar/obr/management/internal/CellarOBRMBeanImpl.java
index f374ae0..d2f3be3 100644
--- a/obr/src/main/java/org/apache/karaf/cellar/obr/management/internal/CellarOBRMBeanImpl.java
+++ b/obr/src/main/java/org/apache/karaf/cellar/obr/management/internal/CellarOBRMBeanImpl.java
@@ -139,6 +139,7 @@ public class CellarOBRMBeanImpl extends StandardMBean implements CellarOBRMBean
         ClusterObrUrlEvent event = new ClusterObrUrlEvent(url, Constants.URL_ADD_EVENT_TYPE);
         event.setForce(true);
         event.setSourceGroup(group);
+        event.setSourceNode(clusterManager.getNode());
         eventProducer.produce(event);
     }
 
@@ -182,6 +183,7 @@ public class CellarOBRMBeanImpl extends StandardMBean implements CellarOBRMBean
         // broadcast a cluster event
         ClusterObrUrlEvent event = new ClusterObrUrlEvent(url, Constants.URL_REMOVE_EVENT_TYPE);
         event.setSourceGroup(group);
+        event.setSourceNode(clusterManager.getNode());
         eventProducer.produce(event);
     }
 
@@ -210,6 +212,7 @@ public class CellarOBRMBeanImpl extends StandardMBean implements CellarOBRMBean
         // broadcast a cluster event
         ClusterObrBundleEvent event = new ClusterObrBundleEvent(bundleId, start, deployOptional);
         event.setSourceGroup(group);
+        event.setSourceNode(clusterManager.getNode());
         eventProducer.produce(event);
     }
 

http://git-wip-us.apache.org/repos/asf/karaf-cellar/blob/1d05e8c4/obr/src/main/java/org/apache/karaf/cellar/obr/shell/ObrAddUrlCommand.java
----------------------------------------------------------------------
diff --git a/obr/src/main/java/org/apache/karaf/cellar/obr/shell/ObrAddUrlCommand.java b/obr/src/main/java/org/apache/karaf/cellar/obr/shell/ObrAddUrlCommand.java
index 46e7b61..0c15b59 100644
--- a/obr/src/main/java/org/apache/karaf/cellar/obr/shell/ObrAddUrlCommand.java
+++ b/obr/src/main/java/org/apache/karaf/cellar/obr/shell/ObrAddUrlCommand.java
@@ -85,6 +85,7 @@ public class ObrAddUrlCommand extends ObrCommandSupport {
         // broadcast a cluster event
         ClusterObrUrlEvent event = new ClusterObrUrlEvent(url, Constants.URL_ADD_EVENT_TYPE);
         event.setSourceGroup(group);
+        event.setSourceNode(clusterManager.getNode());
         eventProducer.produce(event);
 
         return null;

http://git-wip-us.apache.org/repos/asf/karaf-cellar/blob/1d05e8c4/obr/src/main/java/org/apache/karaf/cellar/obr/shell/ObrDeployCommand.java
----------------------------------------------------------------------
diff --git a/obr/src/main/java/org/apache/karaf/cellar/obr/shell/ObrDeployCommand.java b/obr/src/main/java/org/apache/karaf/cellar/obr/shell/ObrDeployCommand.java
index 0f5de1a..5bdfbf8 100644
--- a/obr/src/main/java/org/apache/karaf/cellar/obr/shell/ObrDeployCommand.java
+++ b/obr/src/main/java/org/apache/karaf/cellar/obr/shell/ObrDeployCommand.java
@@ -71,6 +71,7 @@ public class ObrDeployCommand extends ObrCommandSupport {
         // broadcast a cluster event
         ClusterObrBundleEvent event = new ClusterObrBundleEvent(bundleId, start, deployOptional);
         event.setSourceGroup(group);
+        event.setSourceNode(clusterManager.getNode());
         eventProducer.produce(event);
 
         return null;

http://git-wip-us.apache.org/repos/asf/karaf-cellar/blob/1d05e8c4/obr/src/main/java/org/apache/karaf/cellar/obr/shell/ObrRemoveUrlCommand.java
----------------------------------------------------------------------
diff --git a/obr/src/main/java/org/apache/karaf/cellar/obr/shell/ObrRemoveUrlCommand.java b/obr/src/main/java/org/apache/karaf/cellar/obr/shell/ObrRemoveUrlCommand.java
index 1c4e919..5dbf078 100644
--- a/obr/src/main/java/org/apache/karaf/cellar/obr/shell/ObrRemoveUrlCommand.java
+++ b/obr/src/main/java/org/apache/karaf/cellar/obr/shell/ObrRemoveUrlCommand.java
@@ -84,6 +84,7 @@ public class ObrRemoveUrlCommand extends ObrCommandSupport {
         // create an event and produce it
         ClusterObrUrlEvent event = new ClusterObrUrlEvent(url, Constants.URL_REMOVE_EVENT_TYPE);
         event.setSourceGroup(group);
+        event.setSourceNode(clusterManager.getNode());
         eventProducer.produce(event);
 
         return null;