You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@brooklyn.apache.org by al...@apache.org on 2014/08/01 18:47:39 UTC

[5/9] git commit: add a fix for enrichers/policies being added multiple times on rebind, by declining to add an enricher which looks too much like one already present

add a fix for enrichers/policies being added multiple times on rebind, by declining to add an enricher which looks too much like one already present


Project: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/commit/cc64c479
Tree: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/tree/cc64c479
Diff: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/diff/cc64c479

Branch: refs/heads/master
Commit: cc64c47935fcbeab694fae6a659f5766e7da8ee2
Parents: 6416d44
Author: Alex Heneveld <al...@cloudsoftcorp.com>
Authored: Thu Jul 31 02:54:48 2014 -0400
Committer: Alex Heneveld <al...@cloudsoftcorp.com>
Committed: Thu Jul 31 03:40:09 2014 -0400

----------------------------------------------------------------------
 .../brooklyn/entity/basic/AbstractEntity.java   | 46 ++++++++++++++++++++
 .../policy/basic/AbstractEntityAdjunct.java     |  1 +
 2 files changed, 47 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/cc64c479/core/src/main/java/brooklyn/entity/basic/AbstractEntity.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/entity/basic/AbstractEntity.java b/core/src/main/java/brooklyn/entity/basic/AbstractEntity.java
index d2ae2e1..105586a 100644
--- a/core/src/main/java/brooklyn/entity/basic/AbstractEntity.java
+++ b/core/src/main/java/brooklyn/entity/basic/AbstractEntity.java
@@ -26,12 +26,14 @@ import java.util.List;
 import java.util.Map;
 import java.util.Set;
 
+import org.apache.commons.lang3.builder.EqualsBuilder;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import brooklyn.config.ConfigKey;
 import brooklyn.config.ConfigKey.HasConfigKey;
 import brooklyn.enricher.basic.AbstractEnricher;
+import brooklyn.enricher.basic.Aggregator;
 import brooklyn.entity.Application;
 import brooklyn.entity.Effector;
 import brooklyn.entity.Entity;
@@ -68,8 +70,10 @@ import brooklyn.management.internal.SubscriptionTracker;
 import brooklyn.mementos.EntityMemento;
 import brooklyn.policy.Enricher;
 import brooklyn.policy.EnricherSpec;
+import brooklyn.policy.EntityAdjunct;
 import brooklyn.policy.Policy;
 import brooklyn.policy.PolicySpec;
+import brooklyn.policy.basic.AbstractEntityAdjunct;
 import brooklyn.policy.basic.AbstractPolicy;
 import brooklyn.util.BrooklynLanguageExtensions;
 import brooklyn.util.collections.MutableList;
@@ -1085,11 +1089,15 @@ public abstract class AbstractEntity implements EntityLocal, EntityInternal {
 
     @Override
     public void addPolicy(Policy policy) {
+        List<Policy> old = MutableList.<Policy>copyOf(policies);
+
         policies.add((AbstractPolicy)policy);
         ((AbstractPolicy)policy).setEntity(this);
         
         getManagementSupport().getEntityChangeListener().onPolicyAdded(policy);
         emit(AbstractEntity.POLICY_ADDED, new PolicyDescriptor(policy));
+        
+        if (hasApparentlyEqualsAndWarn(old, policy)) removePolicy(policy);
     }
 
     @Override
@@ -1135,11 +1143,49 @@ public abstract class AbstractEntity implements EntityLocal, EntityInternal {
 
     @Override
     public void addEnricher(Enricher enricher) {
+        List<Enricher> old = MutableList.<Enricher>copyOf(enrichers);
+        
         enrichers.add((AbstractEnricher) enricher);
         ((AbstractEnricher)enricher).setEntity(this);
         
         getManagementSupport().getEntityChangeListener().onEnricherAdded(enricher);
         // TODO Could add equivalent of AbstractEntity.POLICY_ADDED for enrichers; no use-case for that yet
+        
+        if (hasApparentlyEqualsAndWarn(old, enricher)) removeEnricher(enricher);
+    }
+    
+    private <T> boolean hasApparentlyEqualsAndWarn(Collection<? extends T> items, T newItem) {
+        T oldItem = findApparentlyEquals(items, newItem);
+        if (oldItem!=null) {
+            LOG.warn("Adding to "+this+", "+newItem+" appears identical to existing "+oldItem+"; will remove after adding");
+            return true;
+        } else {
+            return false;
+        }
+    }
+    private <T> T findApparentlyEquals(Collection<? extends T> itemsCopy, T newItem) {
+        // FIXME workaround for issue where enrichers can get added multiple times on rebind,
+        // if it's added in onBecomingManager or connectSensors; the right fix will be more disciplined about how/where these are added
+        // (easier done when sensor feeds are persisted)
+        Class<?> beforeEntityAdjunct = newItem.getClass();
+        while (beforeEntityAdjunct.getSuperclass()!=null && !beforeEntityAdjunct.getSuperclass().equals(AbstractEntityAdjunct.class))
+            beforeEntityAdjunct = beforeEntityAdjunct.getSuperclass();
+        
+        for (T oldItem: itemsCopy) {
+            if (oldItem.getClass().equals(newItem.getClass())) {
+                if (EqualsBuilder.reflectionEquals(oldItem, newItem, false,
+                        // internal admin in 'beforeEntityAdjunct' should be ignored
+                        beforeEntityAdjunct,
+                        // known fields which shouldn't block equality checks:
+                        // from aggregator
+                        "transformation",
+                        // from averager
+                        "values", "timestamps", "lastAverage")) {
+                    return oldItem;
+                }
+            }
+        }
+        return null;
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/cc64c479/core/src/main/java/brooklyn/policy/basic/AbstractEntityAdjunct.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/policy/basic/AbstractEntityAdjunct.java b/core/src/main/java/brooklyn/policy/basic/AbstractEntityAdjunct.java
index a5d324f..203ffa1 100644
--- a/core/src/main/java/brooklyn/policy/basic/AbstractEntityAdjunct.java
+++ b/core/src/main/java/brooklyn/policy/basic/AbstractEntityAdjunct.java
@@ -396,6 +396,7 @@ public abstract class AbstractEntityAdjunct implements EntityAdjunct, Configurab
         return Objects.toStringHelper(getClass())
                 .add("name", name)
                 .add("running", isRunning())
+                .add("id", id)
                 .toString();
     }
 }