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 2016/02/01 18:49:24 UTC
[38/50] brooklyn-server git commit: SensorPropagatingEnricher:
support propagating as different sensor
SensorPropagatingEnricher: support propagating as different sensor
Project: http://git-wip-us.apache.org/repos/asf/brooklyn-server/repo
Commit: http://git-wip-us.apache.org/repos/asf/brooklyn-server/commit/39c08cb5
Tree: http://git-wip-us.apache.org/repos/asf/brooklyn-server/tree/39c08cb5
Diff: http://git-wip-us.apache.org/repos/asf/brooklyn-server/diff/39c08cb5
Branch: refs/heads/0.5.0
Commit: 39c08cb5c1f233a347fcbe629bc85b3648cb01e9
Parents: 7358417
Author: Aled Sage <al...@gmail.com>
Authored: Wed Apr 24 10:54:04 2013 +0100
Committer: Aled Sage <al...@gmail.com>
Committed: Thu Apr 25 11:15:19 2013 +0100
----------------------------------------------------------------------
.../basic/SensorPropagatingEnricher.java | 56 ++++++++---
.../SensorPropagatingEnricherTest.groovy | 41 --------
.../enricher/SensorPropagatingEnricherTest.java | 98 ++++++++++++++++++++
3 files changed, 141 insertions(+), 54 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/39c08cb5/core/src/main/java/brooklyn/enricher/basic/SensorPropagatingEnricher.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/enricher/basic/SensorPropagatingEnricher.java b/core/src/main/java/brooklyn/enricher/basic/SensorPropagatingEnricher.java
index 899dc61..068cc9a 100644
--- a/core/src/main/java/brooklyn/enricher/basic/SensorPropagatingEnricher.java
+++ b/core/src/main/java/brooklyn/enricher/basic/SensorPropagatingEnricher.java
@@ -1,7 +1,7 @@
package brooklyn.enricher.basic;
-import java.util.Arrays;
import java.util.Collection;
+import java.util.Map;
import java.util.Set;
import org.slf4j.Logger;
@@ -14,6 +14,8 @@ import brooklyn.event.Sensor;
import brooklyn.event.SensorEvent;
import brooklyn.event.SensorEventListener;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableMap;
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Sets;
@@ -24,9 +26,13 @@ public class SensorPropagatingEnricher extends AbstractEnricher implements Senso
/** the entity to listen to */
private final Entity source;
- /** the sensors to listen to */
- private final Set<Sensor<?>> sensors = Sets.newLinkedHashSet();
+ /** the sensors to listen to */
+ private final Set<Sensor<?>> sensors;
+
+ /** the sensors to listen to */
+ private final Map<Sensor<?>, Sensor<?>> sensorAlternatives;
+
public static SensorPropagatingEnricher newInstanceListeningToAllSensors(Entity source) {
return newInstanceListeningToAllSensorsBut(source);
}
@@ -44,12 +50,24 @@ public class SensorPropagatingEnricher extends AbstractEnricher implements Senso
return new SensorPropagatingEnricher(source, includes);
}
+ public static SensorPropagatingEnricher newInstanceListeningTo(Entity source, Map<? extends Sensor<?>, ? extends Sensor<?>> sensors) {
+ return new SensorPropagatingEnricher(source, sensors);
+ }
+
public SensorPropagatingEnricher(Entity source, Sensor<?>... sensors) {
- this(source, Arrays.asList(sensors));
+ this(source, ImmutableList.copyOf(sensors));
}
+
public SensorPropagatingEnricher(Entity source, Collection<Sensor<?>> sensors) {
this.source = source;
- this.sensors.addAll(sensors);
+ this.sensors = ImmutableSet.copyOf(sensors);
+ this.sensorAlternatives = ImmutableMap.of();
+ }
+
+ public SensorPropagatingEnricher(Entity source, Map<? extends Sensor<?>, ? extends Sensor<?>> sensors) {
+ this.source = source;
+ this.sensors = ImmutableSet.copyOf(sensors.keySet());
+ this.sensorAlternatives = ImmutableMap.copyOf(sensors);
}
public void setEntity(EntityLocal entity) {
@@ -59,16 +77,23 @@ public class SensorPropagatingEnricher extends AbstractEnricher implements Senso
}
}
- public void onEvent(SensorEvent event) {
- if (log.isTraceEnabled()) log.trace("policy {} got {}, propagating via {}", new Object[] {this, event, entity});
- //just propagate upwards
+ @Override
+ @SuppressWarnings({ "unchecked", "rawtypes" })
+ public void onEvent(SensorEvent<Object> event) {
+ // propagate upwards
+ Sensor<?> sourceSensor = event.getSensor();
+ Sensor<?> destinationSensor = getDestinationSensor(sourceSensor);
+
+ if (log.isTraceEnabled()) log.trace("policy {} got {}, propagating via {}{}",
+ new Object[] {this, event, entity, (sourceSensor == destinationSensor ? "" : " (as "+destinationSensor+")")});
+
if (event.getSensor() instanceof AttributeSensor) {
- entity.setAttribute((AttributeSensor)event.getSensor(), event.getValue());
+ entity.setAttribute((AttributeSensor)destinationSensor, event.getValue());
} else {
- entity.emit(event.getSensor(), event.getValue());
+ entity.emit((Sensor)destinationSensor, event.getValue());
}
}
-
+
/** useful post-addition to emit current values */
public void emitAllAttributes() {
emitAllAttributes(false);
@@ -77,8 +102,9 @@ public class SensorPropagatingEnricher extends AbstractEnricher implements Senso
public void emitAllAttributes(boolean includeNullValues) {
for (Sensor s: sensors) {
if (s instanceof AttributeSensor) {
+ AttributeSensor destinationSensor = (AttributeSensor<?>) getDestinationSensor(s);
Object v = source.getAttribute((AttributeSensor)s);
- if (v!=null || includeNullValues) entity.setAttribute((AttributeSensor)s, v);
+ if (v != null || includeNullValues) entity.setAttribute(destinationSensor, v);
}
}
}
@@ -88,5 +114,9 @@ public class SensorPropagatingEnricher extends AbstractEnricher implements Senso
host.addEnricher(this);
emitAllAttributes();
return this;
- }
+ }
+
+ private Sensor<?> getDestinationSensor(Sensor<?> sourceSensor) {
+ return sensorAlternatives.containsKey(sourceSensor) ? sensorAlternatives.get(sourceSensor): sourceSensor;
+ }
}
http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/39c08cb5/core/src/test/java/brooklyn/enricher/SensorPropagatingEnricherTest.groovy
----------------------------------------------------------------------
diff --git a/core/src/test/java/brooklyn/enricher/SensorPropagatingEnricherTest.groovy b/core/src/test/java/brooklyn/enricher/SensorPropagatingEnricherTest.groovy
deleted file mode 100644
index c4615d9..0000000
--- a/core/src/test/java/brooklyn/enricher/SensorPropagatingEnricherTest.groovy
+++ /dev/null
@@ -1,41 +0,0 @@
-package brooklyn.enricher
-
-import org.testng.Assert
-import org.testng.annotations.Test
-
-import brooklyn.enricher.basic.SensorPropagatingEnricher
-import brooklyn.entity.basic.ApplicationBuilder
-import brooklyn.entity.proxying.EntitySpecs
-import brooklyn.event.SensorEvent
-import brooklyn.event.SensorEventListener
-import brooklyn.test.TestUtils
-import brooklyn.test.entity.TestApplication
-import brooklyn.test.entity.TestEntity
-
-class SensorPropagatingEnricherTest {
-
- @Test
- public void testPropagation() {
- TestApplication app = ApplicationBuilder.newManagedApp(TestApplication.class);
- TestEntity entity = app.createAndManageChild(EntitySpecs.spec(TestEntity.class));
-
- app.addEnricher(SensorPropagatingEnricher.newInstanceListeningToAllSensorsBut(entity, TestEntity.SEQUENCE))
-
- //name propagated
- entity.setAttribute(TestEntity.NAME, "foo")
- TestUtils.executeUntilSucceeds { Assert.assertEquals(app.getAttribute(TestEntity.NAME), "foo") }
-
- //sequence not picked up
- entity.setAttribute(TestEntity.SEQUENCE, 2)
- Thread.sleep(100)
- Assert.assertEquals(app.getAttribute(TestEntity.SEQUENCE), null)
-
- //notif propagated
- int notif = 0;
- app.subscribe(app, TestEntity.MY_NOTIF, { SensorEvent evt -> notif = evt.value } as SensorEventListener)
- entity.emit(TestEntity.MY_NOTIF, 7)
- TestUtils.executeUntilSucceeds { Assert.assertEquals(notif, 7) }
- }
-
-
-}
http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/39c08cb5/core/src/test/java/brooklyn/enricher/SensorPropagatingEnricherTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/brooklyn/enricher/SensorPropagatingEnricherTest.java b/core/src/test/java/brooklyn/enricher/SensorPropagatingEnricherTest.java
new file mode 100644
index 0000000..27cb601
--- /dev/null
+++ b/core/src/test/java/brooklyn/enricher/SensorPropagatingEnricherTest.java
@@ -0,0 +1,98 @@
+package brooklyn.enricher;
+
+import java.util.concurrent.atomic.AtomicReference;
+
+import org.testng.annotations.AfterMethod;
+import org.testng.annotations.BeforeMethod;
+import org.testng.annotations.Test;
+
+import brooklyn.enricher.basic.SensorPropagatingEnricher;
+import brooklyn.entity.basic.ApplicationBuilder;
+import brooklyn.entity.basic.Entities;
+import brooklyn.entity.proxying.EntitySpecs;
+import brooklyn.event.SensorEvent;
+import brooklyn.event.SensorEventListener;
+import brooklyn.event.basic.BasicAttributeSensor;
+import brooklyn.test.Asserts;
+import brooklyn.test.EntityTestUtils;
+import brooklyn.test.entity.TestApplication;
+import brooklyn.test.entity.TestEntity;
+import brooklyn.util.MutableMap;
+import brooklyn.util.javalang.AtomicReferences;
+
+import com.google.common.base.Predicates;
+import com.google.common.collect.ImmutableMap;
+
+public class SensorPropagatingEnricherTest {
+
+ private TestApplication app;
+ private TestEntity entity;
+
+ @BeforeMethod(alwaysRun=true)
+ public void setUp() throws Exception {
+ app = ApplicationBuilder.newManagedApp(TestApplication.class);
+ entity = app.createAndManageChild(EntitySpecs.spec(TestEntity.class));
+ }
+
+ @AfterMethod(alwaysRun=true)
+ public void tearDown() throws Exception {
+ if (app != null) Entities.destroyAll(app);
+ }
+
+ @Test
+ public void testPropagatesSpecificSensor() {
+ app.addEnricher(SensorPropagatingEnricher.newInstanceListeningTo(entity, TestEntity.NAME));
+
+ // name propagated
+ entity.setAttribute(TestEntity.NAME, "foo");
+ EntityTestUtils.assertAttributeEqualsEventually(app, TestEntity.NAME, "foo");
+
+ // sequence not propagated
+ entity.setAttribute(TestEntity.SEQUENCE, 2);
+ EntityTestUtils.assertAttributeEqualsContinually(MutableMap.of("timeout", 100), app, TestEntity.SEQUENCE, null);
+ }
+
+ @Test
+ public void testPropagatesAllSensors() {
+ app.addEnricher(SensorPropagatingEnricher.newInstanceListeningToAllSensors(entity));
+
+ // all attributes propagated
+ entity.setAttribute(TestEntity.NAME, "foo");
+ entity.setAttribute(TestEntity.SEQUENCE, 2);
+
+ EntityTestUtils.assertAttributeEqualsEventually(app, TestEntity.NAME, "foo");
+ EntityTestUtils.assertAttributeEqualsEventually(app, TestEntity.SEQUENCE, 2);
+
+ // notification-sensor propagated
+ final AtomicReference<Integer> notif = new AtomicReference<Integer>();
+ app.subscribe(app, TestEntity.MY_NOTIF, new SensorEventListener<Integer>() {
+ @Override public void onEvent(SensorEvent<Integer> event) {
+ notif.set(event.getValue());
+ }});
+ entity.emit(TestEntity.MY_NOTIF, 7);
+ Asserts.eventually(AtomicReferences.supplier(notif), Predicates.equalTo(7));
+ }
+
+ @Test
+ public void testPropagatesAllBut() {
+ app.addEnricher(SensorPropagatingEnricher.newInstanceListeningToAllSensorsBut(entity, TestEntity.SEQUENCE)) ;
+
+ // name propagated
+ entity.setAttribute(TestEntity.NAME, "foo");
+ EntityTestUtils.assertAttributeEqualsEventually(app, TestEntity.NAME, "foo");
+
+ // sequence not propagated
+ entity.setAttribute(TestEntity.SEQUENCE, 2);
+ EntityTestUtils.assertAttributeEqualsContinually(MutableMap.of("timeout", 100), app, TestEntity.SEQUENCE, null);
+ }
+
+ @Test
+ public void testPropagatingAsDifferentSensor() {
+ final BasicAttributeSensor<String> ANOTHER_ATTRIBUTE = new BasicAttributeSensor<String>(String.class, "another.attribute", "");
+ app.addEnricher(SensorPropagatingEnricher.newInstanceListeningTo(entity, ImmutableMap.of(TestEntity.NAME, ANOTHER_ATTRIBUTE)));
+
+ // name propagated as different attribute
+ entity.setAttribute(TestEntity.NAME, "foo");
+ EntityTestUtils.assertAttributeEqualsEventually(app, ANOTHER_ATTRIBUTE, "foo");
+ }
+}