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:41 UTC
[2/6] git commit: Add support for json-path
(https://code.google.com/p/json-path) for full access to json response
Add support for json-path (https://code.google.com/p/json-path) for full access to json response
Moved test to new package
Refactoring to avoid removing functionality:
now it supports both full path with JSONPath (through HttpValueFunctions.jsonContentsFromPath) and 1-level json element only.
rebased minor commits
Project: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/commit/a2f8f655
Tree: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/tree/a2f8f655
Diff: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/diff/a2f8f655
Branch: refs/heads/master
Commit: a2f8f655efdb869c8cd3098011e6dd6e3aa98ac0
Parents: 7a28815
Author: Miguel Barrientos <mb...@lcc.uma.es>
Authored: Sat Jul 5 02:18:07 2014 +0200
Committer: Miguel Barrientos <mb...@lcc.uma.es>
Committed: Mon Jul 14 18:26:44 2014 +0200
----------------------------------------------------------------------
core/pom.xml | 5 ++
.../event/feed/http/HttpValueFunctions.java | 4 ++
.../brooklyn/event/feed/http/JsonFunctions.java | 21 ++++++-
pom.xml | 1 +
.../entity/software/http/HttpRequestSensor.java | 8 +--
.../entity/software/HttpRequestSensorTest.java | 63 --------------------
.../software/http/HttpRequestSensorTest.java | 62 +++++++++++++++++++
7 files changed, 95 insertions(+), 69 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/a2f8f655/core/pom.xml
----------------------------------------------------------------------
diff --git a/core/pom.xml b/core/pom.xml
index 5c292de..e2b858a 100644
--- a/core/pom.xml
+++ b/core/pom.xml
@@ -163,6 +163,11 @@
<version>${jetty.version}</version>
<scope>test</scope>
</dependency>
+ <dependency>
+ <groupId>com.jayway.jsonpath</groupId>
+ <artifactId>json-path</artifactId>
+ <version>${jsonPath.version}</version>
+ </dependency>
</dependencies>
<!-- add maxmind geo-ip library; exact copy of source included as required by LGPL2 -->
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/a2f8f655/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 0981b0e..800368d 100644
--- a/core/src/main/java/brooklyn/event/feed/http/HttpValueFunctions.java
+++ b/core/src/main/java/brooklyn/event/feed/http/HttpValueFunctions.java
@@ -72,6 +72,10 @@ public class HttpValueFunctions {
public static <T> Function<HttpToolResponse, T> jsonContents(String[] elements, Class<T> expected) {
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 Function<HttpToolResponse, Long> latency() {
return new Function<HttpToolResponse, Long>() {
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/a2f8f655/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 b9c3eee..5f5da44 100644
--- a/core/src/main/java/brooklyn/event/feed/http/JsonFunctions.java
+++ b/core/src/main/java/brooklyn/event/feed/http/JsonFunctions.java
@@ -38,6 +38,7 @@ import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
+import com.jayway.jsonpath.JsonPath;
public class JsonFunctions {
@@ -80,14 +81,14 @@ public class JsonFunctions {
public static Function<JsonElement, JsonElement> walk(final Iterable<String> elements) {
// could do this instead, pointing at Maybe for this, and for walkN, but it's slightly less efficient
// return Functionals.chain(MaybeFunctions.<JsonElement>wrap(), walkM(elements), MaybeFunctions.<JsonElement>get());
-
+
return new Function<JsonElement, JsonElement>() {
@Override public JsonElement apply(JsonElement input) {
JsonElement curr = input;
for (String element : elements) {
JsonObject jo = curr.getAsJsonObject();
curr = jo.get(element);
- if (curr==null)
+ if (curr==null)
throw new NoSuchElementException("No element '"+element+" in JSON, when walking "+elements);
}
return curr;
@@ -150,6 +151,22 @@ public class JsonFunctions {
};
}
+ /**
+ * returns an element from a json object 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) {
+ 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;
+ }
+ };
+ }
+
@SuppressWarnings("unchecked")
public static <T> Function<JsonElement, T> cast(final Class<T> expected) {
return new Function<JsonElement, T>() {
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/a2f8f655/pom.xml
----------------------------------------------------------------------
diff --git a/pom.xml b/pom.xml
index df490aa..70c63bf 100644
--- a/pom.xml
+++ b/pom.xml
@@ -141,6 +141,7 @@
<osgi-core.version>4.3.0</osgi-core.version>
<commons-io.version>2.4</commons-io.version>
<hazelcast.version>3.0</hazelcast.version>
+ <jsonPath.version>0.9.1</jsonPath.version>
<commons-lang3.version>3.1</commons-lang3.version>
<commons-compress.version>1.4</commons-compress.version>
<qpid.version>0.20</qpid.version>
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/a2f8f655/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 8cc04f9..1ae08dc 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
@@ -10,8 +10,8 @@ import brooklyn.event.feed.http.HttpPollConfig;
import brooklyn.event.feed.http.HttpValueFunctions;
import brooklyn.util.config.ConfigBag;
import brooklyn.util.time.Duration;
+import com.google.common.base.Functions;
import com.google.common.base.Preconditions;
-import com.jayway.jsonpath.JsonPath;
import org.slf4j.LoggerFactory;
import java.util.Map;
@@ -45,7 +45,9 @@ public final class HttpRequestSensor<T extends String> extends AddSensor<String,
Duration period = Duration.ONE_SECOND;
HttpPollConfig<String> pollConfig = new HttpPollConfig<String>(sensor)
- .onSuccess(HttpValueFunctions.jsonContents(jsonPath, String.class));
+ .checkSuccess(HttpValueFunctions.responseCodeEquals(200))
+ .onFailureOrException(Functions.constant((String) null))
+ .onSuccess(HttpValueFunctions.jsonContentsFromPath(jsonPath, String.class));
if (period != null) pollConfig.period(period);
@@ -53,8 +55,6 @@ public final class HttpRequestSensor<T extends String> extends AddSensor<String,
.baseUri(uri)
.poll(pollConfig)
.build();
-
- log.info("HTTPRequestSensor: " + uri + " -> " + jsonPath);
}
public HttpRequestSensor(Map<String, String> params) {
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/a2f8f655/software/base/src/test/java/brooklyn/entity/software/HttpRequestSensorTest.java
----------------------------------------------------------------------
diff --git a/software/base/src/test/java/brooklyn/entity/software/HttpRequestSensorTest.java b/software/base/src/test/java/brooklyn/entity/software/HttpRequestSensorTest.java
deleted file mode 100644
index 1ea5f48..0000000
--- a/software/base/src/test/java/brooklyn/entity/software/HttpRequestSensorTest.java
+++ /dev/null
@@ -1,63 +0,0 @@
-package brooklyn.entity.software;
-
-import brooklyn.entity.basic.ApplicationBuilder;
-import brooklyn.entity.basic.Attributes;
-import brooklyn.entity.basic.Entities;
-import brooklyn.entity.basic.EntityLocal;
-import brooklyn.entity.proxying.EntitySpec;
-import brooklyn.entity.software.http.HttpRequestSensor;
-import brooklyn.event.AttributeSensor;
-import brooklyn.event.basic.Sensors;
-import brooklyn.location.Location;
-import brooklyn.test.entity.TestApplication;
-import brooklyn.test.entity.TestEntity;
-import brooklyn.util.config.ConfigBag;
-import com.google.common.collect.ImmutableList;
-import org.testng.annotations.AfterMethod;
-import org.testng.annotations.BeforeMethod;
-import org.testng.annotations.Test;
-
-import static org.testng.Assert.assertTrue;
-import static org.testng.Assert.assertEquals;
-import static brooklyn.test.Asserts.succeedsEventually;
-
-public class HttpRequestSensorTest {
- final static AttributeSensor<String> SENSOR_STRING = Sensors.newStringSensor("aString", "");
- final static AttributeSensor<String> SENSOR_JSON_OBJECT = Sensors.newStringSensor("aJSONObject","");
- final static AttributeSensor<String> SENSOR_URI = Sensors.newStringSensor("uri","");
-
- private TestApplication app;
- private EntityLocal entity;
-
- @BeforeMethod(alwaysRun=true)
- public void setUp() throws Exception {
- app = ApplicationBuilder.newManagedApp(TestApplication.class);
- entity = app.createAndManageChild(EntitySpec.create(TestEntity.class).location(app.newLocalhostProvisioningLocation().obtain()));
- app.start(ImmutableList.<Location>of());
- }
-
- @AfterMethod(alwaysRun=true)
- public void tearDown() throws Exception {
- if (app != null) Entities.destroyAll(app.getManagementContext());
- }
-
- @Test(groups="Integration")
- public void testHttpSensor() throws Exception {
- new HttpRequestSensor<String>(ConfigBag.newInstance()
- .configure(HttpRequestSensor.SENSOR_NAME, SENSOR_STRING.getName())
- .configure(HttpRequestSensor.JSON_PATH, "myKey")
- .configure(HttpRequestSensor.SENSOR_URI, "http://echo.jsontest.com/myKey/myValue"))
- .apply(entity);
- entity.setAttribute(Attributes.SERVICE_UP, true);
-
- succeedsEventually(new Runnable() {
- public void run() {
- String val = entity.getAttribute(SENSOR_STRING);
- assertTrue(val != null);
- }
- });
-
- String val = entity.getAttribute(SENSOR_STRING);
- assertEquals(val, "myValue", "val=" + val);
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/a2f8f655/software/base/src/test/java/brooklyn/entity/software/http/HttpRequestSensorTest.java
----------------------------------------------------------------------
diff --git a/software/base/src/test/java/brooklyn/entity/software/http/HttpRequestSensorTest.java b/software/base/src/test/java/brooklyn/entity/software/http/HttpRequestSensorTest.java
new file mode 100644
index 0000000..7ec06c1
--- /dev/null
+++ b/software/base/src/test/java/brooklyn/entity/software/http/HttpRequestSensorTest.java
@@ -0,0 +1,62 @@
+package brooklyn.entity.software.http;
+
+import brooklyn.entity.basic.ApplicationBuilder;
+import brooklyn.entity.basic.Attributes;
+import brooklyn.entity.basic.Entities;
+import brooklyn.entity.basic.EntityLocal;
+import brooklyn.entity.proxying.EntitySpec;
+import brooklyn.event.AttributeSensor;
+import brooklyn.event.basic.Sensors;
+import brooklyn.location.Location;
+import brooklyn.test.entity.TestApplication;
+import brooklyn.test.entity.TestEntity;
+import brooklyn.util.config.ConfigBag;
+import com.google.common.collect.ImmutableList;
+import org.testng.annotations.AfterMethod;
+import org.testng.annotations.BeforeMethod;
+import org.testng.annotations.Test;
+
+import static org.testng.Assert.assertTrue;
+import static org.testng.Assert.assertEquals;
+import static brooklyn.test.Asserts.succeedsEventually;
+
+public class HttpRequestSensorTest {
+ final static AttributeSensor<String> SENSOR_STRING = Sensors.newStringSensor("aString", "");
+ final static AttributeSensor<String> SENSOR_JSON_OBJECT = Sensors.newStringSensor("aJSONObject","");
+ final static AttributeSensor<String> SENSOR_URI = Sensors.newStringSensor("uri","");
+
+ private TestApplication app;
+ private EntityLocal entity;
+
+ @BeforeMethod(alwaysRun=true)
+ public void setUp() throws Exception {
+ app = ApplicationBuilder.newManagedApp(TestApplication.class);
+ entity = app.createAndManageChild(EntitySpec.create(TestEntity.class).location(app.newLocalhostProvisioningLocation().obtain()));
+ app.start(ImmutableList.<Location>of());
+ }
+
+ @AfterMethod(alwaysRun=true)
+ public void tearDown() throws Exception {
+ if (app != null) Entities.destroyAll(app.getManagementContext());
+ }
+
+ @Test(groups="Integration")
+ public void testHttpSensor() throws Exception {
+ new HttpRequestSensor<String>(ConfigBag.newInstance()
+ .configure(HttpRequestSensor.SENSOR_NAME, SENSOR_STRING.getName())
+ .configure(HttpRequestSensor.JSON_PATH, "$.myKey")
+ .configure(HttpRequestSensor.SENSOR_URI, "http://echo.jsontest.com/myKey/myValue"))
+ .apply(entity);
+ entity.setAttribute(Attributes.SERVICE_UP, true);
+
+ succeedsEventually(new Runnable() {
+ public void run() {
+ String val = entity.getAttribute(SENSOR_STRING);
+ assertTrue(val != null);
+ }
+ });
+
+ String val = entity.getAttribute(SENSOR_STRING);
+ assertEquals(val, "myValue", "val=" + val);
+ }
+}