You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@brooklyn.apache.org by gr...@apache.org on 2014/11/11 19:32:40 UTC

[4/5] incubator-brooklyn git commit: Add type coercion to added SSH command sensors

Add type coercion to added SSH command sensors


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

Branch: refs/heads/master
Commit: 7ce829827ad0c14d43d155ff60cc8b6e4fbadebf
Parents: e0b6ed1
Author: Andrew Kennedy <gr...@apache.org>
Authored: Mon Nov 10 14:49:18 2014 +0000
Committer: Andrew Kennedy <gr...@apache.org>
Committed: Mon Nov 10 14:49:18 2014 +0000

----------------------------------------------------------------------
 .../java/brooklyn/entity/effector/AddSensor.java  |  9 +++++++--
 .../entity/software/ssh/SshCommandSensor.java     | 18 +++++++++++-------
 2 files changed, 18 insertions(+), 9 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/7ce82982/core/src/main/java/brooklyn/entity/effector/AddSensor.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/entity/effector/AddSensor.java b/core/src/main/java/brooklyn/entity/effector/AddSensor.java
index 040f168..49c191e 100644
--- a/core/src/main/java/brooklyn/entity/effector/AddSensor.java
+++ b/core/src/main/java/brooklyn/entity/effector/AddSensor.java
@@ -72,16 +72,21 @@ public class AddSensor<T> implements EntityInitializer {
 
     private AttributeSensor<T> newSensor() {
         String className = getFullClassName(type);
+        Class<T> clazz = getType(className);
+        return Sensors.newSensor(clazz, name);
+    }
+
+    protected Class<T> getType(String className) {
         Class<T> clazz = null;
         try {
             clazz = (Class<T>) Class.forName(className);
         } catch (ClassNotFoundException e) {
             throw new IllegalArgumentException("Invalid target type for sensor "+name+": " + className);
         }
-        return Sensors.newSensor(clazz, name);
+        return clazz;
     }
 
-    private String getFullClassName(String className) {
+    protected String getFullClassName(String className) {
         if (className.equalsIgnoreCase("string")) {
             return "java.lang.String";
         } else if (className.equalsIgnoreCase("int") || className.equalsIgnoreCase("integer")) {

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/7ce82982/software/base/src/main/java/brooklyn/entity/software/ssh/SshCommandSensor.java
----------------------------------------------------------------------
diff --git a/software/base/src/main/java/brooklyn/entity/software/ssh/SshCommandSensor.java b/software/base/src/main/java/brooklyn/entity/software/ssh/SshCommandSensor.java
index 2f75780..51e2917 100644
--- a/software/base/src/main/java/brooklyn/entity/software/ssh/SshCommandSensor.java
+++ b/software/base/src/main/java/brooklyn/entity/software/ssh/SshCommandSensor.java
@@ -36,9 +36,11 @@ import brooklyn.event.feed.ssh.SshPollConfig;
 import brooklyn.event.feed.ssh.SshValueFunctions;
 import brooklyn.util.collections.MutableMap;
 import brooklyn.util.config.ConfigBag;
+import brooklyn.util.flags.TypeCoercions;
 import brooklyn.util.text.Strings;
 
 import com.google.common.annotations.Beta;
+import com.google.common.base.Function;
 import com.google.common.base.Functions;
 import com.google.common.base.Preconditions;
 import com.google.common.base.Supplier;
@@ -51,10 +53,8 @@ import com.google.common.base.Supplier;
  * @see HttpRequestSensor
  * @see JmxAttributeSensor
  */
-// generics introduced here because we might support a configurable 'targetType` parameter in future, 
-// with automatic casting (e.g. for ints); this way it remains compatible
 @Beta
-public final class SshCommandSensor<T extends String> extends AddSensor<String> {
+public final class SshCommandSensor<T> extends AddSensor<T> {
 
     private static final Logger LOG = LoggerFactory.getLogger(SshCommandSensor.class);
 
@@ -63,7 +63,7 @@ public final class SshCommandSensor<T extends String> extends AddSensor<String>
     protected final String command;
 
     public SshCommandSensor(final ConfigBag params) {
-        super(params.configure(SENSOR_TYPE, "String"));
+        super(params);
 
         // TODO create a supplier for the command string to support attribute embedding
         command = Preconditions.checkNotNull(params.get(SENSOR_COMMAND), "command");
@@ -96,13 +96,17 @@ public final class SshCommandSensor<T extends String> extends AddSensor<String>
             }
         };
 
-        SshPollConfig<String> pollConfig = new SshPollConfig<String>(sensor)
+        SshPollConfig<T> pollConfig = new SshPollConfig<T>(sensor)
                 .period(period)
                 .env(envSupplier)
                 .command(commandSupplier)
                 .checkSuccess(SshValueFunctions.exitStatusEquals(0))
-                .onFailureOrException(Functions.constant((String) null))
-                .onSuccess(SshValueFunctions.stdout());
+                .onFailureOrException(Functions.constant((T) null))
+                .onSuccess(Functions.compose(new Function<String, T>() {
+                        @Override
+                        public T apply(String input) {
+                            return TypeCoercions.coerce(input, getType(type));
+                        }}, SshValueFunctions.stdout()));
 
         SshFeed.builder()
                 .entity(entity)