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();
}
}