You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@brooklyn.apache.org by he...@apache.org on 2014/08/06 23:16:57 UTC

[05/11] git commit: use uniqueTag when checking for duplicate addition

use uniqueTag when checking for duplicate addition


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

Branch: refs/heads/master
Commit: fdb4c0a282818fe001a3966dbf7202d9bd79f4a0
Parents: 427d4e1
Author: Alex Heneveld <al...@cloudsoftcorp.com>
Authored: Mon Aug 4 23:38:44 2014 -0400
Committer: Alex Heneveld <al...@cloudsoftcorp.com>
Committed: Tue Aug 5 10:40:52 2014 -0400

----------------------------------------------------------------------
 api/src/main/java/brooklyn/entity/Entity.java   |  4 +-
 .../brooklyn/entity/basic/AbstractEntity.java   | 55 ++++++++++++++------
 .../enricher/basic/BasicEnricherTest.java       |  9 +++-
 .../group/MembershipTrackingPolicyTest.java     |  8 ++-
 4 files changed, 55 insertions(+), 21 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/fdb4c0a2/api/src/main/java/brooklyn/entity/Entity.java
----------------------------------------------------------------------
diff --git a/api/src/main/java/brooklyn/entity/Entity.java b/api/src/main/java/brooklyn/entity/Entity.java
index c792067..8d0d663 100644
--- a/api/src/main/java/brooklyn/entity/Entity.java
+++ b/api/src/main/java/brooklyn/entity/Entity.java
@@ -216,7 +216,7 @@ public interface Entity extends BrooklynObject {
     /**
      * Adds the given policy to this entity. Also calls policy.setEntity if available.
      */
-    void addPolicy(Policy policy);
+    Policy addPolicy(Policy policy);
     
     /**
      * Adds the given policy to this entity. Also calls policy.setEntity if available.
@@ -232,7 +232,7 @@ public interface Entity extends BrooklynObject {
     /**
      * Adds the given enricher to this entity. Also calls enricher.setEntity if available.
      */
-    void addEnricher(Enricher enricher);
+    Enricher addEnricher(Enricher enricher);
     
     /**
      * Adds the given enricher to this entity. Also calls enricher.setEntity if available.

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/fdb4c0a2/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 19bbea1..68846aa 100644
--- a/core/src/main/java/brooklyn/entity/basic/AbstractEntity.java
+++ b/core/src/main/java/brooklyn/entity/basic/AbstractEntity.java
@@ -70,6 +70,7 @@ 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;
@@ -1075,7 +1076,7 @@ public abstract class AbstractEntity extends AbstractBrooklynObject implements E
     }
 
     @Override
-    public void addPolicy(Policy policy) {
+    public Policy addPolicy(Policy policy) {
         List<Policy> old = MutableList.<Policy>copyOf(policies);
 
         policies.add((AbstractPolicy)policy);
@@ -1084,21 +1085,26 @@ public abstract class AbstractEntity extends AbstractBrooklynObject implements E
         getManagementSupport().getEntityChangeListener().onPolicyAdded(policy);
         emit(AbstractEntity.POLICY_ADDED, new PolicyDescriptor(policy));
         
-        if (hasApparentlyEqualsAndWarn(old, policy)) removePolicy(policy);
+        Policy actual = findApparentlyEqualsAndWarn(old, policy);
+        if (actual!=null) {
+            removePolicy(policy);
+            return actual;
+        }
+        return policy;
     }
 
+    @SuppressWarnings("unchecked")
     @Override
     public <T extends Policy> T addPolicy(PolicySpec<T> spec) {
         T policy = getManagementContext().getEntityManager().createPolicy(spec);
-        addPolicy(policy);
-        return policy;
+        return (T) addPolicy(policy);
     }
 
+    @SuppressWarnings("unchecked")
     @Override
     public <T extends Enricher> T addEnricher(EnricherSpec<T> spec) {
         T enricher = getManagementContext().getEntityManager().createEnricher(spec);
-        addEnricher(enricher);
-        return enricher;
+        return (T) addEnricher(enricher);
     }
 
     @Override
@@ -1129,7 +1135,7 @@ public abstract class AbstractEntity extends AbstractBrooklynObject implements E
     }
 
     @Override
-    public void addEnricher(Enricher enricher) {
+    public Enricher addEnricher(Enricher enricher) {
         List<Enricher> old = MutableList.<Enricher>copyOf(enrichers);
         
         enrichers.add((AbstractEnricher) enricher);
@@ -1138,26 +1144,39 @@ public abstract class AbstractEntity extends AbstractBrooklynObject implements E
         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);
+        Enricher actual = findApparentlyEqualsAndWarn(old, enricher);
+        if (actual!=null) {
+            removeEnricher(enricher);
+            return actual;
+        }
+        return enricher;
     }
     
-    private <T> boolean hasApparentlyEqualsAndWarn(Collection<? extends T> items, T newItem) {
+    private <T extends EntityAdjunct> T findApparentlyEqualsAndWarn(Collection<? extends T> items, T newItem) {
         T oldItem = findApparentlyEquals(items, newItem);
+        
         if (oldItem!=null) {
+            String newItemTag = newItem.getUniqueTag();
+            if (newItemTag!=null) {
+                // old item has same tag; don't add
+                LOG.warn("Adding to "+this+", "+newItem+" has identical uniqueTag as existing "+oldItem+"; will remove after adding. "
+                    + "Underlying addition should be modified so it is not added twice.");
+                return oldItem;
+            }
             if (isRebinding()) {
                 LOG.warn("Adding to "+this+", "+newItem+" appears identical to existing "+oldItem+"; will remove after adding. "
-                    + "Underlying addition should be checked as this behavior will likely be removed without further notice.");
-                return true;
+                    + "Underlying addition should be modified so it is not added twice during rebind.");
+                return oldItem;
             } else {
                 LOG.warn("Adding to "+this+", "+newItem+" appears identical to existing "+oldItem+"; may get removed on rebind. "
-                    + "If unintended, addition should be removed. If intended, enricher should be modified so difference is apparent.");
-                return false;
+                    + "Underlying addition should be modified so it is not added twice.");
+                return null;
             }
         } else {
-            return false;
+            return null;
         }
     }
-    private <T> T findApparentlyEquals(Collection<? extends T> itemsCopy, T newItem) {
+    private <T extends EntityAdjunct> 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)
@@ -1165,8 +1184,12 @@ public abstract class AbstractEntity extends AbstractBrooklynObject implements E
         while (beforeEntityAdjunct.getSuperclass()!=null && !beforeEntityAdjunct.getSuperclass().equals(AbstractEntityAdjunct.class))
             beforeEntityAdjunct = beforeEntityAdjunct.getSuperclass();
         
+        String newItemTag = newItem.getUniqueTag();
         for (T oldItem: itemsCopy) {
-            if (oldItem.getClass().equals(newItem.getClass())) {
+            if (oldItem.getUniqueTag()!=null) {
+                if ((oldItem.getUniqueTag().equals(newItemTag)))
+                    return oldItem;
+            } else if (newItemTag==null && oldItem.getClass().equals(newItem.getClass())) {
                 if (EqualsBuilder.reflectionEquals(oldItem, newItem, false,
                         // internal admin in 'beforeEntityAdjunct' should be ignored
                         beforeEntityAdjunct,

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/fdb4c0a2/core/src/test/java/brooklyn/enricher/basic/BasicEnricherTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/brooklyn/enricher/basic/BasicEnricherTest.java b/core/src/test/java/brooklyn/enricher/basic/BasicEnricherTest.java
index 9d0fcf2..b62b9c9 100644
--- a/core/src/test/java/brooklyn/enricher/basic/BasicEnricherTest.java
+++ b/core/src/test/java/brooklyn/enricher/basic/BasicEnricherTest.java
@@ -25,7 +25,6 @@ import java.util.Map;
 import org.testng.annotations.Test;
 
 import brooklyn.config.ConfigKey;
-import brooklyn.enricher.basic.AbstractEnricher;
 import brooklyn.entity.BrooklynAppUnitTestSupport;
 import brooklyn.event.basic.BasicConfigKey;
 import brooklyn.policy.EnricherSpec;
@@ -90,4 +89,12 @@ public class BasicEnricherTest extends BrooklynAppUnitTestSupport {
         assertEquals(enricher.getUniqueTag(), "x");
     }
 
+    @Test
+    public void testSameUniqueTagEnricherNotAddedTwice() throws Exception {
+        MyEnricher enricher1 = app.addEnricher(EnricherSpec.create(MyEnricher.class).tag(99).uniqueTag("x"));
+        MyEnricher enricher2 = app.addEnricher(EnricherSpec.create(MyEnricher.class).tag(94).uniqueTag("x"));
+        assertEquals(enricher2, enricher1);
+        assertEquals(app.getEnrichers().size(), 1);
+    }
+
 }

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/fdb4c0a2/core/src/test/java/brooklyn/entity/group/MembershipTrackingPolicyTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/brooklyn/entity/group/MembershipTrackingPolicyTest.java b/core/src/test/java/brooklyn/entity/group/MembershipTrackingPolicyTest.java
index 8fe0e19..c9d2552 100644
--- a/core/src/test/java/brooklyn/entity/group/MembershipTrackingPolicyTest.java
+++ b/core/src/test/java/brooklyn/entity/group/MembershipTrackingPolicyTest.java
@@ -138,6 +138,7 @@ public class MembershipTrackingPolicyTest extends BrooklynAppUnitTestSupport {
     public void testNotifiedOfExtraTrackedSensors() throws Exception {
         TestEntity e1 = createAndManageChildOf(group);
 
+        app.removeAllPolicies();
         RecordingMembershipTrackingPolicy policy2 = app.addPolicy(PolicySpec.create(RecordingMembershipTrackingPolicy.class)
                 .configure("group", group)
                 .configure("sensorsToTrack", ImmutableSet.of(TestEntity.NAME)));
@@ -164,6 +165,7 @@ public class MembershipTrackingPolicyTest extends BrooklynAppUnitTestSupport {
     public void testNotNotifiedOfExtraTrackedSensorsIfNonDuplicate() throws Exception {
         TestEntity e1 = createAndManageChildOf(group);
         
+        app.removeAllPolicies();
         RecordingMembershipTrackingPolicy nonDuplicateTrackingPolicy = app.addPolicy(PolicySpec.create(RecordingMembershipTrackingPolicy.class)
                 .configure(AbstractMembershipTrackingPolicy.SENSORS_TO_TRACK, ImmutableSet.<Sensor<?>>of(TestEntity.NAME))
                 .configure(AbstractMembershipTrackingPolicy.NOTIFY_ON_DUPLICATES, false)
@@ -183,7 +185,8 @@ public class MembershipTrackingPolicyTest extends BrooklynAppUnitTestSupport {
     @Test
     public void testDefaultNotNotifiedOfExtraTrackedSensorsIfDuplicate() throws Exception {
         TestEntity e1 = createAndManageChildOf(group);
-        
+
+        app.removeAllPolicies();
         RecordingMembershipTrackingPolicy nonDuplicateTrackingPolicy = app.addPolicy(PolicySpec.create(RecordingMembershipTrackingPolicy.class)
                 .configure(AbstractMembershipTrackingPolicy.SENSORS_TO_TRACK, ImmutableSet.<Sensor<?>>of(TestEntity.NAME))
                 .configure(AbstractMembershipTrackingPolicy.GROUP, group));
@@ -201,7 +204,8 @@ public class MembershipTrackingPolicyTest extends BrooklynAppUnitTestSupport {
     @Test
     public void testNotifiedOfExtraTrackedSensorsIfDuplicate() throws Exception {
         TestEntity e1 = createAndManageChildOf(group);
-        
+
+        app.removeAllPolicies();
         RecordingMembershipTrackingPolicy nonDuplicateTrackingPolicy = app.addPolicy(PolicySpec.create(RecordingMembershipTrackingPolicy.class)
                 .configure(AbstractMembershipTrackingPolicy.SENSORS_TO_TRACK, ImmutableSet.<Sensor<?>>of(TestEntity.NAME))
                 .configure(AbstractMembershipTrackingPolicy.NOTIFY_ON_DUPLICATES, true)