Repository: incubator-brooklyn
Updated Branches:
  refs/heads/master 4338a8f16 -> ff31a41d4


enhance yaml DSL for specifying a sensor

allows `sensor("sensor.name")`, looking up on entity, falling back to untyped 
Object sensor


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

Branch: refs/heads/master
Commit: 8591999ff24555cf798c590b27b31f4da5368c87
Parents: 64b1992
Author: Alex Heneveld <[email protected]>
Authored: Fri Apr 10 12:24:54 2015 +0100
Committer: Alex Heneveld <[email protected]>
Committed: Sun Apr 12 20:00:52 2015 -0500

----------------------------------------------------------------------
 .../src/main/java/brooklyn/util/task/Tasks.java |  1 -
 docs/guide/yaml/yaml-reference.md               |  3 +-
 .../spi/dsl/methods/BrooklynDslCommon.java      |  9 ++-
 .../brooklyn/spi/dsl/methods/DslComponent.java  | 35 ++++++++++++
 .../camp/brooklyn/DslAndRebindYamlTest.java     | 59 ++++++++++++++++++++
 .../camp/brooklyn/EntitiesYamlTest.java         |  4 +-
 6 files changed, 104 insertions(+), 7 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/8591999f/core/src/main/java/brooklyn/util/task/Tasks.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/util/task/Tasks.java 
b/core/src/main/java/brooklyn/util/task/Tasks.java
index f644441..573b342 100644
--- a/core/src/main/java/brooklyn/util/task/Tasks.java
+++ b/core/src/main/java/brooklyn/util/task/Tasks.java
@@ -18,7 +18,6 @@
  */
 package brooklyn.util.task;
 
-import java.util.Collection;
 import java.util.Collections;
 import java.util.List;
 import java.util.concurrent.Callable;

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/8591999f/docs/guide/yaml/yaml-reference.md
----------------------------------------------------------------------
diff --git a/docs/guide/yaml/yaml-reference.md 
b/docs/guide/yaml/yaml-reference.md
index 980b9e3..8427b06 100644
--- a/docs/guide/yaml/yaml-reference.md
+++ b/docs/guide/yaml/yaml-reference.md
@@ -147,6 +147,7 @@ concise DSL defined here:
     until the given `sensor` from the component `ID` has a "truthy" (i.e. 
non-trivial, non-empty, non-zero) value
   * `.config("key")` will insert the value set against the given key at this 
entity (or nearest ancestor);
     can be used to supply config at the root which is used in multiple places 
in the plan
+  * `$brooklyn:sensor("sensor.name")` returns the given sensor on the current 
entity if found, or an untyped (Object) sensor;
 * `$brooklyn:component("scope", "ID")` is also supported, to limit scope to 
any of
   * `global`: looks for the `ID` anywhere in the plan
   * `child`: looks for the `ID` anywhere in the child only
@@ -157,7 +158,7 @@ concise DSL defined here:
 * `$brooklyn:formatString("pattern e.g. %s %s", "field 1", "field 2")` returns 
a future which creates the formatted string
   with the given parameters, where parameters may be strings *or* other tasks 
such as `attributeWhenReady`
 * `$brooklyn:literal("string")` returns the given string as a literal 
(suppressing any `$brooklyn:` expansion)
-* `$brooklyn:sensor("io.brooklyn.ContainingEntityClass", "sensor.name")` 
returns the strongly typed sensor defined in the given class
+  `$brooklyn:sensor("io.brooklyn.ContainingEntityClass", "sensor.name")` 
returns the strongly typed sensor defined in the given class
 * `$brooklyn:entitySpec(Map)` returns a new `ServiceSpecification` as defined 
by the given `Map`,
   but as an `EntitySpec` suitable for setting as the value of 
`ConfigKey<EntitySpec>` config items
   (such as `memberSpec` in `DynamicCluster`)

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/8591999f/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/dsl/methods/BrooklynDslCommon.java
----------------------------------------------------------------------
diff --git 
a/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/dsl/methods/BrooklynDslCommon.java
 
b/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/dsl/methods/BrooklynDslCommon.java
index b38afd8..da19f6e 100644
--- 
a/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/dsl/methods/BrooklynDslCommon.java
+++ 
b/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/dsl/methods/BrooklynDslCommon.java
@@ -95,9 +95,12 @@ public class BrooklynDslCommon {
         return new DslComponent(Scope.THIS, "").attributeWhenReady(sensorName);
     }
 
-    // TODO Would be nice to have sensor(String sensorName), which would take 
the sensor
-    // from the entity in question, but that would require refactoring of 
Brooklyn DSL
-
+    /** Returns a {@link Sensor}, looking up the sensor on the context if 
available and using that,
+     * or else defining an untyped (Object) sensor */
+    public static BrooklynDslDeferredSupplier<Sensor<?>> sensor(String 
sensorName) {
+        return new DslComponent(Scope.THIS, "").sensor(sensorName);
+    }
+    
     /** Returns a {@link Sensor} from the given entity type. */
     @SuppressWarnings({ "unchecked", "rawtypes" })
     public static Sensor<?> sensor(String clazzName, String sensorName) {

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/8591999f/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/dsl/methods/DslComponent.java
----------------------------------------------------------------------
diff --git 
a/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/dsl/methods/DslComponent.java
 
b/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/dsl/methods/DslComponent.java
index 21e8afc..7b1ab4b 100644
--- 
a/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/dsl/methods/DslComponent.java
+++ 
b/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/dsl/methods/DslComponent.java
@@ -230,6 +230,41 @@ public class DslComponent extends 
BrooklynDslDeferredSupplier<Entity> {
             return component.toString()+"."+"config("+keyName+")";
         }
     }
+    
+    public BrooklynDslDeferredSupplier<Sensor<?>> sensor(final String 
sensorName) {
+        return new DslSensorSupplier(this, sensorName);
+    }
+    protected final static class DslSensorSupplier extends 
BrooklynDslDeferredSupplier<Sensor<?>> {
+        private final DslComponent component;
+        private final String sensorName;
+        private static final long serialVersionUID = -4735177561947722511L;
+
+        public DslSensorSupplier(DslComponent component, String sensorName) {
+            this.component = Preconditions.checkNotNull(component);
+            this.sensorName = sensorName;
+        }
+
+        @Override
+        public Task<Sensor<?>> newTask() {
+            return Tasks.<Sensor<?>>builder().name("looking up sensor for 
"+sensorName).dynamic(false).body(new Callable<Sensor<?>>() {
+                @Override
+                public Sensor<?> call() throws Exception {
+                    Entity targetEntity = component.get();
+                    Sensor<?> result = null;
+                    if (targetEntity!=null) {
+                        result = 
targetEntity.getEntityType().getSensor(sensorName);
+                    }
+                    if (result!=null) return result;
+                    return Sensors.newSensor(Object.class, sensorName);
+                }
+            }).build();
+        }
+
+        @Override
+        public String toString() {
+            return component.toString()+"."+"sensor("+sensorName+")";
+        }
+    }
 
     public static enum Scope {
         GLOBAL ("global"),

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/8591999f/usage/camp/src/test/java/io/brooklyn/camp/brooklyn/DslAndRebindYamlTest.java
----------------------------------------------------------------------
diff --git 
a/usage/camp/src/test/java/io/brooklyn/camp/brooklyn/DslAndRebindYamlTest.java 
b/usage/camp/src/test/java/io/brooklyn/camp/brooklyn/DslAndRebindYamlTest.java
index eb99cff..c90104f 100644
--- 
a/usage/camp/src/test/java/io/brooklyn/camp/brooklyn/DslAndRebindYamlTest.java
+++ 
b/usage/camp/src/test/java/io/brooklyn/camp/brooklyn/DslAndRebindYamlTest.java
@@ -31,9 +31,12 @@ import org.testng.annotations.Test;
 import brooklyn.config.ConfigKey;
 import brooklyn.entity.Application;
 import brooklyn.entity.Entity;
+import brooklyn.entity.basic.Attributes;
+import brooklyn.entity.basic.ConfigKeys;
 import brooklyn.entity.basic.Entities;
 import brooklyn.entity.basic.EntityInternal;
 import brooklyn.entity.rebind.RebindTestUtils;
+import brooklyn.event.Sensor;
 import brooklyn.event.basic.Sensors;
 import brooklyn.management.ManagementContext;
 import brooklyn.management.internal.LocalManagementContext;
@@ -135,6 +138,62 @@ public class DslAndRebindYamlTest extends AbstractYamlTest 
{
             "    test.confName: 
$brooklyn:component(\"x\").attributeWhenReady(\"foo\")");
     }
 
+    private void doTestOnEntityWithSensor(Entity testEntity, Sensor<?> 
expectedSensor) throws Exception {
+        doTestOnEntityWithSensor(testEntity, expectedSensor, true);
+    }
+    private void doTestOnEntityWithSensor(Entity testEntity, Sensor<?> 
expectedSensor, boolean inTask) throws Exception {
+        @SuppressWarnings("rawtypes")
+        ConfigKey<Sensor> configKey = ConfigKeys.newConfigKey(Sensor.class, 
"test.sensor");
+        Sensor<?> s;
+        s = inTask ? getConfigInTask(testEntity, configKey) : 
testEntity.getConfig(configKey);
+        Assert.assertEquals(s, expectedSensor);
+        Application app2 = rebind(testEntity.getApplication());
+        Entity te2 = Iterables.getOnlyElement( app2.getChildren() );
+        s = inTask ? getConfigInTask(te2, configKey) : 
te2.getConfig(configKey);
+        Assert.assertEquals(s, expectedSensor);
+    }
+    
+    @Test
+    public void testDslSensorFromClass() throws Exception {
+        doTestOnEntityWithSensor(entityWithSensorFromClass(), 
Attributes.SERVICE_UP);
+        // without context it can still find it
+        doTestOnEntityWithSensor(entityWithSensorFromClass(), 
Attributes.SERVICE_UP, false);
+    }
+    @Test
+    public void testDslSensorLocal() throws Exception {
+        doTestOnEntityWithSensor(entityWithSensorLocal(), TestEntity.SEQUENCE);
+        // here without context it makes one up, so type info (and description 
etc) not present; 
+        // but context is needed to submit the DslDeferredSupplier object, so 
this would fail
+//        doTestOnEntityWithSensor(entityWithSensorAdHoc(), 
Sensors.newSensor(Object.class, TestEntity.SEQUENCE.getName()), false);
+    }
+    @Test
+    public void testDslSensorAdHoc() throws Exception {
+        doTestOnEntityWithSensor(entityWithSensorAdHoc(), 
Sensors.newSensor(Object.class, "sensor.foo"));
+        // here context has no impact, but it is needed to submit the 
DslDeferredSupplier object so this would fail
+//        doTestOnEntityWithSensor(entityWithSensorAdHoc(), 
Sensors.newSensor(Object.class, "sensor.foo"), false);
+    }
+    
+    private Entity entityWithSensorFromClass() throws Exception {
+        return setupAndCheckTestEntityInBasicYamlWith( 
+            "  id: x",
+            "  brooklyn.config:",
+            "    test.sensor: 
$brooklyn:sensor(\""+Attributes.class.getName()+"\", 
\""+Attributes.SERVICE_UP.getName()+"\")");
+    }
+
+    private Entity entityWithSensorLocal() throws Exception {
+        return setupAndCheckTestEntityInBasicYamlWith( 
+            "  id: x",
+            "  brooklyn.config:",
+            "    test.sensor: 
$brooklyn:sensor(\""+TestEntity.SEQUENCE.getName()+"\")");
+    }
+
+    private Entity entityWithSensorAdHoc() throws Exception {
+        return setupAndCheckTestEntityInBasicYamlWith( 
+            "  id: x",
+            "  brooklyn.config:",
+            "    test.sensor: $brooklyn:sensor(\"sensor.foo\")");
+    }
+
 
     @Test
     public void testDslConfigFromRoot() throws Exception {

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/8591999f/usage/camp/src/test/java/io/brooklyn/camp/brooklyn/EntitiesYamlTest.java
----------------------------------------------------------------------
diff --git 
a/usage/camp/src/test/java/io/brooklyn/camp/brooklyn/EntitiesYamlTest.java 
b/usage/camp/src/test/java/io/brooklyn/camp/brooklyn/EntitiesYamlTest.java
index 8defc5f..6deda0f 100644
--- a/usage/camp/src/test/java/io/brooklyn/camp/brooklyn/EntitiesYamlTest.java
+++ b/usage/camp/src/test/java/io/brooklyn/camp/brooklyn/EntitiesYamlTest.java
@@ -460,7 +460,7 @@ public class EntitiesYamlTest extends AbstractYamlTest {
                 Assert.assertEquals(getResolvedConfigInTask(entity, 
key).get(), keyToEntity.get(key));
             } catch (Throwable t) {
                 Exceptions.propagateIfFatal(t);
-                Assert.fail("Wrong value for "+entity+":"+key+", 
"+entity.getConfigRaw(key,  false)+": "+t, t);
+                Assert.fail("Wrong value for "+entity+":"+key+", 
"+((EntityInternal)entity).config().getLocalRaw(key)+": "+t, t);
             }
         }
     }
@@ -699,7 +699,7 @@ public class EntitiesYamlTest extends AbstractYamlTest {
         
         Application app = (Application) createStartWaitAndLogApplication(new 
StringReader(yaml));
         TestEntity entity = (TestEntity) 
Iterables.getOnlyElement(app.getChildren());
-        EntitySpec<?> entitySpec = (EntitySpec<?>) 
entity.getAllConfigBag().getStringKey("key.does.not.match");
+        EntitySpec<?> entitySpec = (EntitySpec<?>) 
entity.config().getBag().getStringKey("key.does.not.match");
         assertEquals(entitySpec.getType(), TestEntity.class);
         assertEquals(entitySpec.getConfig(), 
ImmutableMap.of(TestEntity.CONF_NAME, "inchildspec"));
     }

Reply via email to