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)