diff --git a/src/se/hal/HalContext.java b/src/se/hal/HalContext.java index 97b3db79..db25ece7 100755 --- a/src/se/hal/HalContext.java +++ b/src/se/hal/HalContext.java @@ -31,18 +31,18 @@ public class HalContext { private static DBConnection db; // TODO: Should probably be a db pool as we have multiple threads accessing the DB private static Properties defaultFileConf; - private static Properties fileConf; - private static Properties dbConf; + private static Properties fileConf; + private static Properties dbConf; - static { - defaultFileConf = new Properties(); - defaultFileConf.setProperty("http_port", ""+8080); - defaultFileConf.setProperty("sync_port", ""+6666); - } - - - public static void initialize(){ + static { + defaultFileConf = new Properties(); + defaultFileConf.setProperty("http_port", ""+8080); + defaultFileConf.setProperty("sync_port", ""+6666); + } + + + public static void initialize(){ try { // Read conf fileConf = new Properties(defaultFileConf); @@ -82,9 +82,9 @@ public class HalContext { if(defaultDBVersion > dbVersion ) { logger.info("Starting DB upgrade..."); if(dbFile != null){ - File backupDB = FileUtil.getNextFile(dbFile); - logger.fine("Backing up DB to: "+ backupDB); - FileUtil.copy(dbFile, backupDB); + File backupDB = FileUtil.getNextFile(dbFile); + logger.fine("Backing up DB to: "+ backupDB); + FileUtil.copy(dbFile, backupDB); } logger.fine(String.format("Upgrading DB (from: v%s, to: v%s)...", dbVersion, defaultDBVersion)); @@ -92,43 +92,43 @@ public class HalContext { handler.addIgnoredTable("db_version_history"); handler.addIgnoredTable("sqlite_sequence"); //sqlite internal handler.setTargetDB(db); - + logger.fine("Performing pre-upgrade activities"); //read upgrade path preferences from the reference database referenceDB.exec("SELECT * FROM db_version_history" - + " WHERE db_version <= " + defaultDBVersion - + " AND db_version > " + dbVersion, - new SQLResultHandler() { - @Override - public Object handleQueryResult(Statement stmt, ResultSet result) throws SQLException { - while(result.next()){ - if(result.getBoolean("force_upgrade")){ + + " WHERE db_version <= " + defaultDBVersion + + " AND db_version > " + dbVersion, + new SQLResultHandler() { + @Override + public Object handleQueryResult(Statement stmt, ResultSet result) throws SQLException { + while(result.next()){ + if(result.getBoolean("force_upgrade")){ logger.fine("Forced upgrade enabled"); - handler.setForcedDBUpgrade(true); //set to true if any of the intermediate db version requires it. - } - } - return null; - } - }); - + handler.setForcedDBUpgrade(true); //set to true if any of the intermediate db version requires it. + } + } + return null; + } + }); + handler.upgrade(); - + logger.fine("Performing post-upgrade activities"); //read upgrade path preferences from the reference database referenceDB.exec("SELECT * FROM db_version_history" - + " WHERE db_version <= " + defaultDBVersion - + " AND db_version > " + dbVersion, - new SQLResultHandler() { - @Override - public Object handleQueryResult(Statement stmt, ResultSet result) throws SQLException { + + " WHERE db_version <= " + defaultDBVersion + + " AND db_version > " + dbVersion, + new SQLResultHandler() { + @Override + public Object handleQueryResult(Statement stmt, ResultSet result) throws SQLException { boolean clearExternalAggrData = false; boolean clearInternalAggrData = false; - while(result.next()){ - if(result.getBoolean("clear_external_aggr_data")) + while(result.next()){ + if(result.getBoolean("clear_external_aggr_data")) clearExternalAggrData = true; - if(result.getBoolean("clear_internal_aggr_data")) + if(result.getBoolean("clear_internal_aggr_data")) clearInternalAggrData = true; - } + } if(clearExternalAggrData){ logger.fine("Clearing external aggregate data"); @@ -143,9 +143,9 @@ public class HalContext { db.exec("UPDATE sensor SET aggr_version = (aggr_version+1) WHERE id = " + "(SELECT sensor.id FROM user, sensor WHERE user.external == 0 AND sensor.user_id = user.id)"); } - return null; - } - }); + return null; + } + }); if (dbVersion < 9) { // tellstick code has changed package db.exec("UPDATE sensor SET type = 'se.hal.plugin.tellstick.device.Oregon0x1A2D' WHERE type = 'se.hal.plugin.tellstick.protocols.Oregon0x1A2D'"); db.exec("UPDATE event SET type = 'se.hal.plugin.tellstick.device.NexaSelfLearning' WHERE type = 'se.hal.plugin.tellstick.protocols.NexaSelfLearning'"); @@ -168,7 +168,7 @@ public class HalContext { } catch (Exception e){ throw new RuntimeException(e); } - } + } public static String getStringProperty(String key){ @@ -217,13 +217,13 @@ public class HalContext { public static DBConnection getDB(){ return db; } - + /** * For testing purposes. * @param db */ public static void setDB(DBConnection db){ - HalContext.db = db; + HalContext.db = db; } diff --git a/src/se/hal/bot/AliceBot.java b/src/se/hal/bot/AliceBot.java index 656bc831..2eb10633 100755 --- a/src/se/hal/bot/AliceBot.java +++ b/src/se/hal/bot/AliceBot.java @@ -30,9 +30,6 @@ import zutil.io.file.FileUtil; import java.io.File; -/** - * Created by Ziver on 2015-05-07. - */ public class AliceBot implements HalBot{ private Chat chatSession; diff --git a/src/se/hal/daemon/PCDataSynchronizationClient.java b/src/se/hal/daemon/PCDataSynchronizationClient.java index 8592a5c1..5af5b33b 100755 --- a/src/se/hal/daemon/PCDataSynchronizationClient.java +++ b/src/se/hal/daemon/PCDataSynchronizationClient.java @@ -31,31 +31,31 @@ import java.util.logging.Level; import java.util.logging.Logger; public class PCDataSynchronizationClient implements HalDaemon { - private static final Logger logger = LogUtil.getLogger(); - private static final long SYNC_INTERVAL = 5 * 60 * 1000; // 5 min + private static final Logger logger = LogUtil.getLogger(); + private static final long SYNC_INTERVAL = 5 * 60 * 1000; // 5 min - @Override - public void initiate(ScheduledExecutorService executor){ - executor.scheduleAtFixedRate(this, 10000, SYNC_INTERVAL, TimeUnit.MILLISECONDS); - } + @Override + public void initiate(ScheduledExecutorService executor){ + executor.scheduleAtFixedRate(this, 10000, SYNC_INTERVAL, TimeUnit.MILLISECONDS); + } - @Override - public void run() { - try { - DBConnection db = HalContext.getDB(); - List users = User.getExternalUsers(db); - for(User user : users){ - if(user.getHostname() == null){ - logger.fine("Hostname not defined for user: "+ user.getUsername()); - continue; - } - logger.fine("Synchronizing user: "+ user.getUsername() +" ("+user.getHostname()+":"+user.getPort()+")"); - try (Socket s = new Socket(user.getHostname(), user.getPort());){ - ObjectOutputStream out = new ObjectOutputStream(s.getOutputStream()); - ObjectInputStream in = new ObjectInputStream(s.getInputStream()); + @Override + public void run() { + try { + DBConnection db = HalContext.getDB(); + List users = User.getExternalUsers(db); + for(User user : users){ + if(user.getHostname() == null){ + logger.fine("Hostname not defined for user: "+ user.getUsername()); + continue; + } + logger.fine("Synchronizing user: "+ user.getUsername() +" ("+user.getHostname()+":"+user.getPort()+")"); + try (Socket s = new Socket(user.getHostname(), user.getPort());){ + ObjectOutputStream out = new ObjectOutputStream(s.getOutputStream()); + ObjectInputStream in = new ObjectInputStream(s.getInputStream()); - // Check server protocol version + // Check server protocol version int version = in.readInt(); if(version != PCDataSynchronizationDaemon.PROTOCOL_VERSION){ logger.warning("Protocol version do not match, skipping user. " + @@ -74,82 +74,82 @@ public class PCDataSynchronizationClient implements HalDaemon { user.save(db); for(SensorDTO sensorDTO : peerData.sensors){ - try { // We might not have the sensor plugin installed - Sensor sensor = Sensor.getExternalSensor(db, user, sensorDTO.sensorId); - if(sensor == null) { // new sensor - sensor = new Sensor(); - logger.fine("Created new external sensor with external_id: "+ sensorDTO.sensorId); - } - else - logger.fine("Updating external sensor with id: "+ sensor.getId() +" and external_id: "+ sensor.getExternalId()); - sensor.setExternalId(sensorDTO.sensorId); - sensor.setName(sensorDTO.name); - sensor.setType(sensorDTO.type); - sensor.setUser(user); + try { // We might not have the sensor plugin installed + Sensor sensor = Sensor.getExternalSensor(db, user, sensorDTO.sensorId); + if(sensor == null) { // new sensor + sensor = new Sensor(); + logger.fine("Created new external sensor with external_id: "+ sensorDTO.sensorId); + } + else + logger.fine("Updating external sensor with id: "+ sensor.getId() +" and external_id: "+ sensor.getExternalId()); + sensor.setExternalId(sensorDTO.sensorId); + sensor.setName(sensorDTO.name); + sensor.setType(sensorDTO.type); + sensor.setUser(user); - sensor.getDeviceConfigurator().setValues(JSONParser.read(sensorDTO.config)).applyConfiguration(); - sensor.save(db); - } catch (Exception e){ - logger.warning("Unable to register external sensor: " + - "name="+sensorDTO.name+", type="+ sensorDTO.type); - } + sensor.getDeviceConfigurator().setValues(JSONParser.read(sensorDTO.config)).applyConfiguration(); + sensor.save(db); + } catch (Exception e){ + logger.warning("Unable to register external sensor: " + + "name="+sensorDTO.name+", type="+ sensorDTO.type); + } } // Request sensor data - List sensors = Sensor.getSensors(db, user); - for(Sensor sensor : sensors){ - if(sensor.isSynced()) { - SensorDataReqDTO req = new SensorDataReqDTO(); - req.sensorId = sensor.getExternalId(); - req.offsetSequenceId = Sensor.getHighestSequenceId(sensor.getId()); - req.aggregationVersion = sensor.getAggregationVersion(); - out.writeObject(req); + List sensors = Sensor.getSensors(db, user); + for(Sensor sensor : sensors){ + if(sensor.isSynced()) { + SensorDataReqDTO req = new SensorDataReqDTO(); + req.sensorId = sensor.getExternalId(); + req.offsetSequenceId = Sensor.getHighestSequenceId(sensor.getId()); + req.aggregationVersion = sensor.getAggregationVersion(); + out.writeObject(req); - SensorDataListDTO dataList = (SensorDataListDTO) in.readObject(); - if(dataList.aggregationVersion != sensor.getAggregationVersion()){ - logger.fine("The peer has modified its aggregated data, clearing aggregate data. oldAggregationVersion:"+sensor.getAggregationVersion()+" , newAggregationVersion:"+dataList.aggregationVersion); - - //clear old aggregated data for sensor - sensor.clearAggregatedData(db); - - //save new aggregationVersion - sensor.setAggregationVersion(dataList.aggregationVersion); - sensor.save(db); - } - for (SensorDataDTO data : dataList) { - PreparedStatement stmt = db.getPreparedStatement("INSERT INTO sensor_data_aggr(sensor_id, sequence_id, timestamp_start, timestamp_end, data, confidence) VALUES(?, ?, ?, ?, ?, ?)"); - stmt.setLong(1, sensor.getId()); - stmt.setLong(2, data.sequenceId); - stmt.setLong(3, data.timestampStart); - stmt.setLong(4, data.timestampEnd); - stmt.setInt(5, data.data); - stmt.setFloat(6, data.confidence); - DBConnection.exec(stmt); - } - logger.fine("Stored " + dataList.size() + " entries for sensor " + sensor.getId() + " with offset "+ req.offsetSequenceId +" from " + user.getUsername()); - } + SensorDataListDTO dataList = (SensorDataListDTO) in.readObject(); + if(dataList.aggregationVersion != sensor.getAggregationVersion()){ + logger.fine("The peer has modified its aggregated data, clearing aggregate data. oldAggregationVersion:"+sensor.getAggregationVersion()+" , newAggregationVersion:"+dataList.aggregationVersion); + + //clear old aggregated data for sensor + sensor.clearAggregatedData(db); + + //save new aggregationVersion + sensor.setAggregationVersion(dataList.aggregationVersion); + sensor.save(db); + } + for (SensorDataDTO data : dataList) { + PreparedStatement stmt = db.getPreparedStatement("INSERT INTO sensor_data_aggr(sensor_id, sequence_id, timestamp_start, timestamp_end, data, confidence) VALUES(?, ?, ?, ?, ?, ?)"); + stmt.setLong(1, sensor.getId()); + stmt.setLong(2, data.sequenceId); + stmt.setLong(3, data.timestampStart); + stmt.setLong(4, data.timestampEnd); + stmt.setInt(5, data.data); + stmt.setFloat(6, data.confidence); + DBConnection.exec(stmt); + } + logger.fine("Stored " + dataList.size() + " entries for sensor " + sensor.getId() + " with offset "+ req.offsetSequenceId +" from " + user.getUsername()); + } else logger.fine("Sensor not marked for syncing, skipping sensor id: " + sensor.getId()); - } - out.writeObject(null); // Tell server we are disconnecting + } + out.writeObject(null); // Tell server we are disconnecting - } catch (NoRouteToHostException|UnknownHostException|ConnectException e) { - logger.warning("Unable to connect to "+ user.getHostname()+":"+user.getPort() +", "+ e.getMessage()); - HalAlertManager.getInstance().addAlert(new HalAlert(HalAlertManager.AlertLevel.WARNING, - "Unable to connect to user with host: "+user.getHostname(), AlertTTL.DISMISSED)); - } catch (Exception e) { + } catch (NoRouteToHostException|UnknownHostException|ConnectException e) { + logger.warning("Unable to connect to "+ user.getHostname()+":"+user.getPort() +", "+ e.getMessage()); + HalAlertManager.getInstance().addAlert(new HalAlert(HalAlertManager.AlertLevel.WARNING, + "Unable to connect to user with host: "+user.getHostname(), AlertTTL.DISMISSED)); + } catch (Exception e) { logger.log(Level.SEVERE, null, e); - } + } - } - } catch (SQLException e) { - logger.log(Level.SEVERE, "Thread has crashed", e); - } - } + } + } catch (SQLException e) { + logger.log(Level.SEVERE, "Thread has crashed", e); + } + } - /////////////// DTO /////////////////////// + /////////////// DTO /////////////////////// /** * Request Peer information and isAvailable sensors @@ -160,10 +160,10 @@ public class PCDataSynchronizationClient implements HalDaemon { * Request aggregate data for a specific sensor and offset */ protected static class SensorDataReqDTO implements Serializable{ - private static final long serialVersionUID = -9066734025245139989L; - - public long sensorId; - public long offsetSequenceId; // highest known sequence id - public long aggregationVersion = 0; - } + private static final long serialVersionUID = -9066734025245139989L; + + public long sensorId; + public long offsetSequenceId; // highest known sequence id + public long aggregationVersion = 0; + } } diff --git a/src/se/hal/daemon/PCDataSynchronizationDaemon.java b/src/se/hal/daemon/PCDataSynchronizationDaemon.java index 725e8d11..c8e57e5e 100644 --- a/src/se/hal/daemon/PCDataSynchronizationDaemon.java +++ b/src/se/hal/daemon/PCDataSynchronizationDaemon.java @@ -28,54 +28,54 @@ import java.util.logging.Level; import java.util.logging.Logger; public class PCDataSynchronizationDaemon extends ThreadedTCPNetworkServer implements HalDaemon { - private static final Logger logger = LogUtil.getLogger(); + private static final Logger logger = LogUtil.getLogger(); public static final int PROTOCOL_VERSION = 5; // Increment for protocol changes - public PCDataSynchronizationDaemon() { - super(HalContext.getIntegerProperty("sync_port")); - } + public PCDataSynchronizationDaemon() { + super(HalContext.getIntegerProperty("sync_port")); + } - @Override - public void initiate(ScheduledExecutorService executor){ - this.start(); - } + @Override + public void initiate(ScheduledExecutorService executor){ + this.start(); + } - @Override - protected ThreadedTCPNetworkServerThread getThreadInstance(Socket s) { - try { - return new DataSynchronizationDaemonThread(s); - } catch (IOException e) { + @Override + protected ThreadedTCPNetworkServerThread getThreadInstance(Socket s) { + try { + return new DataSynchronizationDaemonThread(s); + } catch (IOException e) { logger.log(Level.SEVERE, "Unable to create DataSynchronizationDaemonThread", e); - } - return null; - } + } + return null; + } - private class DataSynchronizationDaemonThread implements ThreadedTCPNetworkServerThread{ - private Socket s; - private ObjectOutputStream out; - private ObjectInputStream in; + private class DataSynchronizationDaemonThread implements ThreadedTCPNetworkServerThread{ + private Socket s; + private ObjectOutputStream out; + private ObjectInputStream in; - public DataSynchronizationDaemonThread(Socket s) throws IOException{ - this.s = s; - this.out = new ObjectOutputStream(s.getOutputStream()); - this.in = new ObjectInputStream(s.getInputStream()); - } + public DataSynchronizationDaemonThread(Socket s) throws IOException{ + this.s = s; + this.out = new ObjectOutputStream(s.getOutputStream()); + this.in = new ObjectInputStream(s.getInputStream()); + } - public void run(){ - logger.fine("User connected: "+ s.getInetAddress().getHostName()); + public void run(){ + logger.fine("User connected: "+ s.getInetAddress().getHostName()); DBConnection db = HalContext.getDB(); - try { - Object obj = null; + try { + Object obj = null; out.writeInt(PROTOCOL_VERSION); // send our protocol version to client out.flush(); - while((obj = in.readObject()) != null){ + while((obj = in.readObject()) != null){ if(obj instanceof PeerDataReqDTO){ logger.fine("Client requesting peer data"); PeerDataRspDTO rsp = new PeerDataRspDTO(); @@ -97,20 +97,20 @@ public class PCDataSynchronizationDaemon extends ThreadedTCPNetworkServer implem } out.writeObject(rsp); } - if(obj instanceof SensorDataReqDTO){ - SensorDataReqDTO req = (SensorDataReqDTO) obj; + if(obj instanceof SensorDataReqDTO){ + SensorDataReqDTO req = (SensorDataReqDTO) obj; Sensor sensor = Sensor.getSensor(db, req.sensorId); if(sensor.isSynced()) { - PreparedStatement stmt = db.getPreparedStatement("SELECT * FROM sensor_data_aggr WHERE sensor_id == ? AND sequence_id > ?"); - stmt.setLong(1, sensor.getId()); - logger.fine("Client requesting sensor data: sensorId: " + req.sensorId + ", offset: " + req.offsetSequenceId + ", " + req.aggregationVersion); - if(req.aggregationVersion != sensor.getAggregationVersion()){ - logger.fine("The requested aggregation version does not match the local version: " + sensor.getAggregationVersion() + ". Will re-send all aggregated data."); - stmt.setLong(2, 0); //0 since we want to re-send all data to the peer - }else{ - stmt.setLong(2, req.offsetSequenceId); - } - + PreparedStatement stmt = db.getPreparedStatement("SELECT * FROM sensor_data_aggr WHERE sensor_id == ? AND sequence_id > ?"); + stmt.setLong(1, sensor.getId()); + logger.fine("Client requesting sensor data: sensorId: " + req.sensorId + ", offset: " + req.offsetSequenceId + ", " + req.aggregationVersion); + if(req.aggregationVersion != sensor.getAggregationVersion()){ + logger.fine("The requested aggregation version does not match the local version: " + sensor.getAggregationVersion() + ". Will re-send all aggregated data."); + stmt.setLong(2, 0); //0 since we want to re-send all data to the peer + }else{ + stmt.setLong(2, req.offsetSequenceId); + } + SensorDataListDTO rsp = DBConnection.exec(stmt, new SQLResultHandler() { @Override public SensorDataListDTO handleQueryResult(Statement stmt, ResultSet result) throws SQLException { @@ -131,25 +131,25 @@ public class PCDataSynchronizationDaemon extends ThreadedTCPNetworkServer implem logger.fine("Sending " + rsp.size() + " sensor data items to client"); out.writeObject(rsp); } - else{ + else{ logger.warning("Client requesting non synced sensor data: sensorId: " + req.sensorId + ", offset: " + req.offsetSequenceId); SensorDataListDTO rsp = new SensorDataListDTO(); out.writeObject(rsp); } - } - } + } + } out.close(); in.close(); - s.close(); + s.close(); - } catch (Exception e) { - logger.log(Level.SEVERE, null, e); - } + } catch (Exception e) { + logger.log(Level.SEVERE, null, e); + } logger.fine("User disconnected: "+ s.getInetAddress().getHostName()); - } - } + } + } - /////////////// DTO /////////////////////// + /////////////// DTO /////////////////////// protected static class PeerDataRspDTO implements Serializable{ public String username; public String email; @@ -165,18 +165,18 @@ public class PCDataSynchronizationDaemon extends ThreadedTCPNetworkServer implem } - protected static class SensorDataListDTO extends ArrayList implements Serializable{ - private static final long serialVersionUID = -5701618637734020691L; - - public long aggregationVersion = 0; - } - protected static class SensorDataDTO implements Serializable{ - private static final long serialVersionUID = 8494331502087736809L; - - public long sequenceId; - public long timestampStart; - public long timestampEnd; - public int data; - public float confidence; - } + protected static class SensorDataListDTO extends ArrayList implements Serializable{ + private static final long serialVersionUID = -5701618637734020691L; + + public long aggregationVersion = 0; + } + protected static class SensorDataDTO implements Serializable{ + private static final long serialVersionUID = 8494331502087736809L; + + public long sequenceId; + public long timestampStart; + public long timestampEnd; + public int data; + public float confidence; + } } diff --git a/src/se/hal/daemon/SensorDataCleanupDaemon.java b/src/se/hal/daemon/SensorDataCleanupDaemon.java index 56967f72..50afa0d3 100644 --- a/src/se/hal/daemon/SensorDataCleanupDaemon.java +++ b/src/se/hal/daemon/SensorDataCleanupDaemon.java @@ -20,36 +20,36 @@ import java.util.logging.Level; import java.util.logging.Logger; public class SensorDataCleanupDaemon implements HalDaemon { - private static final Logger logger = LogUtil.getLogger(); + private static final Logger logger = LogUtil.getLogger(); public void initiate(ScheduledExecutorService executor){ - executor.scheduleAtFixedRate(this, 5000, UTCTimeUtility.FIVE_MINUTES_IN_MS, TimeUnit.MILLISECONDS); + executor.scheduleAtFixedRate(this, 5000, UTCTimeUtility.FIVE_MINUTES_IN_MS, TimeUnit.MILLISECONDS); } @Override public void run(){ - try { - List sensorList = Sensor.getSensors(HalContext.getDB()); - for(Sensor sensor : sensorList){ - logger.fine("Deleting old data for sensor id: " + sensor.getId()); - cleanupSensor(sensor); - } + try { + List sensorList = Sensor.getSensors(HalContext.getDB()); + for(Sensor sensor : sensorList){ + logger.fine("Deleting old data for sensor id: " + sensor.getId()); + cleanupSensor(sensor); + } logger.fine("Data cleanup done"); - } catch (Exception e) { - logger.log(Level.SEVERE, "Thread has crashed", e); - } + } catch (Exception e) { + logger.log(Level.SEVERE, "Thread has crashed", e); + } } public void cleanupSensor(Sensor sensor) { - if (sensor.getUser() != null) { - cleanupSensorData(sensor.getId(), AggregationPeriodLength.FIVE_MINUTES, UTCTimeUtility.DAY_IN_MS); //clear 5-minute data older than a day - cleanupSensorData(sensor.getId(), AggregationPeriodLength.HOUR, UTCTimeUtility.WEEK_IN_MS); //clear 1-hour data older than a week - //cleanupSensorData(sensor.getId(), AggregationPeriodLength.day, TimeUtility.INFINITY); //clear 1-day data older than infinity - //cleanupSensorData(sensor.getId(), AggregationPeriodLength.week, TimeUtility.INFINITY); //clear 1-week data older than infinity - } + if (sensor.getUser() != null) { + cleanupSensorData(sensor.getId(), AggregationPeriodLength.FIVE_MINUTES, UTCTimeUtility.DAY_IN_MS); //clear 5-minute data older than a day + cleanupSensorData(sensor.getId(), AggregationPeriodLength.HOUR, UTCTimeUtility.WEEK_IN_MS); //clear 1-hour data older than a week + //cleanupSensorData(sensor.getId(), AggregationPeriodLength.day, TimeUtility.INFINITY); //clear 1-day data older than infinity + //cleanupSensorData(sensor.getId(), AggregationPeriodLength.week, TimeUtility.INFINITY); //clear 1-week data older than infinity + } } - + /** * Will clear periods if they are too old. * @@ -58,67 +58,67 @@ public class SensorDataCleanupDaemon implements HalDaemon { * @param olderThan Data must be older than this many ms to be cleared from the DB */ private void cleanupSensorData(long sensorId, AggregationPeriodLength cleanupPeriodlength, long olderThan){ - DBConnection db = HalContext.getDB(); - PreparedStatement stmt = null; - try { + DBConnection db = HalContext.getDB(); + PreparedStatement stmt = null; + try { - stmt = db.getPreparedStatement("SELECT * FROM sensor_data_aggr" - +" WHERE sensor_id == ? " - + "AND timestamp_end-timestamp_start == ?" - + "AND timestamp_end < ?"); - stmt.setLong(1, sensorId); - switch(cleanupPeriodlength){ - case SECOND: stmt.setLong(2, UTCTimeUtility.SECOND_IN_MS-1); break; - case MINUTE: stmt.setLong(2, UTCTimeUtility.MINUTE_IN_MS-1); break; - case FIVE_MINUTES: stmt.setLong(2, UTCTimeUtility.FIVE_MINUTES_IN_MS-1); break; - case FIFTEEN_MINUTES: stmt.setLong(2, UTCTimeUtility.FIFTEEN_MINUTES_IN_MS-1); break; - case HOUR: stmt.setLong(2, UTCTimeUtility.HOUR_IN_MS-1); break; - case DAY: stmt.setLong(2, UTCTimeUtility.DAY_IN_MS-1); break; - case WEEK: stmt.setLong(2, UTCTimeUtility.WEEK_IN_MS-1); break; - default: logger.warning("cleanup period length is not supported."); return; - } - stmt.setLong(3, System.currentTimeMillis()-olderThan); - DBConnection.exec(stmt, new AggregateDataDeleter(sensorId)); - } catch (SQLException e) { - logger.log(Level.SEVERE, null, e); - } + stmt = db.getPreparedStatement("SELECT * FROM sensor_data_aggr" + +" WHERE sensor_id == ? " + + "AND timestamp_end-timestamp_start == ?" + + "AND timestamp_end < ?"); + stmt.setLong(1, sensorId); + switch(cleanupPeriodlength){ + case SECOND: stmt.setLong(2, UTCTimeUtility.SECOND_IN_MS-1); break; + case MINUTE: stmt.setLong(2, UTCTimeUtility.MINUTE_IN_MS-1); break; + case FIVE_MINUTES: stmt.setLong(2, UTCTimeUtility.FIVE_MINUTES_IN_MS-1); break; + case FIFTEEN_MINUTES: stmt.setLong(2, UTCTimeUtility.FIFTEEN_MINUTES_IN_MS-1); break; + case HOUR: stmt.setLong(2, UTCTimeUtility.HOUR_IN_MS-1); break; + case DAY: stmt.setLong(2, UTCTimeUtility.DAY_IN_MS-1); break; + case WEEK: stmt.setLong(2, UTCTimeUtility.WEEK_IN_MS-1); break; + default: logger.warning("cleanup period length is not supported."); return; + } + stmt.setLong(3, System.currentTimeMillis()-olderThan); + DBConnection.exec(stmt, new AggregateDataDeleter(sensorId)); + } catch (SQLException e) { + logger.log(Level.SEVERE, null, e); + } } - + private class AggregateDataDeleter implements SQLResultHandler{ - private long sensorId = -1; - - public AggregateDataDeleter(long sensorId){ - this.sensorId = sensorId; - } - - @Override - public Long handleQueryResult(Statement stmt, ResultSet result) throws SQLException { - long count = 0; - try{ - HalContext.getDB().getConnection().setAutoCommit(false); - PreparedStatement preparedDeleteStmt = HalContext.getDB().getPreparedStatement("DELETE FROM sensor_data_aggr WHERE sensor_id == ? AND sequence_id == ?"); - while(result.next()){ - if(sensorId != result.getInt("sensor_id")){ - throw new IllegalArgumentException("Found entry for aggregation for the wrong sensorId (expecting: "+sensorId+", but was: "+result.getInt("sensor_id")+")"); - } + private long sensorId = -1; + + public AggregateDataDeleter(long sensorId){ + this.sensorId = sensorId; + } + + @Override + public Long handleQueryResult(Statement stmt, ResultSet result) throws SQLException { + long count = 0; + try{ + HalContext.getDB().getConnection().setAutoCommit(false); + PreparedStatement preparedDeleteStmt = HalContext.getDB().getPreparedStatement("DELETE FROM sensor_data_aggr WHERE sensor_id == ? AND sequence_id == ?"); + while(result.next()){ + if(sensorId != result.getInt("sensor_id")){ + throw new IllegalArgumentException("Found entry for aggregation for the wrong sensorId (expecting: "+sensorId+", but was: "+result.getInt("sensor_id")+")"); + } logger.finer("Deleting sensor(id: "+ sensorId +") aggregate entry timestamp: "+ result.getLong("timestamp_start") +" - "+ result.getLong("timestamp_end") + " (" + UTCTimeUtility.timeInMsToString(1+result.getLong("timestamp_end")-result.getLong("timestamp_start")) + ")"); - preparedDeleteStmt.setInt(1, result.getInt("sensor_id")); - preparedDeleteStmt.setLong(2, result.getLong("sequence_id")); - preparedDeleteStmt.addBatch(); - count++; - } + preparedDeleteStmt.setInt(1, result.getInt("sensor_id")); + preparedDeleteStmt.setLong(2, result.getLong("sequence_id")); + preparedDeleteStmt.addBatch(); + count++; + } DBConnection.execBatch(preparedDeleteStmt); HalContext.getDB().getConnection().commit(); - }catch(Exception e){ - HalContext.getDB().getConnection().rollback(); - throw e; - }finally{ - HalContext.getDB().getConnection().setAutoCommit(true); - } - return count; - } - + }catch(Exception e){ + HalContext.getDB().getConnection().rollback(); + throw e; + }finally{ + HalContext.getDB().getConnection().setAutoCommit(true); + } + return count; + } + } - + } diff --git a/src/se/hal/intf/HalBot.java b/src/se/hal/intf/HalBot.java index 6cd7a1e1..057e59c0 100755 --- a/src/se/hal/intf/HalBot.java +++ b/src/se/hal/intf/HalBot.java @@ -22,9 +22,6 @@ package se.hal.intf; -/** - * Created by Ziver on 2015-05-07. - */ public interface HalBot { void initialize(); diff --git a/src/se/hal/intf/HalDaemon.java b/src/se/hal/intf/HalDaemon.java index 4b154670..2a11e26a 100755 --- a/src/se/hal/intf/HalDaemon.java +++ b/src/se/hal/intf/HalDaemon.java @@ -2,9 +2,6 @@ package se.hal.intf; import java.util.concurrent.ScheduledExecutorService; -/** - * Created by Ziver on 2015-12-03. - */ public interface HalDaemon extends Runnable{ void initiate(ScheduledExecutorService executor); diff --git a/src/se/hal/intf/HalDeviceData.java b/src/se/hal/intf/HalDeviceData.java index 321ec366..6cd6e23c 100755 --- a/src/se/hal/intf/HalDeviceData.java +++ b/src/se/hal/intf/HalDeviceData.java @@ -2,8 +2,6 @@ package se.hal.intf; /** * Interface representing one report from an event - * - * Created by Ziver on 2016-08-17. */ public abstract class HalDeviceData { diff --git a/src/se/hal/intf/HalEventConfig.java b/src/se/hal/intf/HalEventConfig.java index 40bb524c..977bc1e4 100755 --- a/src/se/hal/intf/HalEventConfig.java +++ b/src/se/hal/intf/HalEventConfig.java @@ -2,8 +2,6 @@ package se.hal.intf; /** * Interface representing event type specific configuration data. - * - * Created by Ziver on 2015-12-23. */ public interface HalEventConfig { diff --git a/src/se/hal/intf/HalEventController.java b/src/se/hal/intf/HalEventController.java index c44eef7f..b5933237 100755 --- a/src/se/hal/intf/HalEventController.java +++ b/src/se/hal/intf/HalEventController.java @@ -1,8 +1,5 @@ package se.hal.intf; -/** - * Created by Ziver on 2015-12-15. - */ public interface HalEventController { /** diff --git a/src/se/hal/intf/HalEventData.java b/src/se/hal/intf/HalEventData.java index 1f090223..a3f646f6 100755 --- a/src/se/hal/intf/HalEventData.java +++ b/src/se/hal/intf/HalEventData.java @@ -2,8 +2,6 @@ package se.hal.intf; /** * Interface representing one report from an event - * - * Created by Ziver on 2016-08-17. */ public abstract class HalEventData extends HalDeviceData{ diff --git a/src/se/hal/intf/HalHttpPage.java b/src/se/hal/intf/HalHttpPage.java index fa0c0a25..45a66c29 100755 --- a/src/se/hal/intf/HalHttpPage.java +++ b/src/se/hal/intf/HalHttpPage.java @@ -16,9 +16,6 @@ import java.io.IOException; import java.util.List; import java.util.Map; -/** - * Created by Ziver on 2015-12-10. - */ public abstract class HalHttpPage implements HttpPage{ private static final String TEMPLATE = "resource/web/main_index.tmpl"; private static Navigation rootNav = Navigation.createRootNav(); diff --git a/src/se/hal/intf/HalSensorConfig.java b/src/se/hal/intf/HalSensorConfig.java index 3f0c95fb..8fa2333d 100755 --- a/src/se/hal/intf/HalSensorConfig.java +++ b/src/se/hal/intf/HalSensorConfig.java @@ -2,8 +2,6 @@ package se.hal.intf; /** * Interface representing sensor type specific configuration data. - * - * Created by Ziver on 2015-12-23. */ public interface HalSensorConfig { enum AggregationMethod{ diff --git a/src/se/hal/intf/HalSensorController.java b/src/se/hal/intf/HalSensorController.java index 5aac59a4..e9173036 100755 --- a/src/se/hal/intf/HalSensorController.java +++ b/src/se/hal/intf/HalSensorController.java @@ -1,8 +1,5 @@ package se.hal.intf; -/** - * Created by Ziver on 2015-12-15. - */ public interface HalSensorController { /** diff --git a/src/se/hal/intf/HalSensorData.java b/src/se/hal/intf/HalSensorData.java index bab1d0e0..7997fa40 100644 --- a/src/se/hal/intf/HalSensorData.java +++ b/src/se/hal/intf/HalSensorData.java @@ -2,8 +2,6 @@ package se.hal.intf; /** * Interface representing one data report from a sensor. - * - * Created by Ziver on 2016-08-17. */ public abstract class HalSensorData extends HalDeviceData{ diff --git a/src/se/hal/page/HalAlertManager.java b/src/se/hal/page/HalAlertManager.java index 76f3715b..3152fe1e 100755 --- a/src/se/hal/page/HalAlertManager.java +++ b/src/se/hal/page/HalAlertManager.java @@ -12,9 +12,6 @@ import java.util.*; import java.util.logging.Level; import java.util.logging.Logger; -/** - * Created by ezivkoc on 2016-01-20. - */ public class HalAlertManager implements HttpPage { private static final Logger logger = LogUtil.getLogger(); private static final String TMPL_PATH = "resource/web/main_alerts.tmpl"; diff --git a/src/se/hal/page/MapHttpPage.java b/src/se/hal/page/MapHttpPage.java index 7796e617..ed22dcfc 100755 --- a/src/se/hal/page/MapHttpPage.java +++ b/src/se/hal/page/MapHttpPage.java @@ -16,9 +16,6 @@ import java.io.IOException; import java.sql.SQLException; import java.util.Map; -/** - * Created by Ziver on 2016-06-23. - */ public class MapHttpPage extends HalHttpPage { private static final String TEMPLATE = "resource/web/map.tmpl"; diff --git a/src/se/hal/page/MapJsonPage.java b/src/se/hal/page/MapJsonPage.java index 8695bae2..ff785405 100755 --- a/src/se/hal/page/MapJsonPage.java +++ b/src/se/hal/page/MapJsonPage.java @@ -13,8 +13,6 @@ import java.util.Map; /** * TODO: This json endpoint might not be needed as we have SensorJsonPage? - * - * Created by Ziver on 2016-06-23. */ public class MapJsonPage extends HalJsonPage { diff --git a/src/se/hal/page/PCHeatMapHttpPage.java b/src/se/hal/page/PCHeatMapHttpPage.java index 80904aff..6d25b87b 100755 --- a/src/se/hal/page/PCHeatMapHttpPage.java +++ b/src/se/hal/page/PCHeatMapHttpPage.java @@ -8,23 +8,23 @@ import zutil.parser.Templator; import java.util.Map; public class PCHeatMapHttpPage extends HalHttpPage { - private static final String TEMPLATE = "resource/web/pc_heatmap.tmpl"; + private static final String TEMPLATE = "resource/web/pc_heatmap.tmpl"; - public PCHeatMapHttpPage() { - super("pc_heatmap"); + public PCHeatMapHttpPage() { + super("pc_heatmap"); super.getRootNav().createSubNav("Sensors").createSubNav(this.getId(), "Heatmap").setWeight(60); - } + } - @Override - public Templator httpRespond( - Map session, - Map cookie, - Map request) - throws Exception{ + @Override + public Templator httpRespond( + Map session, + Map cookie, + Map request) + throws Exception{ - Templator tmpl = new Templator(FileUtil.find(TEMPLATE)); - return tmpl; - } + Templator tmpl = new Templator(FileUtil.find(TEMPLATE)); + return tmpl; + } } diff --git a/src/se/hal/page/SensorJsonPage.java b/src/se/hal/page/SensorJsonPage.java index 43978220..8d7b0790 100755 --- a/src/se/hal/page/SensorJsonPage.java +++ b/src/se/hal/page/SensorJsonPage.java @@ -24,7 +24,7 @@ import java.util.logging.Logger; * type: sensor data type name * * Data filtering parameters: - * aggr: Aggrigation periods, needs to be provided to retrieve data. Possible values: minute,hour,day,week + * aggr: Aggregation periods, needs to be provided to retrieve data. Possible values: minute,hour,day,week * */ public class SensorJsonPage extends HalJsonPage { diff --git a/src/se/hal/plugin/netscan/NetScanController.java b/src/se/hal/plugin/netscan/NetScanController.java index c38bcf8b..a1fcccb1 100755 --- a/src/se/hal/plugin/netscan/NetScanController.java +++ b/src/se/hal/plugin/netscan/NetScanController.java @@ -18,9 +18,6 @@ import java.util.concurrent.TimeUnit; import java.util.logging.Level; import java.util.logging.Logger; -/** - * Created by Ziver on 2016-09-30. - */ public class NetScanController implements HalEventController, HalAutoScannableController, InetScanListener, Runnable{ public static Logger logger = LogUtil.getLogger(); private static final int NETWORK_SYNC_INTERVAL = 3 * 60 * 60 * 1000; // 3 hours diff --git a/src/se/hal/plugin/netscan/NetworkDevice.java b/src/se/hal/plugin/netscan/NetworkDevice.java index 264d8b8f..3e4d1730 100755 --- a/src/se/hal/plugin/netscan/NetworkDevice.java +++ b/src/se/hal/plugin/netscan/NetworkDevice.java @@ -6,9 +6,6 @@ import se.hal.intf.HalEventData; import se.hal.struct.devicedata.SwitchEventData; import zutil.ui.Configurator; -/** - * Created by Ziver on 2016-10-02. - */ public class NetworkDevice implements HalEventConfig { @Configurator.Configurable("IP Address") diff --git a/src/se/hal/plugin/nutups/NutUpsController.java b/src/se/hal/plugin/nutups/NutUpsController.java index a780eacb..f84cd58c 100755 --- a/src/se/hal/plugin/nutups/NutUpsController.java +++ b/src/se/hal/plugin/nutups/NutUpsController.java @@ -15,9 +15,6 @@ import java.util.concurrent.TimeUnit; import java.util.logging.Level; import java.util.logging.Logger; -/** - * Created by Ziver on 2016-05-25. - */ public class NutUpsController implements HalSensorController, HalAutoScannableController, Runnable{ public static Logger logger = LogUtil.getLogger(); private static final int SYNC_INTERVAL = 60 * 1000; diff --git a/src/se/hal/plugin/nutups/NutUpsDevice.java b/src/se/hal/plugin/nutups/NutUpsDevice.java index 6c4f2151..4997310d 100755 --- a/src/se/hal/plugin/nutups/NutUpsDevice.java +++ b/src/se/hal/plugin/nutups/NutUpsDevice.java @@ -7,9 +7,6 @@ import se.hal.struct.devicedata.PowerConsumptionSensorData; import zutil.osal.linux.app.NutUPSClient; import zutil.ui.Configurator; -/** - * Created by Ziver on 2016-05-25. - */ public class NutUpsDevice implements HalSensorConfig{ @Configurator.Configurable("UPS id") diff --git a/src/se/hal/struct/Event.java b/src/se/hal/struct/Event.java index 17f2fa7a..ccb9df13 100755 --- a/src/se/hal/struct/Event.java +++ b/src/se/hal/struct/Event.java @@ -20,9 +20,6 @@ import java.util.List; import java.util.logging.Level; import java.util.logging.Logger; -/** - * Created by Ziver on 2015-12-15. - */ @DBBean.DBTable(value="event", superBean=true) public class Event extends AbstractDevice{ private static final Logger logger = LogUtil.getLogger(); diff --git a/src/se/hal/struct/Sensor.java b/src/se/hal/struct/Sensor.java index f79e4e49..d2e603af 100755 --- a/src/se/hal/struct/Sensor.java +++ b/src/se/hal/struct/Sensor.java @@ -23,16 +23,16 @@ import java.util.logging.Logger; public class Sensor extends AbstractDevice{ private static final Logger logger = LogUtil.getLogger(); - private long external_id = -1; + private long external_id = -1; /** local sensor= if sensor should be public. external sensor= if sensor should be requested from host **/ private boolean sync = false; private long aggr_version; - public static List getExternalSensors(DBConnection db) throws SQLException{ - PreparedStatement stmt = db.getPreparedStatement( "SELECT sensor.* FROM sensor,user WHERE user.external == 1 AND user.id == sensor.user_id" ); - return DBConnection.exec(stmt, DBBeanSQLResultHandler.createList(Sensor.class, db) ); - } + public static List getExternalSensors(DBConnection db) throws SQLException{ + PreparedStatement stmt = db.getPreparedStatement( "SELECT sensor.* FROM sensor,user WHERE user.external == 1 AND user.id == sensor.user_id" ); + return DBConnection.exec(stmt, DBBeanSQLResultHandler.createList(Sensor.class, db) ); + } public static Sensor getExternalSensor(DBConnection db, User user, long external_id) throws SQLException{ PreparedStatement stmt = db.getPreparedStatement( "SELECT sensor.* FROM sensor WHERE ? == sensor.user_id AND sensor.external_id == ?" ); stmt.setLong(1, user.getId()); @@ -40,31 +40,31 @@ public class Sensor extends AbstractDevice getLocalSensors(DBConnection db) throws SQLException{ - PreparedStatement stmt = db.getPreparedStatement( "SELECT sensor.* FROM sensor,user WHERE user.external == 0 AND user.id == sensor.user_id" ); - return DBConnection.exec(stmt, DBBeanSQLResultHandler.createList(Sensor.class, db) ); - } + public static List getLocalSensors(DBConnection db) throws SQLException{ + PreparedStatement stmt = db.getPreparedStatement( "SELECT sensor.* FROM sensor,user WHERE user.external == 0 AND user.id == sensor.user_id" ); + return DBConnection.exec(stmt, DBBeanSQLResultHandler.createList(Sensor.class, db) ); + } - public static List getSensors(DBConnection db, User user) throws SQLException{ - PreparedStatement stmt = db.getPreparedStatement( "SELECT * FROM sensor WHERE user_id == ?" ); - stmt.setLong(1, user.getId()); - return DBConnection.exec(stmt, DBBeanSQLResultHandler.createList(Sensor.class, db) ); - } + public static List getSensors(DBConnection db, User user) throws SQLException{ + PreparedStatement stmt = db.getPreparedStatement( "SELECT * FROM sensor WHERE user_id == ?" ); + stmt.setLong(1, user.getId()); + return DBConnection.exec(stmt, DBBeanSQLResultHandler.createList(Sensor.class, db) ); + } - public static List getSensors(DBConnection db) throws SQLException{ - PreparedStatement stmt = db.getPreparedStatement( "SELECT * FROM sensor" ); - return DBConnection.exec(stmt, DBBeanSQLResultHandler.createList(Sensor.class, db) ); - } + public static List getSensors(DBConnection db) throws SQLException{ + PreparedStatement stmt = db.getPreparedStatement( "SELECT * FROM sensor" ); + return DBConnection.exec(stmt, DBBeanSQLResultHandler.createList(Sensor.class, db) ); + } public static Sensor getSensor(DBConnection db, long id) throws SQLException{ return DBBean.load(db, Sensor.class, id); } public static long getHighestSequenceId(long sensorId) throws SQLException{ - PreparedStatement stmt = HalContext.getDB().getPreparedStatement("SELECT MAX(sequence_id) FROM sensor_data_aggr WHERE sensor_id == ?"); - stmt.setLong(1, sensorId); - Integer id = DBConnection.exec(stmt, new SimpleSQLResult()); - return (id != null ? id : 0); + PreparedStatement stmt = HalContext.getDB().getPreparedStatement("SELECT MAX(sequence_id) FROM sensor_data_aggr WHERE sensor_id == ?"); + stmt.setLong(1, sensorId); + Integer id = DBConnection.exec(stmt, new SimpleSQLResult()); + return (id != null ? id : 0); } @@ -90,12 +90,12 @@ public class Sensor extends AbstractDevice getExternalUsers(DBConnection db) throws SQLException{ - PreparedStatement stmt = db.getPreparedStatement( "SELECT * FROM user WHERE user.external == 1" ); - return DBConnection.exec(stmt, DBBeanSQLResultHandler.createList(User.class, db) ); - } - - public static User getLocalUser(DBConnection db) throws SQLException{ - PreparedStatement stmt = db.getPreparedStatement( "SELECT * FROM user WHERE user.external == 0" ); - return DBConnection.exec(stmt, DBBeanSQLResultHandler.create(User.class, db) ); - } - - public static List getUsers(DBConnection db) throws SQLException{ - PreparedStatement stmt = db.getPreparedStatement( "SELECT * FROM user" ); - return DBConnection.exec(stmt, DBBeanSQLResultHandler.createList(User.class, db) ); - } - - public static User getUser(DBConnection db, int id) throws SQLException { - return DBBean.load(db, User.class, id); - } - /** - * Will delete this user and all its Sensors + + public static List getExternalUsers(DBConnection db) throws SQLException{ + PreparedStatement stmt = db.getPreparedStatement( "SELECT * FROM user WHERE user.external == 1" ); + return DBConnection.exec(stmt, DBBeanSQLResultHandler.createList(User.class, db) ); + } + + public static User getLocalUser(DBConnection db) throws SQLException{ + PreparedStatement stmt = db.getPreparedStatement( "SELECT * FROM user WHERE user.external == 0" ); + return DBConnection.exec(stmt, DBBeanSQLResultHandler.create(User.class, db) ); + } + + public static List getUsers(DBConnection db) throws SQLException{ + PreparedStatement stmt = db.getPreparedStatement( "SELECT * FROM user" ); + return DBConnection.exec(stmt, DBBeanSQLResultHandler.createList(User.class, db) ); + } + + public static User getUser(DBConnection db, int id) throws SQLException { + return DBBean.load(db, User.class, id); + } + + + /** + * Will delete this user and all its Sensors */ - @Override - public void delete(DBConnection db) throws SQLException { - List sensorList = Sensor.getSensors(db, this); + @Override + public void delete(DBConnection db) throws SQLException { + List sensorList = Sensor.getSensors(db, this); for(Sensor sensor : sensorList){ sensor.delete(db); } super.delete(db); - } + } - - public String getUsername() { - return username; - } - public void setUsername(String name) { - this.username = name; - } - public String getEmail() { - return email; - } - public void setEmail(String email) { - this.email = email; - } - public String getAvatarUrl(){ - return Gravatar.getImageUrl(email, 130); - } - public String getLargeAvatarUrl(){ - return Gravatar.getImageUrl(email, 250); - } - public String getAddress() { - return address; - } - public void setAddress(String address) { - this.address = address; - } - public boolean isExternal() { - return external > 0; - } - public void setExternal(boolean external) { - this.external = (external? 1:0 ); - } - public String getHostname() { - return hostname; - } - public void setHostname(String hostname) { - this.hostname = hostname; - } - public int getPort() { - return port; - } - public void setPort(int port) { - this.port = port; - } + + public String getUsername() { + return username; + } + public void setUsername(String name) { + this.username = name; + } + public String getEmail() { + return email; + } + public void setEmail(String email) { + this.email = email; + } + public String getAvatarUrl(){ + return Gravatar.getImageUrl(email, 130); + } + public String getLargeAvatarUrl(){ + return Gravatar.getImageUrl(email, 250); + } + public String getAddress() { + return address; + } + public void setAddress(String address) { + this.address = address; + } + public boolean isExternal() { + return external > 0; + } + public void setExternal(boolean external) { + this.external = (external? 1:0 ); + } + public String getHostname() { + return hostname; + } + public void setHostname(String hostname) { + this.hostname = hostname; + } + public int getPort() { + return port; + } + public void setPort(int port) { + this.port = port; + } } diff --git a/src/se/hal/struct/devicedata/DimmerEventData.java b/src/se/hal/struct/devicedata/DimmerEventData.java index 7a496877..f2de46bb 100755 --- a/src/se/hal/struct/devicedata/DimmerEventData.java +++ b/src/se/hal/struct/devicedata/DimmerEventData.java @@ -24,9 +24,6 @@ package se.hal.struct.devicedata; import se.hal.intf.HalEventData; -/** - * Created by Ziver on 2015-05-07. - */ public class DimmerEventData extends HalEventData { private double dimmValue; diff --git a/src/se/hal/struct/devicedata/HumiditySensorData.java b/src/se/hal/struct/devicedata/HumiditySensorData.java index 434e3fa0..c385d058 100755 --- a/src/se/hal/struct/devicedata/HumiditySensorData.java +++ b/src/se/hal/struct/devicedata/HumiditySensorData.java @@ -3,9 +3,6 @@ package se.hal.struct.devicedata; import se.hal.intf.HalSensorData; -/** - * Created by Ziver on 2015-12-03. - */ public class HumiditySensorData extends HalSensorData { private double humidity; diff --git a/src/se/hal/struct/devicedata/LightSensorData.java b/src/se/hal/struct/devicedata/LightSensorData.java index f358c556..c92f9265 100755 --- a/src/se/hal/struct/devicedata/LightSensorData.java +++ b/src/se/hal/struct/devicedata/LightSensorData.java @@ -2,9 +2,6 @@ package se.hal.struct.devicedata; import se.hal.intf.HalSensorData; -/** - * Created by Ziver on 2015-12-03. - */ public class LightSensorData extends HalSensorData { private double lux; diff --git a/src/se/hal/struct/devicedata/PowerConsumptionSensorData.java b/src/se/hal/struct/devicedata/PowerConsumptionSensorData.java index 32a6fb24..fe627b84 100755 --- a/src/se/hal/struct/devicedata/PowerConsumptionSensorData.java +++ b/src/se/hal/struct/devicedata/PowerConsumptionSensorData.java @@ -2,9 +2,6 @@ package se.hal.struct.devicedata; import se.hal.intf.HalSensorData; -/** - * Created by Ziver on 2015-12-03. - */ public class PowerConsumptionSensorData extends HalSensorData { private double wattHours; diff --git a/src/se/hal/struct/devicedata/SwitchEventData.java b/src/se/hal/struct/devicedata/SwitchEventData.java index 36c2e8c1..685a6f6e 100755 --- a/src/se/hal/struct/devicedata/SwitchEventData.java +++ b/src/se/hal/struct/devicedata/SwitchEventData.java @@ -24,9 +24,6 @@ package se.hal.struct.devicedata; import se.hal.intf.HalEventData; -/** - * Created by Ziver on 2015-05-07. - */ public class SwitchEventData extends HalEventData { private boolean enabled; diff --git a/src/se/hal/struct/devicedata/TemperatureSensorData.java b/src/se/hal/struct/devicedata/TemperatureSensorData.java index 81fc03ba..ec7c5815 100755 --- a/src/se/hal/struct/devicedata/TemperatureSensorData.java +++ b/src/se/hal/struct/devicedata/TemperatureSensorData.java @@ -2,9 +2,6 @@ package se.hal.struct.devicedata; import se.hal.intf.HalSensorData; -/** - * Created by Ziver on 2015-12-03. - */ public class TemperatureSensorData extends HalSensorData { private double temperature; diff --git a/src/se/hal/stt/ManualSTTClient.java b/src/se/hal/stt/ManualSTTClient.java index 66c4fd39..64f44c71 100755 --- a/src/se/hal/stt/ManualSTTClient.java +++ b/src/se/hal/stt/ManualSTTClient.java @@ -31,19 +31,19 @@ import java.io.InputStreamReader; public class ManualSTTClient implements HalSpeechToText { private BufferedReader in; - @Override - public void initialize() { + @Override + public void initialize() { // open up standard input in = new BufferedReader(new InputStreamReader(System.in)); - } + } - @Override - public String listen() { + @Override + public String listen() { try { return in.readLine(); } catch (IOException ioe) { ioe.printStackTrace(); } return null; - } + } } diff --git a/src/se/hal/stt/Sphinx4STTClient.java b/src/se/hal/stt/Sphinx4STTClient.java index 230b68ba..fc4991ee 100755 --- a/src/se/hal/stt/Sphinx4STTClient.java +++ b/src/se/hal/stt/Sphinx4STTClient.java @@ -30,9 +30,6 @@ import se.hal.intf.HalSpeechToText; import java.io.IOException; -/** - * Created by Ziver on 2015-05-08. - */ public class Sphinx4STTClient implements HalSpeechToText { private LiveSpeechRecognizer recognizer; diff --git a/src/se/hal/trigger/DateTimeTrigger.java b/src/se/hal/trigger/DateTimeTrigger.java index fbec3ace..3046d7e9 100755 --- a/src/se/hal/trigger/DateTimeTrigger.java +++ b/src/se/hal/trigger/DateTimeTrigger.java @@ -7,9 +7,6 @@ import zutil.ui.Configurator.PreConfigurationActionListener; import java.text.SimpleDateFormat; -/** - * - */ public class DateTimeTrigger implements HalTrigger,Configurator.PostConfigurationActionListener { @Configurator.Configurable("Minute (Cron format)") diff --git a/src/se/hal/trigger/EventTrigger.java b/src/se/hal/trigger/EventTrigger.java index f508ac4f..5f515fed 100755 --- a/src/se/hal/trigger/EventTrigger.java +++ b/src/se/hal/trigger/EventTrigger.java @@ -8,9 +8,6 @@ import java.sql.SQLException; import java.util.logging.Level; import java.util.logging.Logger; -/** - * - */ public class EventTrigger extends DeviceTrigger{ private static final Logger logger = LogUtil.getLogger(); diff --git a/src/se/hal/trigger/SensorTrigger.java b/src/se/hal/trigger/SensorTrigger.java index 1b940801..2ca56c9b 100755 --- a/src/se/hal/trigger/SensorTrigger.java +++ b/src/se/hal/trigger/SensorTrigger.java @@ -9,9 +9,6 @@ import java.sql.SQLException; import java.util.logging.Level; import java.util.logging.Logger; -/** - * - */ public class SensorTrigger extends DeviceTrigger{ private static final Logger logger = LogUtil.getLogger(); diff --git a/src/se/hal/trigger/TimerTrigger.java b/src/se/hal/trigger/TimerTrigger.java index 65b868a1..29b83945 100755 --- a/src/se/hal/trigger/TimerTrigger.java +++ b/src/se/hal/trigger/TimerTrigger.java @@ -4,9 +4,6 @@ import se.hal.intf.HalTrigger; import zutil.Timer; import zutil.ui.Configurator; -/** - * - */ public class TimerTrigger implements HalTrigger { @Configurator.Configurable("Countdown time (in seconds)") diff --git a/src/se/hal/tts/MaryTTSLocalClient.java b/src/se/hal/tts/MaryTTSLocalClient.java index f944a836..73ce87f5 100755 --- a/src/se/hal/tts/MaryTTSLocalClient.java +++ b/src/se/hal/tts/MaryTTSLocalClient.java @@ -32,9 +32,6 @@ import se.hal.intf.HalTextToSpeech; import javax.sound.sampled.AudioInputStream; import java.util.Set; -/** - * - */ public class MaryTTSLocalClient implements HalTextToSpeech { private MaryInterface marytts; diff --git a/src/se/hal/util/AggregateDataListSqlResult.java b/src/se/hal/util/AggregateDataListSqlResult.java index 63789ab1..0828265c 100755 --- a/src/se/hal/util/AggregateDataListSqlResult.java +++ b/src/se/hal/util/AggregateDataListSqlResult.java @@ -15,22 +15,22 @@ import java.util.List; public class AggregateDataListSqlResult implements SQLResultHandler> { - public static class AggregateData { + public static class AggregateData { public int id; - public long timestamp; - public Float data; - public String username; + public long timestamp; + public Float data; + public String username; - public AggregateData(int id, long time, Float data, String uname) { + public AggregateData(int id, long time, Float data, String uname) { this.id = id; - this.timestamp = time; - this.data = data; - this.username = uname; - } - } - + this.timestamp = time; + this.data = data; + this.username = uname; + } + } + public static List getAggregateDataForPeriod(DBConnection db, Sensor sensor, AggregationPeriodLength aggrPeriodLength, long ageLimitInMs) throws SQLException { - PreparedStatement stmt = db.getPreparedStatement( + PreparedStatement stmt = db.getPreparedStatement( "SELECT user.username as username," + " sensor.*," + " sensor_data_aggr.*" @@ -45,15 +45,15 @@ public class AggregateDataListSqlResult implements SQLResultHandler handleQueryResult(Statement stmt, ResultSet result) throws SQLException { - ArrayList list = new ArrayList<>(); - long previousTimestampEnd = -1; - while (result.next()){ + @Override + public ArrayList handleQueryResult(Statement stmt, ResultSet result) throws SQLException { + ArrayList list = new ArrayList<>(); + long previousTimestampEnd = -1; + while (result.next()){ int id = result.getInt("id"); - long timestampStart = result.getLong("timestamp_start"); - long timestampEnd = result.getLong("timestamp_end"); - String username = result.getString("username"); - float confidence = result.getFloat("confidence"); + long timestampStart = result.getLong("timestamp_start"); + long timestampEnd = result.getLong("timestamp_end"); + String username = result.getString("username"); + float confidence = result.getFloat("confidence"); - // Calculate the data point - float data = result.getFloat("data"); //the "raw" recorded data - float estimatedData = data/confidence; //estimate the "real" value of the data by looking at the confidence value + // Calculate the data point + float data = result.getFloat("data"); //the "raw" recorded data + float estimatedData = data/confidence; //estimate the "real" value of the data by looking at the confidence value // Add null data point to list if one or more periods of data is missing before this - if (previousTimestampEnd != -1 && sensor.getDeviceConfig() != null){ + if (previousTimestampEnd != -1 && sensor.getDeviceConfig() != null){ boolean shortInterval = timestampEnd-timestampStart < sensor.getDeviceConfig().getDataInterval(); long distance = timestampStart - (previousTimestampEnd + 1); - if (// Only add nulls if the report interval is smaller than the aggregated interval + if (// Only add nulls if the report interval is smaller than the aggregated interval !shortInterval && distance > 0 || // Only add nulls if space between aggr is larger than sensor report interval shortInterval && distance > sensor.getDeviceConfig().getDataInterval()) - list.add(new AggregateData(id, previousTimestampEnd + 1, null /*Float.NaN*/, username)); - } + list.add(new AggregateData(id, previousTimestampEnd + 1, null /*Float.NaN*/, username)); + } - if (sensor.getDeviceConfig().getSensorDataClass() == PowerConsumptionSensorData.class) - estimatedData = (estimatedData/1000f); - list.add(new AggregateData(id, timestampEnd, estimatedData, username)); //add this data point to list + if (sensor.getDeviceConfig().getSensorDataClass() == PowerConsumptionSensorData.class) + estimatedData = (estimatedData/1000f); + list.add(new AggregateData(id, timestampEnd, estimatedData, username)); //add this data point to list - // Update previous end timestamp - previousTimestampEnd = timestampEnd; - } - return list; - } + // Update previous end timestamp + previousTimestampEnd = timestampEnd; + } + return list; + } } \ No newline at end of file diff --git a/src/se/hal/util/DeviceDataSqlResult.java b/src/se/hal/util/DeviceDataSqlResult.java index 006fb430..dfedde07 100755 --- a/src/se/hal/util/DeviceDataSqlResult.java +++ b/src/se/hal/util/DeviceDataSqlResult.java @@ -8,9 +8,6 @@ import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; -/** - * Created by Ziver on 2016-08-22. - */ public class DeviceDataSqlResult implements SQLResultHandler { private Class clazz; diff --git a/src/se/hal/util/UTCTimePeriod.java b/src/se/hal/util/UTCTimePeriod.java index a527eba6..60e8e879 100755 --- a/src/se/hal/util/UTCTimePeriod.java +++ b/src/se/hal/util/UTCTimePeriod.java @@ -3,50 +3,50 @@ package se.hal.util; import se.hal.daemon.SensorDataAggregatorDaemon.AggregationPeriodLength; public class UTCTimePeriod{ - private final long start; - private final long end; - private final AggregationPeriodLength periodLength; - - public UTCTimePeriod(long timestamp, AggregationPeriodLength periodLength){ - start = UTCTimeUtility.getTimestampPeriodStart(periodLength, timestamp); - end = UTCTimeUtility.getTimestampPeriodEnd(periodLength, timestamp); - this.periodLength = periodLength; - } - - public long getStartTimestamp(){ - return start; - } - - public long getEndTimestamp(){ - return end; - } - - public UTCTimePeriod getNextPeriod(){ - return new UTCTimePeriod(end+1, periodLength); - } - - public UTCTimePeriod getPreviosPeriod(){ - return new UTCTimePeriod(start-1, periodLength); - } - - public boolean containsTimestamp(long timestamp){ - return start <= timestamp && timestamp <= end; - } - - public boolean equals(Object other){ - if(other == null) - return false; - if(other instanceof UTCTimePeriod){ - UTCTimePeriod o = (UTCTimePeriod)other; - return start == o.start - && end == o.end - && periodLength == o.periodLength; - } - return false; - } - - public String toString(){ - return start + "=>" + end + " (" + UTCTimeUtility.getDateString(start) + "=>" + UTCTimeUtility.getDateString(end) + ")"; - } - + private final long start; + private final long end; + private final AggregationPeriodLength periodLength; + + public UTCTimePeriod(long timestamp, AggregationPeriodLength periodLength){ + start = UTCTimeUtility.getTimestampPeriodStart(periodLength, timestamp); + end = UTCTimeUtility.getTimestampPeriodEnd(periodLength, timestamp); + this.periodLength = periodLength; + } + + public long getStartTimestamp(){ + return start; + } + + public long getEndTimestamp(){ + return end; + } + + public UTCTimePeriod getNextPeriod(){ + return new UTCTimePeriod(end+1, periodLength); + } + + public UTCTimePeriod getPreviosPeriod(){ + return new UTCTimePeriod(start-1, periodLength); + } + + public boolean containsTimestamp(long timestamp){ + return start <= timestamp && timestamp <= end; + } + + public boolean equals(Object other){ + if(other == null) + return false; + if(other instanceof UTCTimePeriod){ + UTCTimePeriod o = (UTCTimePeriod)other; + return start == o.start + && end == o.end + && periodLength == o.periodLength; + } + return false; + } + + public String toString(){ + return start + "=>" + end + " (" + UTCTimeUtility.getDateString(start) + "=>" + UTCTimeUtility.getDateString(end) + ")"; + } + } \ No newline at end of file diff --git a/src/se/hal/util/UTCTimeUtility.java b/src/se/hal/util/UTCTimeUtility.java index 4c549d27..47c2aaff 100755 --- a/src/se/hal/util/UTCTimeUtility.java +++ b/src/se/hal/util/UTCTimeUtility.java @@ -8,243 +8,243 @@ import java.util.Locale; import java.util.TimeZone; public class UTCTimeUtility { - public static final TimeZone TIMEZONE = TimeZone.getTimeZone("UTC"); - public static final Locale LOCALE = new Locale("sv","SE"); + public static final TimeZone TIMEZONE = TimeZone.getTimeZone("UTC"); + public static final Locale LOCALE = new Locale("sv","SE"); - public static final long SECOND_IN_MS = 1000; - public static final long MINUTE_IN_MS = SECOND_IN_MS * 60; - public static final long FIVE_MINUTES_IN_MS = MINUTE_IN_MS * 5; - public static final long FIFTEEN_MINUTES_IN_MS = MINUTE_IN_MS * 15; + public static final long SECOND_IN_MS = 1000; + public static final long MINUTE_IN_MS = SECOND_IN_MS * 60; + public static final long FIVE_MINUTES_IN_MS = MINUTE_IN_MS * 5; + public static final long FIFTEEN_MINUTES_IN_MS = MINUTE_IN_MS * 15; public static final long HOUR_IN_MS = MINUTE_IN_MS * 60; public static final long DAY_IN_MS = HOUR_IN_MS * 24; public static final long WEEK_IN_MS = DAY_IN_MS * 7; - public static final long INFINITY = Long.MAX_VALUE; //sort of true - - public static long getTimestampPeriodStart(AggregationPeriodLength aggrPeriodLength, long timestamp) throws NumberFormatException{ - Calendar cal = Calendar.getInstance(TIMEZONE, LOCALE); - cal.setTimeInMillis(timestamp); - cal.setFirstDayOfWeek(Calendar.MONDAY); - switch(aggrPeriodLength){ - case YEAR: - cal.set(Calendar.DAY_OF_YEAR, 1); - cal.set(Calendar.HOUR_OF_DAY, 0); - cal.set(Calendar.MINUTE, 0); - cal.set(Calendar.SECOND, 0); - cal.set(Calendar.MILLISECOND, 0); - break; - case MONTH: - cal.set(Calendar.DAY_OF_MONTH, 1); - cal.set(Calendar.HOUR_OF_DAY, 0); - cal.set(Calendar.MINUTE, 0); - cal.set(Calendar.SECOND, 0); - cal.set(Calendar.MILLISECOND, 0); - break; - case WEEK: - cal.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY); - cal.set(Calendar.HOUR_OF_DAY, 0); - cal.set(Calendar.MINUTE, 0); - cal.set(Calendar.SECOND, 0); - cal.set(Calendar.MILLISECOND, 0); - break; - case DAY: - cal.set(Calendar.HOUR_OF_DAY, 0); - cal.set(Calendar.MINUTE, 0); - cal.set(Calendar.SECOND, 0); - cal.set(Calendar.MILLISECOND, 0); - break; - case HOUR: - cal.set(Calendar.MINUTE, 0); - cal.set(Calendar.SECOND, 0); - cal.set(Calendar.MILLISECOND, 0); - break; - case FIVE_MINUTES: - cal.set(Calendar.MINUTE, (cal.get(Calendar.MINUTE)/5)*5); - cal.set(Calendar.SECOND, 0); - cal.set(Calendar.MILLISECOND, 0); - break; - case FIFTEEN_MINUTES: - cal.set(Calendar.MINUTE, (cal.get(Calendar.MINUTE)/15)*15); - cal.set(Calendar.SECOND, 0); - cal.set(Calendar.MILLISECOND, 0); - break; - case MINUTE: - cal.set(Calendar.SECOND, 0); - cal.set(Calendar.MILLISECOND, 0); - break; - case SECOND: - cal.set(Calendar.MILLISECOND, 0); - break; - } - return cal.getTimeInMillis(); - } - - public static long getTimestampPeriodEnd(AggregationPeriodLength aggrPeriodLength, long timestamp) throws NumberFormatException{ - Calendar cal = Calendar.getInstance(TIMEZONE, LOCALE); - cal.setTimeInMillis(timestamp); - cal.setFirstDayOfWeek(Calendar.MONDAY); - switch(aggrPeriodLength){ - case YEAR: - cal.set(Calendar.DAY_OF_YEAR, cal.getActualMaximum(Calendar.DAY_OF_YEAR)); - cal.set(Calendar.HOUR_OF_DAY, 23); - cal.set(Calendar.MINUTE, 59); - cal.set(Calendar.SECOND, 59); - cal.set(Calendar.MILLISECOND, 1000); - break; - case MONTH: - cal.set(Calendar.DAY_OF_MONTH, cal.getActualMaximum(Calendar.DAY_OF_MONTH)); - cal.set(Calendar.HOUR_OF_DAY, 23); - cal.set(Calendar.MINUTE, 59); - cal.set(Calendar.SECOND, 59); - cal.set(Calendar.MILLISECOND, 1000); - break; - case WEEK: - cal.set(Calendar.DAY_OF_WEEK, Calendar.SUNDAY); - cal.set(Calendar.HOUR_OF_DAY, 23); - cal.set(Calendar.MINUTE, 59); - cal.set(Calendar.SECOND, 59); - cal.set(Calendar.MILLISECOND, 1000); - break; - case DAY: - cal.set(Calendar.HOUR_OF_DAY, 23); - cal.set(Calendar.MINUTE, 59); - cal.set(Calendar.SECOND, 59); - cal.set(Calendar.MILLISECOND, 1000); - break; - case HOUR: - cal.set(Calendar.MINUTE, 59); - cal.set(Calendar.SECOND, 59); - cal.set(Calendar.MILLISECOND, 1000); - break; - case FIVE_MINUTES: - cal.set(Calendar.MINUTE, 4+(cal.get(Calendar.MINUTE)/5)*5); - cal.set(Calendar.SECOND, 59); - cal.set(Calendar.MILLISECOND, 1000); - break; - case FIFTEEN_MINUTES: - cal.set(Calendar.MINUTE, 14+(cal.get(Calendar.MINUTE)/15)*15); - cal.set(Calendar.SECOND, 59); - cal.set(Calendar.MILLISECOND, 1000); - break; - case MINUTE: - cal.set(Calendar.SECOND, 59); - cal.set(Calendar.MILLISECOND, 1000); - break; - case SECOND: - cal.set(Calendar.MILLISECOND, 1000); - break; - } - return cal.getTimeInMillis()-1; //subtract one - } - - public static int getMillisecondInSecondFromTimestamp(long ms) throws NumberFormatException{ - if(ms < 0) - throw new NumberFormatException("argument must be positive"); - Calendar cal = Calendar.getInstance(TIMEZONE, LOCALE); - cal.setTimeInMillis(ms); - return cal.get(Calendar.MILLISECOND); - } - - public static int getSecondOfMinuteFromTimestamp(long ms) throws NumberFormatException{ - if(ms < 0) - throw new NumberFormatException("argument must be positive"); - Calendar cal = Calendar.getInstance(TIMEZONE, LOCALE); - cal.setTimeInMillis(ms); - return cal.get(Calendar.SECOND); - } - - public static int getMinuteOfHourFromTimestamp(long ms) throws NumberFormatException{ - if(ms < 0) - throw new NumberFormatException("argument must be positive"); - Calendar cal = Calendar.getInstance(TIMEZONE, LOCALE); - cal.setTimeInMillis(ms); - return cal.get(Calendar.MINUTE); - } - - public static int getHourOfDayFromTimestamp(long ms) throws NumberFormatException{ - if(ms < 0) - throw new NumberFormatException("argument must be positive"); - Calendar cal = Calendar.getInstance(TIMEZONE, LOCALE); - cal.setTimeInMillis(ms); - return cal.get(Calendar.HOUR_OF_DAY); - } - - public static int getDayOfWeekFromTimestamp(long ms) throws NumberFormatException{ - if(ms < 0) - throw new NumberFormatException("argument must be positive"); - Calendar cal = Calendar.getInstance(TIMEZONE, LOCALE); - cal.setTimeInMillis(ms); - return cal.get(Calendar.DAY_OF_WEEK); - } - - public static int getDayOfMonthFromTimestamp(long ms) throws NumberFormatException{ - if(ms < 0) - throw new NumberFormatException("argument must be positive"); - Calendar cal = Calendar.getInstance(TIMEZONE, LOCALE); - cal.setTimeInMillis(ms); - return cal.get(Calendar.DAY_OF_MONTH); - } - - public static int getDayOfYearFromTimestamp(long ms) throws NumberFormatException{ - if(ms < 0) - throw new NumberFormatException("argument must be positive"); - Calendar cal = Calendar.getInstance(TIMEZONE, LOCALE); - cal.setTimeInMillis(ms); - return cal.get(Calendar.DAY_OF_YEAR); - } - - public static int getWeekOfYearFromTimestamp(long ms) throws NumberFormatException{ - if(ms < 0) - throw new NumberFormatException("argument must be positive"); - Calendar cal = Calendar.getInstance(TIMEZONE, LOCALE); - cal.setTimeInMillis(ms); - return cal.get(Calendar.WEEK_OF_YEAR); - } - - public static int getMonthOfYearFromTimestamp(long ms) throws NumberFormatException{ - if(ms < 0) - throw new NumberFormatException("argument must be positive"); - Calendar cal = Calendar.getInstance(TIMEZONE, LOCALE); - cal.setTimeInMillis(ms); - return cal.get(Calendar.MONTH); - } - - public static int getYearFromTimestamp(long ms) throws NumberFormatException{ - if(ms < 0) - throw new NumberFormatException("argument must be positive"); - Calendar cal = Calendar.getInstance(TIMEZONE, LOCALE); - cal.setTimeInMillis(ms); - return cal.get(Calendar.YEAR); - } - - public static String timeInMsToString(long ms) throws NumberFormatException{ - if(ms < 0) - throw new NumberFormatException("argument must be positive"); - String retval = ""; - int weeks = (int) (ms / WEEK_IN_MS); - if(weeks > 0){ - retval += weeks + "w+"; - } - int days = ((int) (ms / DAY_IN_MS)) % 7; - if(days > 0){ - retval += days + "d+"; - } - int hours = (int) ((ms % DAY_IN_MS) / HOUR_IN_MS); - retval += (hours<10?"0"+hours:hours); - int minutes = (int) ((ms % HOUR_IN_MS) / MINUTE_IN_MS); - retval += ":" + (minutes<10?"0"+minutes:minutes); - int seconds = (int) ((ms % MINUTE_IN_MS) / SECOND_IN_MS); - retval += ":" + (seconds<10?"0"+seconds:seconds); - int milliseconds = (int) (ms % SECOND_IN_MS); - retval += "." + (milliseconds<100?"0"+(milliseconds<10?"0"+milliseconds:milliseconds):milliseconds); - return retval; - } - - public static String getDateString(long timestamp){ - SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS"); - format.setTimeZone(TIMEZONE); - Calendar cal = Calendar.getInstance(TIMEZONE, LOCALE); - cal.setTimeInMillis(timestamp); - return format.format(cal.getTime()); - } - + public static final long INFINITY = Long.MAX_VALUE; //sort of true + + public static long getTimestampPeriodStart(AggregationPeriodLength aggrPeriodLength, long timestamp) throws NumberFormatException{ + Calendar cal = Calendar.getInstance(TIMEZONE, LOCALE); + cal.setTimeInMillis(timestamp); + cal.setFirstDayOfWeek(Calendar.MONDAY); + switch(aggrPeriodLength){ + case YEAR: + cal.set(Calendar.DAY_OF_YEAR, 1); + cal.set(Calendar.HOUR_OF_DAY, 0); + cal.set(Calendar.MINUTE, 0); + cal.set(Calendar.SECOND, 0); + cal.set(Calendar.MILLISECOND, 0); + break; + case MONTH: + cal.set(Calendar.DAY_OF_MONTH, 1); + cal.set(Calendar.HOUR_OF_DAY, 0); + cal.set(Calendar.MINUTE, 0); + cal.set(Calendar.SECOND, 0); + cal.set(Calendar.MILLISECOND, 0); + break; + case WEEK: + cal.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY); + cal.set(Calendar.HOUR_OF_DAY, 0); + cal.set(Calendar.MINUTE, 0); + cal.set(Calendar.SECOND, 0); + cal.set(Calendar.MILLISECOND, 0); + break; + case DAY: + cal.set(Calendar.HOUR_OF_DAY, 0); + cal.set(Calendar.MINUTE, 0); + cal.set(Calendar.SECOND, 0); + cal.set(Calendar.MILLISECOND, 0); + break; + case HOUR: + cal.set(Calendar.MINUTE, 0); + cal.set(Calendar.SECOND, 0); + cal.set(Calendar.MILLISECOND, 0); + break; + case FIVE_MINUTES: + cal.set(Calendar.MINUTE, (cal.get(Calendar.MINUTE)/5)*5); + cal.set(Calendar.SECOND, 0); + cal.set(Calendar.MILLISECOND, 0); + break; + case FIFTEEN_MINUTES: + cal.set(Calendar.MINUTE, (cal.get(Calendar.MINUTE)/15)*15); + cal.set(Calendar.SECOND, 0); + cal.set(Calendar.MILLISECOND, 0); + break; + case MINUTE: + cal.set(Calendar.SECOND, 0); + cal.set(Calendar.MILLISECOND, 0); + break; + case SECOND: + cal.set(Calendar.MILLISECOND, 0); + break; + } + return cal.getTimeInMillis(); + } + + public static long getTimestampPeriodEnd(AggregationPeriodLength aggrPeriodLength, long timestamp) throws NumberFormatException{ + Calendar cal = Calendar.getInstance(TIMEZONE, LOCALE); + cal.setTimeInMillis(timestamp); + cal.setFirstDayOfWeek(Calendar.MONDAY); + switch(aggrPeriodLength){ + case YEAR: + cal.set(Calendar.DAY_OF_YEAR, cal.getActualMaximum(Calendar.DAY_OF_YEAR)); + cal.set(Calendar.HOUR_OF_DAY, 23); + cal.set(Calendar.MINUTE, 59); + cal.set(Calendar.SECOND, 59); + cal.set(Calendar.MILLISECOND, 1000); + break; + case MONTH: + cal.set(Calendar.DAY_OF_MONTH, cal.getActualMaximum(Calendar.DAY_OF_MONTH)); + cal.set(Calendar.HOUR_OF_DAY, 23); + cal.set(Calendar.MINUTE, 59); + cal.set(Calendar.SECOND, 59); + cal.set(Calendar.MILLISECOND, 1000); + break; + case WEEK: + cal.set(Calendar.DAY_OF_WEEK, Calendar.SUNDAY); + cal.set(Calendar.HOUR_OF_DAY, 23); + cal.set(Calendar.MINUTE, 59); + cal.set(Calendar.SECOND, 59); + cal.set(Calendar.MILLISECOND, 1000); + break; + case DAY: + cal.set(Calendar.HOUR_OF_DAY, 23); + cal.set(Calendar.MINUTE, 59); + cal.set(Calendar.SECOND, 59); + cal.set(Calendar.MILLISECOND, 1000); + break; + case HOUR: + cal.set(Calendar.MINUTE, 59); + cal.set(Calendar.SECOND, 59); + cal.set(Calendar.MILLISECOND, 1000); + break; + case FIVE_MINUTES: + cal.set(Calendar.MINUTE, 4+(cal.get(Calendar.MINUTE)/5)*5); + cal.set(Calendar.SECOND, 59); + cal.set(Calendar.MILLISECOND, 1000); + break; + case FIFTEEN_MINUTES: + cal.set(Calendar.MINUTE, 14+(cal.get(Calendar.MINUTE)/15)*15); + cal.set(Calendar.SECOND, 59); + cal.set(Calendar.MILLISECOND, 1000); + break; + case MINUTE: + cal.set(Calendar.SECOND, 59); + cal.set(Calendar.MILLISECOND, 1000); + break; + case SECOND: + cal.set(Calendar.MILLISECOND, 1000); + break; + } + return cal.getTimeInMillis()-1; //subtract one + } + + public static int getMillisecondInSecondFromTimestamp(long ms) throws NumberFormatException{ + if(ms < 0) + throw new NumberFormatException("argument must be positive"); + Calendar cal = Calendar.getInstance(TIMEZONE, LOCALE); + cal.setTimeInMillis(ms); + return cal.get(Calendar.MILLISECOND); + } + + public static int getSecondOfMinuteFromTimestamp(long ms) throws NumberFormatException{ + if(ms < 0) + throw new NumberFormatException("argument must be positive"); + Calendar cal = Calendar.getInstance(TIMEZONE, LOCALE); + cal.setTimeInMillis(ms); + return cal.get(Calendar.SECOND); + } + + public static int getMinuteOfHourFromTimestamp(long ms) throws NumberFormatException{ + if(ms < 0) + throw new NumberFormatException("argument must be positive"); + Calendar cal = Calendar.getInstance(TIMEZONE, LOCALE); + cal.setTimeInMillis(ms); + return cal.get(Calendar.MINUTE); + } + + public static int getHourOfDayFromTimestamp(long ms) throws NumberFormatException{ + if(ms < 0) + throw new NumberFormatException("argument must be positive"); + Calendar cal = Calendar.getInstance(TIMEZONE, LOCALE); + cal.setTimeInMillis(ms); + return cal.get(Calendar.HOUR_OF_DAY); + } + + public static int getDayOfWeekFromTimestamp(long ms) throws NumberFormatException{ + if(ms < 0) + throw new NumberFormatException("argument must be positive"); + Calendar cal = Calendar.getInstance(TIMEZONE, LOCALE); + cal.setTimeInMillis(ms); + return cal.get(Calendar.DAY_OF_WEEK); + } + + public static int getDayOfMonthFromTimestamp(long ms) throws NumberFormatException{ + if(ms < 0) + throw new NumberFormatException("argument must be positive"); + Calendar cal = Calendar.getInstance(TIMEZONE, LOCALE); + cal.setTimeInMillis(ms); + return cal.get(Calendar.DAY_OF_MONTH); + } + + public static int getDayOfYearFromTimestamp(long ms) throws NumberFormatException{ + if(ms < 0) + throw new NumberFormatException("argument must be positive"); + Calendar cal = Calendar.getInstance(TIMEZONE, LOCALE); + cal.setTimeInMillis(ms); + return cal.get(Calendar.DAY_OF_YEAR); + } + + public static int getWeekOfYearFromTimestamp(long ms) throws NumberFormatException{ + if(ms < 0) + throw new NumberFormatException("argument must be positive"); + Calendar cal = Calendar.getInstance(TIMEZONE, LOCALE); + cal.setTimeInMillis(ms); + return cal.get(Calendar.WEEK_OF_YEAR); + } + + public static int getMonthOfYearFromTimestamp(long ms) throws NumberFormatException{ + if(ms < 0) + throw new NumberFormatException("argument must be positive"); + Calendar cal = Calendar.getInstance(TIMEZONE, LOCALE); + cal.setTimeInMillis(ms); + return cal.get(Calendar.MONTH); + } + + public static int getYearFromTimestamp(long ms) throws NumberFormatException{ + if(ms < 0) + throw new NumberFormatException("argument must be positive"); + Calendar cal = Calendar.getInstance(TIMEZONE, LOCALE); + cal.setTimeInMillis(ms); + return cal.get(Calendar.YEAR); + } + + public static String timeInMsToString(long ms) throws NumberFormatException{ + if(ms < 0) + throw new NumberFormatException("argument must be positive"); + String retval = ""; + int weeks = (int) (ms / WEEK_IN_MS); + if(weeks > 0){ + retval += weeks + "w+"; + } + int days = ((int) (ms / DAY_IN_MS)) % 7; + if(days > 0){ + retval += days + "d+"; + } + int hours = (int) ((ms % DAY_IN_MS) / HOUR_IN_MS); + retval += (hours<10?"0"+hours:hours); + int minutes = (int) ((ms % HOUR_IN_MS) / MINUTE_IN_MS); + retval += ":" + (minutes<10?"0"+minutes:minutes); + int seconds = (int) ((ms % MINUTE_IN_MS) / SECOND_IN_MS); + retval += ":" + (seconds<10?"0"+seconds:seconds); + int milliseconds = (int) (ms % SECOND_IN_MS); + retval += "." + (milliseconds<100?"0"+(milliseconds<10?"0"+milliseconds:milliseconds):milliseconds); + return retval; + } + + public static String getDateString(long timestamp){ + SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS"); + format.setTimeZone(TIMEZONE); + Calendar cal = Calendar.getInstance(TIMEZONE, LOCALE); + cal.setTimeInMillis(timestamp); + return format.format(cal.getTime()); + } + }