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/07/18 18:37:42 UTC

[3/6] git commit: Adds support for multiple type value on AddSensor.

Adds support for multiple type value on AddSensor.

Target type now needs to be specified as ConfigKey


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

Branch: refs/heads/master
Commit: 65ddabd298991740f4df3363b84dbdf79bf33dd2
Parents: a2f8f65
Author: Miguel Barrientos <mb...@lcc.uma.es>
Authored: Mon Jul 14 17:22:23 2014 +0200
Committer: Miguel Barrientos <mb...@lcc.uma.es>
Committed: Mon Jul 14 18:26:46 2014 +0200

----------------------------------------------------------------------
 .../brooklyn/entity/effector/AddSensor.java     | 22 +++++++++++++++-----
 .../event/feed/http/HttpValueFunctions.java     |  4 ++--
 .../brooklyn/event/feed/http/JsonFunctions.java | 19 +++++++----------
 .../entity/software/http/HttpRequestSensor.java | 19 +++++++----------
 4 files changed, 34 insertions(+), 30 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/65ddabd2/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 9201f23..fb58e52 100644
--- a/core/src/main/java/brooklyn/entity/effector/AddSensor.java
+++ b/core/src/main/java/brooklyn/entity/effector/AddSensor.java
@@ -38,12 +38,11 @@ import com.google.common.base.Preconditions;
 @Beta
 public class AddSensor<RT,T extends Sensor<RT>> implements EntityInitializer {
     protected final T sensor;
-    
     public static final ConfigKey<String> SENSOR_NAME = ConfigKeys.newStringConfigKey("name");
     public static final ConfigKey<Duration> SENSOR_PERIOD = ConfigKeys.newConfigKey(Duration.class, "period", "Period, including units e.g. 1m or 5s or 200ms");
     
     // TODO
-//    public static final ConfigKey<String> SENSOR_TYPE = ConfigKeys.newStringConfigKey("targetType");
+    public static final ConfigKey<String> SENSOR_TYPE = ConfigKeys.newStringConfigKey("targetType");
 
     public AddSensor(T sensor) {
         this.sensor = Preconditions.checkNotNull(sensor, "sensor");
@@ -53,10 +52,23 @@ public class AddSensor<RT,T extends Sensor<RT>> implements EntityInitializer {
     public void apply(EntityLocal entity) {
         ((EntityInternal)entity).getMutableEntityType().addSensor(sensor);
     }
-    
-    public static <T> AttributeSensor<T> newSensor(Class<T> type, ConfigBag params) {
+
+    public static <T> AttributeSensor<T> newSensor(Class<T> type, ConfigBag params){
         String name = Preconditions.checkNotNull(params.get(SENSOR_NAME), "name must be supplied when defining a sensor");
-        return Sensors.newSensor(type, name); 
+        return Sensors.newSensor(type, name);
+    }
+
+    public static <T> AttributeSensor<T> newSensor(ConfigBag params) {
+        String name = Preconditions.checkNotNull(params.get(SENSOR_NAME), "name must be supplied when defining a sensor");
+        String className = Preconditions.checkNotNull(params.get(SENSOR_TYPE), "target class must be supplied when defining a sensor");
+        Class<T> type = null;
+
+        try {
+            type = (Class<T>) Class.forName(className);
+        } catch (ClassNotFoundException e) {
+            throw new IllegalArgumentException("Invalid target type");
+        }
+        return Sensors.newSensor(type, name);
     }
 
 }

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/65ddabd2/core/src/main/java/brooklyn/event/feed/http/HttpValueFunctions.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/event/feed/http/HttpValueFunctions.java b/core/src/main/java/brooklyn/event/feed/http/HttpValueFunctions.java
index 800368d..bcd79ad 100644
--- a/core/src/main/java/brooklyn/event/feed/http/HttpValueFunctions.java
+++ b/core/src/main/java/brooklyn/event/feed/http/HttpValueFunctions.java
@@ -73,8 +73,8 @@ public class HttpValueFunctions {
         return Functionals.chain(jsonContents(), JsonFunctions.walk(elements), JsonFunctions.cast(expected));
     }
 
-    public static <T> Function<HttpToolResponse, T> jsonContentsFromPath(String element, Class<T> expected){
-        return Functionals.chain(jsonContents(), JsonFunctions.getPath(element), JsonFunctions.cast(expected));
+    public static <T> Function<HttpToolResponse, T> jsonContentsFromPath(String path){
+        return Functionals.chain(jsonContents(), JsonFunctions.<T>getPath(path));
     }
     
     public static Function<HttpToolResponse, Long> latency() {

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/65ddabd2/core/src/main/java/brooklyn/event/feed/http/JsonFunctions.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/event/feed/http/JsonFunctions.java b/core/src/main/java/brooklyn/event/feed/http/JsonFunctions.java
index 5f5da44..d9ef9d2 100644
--- a/core/src/main/java/brooklyn/event/feed/http/JsonFunctions.java
+++ b/core/src/main/java/brooklyn/event/feed/http/JsonFunctions.java
@@ -34,9 +34,7 @@ import brooklyn.util.guava.MaybeFunctions;
 import com.google.common.base.Function;
 import com.google.common.base.Splitter;
 import com.google.common.collect.Lists;
-import com.google.gson.JsonArray;
-import com.google.gson.JsonElement;
-import com.google.gson.JsonObject;
+import com.google.gson.*;
 import com.google.gson.JsonParser;
 import com.jayway.jsonpath.JsonPath;
 
@@ -152,17 +150,14 @@ public class JsonFunctions {
     }
 
     /**
-     * returns an element from a json object given a full path {@link com.jayway.jsonpath.JsonPath}
+     * returns an element from a single json primitive value given a full path {@link com.jayway.jsonpath.JsonPath}
      */
-    public static Function<JsonElement,? extends JsonElement> getPath(final String element) {
-        return new Function<JsonElement, JsonElement>() {
-            @Override public JsonElement apply(JsonElement input) {
+    public static <T> Function<JsonElement,T> getPath(final String path) {
+        return new Function<JsonElement, T>() {
+            @Override public T apply(JsonElement input) {
                 String jsonString = input.toString();
-                JsonParser jsonParser = new JsonParser();
-                JsonElement curr = jsonParser.parse(JsonPath.<String>read(jsonString, element));
-                if (curr==null)
-                    throw new NoSuchElementException("No element '"+element+" in JSON);");
-                return curr;
+                Object rawElement = JsonPath.read(jsonString, path);
+                return (T) rawElement;
             }
         };
     }

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/65ddabd2/software/base/src/main/java/brooklyn/entity/software/http/HttpRequestSensor.java
----------------------------------------------------------------------
diff --git a/software/base/src/main/java/brooklyn/entity/software/http/HttpRequestSensor.java b/software/base/src/main/java/brooklyn/entity/software/http/HttpRequestSensor.java
index 1ae08dc..aab0123 100644
--- a/software/base/src/main/java/brooklyn/entity/software/http/HttpRequestSensor.java
+++ b/software/base/src/main/java/brooklyn/entity/software/http/HttpRequestSensor.java
@@ -20,20 +20,18 @@ import java.util.Map;
  * Configurable {@link brooklyn.entity.proxying.EntityInitializer} which adds an HTTP sensor feed to retrieve the
  * <code>JSONObject</code> from a JSON response in order to populate the sensor with the indicated <code>name</code>.
  */
-// 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
-public final class HttpRequestSensor<T extends String> extends AddSensor<String, AttributeSensor<String>> {
+public final class HttpRequestSensor<T> extends AddSensor<T, AttributeSensor<T>> {
 
     private static final org.slf4j.Logger log = LoggerFactory.getLogger(HttpRequestSensor.class);
 
     public static final ConfigKey<String> JSON_PATH = ConfigKeys.newStringConfigKey("jsonPath");
     public static final ConfigKey<String> SENSOR_URI = ConfigKeys.newStringConfigKey("uri");
 
-    String jsonPath;
-    String uri;
+    private String jsonPath;
+    private String uri;
 
     public HttpRequestSensor(ConfigBag params) {
-        super(newSensor(String.class, params));
+        super(AddSensor.<T>newSensor(params));
         jsonPath = Preconditions.checkNotNull(params.get(JSON_PATH), JSON_PATH);
         uri = Preconditions.checkNotNull(params.get(SENSOR_URI), SENSOR_URI);
     }
@@ -44,12 +42,11 @@ public final class HttpRequestSensor<T extends String> extends AddSensor<String,
 
         Duration period = Duration.ONE_SECOND;
 
-        HttpPollConfig<String> pollConfig = new HttpPollConfig<String>(sensor)
+        HttpPollConfig<T> pollConfig = new HttpPollConfig<T>(sensor)
                 .checkSuccess(HttpValueFunctions.responseCodeEquals(200))
-                .onFailureOrException(Functions.constant((String) null))
-                .onSuccess(HttpValueFunctions.jsonContentsFromPath(jsonPath, String.class));
-
-        if (period != null) pollConfig.period(period);
+                .onFailureOrException(Functions.constant((T) null))
+                .onSuccess(HttpValueFunctions.<T>jsonContentsFromPath(jsonPath))
+                .period(period);
 
         HttpFeed.builder().entity(entity)
                 .baseUri(uri)