From c27620d63dac752185811170abb500f1c1285942 Mon Sep 17 00:00:00 2001 From: dcollin Date: Fri, 4 Dec 2015 07:36:07 +0100 Subject: [PATCH] Added synchronizer daemon Former-commit-id: ee3100d97cad83de5498f38467ac61a922398cb6 --- hal.db | Bin 928768 -> 928768 bytes src/se/koc/hal/PowerChallenge.java | 12 +++++----- .../koc/hal/deamon/DataAggregatorDaemon.java | 21 +++++++++--------- src/se/koc/hal/page/PCConfigureHttpPage.java | 4 ++-- src/se/koc/hal/page/PCOverviewHttpPage.java | 8 +++---- web-resource/configure.html | 3 ++- web-resource/index.html | 13 ++++++----- 7 files changed, 32 insertions(+), 29 deletions(-) diff --git a/hal.db b/hal.db index 6d03a93c177fc5ff4517f5b18c6f576381a79cc9..357481c91fd6f679b7b3de60cb31bf72b0429515 100755 GIT binary patch delta 687 zcmYjOO=uHA6n<}JH`!z}SS4!KM6wu))lhN~EmBFP>cN7TOZ|ZuF(nldjan+UjZGD) zKL-=mu-Yi*Ac_jMHitdbgM#9v)E{~XNNo_U;!Uth#e=U)TDvpfH_LqAn|bqIw$hZX zH0Ata27q4!U{e4%lyBG~&p_j+HBUQAPKORvfU2PcqDDku*o)Eo~c@?78) z8}%@c_aiv)4W}eqvBJ~*81KXPhVIkK5#JC7u>y`_3_nvG`#Bt;g%{iSe(W0d5uYf3 z(~hIgW=Hn$ZdfrACUz8?Z4Qz(cBh*n6r;>!AVdEE`r;Vbd~SLlBJ~8UMBCN>r>X{ z(`wIw-RD4q7eMm^%;GZKfUOwEvzW)n_zJ%=7Yng%EYAAbEjGrc*l)g^hxtyP;9nL7 zOh6fKLdI;lC#^D%jH?Oj&$v3qaL~+L5v#Y-EB#2VqO+6?l{$9)IdOaFE~b`B=k3i} z8*%--WKK|gc&RB%ro~QTy&x@s0#INBC4R_MZir28cn22Th5_izZ`aJuw`!W|{Xd5R mIwLtQdzTR5HX(HMRPYh|byBgI^JQz?X)6#m5nYv~;wby= zf3GFBdM&eMGC_vOanedMKe^ZGqISFJ>ZMxX=bi{Ol^2pvWatUBe_D!huUYQN&>pmJ zJ{#v=RPN?9D!RG>W|B#6jv>Fo6F*F~qW&xBT=bq6U89xe9m3}l>~`w1Z>L&FsU}nd z`F?6l{G%#XdWtR(++~vS!aZ^B-Hckn8Pwe=O_-n?^x7nF-AFx zK^3XlYcW3LC;}}U59L^lGaQAX{z|_OMl?IS!I=sTe3!P)e%3_S2sGG~vKr?&nunJE zG3~ZYa-O3kblb_XjTU2!qd0VjH=3^)s?!za`zWol7@X=anl~uMgU;0rmc}`XKtthB zo?;YbjgL4ALu+UKl41n1#>X6~(7N_CjE!026B8XG(E7hpm}8S^)Zr~k7dV@TYJ=13 z6r(shWP+n4^!dP;S1~qcjf)(`p^b@Xj$#Cz!!hyx9g0zs?eQ7B=4T?%mQ)BmO0&l2 z9EG8WUh_K?qs%${gLw6_NAP&(h)Az7oSIs?fSXR%!FuQ&dTUtq`i8f99aE2bho~PL zDjFJHz`yY4WCdL&j!QP&-@Rmh0&Hr@_cB%4!N~^JMe--hpbq0Pt{BR+b6wDG=@ zA63&kke0DqyzgeT>ud1D@cc41m(yajcU_E_=d8XaB;#!W%Z(Yg5y!D|60-)XpPZKW zW#~TMPSUAC*I_~L*yTC%mQC%qsT3g~7{Z3IBOC}PLPWR_ISHHUX1nS6gxKls7VP=h zhL*&@5%=-Ek6$J}vO>rTmFX5*M-R{*IzlJu_jnC|3#zbFXcD@F5#cN0mT;FT>>>6v zYh}G`lr5T<9$s(<^p+X-eo3p%?ZSiB7UcM8vwp0`vtgavN%4&fE`j_4!=Ctd#{IQG z8}!KAl7iPp3P<`S#XKd2WcKwld-`mtf@ydx)?{&&`t_(6@&rZ!TLT zzmuCJLC%slNc*WLe0uv0cc=blfk)Z4g-?h?B#j9#^r^f$t!3}vc>&wfCFu%tUcCV; z;7if(oRpL*>snsHcPeU0D2h^<)p?b(I22W>l;;`3=+!(oknvx64x?Y;co>SpQ*O<3 zgfpziEIeCzp230tj6MoC*fbACsWEHt+S9zwSrUp`!=1$K0qH93n|1fidM0M27ybc` C(RqLX diff --git a/src/se/koc/hal/PowerChallenge.java b/src/se/koc/hal/PowerChallenge.java index 5ccfd139..74afb573 100755 --- a/src/se/koc/hal/PowerChallenge.java +++ b/src/se/koc/hal/PowerChallenge.java @@ -2,6 +2,7 @@ package se.koc.hal; import se.koc.hal.deamon.DataAggregatorDaemon; +import se.koc.hal.deamon.DataSynchronizationDaemon; import se.koc.hal.deamon.HalDaemon; import se.koc.hal.page.PCConfigureHttpPage; import se.koc.hal.page.PCHeatMapHttpPage; @@ -20,21 +21,20 @@ import java.util.logging.Level; * Created by Ziver on 2015-12-03. */ public class PowerChallenge { - - public static DBConnection db; + private static HalDaemon[] daemons = new HalDaemon[]{ - new DataAggregatorDaemon() + new DataAggregatorDaemon(), + new DataSynchronizationDaemon() }; public static void main(String[] args) throws Exception { + HalContext.initialize(); + // init logging LogUtil.setGlobalLevel(Level.ALL); LogUtil.setGlobalFormatter(new CompactLogFormatter()); - - // init Database - db = new DBConnection(DBConnection.DBMS.SQLite, "hal.db"); // init daemons Timer daemonTimer = new Timer(); diff --git a/src/se/koc/hal/deamon/DataAggregatorDaemon.java b/src/se/koc/hal/deamon/DataAggregatorDaemon.java index 483a4400..02c38255 100755 --- a/src/se/koc/hal/deamon/DataAggregatorDaemon.java +++ b/src/se/koc/hal/deamon/DataAggregatorDaemon.java @@ -11,7 +11,7 @@ import java.util.Timer; import java.util.TimerTask; import java.util.logging.Logger; -import se.koc.hal.PowerChallenge; +import se.koc.hal.HalContext; import zutil.db.DBConnection; import zutil.db.SQLResultHandler; import zutil.db.handler.SimpleSQLHandler; @@ -31,14 +31,13 @@ public class DataAggregatorDaemon extends TimerTask implements HalDaemon { public void initiate(Timer timer){ - timer.schedule(this, FIVE_MINUTES_IN_MS); - run(); + timer.schedule(this, 0, FIVE_MINUTES_IN_MS); } @Override public void run(){ try { - List sensorIdList = PowerChallenge.db.exec("SELECT id FROM sensor", new SQLResultHandler>(){ + List sensorIdList = HalContext.db.exec("SELECT id FROM sensor", new SQLResultHandler>(){ @Override public List handleQueryResult(Statement stmt, ResultSet result) throws SQLException { ArrayList list = new ArrayList<>(); @@ -58,7 +57,7 @@ public class DataAggregatorDaemon extends TimerTask implements HalDaemon { } public void aggregateSensor(int sensorId) { - DBConnection db = PowerChallenge.db; + DBConnection db = HalContext.db; try { Long maxDBTimestamp = db.exec("SELECT MAX(timestamp_end) FROM sensor_data_aggr WHERE sensor_id == "+sensorId, new SimpleSQLHandler()); if(maxDBTimestamp == null) @@ -122,7 +121,7 @@ public class DataAggregatorDaemon extends TimerTask implements HalDaemon { } public static Integer getNextSequenceId(long sensorId) throws SQLException{ - Integer id = PowerChallenge.db.exec("SELECT MAX(sequence_id) FROM sensor_data_aggr WHERE sensor_id == "+ sensorId, new SimpleSQLHandler()); + Integer id = HalContext.db.exec("SELECT MAX(sequence_id) FROM sensor_data_aggr WHERE sensor_id == "+ sensorId, new SimpleSQLHandler()); return (id != null ? id+1 : 1); } @@ -138,7 +137,7 @@ public class DataAggregatorDaemon extends TimerTask implements HalDaemon { if(currentPeriodTimestamp != 0 && periodTimestamp != currentPeriodTimestamp){ float confidence = Math.min(count / 5f, 1.0f); logger.finer("Calculated minute period: "+ currentPeriodTimestamp +" sum: "+ sum +" confidence: "+ confidence); - PowerChallenge.db.exec(String.format(Locale.US, "INSERT INTO sensor_data_aggr(sensor_id, sequence_id, timestamp_start, timestamp_end, data, confidence) VALUES(%d, %d, %d, %d, %d, %f)", + HalContext.db.exec(String.format(Locale.US, "INSERT INTO sensor_data_aggr(sensor_id, sequence_id, timestamp_start, timestamp_end, data, confidence) VALUES(%d, %d, %d, %d, %d, %f)", result.getInt("sensor_id"), getNextSequenceId(result.getInt("sensor_id")), currentPeriodTimestamp, @@ -170,7 +169,7 @@ public class DataAggregatorDaemon extends TimerTask implements HalDaemon { if(currentPeriodTimestamp != 0 && periodTimestamp != currentPeriodTimestamp){ float aggrConfidence = confidenceSum / 12f; logger.finer("Calculated hour period: "+ currentPeriodTimestamp +" sum: "+ sum +" confidence: "+ aggrConfidence); - PowerChallenge.db.exec(String.format(Locale.US, "INSERT INTO sensor_data_aggr(sensor_id, sequence_id, timestamp_start, timestamp_end, data, confidence) VALUES(%d, %d, %d, %d, %d, %f)", + HalContext.db.exec(String.format(Locale.US, "INSERT INTO sensor_data_aggr(sensor_id, sequence_id, timestamp_start, timestamp_end, data, confidence) VALUES(%d, %d, %d, %d, %d, %f)", result.getInt("sensor_id"), getNextSequenceId(result.getInt("sensor_id")), currentPeriodTimestamp, @@ -187,7 +186,7 @@ public class DataAggregatorDaemon extends TimerTask implements HalDaemon { confidenceSum += result.getFloat("confidence"); //TODO: SHould not be here! - PowerChallenge.db.exec("DELETE FROM sensor_data_aggr " + HalContext.db.exec("DELETE FROM sensor_data_aggr " + "WHERE sensor_id == "+ result.getInt("sensor_id") +" AND sequence_id == "+ result.getInt("sequence_id")); } return null; @@ -207,7 +206,7 @@ public class DataAggregatorDaemon extends TimerTask implements HalDaemon { if(currentPeriodTimestamp != 0 && periodTimestamp != currentPeriodTimestamp){ float aggrConfidence = confidenceSum / 24f; logger.finer("Calculated day period: "+ currentPeriodTimestamp +" sum: "+ sum +" confidence: "+ aggrConfidence+ " samples: " + samples); - PowerChallenge.db.exec(String.format(Locale.US, "INSERT INTO sensor_data_aggr(sensor_id, sequence_id, timestamp_start, timestamp_end, data, confidence) VALUES(%d, %d, %d, %d, %d, %f)", + HalContext.db.exec(String.format(Locale.US, "INSERT INTO sensor_data_aggr(sensor_id, sequence_id, timestamp_start, timestamp_end, data, confidence) VALUES(%d, %d, %d, %d, %d, %f)", result.getInt("sensor_id"), getNextSequenceId(result.getInt("sensor_id")), currentPeriodTimestamp, @@ -226,7 +225,7 @@ public class DataAggregatorDaemon extends TimerTask implements HalDaemon { samples++; //TODO: SHould not be here! - PowerChallenge.db.exec("DELETE FROM sensor_data_aggr " + HalContext.db.exec("DELETE FROM sensor_data_aggr " + "WHERE sensor_id == "+ result.getInt("sensor_id") +" AND sequence_id == "+ result.getInt("sequence_id")); } return null; diff --git a/src/se/koc/hal/page/PCConfigureHttpPage.java b/src/se/koc/hal/page/PCConfigureHttpPage.java index f5ae2e5c..95cc150a 100644 --- a/src/se/koc/hal/page/PCConfigureHttpPage.java +++ b/src/se/koc/hal/page/PCConfigureHttpPage.java @@ -4,7 +4,7 @@ import java.io.IOException; import java.sql.SQLException; import java.util.Map; -import se.koc.hal.PowerChallenge; +import se.koc.hal.HalContext; import se.koc.hal.struct.Sensor; import se.koc.hal.struct.User; import zutil.db.DBConnection; @@ -22,7 +22,7 @@ public class PCConfigureHttpPage implements HttpPage { Map request) throws IOException { try { - DBConnection db = PowerChallenge.db; + DBConnection db = HalContext.db; Templator tmpl = new Templator(FileUtil.find("web-resource/configure.html")); tmpl.set("user", User.getLocalUser(db)); diff --git a/src/se/koc/hal/page/PCOverviewHttpPage.java b/src/se/koc/hal/page/PCOverviewHttpPage.java index 5ee536e2..7b231c78 100644 --- a/src/se/koc/hal/page/PCOverviewHttpPage.java +++ b/src/se/koc/hal/page/PCOverviewHttpPage.java @@ -7,7 +7,7 @@ import java.sql.Statement; import java.util.ArrayList; import java.util.Map; -import se.koc.hal.PowerChallenge; +import se.koc.hal.HalContext; import se.koc.hal.deamon.DataAggregatorDaemon; import zutil.db.SQLResultHandler; import zutil.io.file.FileUtil; @@ -22,21 +22,21 @@ public class PCOverviewHttpPage implements HttpPage { public void respond(HttpPrintStream out, HttpHeaderParser client_info, Map session, Map cookie, Map request) throws IOException { try { - ArrayList minDataList = PowerChallenge.db.exec( + ArrayList minDataList = HalContext.db.exec( "SELECT user.username as username, sensor_data_aggr.timestamp_start as timestamp, sensor_data_aggr.data as data " + "FROM sensor_data_aggr, user, sensor " + "WHERE sensor.id = sensor_data_aggr.sensor_id " + "AND user.id = sensor.user_id " + "AND timestamp_end-timestamp_start == " + (DataAggregatorDaemon.FIVE_MINUTES_IN_MS-1), new SQLPowerDataBuilder()); - ArrayList hourDataList = PowerChallenge.db.exec( + ArrayList hourDataList = HalContext.db.exec( "SELECT user.username as username, sensor_data_aggr.timestamp_start as timestamp, sensor_data_aggr.data as data " + "FROM sensor_data_aggr, user, sensor " + "WHERE sensor.id = sensor_data_aggr.sensor_id " + "AND user.id = sensor.user_id " + "AND timestamp_end-timestamp_start == " + (DataAggregatorDaemon.HOUR_IN_MS-1), new SQLPowerDataBuilder()); - ArrayList dayDataList = PowerChallenge.db.exec( + ArrayList dayDataList = HalContext.db.exec( "SELECT user.username as username, sensor_data_aggr.timestamp_start as timestamp, sensor_data_aggr.data as data " + "FROM sensor_data_aggr, user, sensor " + "WHERE sensor.id = sensor_data_aggr.sensor_id " diff --git a/web-resource/configure.html b/web-resource/configure.html index ba03427b..6a3101ce 100644 --- a/web-resource/configure.html +++ b/web-resource/configure.html @@ -12,7 +12,7 @@ - + @@ -49,6 +49,7 @@
Profile Information
+
diff --git a/web-resource/index.html b/web-resource/index.html index 05e4a65e..5abbc6f9 100644 --- a/web-resource/index.html +++ b/web-resource/index.html @@ -13,16 +13,19 @@ - +