From 909c8ea2b37251dc09725bbcff960584d9946bae Mon Sep 17 00:00:00 2001 From: Ziver Koc Date: Tue, 29 Nov 2016 16:45:30 +0100 Subject: [PATCH] Implemented sensor filtering for json endpoint --- resource/web/sensor_detail.tmpl | 2 +- src/se/hal/intf/HalJsonPage.java | 8 ++- src/se/hal/page/SensorJsonPage.java | 88 +++++++++++++++++++---------- 3 files changed, 65 insertions(+), 33 deletions(-) diff --git a/resource/web/sensor_detail.tmpl b/resource/web/sensor_detail.tmpl index 2bcdb897..68a559d8 100755 --- a/resource/web/sensor_detail.tmpl +++ b/resource/web/sensor_detail.tmpl @@ -10,7 +10,7 @@ diff --git a/src/se/hal/intf/HalJsonPage.java b/src/se/hal/intf/HalJsonPage.java index d5f53139..ca3e9d56 100755 --- a/src/se/hal/intf/HalJsonPage.java +++ b/src/se/hal/intf/HalJsonPage.java @@ -1,5 +1,6 @@ package se.hal.intf; +import zutil.log.LogUtil; import zutil.net.http.HttpHeader; import zutil.net.http.HttpPage; import zutil.net.http.HttpPrintStream; @@ -10,12 +11,13 @@ import zutil.parser.json.JSONWriter; import java.io.IOException; import java.util.Map; import java.util.logging.Level; +import java.util.logging.Logger; /** * A interface defining a Hal json endpoint */ public abstract class HalJsonPage extends HalHttpPage{ - + private static final Logger logger = LogUtil.getLogger(); public HalJsonPage(String id) { super(id); @@ -34,8 +36,10 @@ public abstract class HalJsonPage extends HalHttpPage{ out.setHeader("Content-Type", "application/json"); JSONWriter writer = new JSONWriter(out); try{ - writer.write(jsonRespond(session, cookie, request)); + writer.write( + jsonRespond(session, cookie, request)); } catch (Exception e){ + logger.log(Level.SEVERE, null, e); DataNode root = new DataNode(DataNode.DataType.Map); root.set("error", e.getMessage()); writer.write(root); diff --git a/src/se/hal/page/SensorJsonPage.java b/src/se/hal/page/SensorJsonPage.java index 21dcd7d6..4897d718 100755 --- a/src/se/hal/page/SensorJsonPage.java +++ b/src/se/hal/page/SensorJsonPage.java @@ -6,6 +6,7 @@ import se.hal.intf.HalJsonPage; import se.hal.struct.Sensor; import se.hal.util.AggregateDataListSqlResult; import se.hal.util.UTCTimeUtility; +import zutil.ArrayUtil; import zutil.db.DBConnection; import zutil.log.LogUtil; import zutil.parser.DataNode; @@ -16,8 +17,15 @@ import java.util.Map; import java.util.logging.Logger; /** - * Request parameters: - * aggr: Aggrigation periods. Possible values: minute,hour,day,week + * Available HTTP Get Request parameters: + *
+ * Sensor filtering parameters:
+ * id: comma separated numeric id for specific sensors
+ * type: sensor data type name
+ *
+ * Data filtering parameters:
+ * aggr: Aggrigation periods, needs to be provided to retrieve data. Possible values: minute,hour,day,week
+ * 
*/ public class SensorJsonPage extends HalJsonPage { private static final Logger logger = LogUtil.getLogger(); @@ -37,45 +45,70 @@ public class SensorJsonPage extends HalJsonPage { DataNode root = new DataNode(DataNode.DataType.List); //// Get sensors + String[] req_ids = null; + if (request.get("id") != null) + req_ids = request.get("id").split(","); + String req_type = request.get("type"); + List sensors = new ArrayList<>(); for (Sensor sensor : Sensor.getSensors(db)) { - if (sensor.getDeviceConfig() != null) // Show all sensors for now -// if (sensor.getDeviceConfig() != null && -// sensor.getDeviceConfig().getSensorDataClass() == PowerConsumptionSensorData.class) + if (sensor.getDeviceConfig() == null) // Show all sensors for now + continue; + + if (req_ids == null && req_type==null) // no options defined, then add all sensors + sensors.add(sensor); + else if (req_ids != null && ArrayUtil.contains(req_ids, ""+sensor.getId())) // id filtering + sensors.add(sensor); + else if (req_type != null && !req_type.isEmpty() && + sensor.getDeviceConfig().getSensorDataClass().getSimpleName().contains(req_type)) // device type filtering sensors.add(sensor); } //// Figure out aggregation period - SensorDataAggregatorDaemon.AggregationPeriodLength aggrType; - long aggrLength = UTCTimeUtility.INFINITY; - switch (request.get("aggr")) { - case "minute": - default: - aggrType = SensorDataAggregatorDaemon.AggregationPeriodLength.FIVE_MINUTES; - aggrLength = UTCTimeUtility.DAY_IN_MS; - break; - case "hour": - aggrType = SensorDataAggregatorDaemon.AggregationPeriodLength.HOUR; - aggrLength = UTCTimeUtility.WEEK_IN_MS; - break; - case "day": - aggrType = SensorDataAggregatorDaemon.AggregationPeriodLength.DAY; - break; - case "week": - aggrType = SensorDataAggregatorDaemon.AggregationPeriodLength.WEEK; - break; + SensorDataAggregatorDaemon.AggregationPeriodLength aggrType = null; + long aggrLength = -1; + if (request.get("aggr") != null) { + switch (request.get("aggr")) { + case "minute": + aggrType = SensorDataAggregatorDaemon.AggregationPeriodLength.FIVE_MINUTES; + aggrLength = UTCTimeUtility.DAY_IN_MS; + break; + case "hour": + aggrType = SensorDataAggregatorDaemon.AggregationPeriodLength.HOUR; + aggrLength = UTCTimeUtility.WEEK_IN_MS; + break; + case "day": + aggrType = SensorDataAggregatorDaemon.AggregationPeriodLength.DAY; + aggrLength = UTCTimeUtility.INFINITY; + break; + case "week": + aggrType = SensorDataAggregatorDaemon.AggregationPeriodLength.WEEK; + aggrLength = UTCTimeUtility.INFINITY; + break; + } } /// Generate DataNode for (Sensor sensor : sensors) { - addAggregateDataToDataNode(root, sensor, aggrLength, + DataNode deviceNode = new DataNode(DataNode.DataType.Map); + deviceNode.set("id", sensor.getId()); + deviceNode.set("name", sensor.getName()); + deviceNode.set("user", sensor.getUser().getUsername()); + deviceNode.set("type", sensor.getDeviceConfig().getSensorDataClass().getSimpleName()); + deviceNode.set("x", sensor.getX()); + deviceNode.set("y", sensor.getY()); + + if (aggrLength > 0) { + addAggregateDataToDataNode(deviceNode, aggrLength, AggregateDataListSqlResult.getAggregateDataForPeriod(db, sensor, aggrType, aggrLength)); + } + root.add(deviceNode); } return root; } - private void addAggregateDataToDataNode(DataNode root, Sensor sensor, long endTime, List dataList) { + private void addAggregateDataToDataNode(DataNode deviceNode, long endTime, List dataList) { DataNode timestampNode = new DataNode(DataNode.DataType.List); DataNode dataNode = new DataNode(DataNode.DataType.List); // end timestamp @@ -95,13 +128,8 @@ public class SensorJsonPage extends HalJsonPage { timestampNode.add(System.currentTimeMillis()); dataNode.add((String)null); - DataNode deviceNode = new DataNode(DataNode.DataType.Map); - deviceNode.set("name", sensor.getName()); - deviceNode.set("user", sensor.getUser().getUsername()); - deviceNode.set("type", sensor.getDeviceConfig().getSensorDataClass().getSimpleName()); deviceNode.set("timestamps", timestampNode); deviceNode.set("data", dataNode); - root.add(deviceNode); } }