Initial implementaion of json support for charts

This commit is contained in:
Ziver Koc 2016-06-01 16:27:28 +02:00
parent 80a7989481
commit b229671abf
3 changed files with 138 additions and 57 deletions

View file

@ -21,34 +21,34 @@
$(function(){
chartData("min-power-chart",
[
{ y: (Date.now()-24*60*60*1000) },
{ time: (Date.now()-24*60*60*1000) },
{{#minData}}
{ y: {{.timestamp}}, "{{.id}}": {{.data}} },
{ time: {{.timestamp}}, "{{.id}}": {{.data}} },
{{/minData}}
{ y: Date.now() }
{ time: Date.now() }
]
);
chartData("hour-power-chart",
[
{ y: (Date.now()-7*24*60*60*1000) },
{ time: (Date.now()-7*24*60*60*1000) },
{{#hourData}}
{ y: {{.timestamp}}, "{{.id}}": {{.data}} },
{ time: {{.timestamp}}, "{{.id}}": {{.data}} },
{{/hourData}}
{ y: Date.now() }
{ time: Date.now() }
]
);
chartData("day-power-chart",
[{{#dayData}}
{ y: {{.timestamp}}, "{{.id}}": {{.data}} },
{ time: {{.timestamp}}, "{{.id}}": {{.data}} },
{{/dayData}}
{ y: Date.now() }
{ time: Date.now() }
]
);
chartData("week-power-chart",
[{{#weekData}}
{ y: {{.timestamp}}, "{{.id}}": {{.data}} },
{ time: {{.timestamp}}, "{{.id}}": {{.data}} },
{{/weekData}}
{ y: Date.now() }
{ time: Date.now() }
]
);
});
@ -57,7 +57,7 @@
Morris.Line({
element: elementId,
data: data,
xkey: 'y',
xkey: 'time',
ykeys: [ {{#sensors}} "{{.getId()}}", {{/sensors}} ],
labels: [ {{#sensors}} "{{.getUser().getUsername()}}: {{.getName()}}", {{/sensors}} ],
continuousLine: false,

View file

@ -9,7 +9,9 @@ import zutil.io.file.FileUtil;
import zutil.net.http.HttpHeader;
import zutil.net.http.HttpPage;
import zutil.net.http.HttpPrintStream;
import zutil.parser.DataNode;
import zutil.parser.Templator;
import zutil.parser.json.JSONWriter;
import java.io.IOException;
import java.util.Map;
@ -46,17 +48,26 @@ public abstract class HalHttpPage implements HttpPage{
Map<String, String> request) throws IOException {
try {
DBConnection db = HalContext.getDB();
Templator tmpl = new Templator(FileUtil.find(TEMPLATE));
tmpl.set("user", User.getLocalUser(db));
tmpl.set("nav", nav.getNavBreadcrumb().get(1));
tmpl.set("rootNav", rootNav);
tmpl.set("userNav", userNav);
tmpl.set("alerts", HalAlertManager.getInstance().generateAlerts());
tmpl.set("content", httpRespond(session, cookie, request));
out.print(tmpl.compile());
if(this instanceof HalJsonPage &&
(("application/json").equals(client_info.getHeader("ContentType")) ||
request.containsKey("json"))){
out.setHeader("Content-Type", "application/json");
JSONWriter writer = new JSONWriter(out);
writer.write(((HalJsonPage)this).jsonResponse(session,cookie, request));
writer.close();
}
else{
DBConnection db = HalContext.getDB();
Templator tmpl = new Templator(FileUtil.find(TEMPLATE));
tmpl.set("user", User.getLocalUser(db));
tmpl.set("nav", nav.getNavBreadcrumb().get(1));
tmpl.set("rootNav", rootNav);
tmpl.set("userNav", userNav);
tmpl.set("alerts", HalAlertManager.getInstance().generateAlerts());
tmpl.set("content", httpRespond(session, cookie, request));
out.print(tmpl.compile());
}
} catch (Exception e) {
throw new IOException(e);
}
@ -76,4 +87,13 @@ public abstract class HalHttpPage implements HttpPage{
Map<String, String> cookie,
Map<String, String> request)
throws Exception;
}
public interface HalJsonPage{
DataNode jsonResponse(
Map<String, Object> session,
Map<String, String> cookie,
Map<String, String> request)
throws Exception;
}
}

View file

@ -3,6 +3,7 @@ package se.hal.page;
import se.hal.HalContext;
import se.hal.deamon.SensorDataAggregatorDaemon.AggregationPeriodLength;
import se.hal.intf.HalHttpPage;
import se.hal.struct.PowerConsumptionSensorData;
import se.hal.struct.Sensor;
import se.hal.struct.User;
import se.hal.util.AggregateDataListSqlResult;
@ -10,60 +11,120 @@ import se.hal.util.AggregateDataListSqlResult.AggregateData;
import se.hal.util.UTCTimeUtility;
import zutil.db.DBConnection;
import zutil.io.file.FileUtil;
import zutil.parser.DataNode;
import zutil.parser.Templator;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
public class PCOverviewHttpPage extends HalHttpPage {
private static final String TEMPLATE = "resource/web/pc_overview.tmpl";
public class PCOverviewHttpPage extends HalHttpPage implements HalHttpPage.HalJsonPage {
private static final String TEMPLATE = "resource/web/pc_overview.tmpl";
public PCOverviewHttpPage() {
super("Power;Challenge", "pc_overview");
public PCOverviewHttpPage() {
super("Power;Challenge", "pc_overview");
super.getRootNav().getSubNav("sensors").addSubNav(super.getNav());
}
}
@Override
public Templator httpRespond(
Map<String, Object> session,
Map<String, String> cookie,
Map<String, String> request)
throws Exception{
@Override
public Templator httpRespond(
Map<String, Object> session,
Map<String, String> cookie,
Map<String, String> request)
throws Exception {
DBConnection db = HalContext.getDB();
DBConnection db = HalContext.getDB();
List<User> users = User.getUsers(db);
ArrayList<Sensor> sensors = new ArrayList<>();
ArrayList<AggregateData> minDataList = new ArrayList<>();
ArrayList<AggregateData> hourDataList = new ArrayList<>();
ArrayList<AggregateData> dayDataList = new ArrayList<>();
ArrayList<AggregateData> weekDataList = new ArrayList<>();
List<User> users = User.getUsers(db);
ArrayList<AggregateData> minDataList = new ArrayList<>();
ArrayList<AggregateData> hourDataList = new ArrayList<>();
ArrayList<AggregateData> dayDataList = new ArrayList<>();
ArrayList<AggregateData> weekDataList = new ArrayList<>();
for(User user : users){
List<Sensor> userSensors = Sensor.getSensors(db, user);
for(Sensor sensor : userSensors){
sensors.add(sensor);
minDataList.addAll(AggregateDataListSqlResult.getAggregateDataForPeriod(db, sensor, AggregationPeriodLength.FIVE_MINUTES, UTCTimeUtility.DAY_IN_MS));
List<Sensor> sensors = getSensorList(db);
for (Sensor sensor : sensors) {
minDataList.addAll(AggregateDataListSqlResult.getAggregateDataForPeriod(db, sensor, AggregationPeriodLength.FIVE_MINUTES, UTCTimeUtility.DAY_IN_MS));
hourDataList.addAll(AggregateDataListSqlResult.getAggregateDataForPeriod(db, sensor, AggregationPeriodLength.HOUR, UTCTimeUtility.WEEK_IN_MS));
hourDataList.addAll(AggregateDataListSqlResult.getAggregateDataForPeriod(db, sensor, AggregationPeriodLength.HOUR, UTCTimeUtility.WEEK_IN_MS));
dayDataList.addAll(AggregateDataListSqlResult.getAggregateDataForPeriod(db, sensor, AggregationPeriodLength.DAY, UTCTimeUtility.INFINITY));
dayDataList.addAll(AggregateDataListSqlResult.getAggregateDataForPeriod(db, sensor, AggregationPeriodLength.DAY, UTCTimeUtility.INFINITY));
weekDataList.addAll(AggregateDataListSqlResult.getAggregateDataForPeriod(db, sensor, AggregationPeriodLength.WEEK, UTCTimeUtility.INFINITY));
}
}
weekDataList.addAll(AggregateDataListSqlResult.getAggregateDataForPeriod(db, sensor, AggregationPeriodLength.WEEK, UTCTimeUtility.INFINITY));
}
Templator tmpl = new Templator(FileUtil.find(TEMPLATE));
Templator tmpl = new Templator(FileUtil.find(TEMPLATE));
tmpl.set("users", User.getUsers(db));
tmpl.set("sensors", sensors);
tmpl.set("minData", minDataList);
tmpl.set("hourData", hourDataList);
tmpl.set("dayData", dayDataList);
tmpl.set("weekData", weekDataList);
tmpl.set("minData", minDataList);
tmpl.set("hourData", hourDataList);
tmpl.set("dayData", dayDataList);
tmpl.set("weekData", weekDataList);
return tmpl;
}
return tmpl;
}
@Override
public DataNode jsonResponse(
Map<String, Object> session,
Map<String, String> cookie,
Map<String, String> request) throws Exception {
DataNode root = new DataNode(DataNode.DataType.Map);
DBConnection db = HalContext.getDB();
List<Sensor> sensors = getSensorList(db);
if (request.get("data").contains("minute")) {
DataNode node = new DataNode(DataNode.DataType.List);
for (Sensor sensor : sensors)
addAggregateDataToDataNode(node,
AggregateDataListSqlResult.getAggregateDataForPeriod(db, sensor, AggregationPeriodLength.FIVE_MINUTES, UTCTimeUtility.DAY_IN_MS));
root.set("minuteData", node);
}
if (request.get("data").contains("hour")) {
DataNode node = new DataNode(DataNode.DataType.List);
for (Sensor sensor : sensors)
addAggregateDataToDataNode(node,
AggregateDataListSqlResult.getAggregateDataForPeriod(db, sensor, AggregationPeriodLength.HOUR, UTCTimeUtility.WEEK_IN_MS));
root.set("minuteData", node);
}
if (request.get("data").contains("day")) {
DataNode node = new DataNode(DataNode.DataType.List);
for (Sensor sensor : sensors)
addAggregateDataToDataNode(node,
AggregateDataListSqlResult.getAggregateDataForPeriod(db, sensor, AggregationPeriodLength.DAY, UTCTimeUtility.INFINITY));
root.set("minuteData", node);
}
if (request.get("data").contains("week")) {
DataNode node = new DataNode(DataNode.DataType.List);
for (Sensor sensor : sensors)
addAggregateDataToDataNode(node,
AggregateDataListSqlResult.getAggregateDataForPeriod(db, sensor, AggregationPeriodLength.WEEK, UTCTimeUtility.INFINITY));
root.set("minuteData", node);
}
return root;
}
private void addAggregateDataToDataNode(DataNode root, List<AggregateData> dataList) {
for (AggregateDataListSqlResult.AggregateData data : dataList) {
DataNode dataNode = new DataNode(DataNode.DataType.Map);
dataNode.set("time", data.timestamp);
dataNode.set("" + data.id, data.data);
root.add(dataNode);
}
}
/**
* @return a List of all PowerConsumption sensors
*/
private List<Sensor> getSensorList(DBConnection db) throws SQLException {
List<Sensor> sensors = new ArrayList<>();
for (Sensor sensor : Sensor.getSensors(db)) {
if (sensor instanceof PowerConsumptionSensorData)
sensors.add(sensor);
}
return sensors;
}
}