changed indent to space and removed created by comment
This commit is contained in:
parent
8526e5157d
commit
6a15640aea
44 changed files with 721 additions and 814 deletions
|
|
@ -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 DBConnection db; // TODO: Should probably be a db pool as we have multiple threads accessing the DB
|
||||||
|
|
||||||
private static Properties defaultFileConf;
|
private static Properties defaultFileConf;
|
||||||
private static Properties fileConf;
|
private static Properties fileConf;
|
||||||
private static Properties dbConf;
|
private static Properties dbConf;
|
||||||
|
|
||||||
|
|
||||||
static {
|
static {
|
||||||
defaultFileConf = new Properties();
|
defaultFileConf = new Properties();
|
||||||
defaultFileConf.setProperty("http_port", ""+8080);
|
defaultFileConf.setProperty("http_port", ""+8080);
|
||||||
defaultFileConf.setProperty("sync_port", ""+6666);
|
defaultFileConf.setProperty("sync_port", ""+6666);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public static void initialize(){
|
public static void initialize(){
|
||||||
try {
|
try {
|
||||||
// Read conf
|
// Read conf
|
||||||
fileConf = new Properties(defaultFileConf);
|
fileConf = new Properties(defaultFileConf);
|
||||||
|
|
@ -82,9 +82,9 @@ public class HalContext {
|
||||||
if(defaultDBVersion > dbVersion ) {
|
if(defaultDBVersion > dbVersion ) {
|
||||||
logger.info("Starting DB upgrade...");
|
logger.info("Starting DB upgrade...");
|
||||||
if(dbFile != null){
|
if(dbFile != null){
|
||||||
File backupDB = FileUtil.getNextFile(dbFile);
|
File backupDB = FileUtil.getNextFile(dbFile);
|
||||||
logger.fine("Backing up DB to: "+ backupDB);
|
logger.fine("Backing up DB to: "+ backupDB);
|
||||||
FileUtil.copy(dbFile, backupDB);
|
FileUtil.copy(dbFile, backupDB);
|
||||||
}
|
}
|
||||||
|
|
||||||
logger.fine(String.format("Upgrading DB (from: v%s, to: v%s)...", dbVersion, defaultDBVersion));
|
logger.fine(String.format("Upgrading DB (from: v%s, to: v%s)...", dbVersion, defaultDBVersion));
|
||||||
|
|
@ -96,39 +96,39 @@ public class HalContext {
|
||||||
logger.fine("Performing pre-upgrade activities");
|
logger.fine("Performing pre-upgrade activities");
|
||||||
//read upgrade path preferences from the reference database
|
//read upgrade path preferences from the reference database
|
||||||
referenceDB.exec("SELECT * FROM db_version_history"
|
referenceDB.exec("SELECT * FROM db_version_history"
|
||||||
+ " WHERE db_version <= " + defaultDBVersion
|
+ " WHERE db_version <= " + defaultDBVersion
|
||||||
+ " AND db_version > " + dbVersion,
|
+ " AND db_version > " + dbVersion,
|
||||||
new SQLResultHandler<Object>() {
|
new SQLResultHandler<Object>() {
|
||||||
@Override
|
@Override
|
||||||
public Object handleQueryResult(Statement stmt, ResultSet result) throws SQLException {
|
public Object handleQueryResult(Statement stmt, ResultSet result) throws SQLException {
|
||||||
while(result.next()){
|
while(result.next()){
|
||||||
if(result.getBoolean("force_upgrade")){
|
if(result.getBoolean("force_upgrade")){
|
||||||
logger.fine("Forced upgrade enabled");
|
logger.fine("Forced upgrade enabled");
|
||||||
handler.setForcedDBUpgrade(true); //set to true if any of the intermediate db version requires it.
|
handler.setForcedDBUpgrade(true); //set to true if any of the intermediate db version requires it.
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
handler.upgrade();
|
handler.upgrade();
|
||||||
|
|
||||||
logger.fine("Performing post-upgrade activities");
|
logger.fine("Performing post-upgrade activities");
|
||||||
//read upgrade path preferences from the reference database
|
//read upgrade path preferences from the reference database
|
||||||
referenceDB.exec("SELECT * FROM db_version_history"
|
referenceDB.exec("SELECT * FROM db_version_history"
|
||||||
+ " WHERE db_version <= " + defaultDBVersion
|
+ " WHERE db_version <= " + defaultDBVersion
|
||||||
+ " AND db_version > " + dbVersion,
|
+ " AND db_version > " + dbVersion,
|
||||||
new SQLResultHandler<Object>() {
|
new SQLResultHandler<Object>() {
|
||||||
@Override
|
@Override
|
||||||
public Object handleQueryResult(Statement stmt, ResultSet result) throws SQLException {
|
public Object handleQueryResult(Statement stmt, ResultSet result) throws SQLException {
|
||||||
boolean clearExternalAggrData = false;
|
boolean clearExternalAggrData = false;
|
||||||
boolean clearInternalAggrData = false;
|
boolean clearInternalAggrData = false;
|
||||||
while(result.next()){
|
while(result.next()){
|
||||||
if(result.getBoolean("clear_external_aggr_data"))
|
if(result.getBoolean("clear_external_aggr_data"))
|
||||||
clearExternalAggrData = true;
|
clearExternalAggrData = true;
|
||||||
if(result.getBoolean("clear_internal_aggr_data"))
|
if(result.getBoolean("clear_internal_aggr_data"))
|
||||||
clearInternalAggrData = true;
|
clearInternalAggrData = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(clearExternalAggrData){
|
if(clearExternalAggrData){
|
||||||
logger.fine("Clearing external aggregate data");
|
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 = "
|
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)");
|
+ "(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
|
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 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'");
|
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){
|
} catch (Exception e){
|
||||||
throw new RuntimeException(e);
|
throw new RuntimeException(e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public static String getStringProperty(String key){
|
public static String getStringProperty(String key){
|
||||||
|
|
@ -223,7 +223,7 @@ public class HalContext {
|
||||||
* @param db
|
* @param db
|
||||||
*/
|
*/
|
||||||
public static void setDB(DBConnection db){
|
public static void setDB(DBConnection db){
|
||||||
HalContext.db = db;
|
HalContext.db = db;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -30,9 +30,6 @@ import zutil.io.file.FileUtil;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
|
|
||||||
/**
|
|
||||||
* Created by Ziver on 2015-05-07.
|
|
||||||
*/
|
|
||||||
public class AliceBot implements HalBot{
|
public class AliceBot implements HalBot{
|
||||||
private Chat chatSession;
|
private Chat chatSession;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -31,31 +31,31 @@ import java.util.logging.Level;
|
||||||
import java.util.logging.Logger;
|
import java.util.logging.Logger;
|
||||||
|
|
||||||
public class PCDataSynchronizationClient implements HalDaemon {
|
public class PCDataSynchronizationClient implements HalDaemon {
|
||||||
private static final Logger logger = LogUtil.getLogger();
|
private static final Logger logger = LogUtil.getLogger();
|
||||||
private static final long SYNC_INTERVAL = 5 * 60 * 1000; // 5 min
|
private static final long SYNC_INTERVAL = 5 * 60 * 1000; // 5 min
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void initiate(ScheduledExecutorService executor){
|
public void initiate(ScheduledExecutorService executor){
|
||||||
executor.scheduleAtFixedRate(this, 10000, SYNC_INTERVAL, TimeUnit.MILLISECONDS);
|
executor.scheduleAtFixedRate(this, 10000, SYNC_INTERVAL, TimeUnit.MILLISECONDS);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
try {
|
try {
|
||||||
DBConnection db = HalContext.getDB();
|
DBConnection db = HalContext.getDB();
|
||||||
List<User> users = User.getExternalUsers(db);
|
List<User> users = User.getExternalUsers(db);
|
||||||
for(User user : users){
|
for(User user : users){
|
||||||
if(user.getHostname() == null){
|
if(user.getHostname() == null){
|
||||||
logger.fine("Hostname not defined for user: "+ user.getUsername());
|
logger.fine("Hostname not defined for user: "+ user.getUsername());
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
logger.fine("Synchronizing user: "+ user.getUsername() +" ("+user.getHostname()+":"+user.getPort()+")");
|
logger.fine("Synchronizing user: "+ user.getUsername() +" ("+user.getHostname()+":"+user.getPort()+")");
|
||||||
try (Socket s = new Socket(user.getHostname(), user.getPort());){
|
try (Socket s = new Socket(user.getHostname(), user.getPort());){
|
||||||
ObjectOutputStream out = new ObjectOutputStream(s.getOutputStream());
|
ObjectOutputStream out = new ObjectOutputStream(s.getOutputStream());
|
||||||
ObjectInputStream in = new ObjectInputStream(s.getInputStream());
|
ObjectInputStream in = new ObjectInputStream(s.getInputStream());
|
||||||
|
|
||||||
// Check server protocol version
|
// Check server protocol version
|
||||||
int version = in.readInt();
|
int version = in.readInt();
|
||||||
if(version != PCDataSynchronizationDaemon.PROTOCOL_VERSION){
|
if(version != PCDataSynchronizationDaemon.PROTOCOL_VERSION){
|
||||||
logger.warning("Protocol version do not match, skipping user. " +
|
logger.warning("Protocol version do not match, skipping user. " +
|
||||||
|
|
@ -74,82 +74,82 @@ public class PCDataSynchronizationClient implements HalDaemon {
|
||||||
user.save(db);
|
user.save(db);
|
||||||
|
|
||||||
for(SensorDTO sensorDTO : peerData.sensors){
|
for(SensorDTO sensorDTO : peerData.sensors){
|
||||||
try { // We might not have the sensor plugin installed
|
try { // We might not have the sensor plugin installed
|
||||||
Sensor sensor = Sensor.getExternalSensor(db, user, sensorDTO.sensorId);
|
Sensor sensor = Sensor.getExternalSensor(db, user, sensorDTO.sensorId);
|
||||||
if(sensor == null) { // new sensor
|
if(sensor == null) { // new sensor
|
||||||
sensor = new Sensor();
|
sensor = new Sensor();
|
||||||
logger.fine("Created new external sensor with external_id: "+ sensorDTO.sensorId);
|
logger.fine("Created new external sensor with external_id: "+ sensorDTO.sensorId);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
logger.fine("Updating external sensor with id: "+ sensor.getId() +" and external_id: "+ sensor.getExternalId());
|
logger.fine("Updating external sensor with id: "+ sensor.getId() +" and external_id: "+ sensor.getExternalId());
|
||||||
sensor.setExternalId(sensorDTO.sensorId);
|
sensor.setExternalId(sensorDTO.sensorId);
|
||||||
sensor.setName(sensorDTO.name);
|
sensor.setName(sensorDTO.name);
|
||||||
sensor.setType(sensorDTO.type);
|
sensor.setType(sensorDTO.type);
|
||||||
sensor.setUser(user);
|
sensor.setUser(user);
|
||||||
|
|
||||||
sensor.getDeviceConfigurator().setValues(JSONParser.read(sensorDTO.config)).applyConfiguration();
|
sensor.getDeviceConfigurator().setValues(JSONParser.read(sensorDTO.config)).applyConfiguration();
|
||||||
sensor.save(db);
|
sensor.save(db);
|
||||||
} catch (Exception e){
|
} catch (Exception e){
|
||||||
logger.warning("Unable to register external sensor: " +
|
logger.warning("Unable to register external sensor: " +
|
||||||
"name="+sensorDTO.name+", type="+ sensorDTO.type);
|
"name="+sensorDTO.name+", type="+ sensorDTO.type);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Request sensor data
|
// Request sensor data
|
||||||
List<Sensor> sensors = Sensor.getSensors(db, user);
|
List<Sensor> sensors = Sensor.getSensors(db, user);
|
||||||
for(Sensor sensor : sensors){
|
for(Sensor sensor : sensors){
|
||||||
if(sensor.isSynced()) {
|
if(sensor.isSynced()) {
|
||||||
SensorDataReqDTO req = new SensorDataReqDTO();
|
SensorDataReqDTO req = new SensorDataReqDTO();
|
||||||
req.sensorId = sensor.getExternalId();
|
req.sensorId = sensor.getExternalId();
|
||||||
req.offsetSequenceId = Sensor.getHighestSequenceId(sensor.getId());
|
req.offsetSequenceId = Sensor.getHighestSequenceId(sensor.getId());
|
||||||
req.aggregationVersion = sensor.getAggregationVersion();
|
req.aggregationVersion = sensor.getAggregationVersion();
|
||||||
out.writeObject(req);
|
out.writeObject(req);
|
||||||
|
|
||||||
SensorDataListDTO dataList = (SensorDataListDTO) in.readObject();
|
SensorDataListDTO dataList = (SensorDataListDTO) in.readObject();
|
||||||
if(dataList.aggregationVersion != sensor.getAggregationVersion()){
|
if(dataList.aggregationVersion != sensor.getAggregationVersion()){
|
||||||
logger.fine("The peer has modified its aggregated data, clearing aggregate data. oldAggregationVersion:"+sensor.getAggregationVersion()+" , newAggregationVersion:"+dataList.aggregationVersion);
|
logger.fine("The peer has modified its aggregated data, clearing aggregate data. oldAggregationVersion:"+sensor.getAggregationVersion()+" , newAggregationVersion:"+dataList.aggregationVersion);
|
||||||
|
|
||||||
//clear old aggregated data for sensor
|
//clear old aggregated data for sensor
|
||||||
sensor.clearAggregatedData(db);
|
sensor.clearAggregatedData(db);
|
||||||
|
|
||||||
//save new aggregationVersion
|
//save new aggregationVersion
|
||||||
sensor.setAggregationVersion(dataList.aggregationVersion);
|
sensor.setAggregationVersion(dataList.aggregationVersion);
|
||||||
sensor.save(db);
|
sensor.save(db);
|
||||||
}
|
}
|
||||||
for (SensorDataDTO data : dataList) {
|
for (SensorDataDTO data : dataList) {
|
||||||
PreparedStatement stmt = db.getPreparedStatement("INSERT INTO sensor_data_aggr(sensor_id, sequence_id, timestamp_start, timestamp_end, data, confidence) VALUES(?, ?, ?, ?, ?, ?)");
|
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(1, sensor.getId());
|
||||||
stmt.setLong(2, data.sequenceId);
|
stmt.setLong(2, data.sequenceId);
|
||||||
stmt.setLong(3, data.timestampStart);
|
stmt.setLong(3, data.timestampStart);
|
||||||
stmt.setLong(4, data.timestampEnd);
|
stmt.setLong(4, data.timestampEnd);
|
||||||
stmt.setInt(5, data.data);
|
stmt.setInt(5, data.data);
|
||||||
stmt.setFloat(6, data.confidence);
|
stmt.setFloat(6, data.confidence);
|
||||||
DBConnection.exec(stmt);
|
DBConnection.exec(stmt);
|
||||||
}
|
}
|
||||||
logger.fine("Stored " + dataList.size() + " entries for sensor " + sensor.getId() + " with offset "+ req.offsetSequenceId +" from " + user.getUsername());
|
logger.fine("Stored " + dataList.size() + " entries for sensor " + sensor.getId() + " with offset "+ req.offsetSequenceId +" from " + user.getUsername());
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
logger.fine("Sensor not marked for syncing, skipping sensor id: " + sensor.getId());
|
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) {
|
} catch (NoRouteToHostException|UnknownHostException|ConnectException e) {
|
||||||
logger.warning("Unable to connect to "+ user.getHostname()+":"+user.getPort() +", "+ e.getMessage());
|
logger.warning("Unable to connect to "+ user.getHostname()+":"+user.getPort() +", "+ e.getMessage());
|
||||||
HalAlertManager.getInstance().addAlert(new HalAlert(HalAlertManager.AlertLevel.WARNING,
|
HalAlertManager.getInstance().addAlert(new HalAlert(HalAlertManager.AlertLevel.WARNING,
|
||||||
"Unable to connect to user with host: "+user.getHostname(), AlertTTL.DISMISSED));
|
"Unable to connect to user with host: "+user.getHostname(), AlertTTL.DISMISSED));
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
logger.log(Level.SEVERE, null, e);
|
logger.log(Level.SEVERE, null, e);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
} catch (SQLException e) {
|
} catch (SQLException e) {
|
||||||
logger.log(Level.SEVERE, "Thread has crashed", e);
|
logger.log(Level.SEVERE, "Thread has crashed", e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/////////////// DTO ///////////////////////
|
/////////////// DTO ///////////////////////
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Request Peer information and isAvailable sensors
|
* Request Peer information and isAvailable sensors
|
||||||
|
|
@ -160,10 +160,10 @@ public class PCDataSynchronizationClient implements HalDaemon {
|
||||||
* Request aggregate data for a specific sensor and offset
|
* Request aggregate data for a specific sensor and offset
|
||||||
*/
|
*/
|
||||||
protected static class SensorDataReqDTO implements Serializable{
|
protected static class SensorDataReqDTO implements Serializable{
|
||||||
private static final long serialVersionUID = -9066734025245139989L;
|
private static final long serialVersionUID = -9066734025245139989L;
|
||||||
|
|
||||||
public long sensorId;
|
public long sensorId;
|
||||||
public long offsetSequenceId; // highest known sequence id
|
public long offsetSequenceId; // highest known sequence id
|
||||||
public long aggregationVersion = 0;
|
public long aggregationVersion = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -28,54 +28,54 @@ import java.util.logging.Level;
|
||||||
import java.util.logging.Logger;
|
import java.util.logging.Logger;
|
||||||
|
|
||||||
public class PCDataSynchronizationDaemon extends ThreadedTCPNetworkServer implements HalDaemon {
|
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 static final int PROTOCOL_VERSION = 5; // Increment for protocol changes
|
||||||
|
|
||||||
|
|
||||||
public PCDataSynchronizationDaemon() {
|
public PCDataSynchronizationDaemon() {
|
||||||
super(HalContext.getIntegerProperty("sync_port"));
|
super(HalContext.getIntegerProperty("sync_port"));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void initiate(ScheduledExecutorService executor){
|
public void initiate(ScheduledExecutorService executor){
|
||||||
this.start();
|
this.start();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected ThreadedTCPNetworkServerThread getThreadInstance(Socket s) {
|
protected ThreadedTCPNetworkServerThread getThreadInstance(Socket s) {
|
||||||
try {
|
try {
|
||||||
return new DataSynchronizationDaemonThread(s);
|
return new DataSynchronizationDaemonThread(s);
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
logger.log(Level.SEVERE, "Unable to create DataSynchronizationDaemonThread", e);
|
logger.log(Level.SEVERE, "Unable to create DataSynchronizationDaemonThread", e);
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
private class DataSynchronizationDaemonThread implements ThreadedTCPNetworkServerThread{
|
private class DataSynchronizationDaemonThread implements ThreadedTCPNetworkServerThread{
|
||||||
private Socket s;
|
private Socket s;
|
||||||
private ObjectOutputStream out;
|
private ObjectOutputStream out;
|
||||||
private ObjectInputStream in;
|
private ObjectInputStream in;
|
||||||
|
|
||||||
|
|
||||||
public DataSynchronizationDaemonThread(Socket s) throws IOException{
|
public DataSynchronizationDaemonThread(Socket s) throws IOException{
|
||||||
this.s = s;
|
this.s = s;
|
||||||
this.out = new ObjectOutputStream(s.getOutputStream());
|
this.out = new ObjectOutputStream(s.getOutputStream());
|
||||||
this.in = new ObjectInputStream(s.getInputStream());
|
this.in = new ObjectInputStream(s.getInputStream());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public void run(){
|
public void run(){
|
||||||
logger.fine("User connected: "+ s.getInetAddress().getHostName());
|
logger.fine("User connected: "+ s.getInetAddress().getHostName());
|
||||||
DBConnection db = HalContext.getDB();
|
DBConnection db = HalContext.getDB();
|
||||||
|
|
||||||
try {
|
try {
|
||||||
Object obj = null;
|
Object obj = null;
|
||||||
out.writeInt(PROTOCOL_VERSION); // send our protocol version to client
|
out.writeInt(PROTOCOL_VERSION); // send our protocol version to client
|
||||||
out.flush();
|
out.flush();
|
||||||
while((obj = in.readObject()) != null){
|
while((obj = in.readObject()) != null){
|
||||||
if(obj instanceof PeerDataReqDTO){
|
if(obj instanceof PeerDataReqDTO){
|
||||||
logger.fine("Client requesting peer data");
|
logger.fine("Client requesting peer data");
|
||||||
PeerDataRspDTO rsp = new PeerDataRspDTO();
|
PeerDataRspDTO rsp = new PeerDataRspDTO();
|
||||||
|
|
@ -97,19 +97,19 @@ public class PCDataSynchronizationDaemon extends ThreadedTCPNetworkServer implem
|
||||||
}
|
}
|
||||||
out.writeObject(rsp);
|
out.writeObject(rsp);
|
||||||
}
|
}
|
||||||
if(obj instanceof SensorDataReqDTO){
|
if(obj instanceof SensorDataReqDTO){
|
||||||
SensorDataReqDTO req = (SensorDataReqDTO) obj;
|
SensorDataReqDTO req = (SensorDataReqDTO) obj;
|
||||||
Sensor sensor = Sensor.getSensor(db, req.sensorId);
|
Sensor sensor = Sensor.getSensor(db, req.sensorId);
|
||||||
if(sensor.isSynced()) {
|
if(sensor.isSynced()) {
|
||||||
PreparedStatement stmt = db.getPreparedStatement("SELECT * FROM sensor_data_aggr WHERE sensor_id == ? AND sequence_id > ?");
|
PreparedStatement stmt = db.getPreparedStatement("SELECT * FROM sensor_data_aggr WHERE sensor_id == ? AND sequence_id > ?");
|
||||||
stmt.setLong(1, sensor.getId());
|
stmt.setLong(1, sensor.getId());
|
||||||
logger.fine("Client requesting sensor data: sensorId: " + req.sensorId + ", offset: " + req.offsetSequenceId + ", " + req.aggregationVersion);
|
logger.fine("Client requesting sensor data: sensorId: " + req.sensorId + ", offset: " + req.offsetSequenceId + ", " + req.aggregationVersion);
|
||||||
if(req.aggregationVersion != sensor.getAggregationVersion()){
|
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.");
|
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
|
stmt.setLong(2, 0); //0 since we want to re-send all data to the peer
|
||||||
}else{
|
}else{
|
||||||
stmt.setLong(2, req.offsetSequenceId);
|
stmt.setLong(2, req.offsetSequenceId);
|
||||||
}
|
}
|
||||||
|
|
||||||
SensorDataListDTO rsp = DBConnection.exec(stmt, new SQLResultHandler<SensorDataListDTO>() {
|
SensorDataListDTO rsp = DBConnection.exec(stmt, new SQLResultHandler<SensorDataListDTO>() {
|
||||||
@Override
|
@Override
|
||||||
|
|
@ -131,25 +131,25 @@ public class PCDataSynchronizationDaemon extends ThreadedTCPNetworkServer implem
|
||||||
logger.fine("Sending " + rsp.size() + " sensor data items to client");
|
logger.fine("Sending " + rsp.size() + " sensor data items to client");
|
||||||
out.writeObject(rsp);
|
out.writeObject(rsp);
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
logger.warning("Client requesting non synced sensor data: sensorId: " + req.sensorId + ", offset: " + req.offsetSequenceId);
|
logger.warning("Client requesting non synced sensor data: sensorId: " + req.sensorId + ", offset: " + req.offsetSequenceId);
|
||||||
SensorDataListDTO rsp = new SensorDataListDTO();
|
SensorDataListDTO rsp = new SensorDataListDTO();
|
||||||
out.writeObject(rsp);
|
out.writeObject(rsp);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
out.close();
|
out.close();
|
||||||
in.close();
|
in.close();
|
||||||
s.close();
|
s.close();
|
||||||
|
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
logger.log(Level.SEVERE, null, e);
|
logger.log(Level.SEVERE, null, e);
|
||||||
}
|
}
|
||||||
logger.fine("User disconnected: "+ s.getInetAddress().getHostName());
|
logger.fine("User disconnected: "+ s.getInetAddress().getHostName());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/////////////// DTO ///////////////////////
|
/////////////// DTO ///////////////////////
|
||||||
protected static class PeerDataRspDTO implements Serializable{
|
protected static class PeerDataRspDTO implements Serializable{
|
||||||
public String username;
|
public String username;
|
||||||
public String email;
|
public String email;
|
||||||
|
|
@ -165,18 +165,18 @@ public class PCDataSynchronizationDaemon extends ThreadedTCPNetworkServer implem
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
protected static class SensorDataListDTO extends ArrayList<SensorDataDTO> implements Serializable{
|
protected static class SensorDataListDTO extends ArrayList<SensorDataDTO> implements Serializable{
|
||||||
private static final long serialVersionUID = -5701618637734020691L;
|
private static final long serialVersionUID = -5701618637734020691L;
|
||||||
|
|
||||||
public long aggregationVersion = 0;
|
public long aggregationVersion = 0;
|
||||||
}
|
}
|
||||||
protected static class SensorDataDTO implements Serializable{
|
protected static class SensorDataDTO implements Serializable{
|
||||||
private static final long serialVersionUID = 8494331502087736809L;
|
private static final long serialVersionUID = 8494331502087736809L;
|
||||||
|
|
||||||
public long sequenceId;
|
public long sequenceId;
|
||||||
public long timestampStart;
|
public long timestampStart;
|
||||||
public long timestampEnd;
|
public long timestampEnd;
|
||||||
public int data;
|
public int data;
|
||||||
public float confidence;
|
public float confidence;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -20,33 +20,33 @@ import java.util.logging.Level;
|
||||||
import java.util.logging.Logger;
|
import java.util.logging.Logger;
|
||||||
|
|
||||||
public class SensorDataCleanupDaemon implements HalDaemon {
|
public class SensorDataCleanupDaemon implements HalDaemon {
|
||||||
private static final Logger logger = LogUtil.getLogger();
|
private static final Logger logger = LogUtil.getLogger();
|
||||||
|
|
||||||
public void initiate(ScheduledExecutorService executor){
|
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
|
@Override
|
||||||
public void run(){
|
public void run(){
|
||||||
try {
|
try {
|
||||||
List<Sensor> sensorList = Sensor.getSensors(HalContext.getDB());
|
List<Sensor> sensorList = Sensor.getSensors(HalContext.getDB());
|
||||||
for(Sensor sensor : sensorList){
|
for(Sensor sensor : sensorList){
|
||||||
logger.fine("Deleting old data for sensor id: " + sensor.getId());
|
logger.fine("Deleting old data for sensor id: " + sensor.getId());
|
||||||
cleanupSensor(sensor);
|
cleanupSensor(sensor);
|
||||||
}
|
}
|
||||||
logger.fine("Data cleanup done");
|
logger.fine("Data cleanup done");
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
logger.log(Level.SEVERE, "Thread has crashed", e);
|
logger.log(Level.SEVERE, "Thread has crashed", e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void cleanupSensor(Sensor sensor) {
|
public void cleanupSensor(Sensor sensor) {
|
||||||
if (sensor.getUser() != null) {
|
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.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.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.day, TimeUtility.INFINITY); //clear 1-day data older than infinity
|
||||||
//cleanupSensorData(sensor.getId(), AggregationPeriodLength.week, TimeUtility.INFINITY); //clear 1-week data older than infinity
|
//cleanupSensorData(sensor.getId(), AggregationPeriodLength.week, TimeUtility.INFINITY); //clear 1-week data older than infinity
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -58,66 +58,66 @@ public class SensorDataCleanupDaemon implements HalDaemon {
|
||||||
* @param olderThan Data must be older than this many ms to be cleared from the DB
|
* @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){
|
private void cleanupSensorData(long sensorId, AggregationPeriodLength cleanupPeriodlength, long olderThan){
|
||||||
DBConnection db = HalContext.getDB();
|
DBConnection db = HalContext.getDB();
|
||||||
PreparedStatement stmt = null;
|
PreparedStatement stmt = null;
|
||||||
try {
|
try {
|
||||||
|
|
||||||
stmt = db.getPreparedStatement("SELECT * FROM sensor_data_aggr"
|
stmt = db.getPreparedStatement("SELECT * FROM sensor_data_aggr"
|
||||||
+" WHERE sensor_id == ? "
|
+" WHERE sensor_id == ? "
|
||||||
+ "AND timestamp_end-timestamp_start == ?"
|
+ "AND timestamp_end-timestamp_start == ?"
|
||||||
+ "AND timestamp_end < ?");
|
+ "AND timestamp_end < ?");
|
||||||
stmt.setLong(1, sensorId);
|
stmt.setLong(1, sensorId);
|
||||||
switch(cleanupPeriodlength){
|
switch(cleanupPeriodlength){
|
||||||
case SECOND: stmt.setLong(2, UTCTimeUtility.SECOND_IN_MS-1); break;
|
case SECOND: stmt.setLong(2, UTCTimeUtility.SECOND_IN_MS-1); break;
|
||||||
case MINUTE: stmt.setLong(2, UTCTimeUtility.MINUTE_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 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 FIFTEEN_MINUTES: stmt.setLong(2, UTCTimeUtility.FIFTEEN_MINUTES_IN_MS-1); break;
|
||||||
case HOUR: stmt.setLong(2, UTCTimeUtility.HOUR_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 DAY: stmt.setLong(2, UTCTimeUtility.DAY_IN_MS-1); break;
|
||||||
case WEEK: stmt.setLong(2, UTCTimeUtility.WEEK_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;
|
default: logger.warning("cleanup period length is not supported."); return;
|
||||||
}
|
}
|
||||||
stmt.setLong(3, System.currentTimeMillis()-olderThan);
|
stmt.setLong(3, System.currentTimeMillis()-olderThan);
|
||||||
DBConnection.exec(stmt, new AggregateDataDeleter(sensorId));
|
DBConnection.exec(stmt, new AggregateDataDeleter(sensorId));
|
||||||
} catch (SQLException e) {
|
} catch (SQLException e) {
|
||||||
logger.log(Level.SEVERE, null, e);
|
logger.log(Level.SEVERE, null, e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private class AggregateDataDeleter implements SQLResultHandler<Long>{
|
private class AggregateDataDeleter implements SQLResultHandler<Long>{
|
||||||
private long sensorId = -1;
|
private long sensorId = -1;
|
||||||
|
|
||||||
public AggregateDataDeleter(long sensorId){
|
public AggregateDataDeleter(long sensorId){
|
||||||
this.sensorId = sensorId;
|
this.sensorId = sensorId;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Long handleQueryResult(Statement stmt, ResultSet result) throws SQLException {
|
public Long handleQueryResult(Statement stmt, ResultSet result) throws SQLException {
|
||||||
long count = 0;
|
long count = 0;
|
||||||
try{
|
try{
|
||||||
HalContext.getDB().getConnection().setAutoCommit(false);
|
HalContext.getDB().getConnection().setAutoCommit(false);
|
||||||
PreparedStatement preparedDeleteStmt = HalContext.getDB().getPreparedStatement("DELETE FROM sensor_data_aggr WHERE sensor_id == ? AND sequence_id == ?");
|
PreparedStatement preparedDeleteStmt = HalContext.getDB().getPreparedStatement("DELETE FROM sensor_data_aggr WHERE sensor_id == ? AND sequence_id == ?");
|
||||||
while(result.next()){
|
while(result.next()){
|
||||||
if(sensorId != result.getInt("sensor_id")){
|
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")+")");
|
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")) + ")");
|
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.setInt(1, result.getInt("sensor_id"));
|
||||||
preparedDeleteStmt.setLong(2, result.getLong("sequence_id"));
|
preparedDeleteStmt.setLong(2, result.getLong("sequence_id"));
|
||||||
preparedDeleteStmt.addBatch();
|
preparedDeleteStmt.addBatch();
|
||||||
count++;
|
count++;
|
||||||
}
|
}
|
||||||
|
|
||||||
DBConnection.execBatch(preparedDeleteStmt);
|
DBConnection.execBatch(preparedDeleteStmt);
|
||||||
HalContext.getDB().getConnection().commit();
|
HalContext.getDB().getConnection().commit();
|
||||||
}catch(Exception e){
|
}catch(Exception e){
|
||||||
HalContext.getDB().getConnection().rollback();
|
HalContext.getDB().getConnection().rollback();
|
||||||
throw e;
|
throw e;
|
||||||
}finally{
|
}finally{
|
||||||
HalContext.getDB().getConnection().setAutoCommit(true);
|
HalContext.getDB().getConnection().setAutoCommit(true);
|
||||||
}
|
}
|
||||||
return count;
|
return count;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -22,9 +22,6 @@
|
||||||
|
|
||||||
package se.hal.intf;
|
package se.hal.intf;
|
||||||
|
|
||||||
/**
|
|
||||||
* Created by Ziver on 2015-05-07.
|
|
||||||
*/
|
|
||||||
public interface HalBot {
|
public interface HalBot {
|
||||||
|
|
||||||
void initialize();
|
void initialize();
|
||||||
|
|
|
||||||
|
|
@ -2,9 +2,6 @@ package se.hal.intf;
|
||||||
|
|
||||||
import java.util.concurrent.ScheduledExecutorService;
|
import java.util.concurrent.ScheduledExecutorService;
|
||||||
|
|
||||||
/**
|
|
||||||
* Created by Ziver on 2015-12-03.
|
|
||||||
*/
|
|
||||||
public interface HalDaemon extends Runnable{
|
public interface HalDaemon extends Runnable{
|
||||||
|
|
||||||
void initiate(ScheduledExecutorService executor);
|
void initiate(ScheduledExecutorService executor);
|
||||||
|
|
|
||||||
|
|
@ -2,8 +2,6 @@ package se.hal.intf;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Interface representing one report from an event
|
* Interface representing one report from an event
|
||||||
*
|
|
||||||
* Created by Ziver on 2016-08-17.
|
|
||||||
*/
|
*/
|
||||||
public abstract class HalDeviceData {
|
public abstract class HalDeviceData {
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -2,8 +2,6 @@ package se.hal.intf;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Interface representing event type specific configuration data.
|
* Interface representing event type specific configuration data.
|
||||||
*
|
|
||||||
* Created by Ziver on 2015-12-23.
|
|
||||||
*/
|
*/
|
||||||
public interface HalEventConfig {
|
public interface HalEventConfig {
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,8 +1,5 @@
|
||||||
package se.hal.intf;
|
package se.hal.intf;
|
||||||
|
|
||||||
/**
|
|
||||||
* Created by Ziver on 2015-12-15.
|
|
||||||
*/
|
|
||||||
public interface HalEventController {
|
public interface HalEventController {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
||||||
|
|
@ -2,8 +2,6 @@ package se.hal.intf;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Interface representing one report from an event
|
* Interface representing one report from an event
|
||||||
*
|
|
||||||
* Created by Ziver on 2016-08-17.
|
|
||||||
*/
|
*/
|
||||||
public abstract class HalEventData extends HalDeviceData{
|
public abstract class HalEventData extends HalDeviceData{
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -16,9 +16,6 @@ import java.io.IOException;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
/**
|
|
||||||
* Created by Ziver on 2015-12-10.
|
|
||||||
*/
|
|
||||||
public abstract class HalHttpPage implements HttpPage{
|
public abstract class HalHttpPage implements HttpPage{
|
||||||
private static final String TEMPLATE = "resource/web/main_index.tmpl";
|
private static final String TEMPLATE = "resource/web/main_index.tmpl";
|
||||||
private static Navigation rootNav = Navigation.createRootNav();
|
private static Navigation rootNav = Navigation.createRootNav();
|
||||||
|
|
|
||||||
|
|
@ -2,8 +2,6 @@ package se.hal.intf;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Interface representing sensor type specific configuration data.
|
* Interface representing sensor type specific configuration data.
|
||||||
*
|
|
||||||
* Created by Ziver on 2015-12-23.
|
|
||||||
*/
|
*/
|
||||||
public interface HalSensorConfig {
|
public interface HalSensorConfig {
|
||||||
enum AggregationMethod{
|
enum AggregationMethod{
|
||||||
|
|
|
||||||
|
|
@ -1,8 +1,5 @@
|
||||||
package se.hal.intf;
|
package se.hal.intf;
|
||||||
|
|
||||||
/**
|
|
||||||
* Created by Ziver on 2015-12-15.
|
|
||||||
*/
|
|
||||||
public interface HalSensorController {
|
public interface HalSensorController {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
||||||
|
|
@ -2,8 +2,6 @@ package se.hal.intf;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Interface representing one data report from a sensor.
|
* Interface representing one data report from a sensor.
|
||||||
*
|
|
||||||
* Created by Ziver on 2016-08-17.
|
|
||||||
*/
|
*/
|
||||||
public abstract class HalSensorData extends HalDeviceData{
|
public abstract class HalSensorData extends HalDeviceData{
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -12,9 +12,6 @@ import java.util.*;
|
||||||
import java.util.logging.Level;
|
import java.util.logging.Level;
|
||||||
import java.util.logging.Logger;
|
import java.util.logging.Logger;
|
||||||
|
|
||||||
/**
|
|
||||||
* Created by ezivkoc on 2016-01-20.
|
|
||||||
*/
|
|
||||||
public class HalAlertManager implements HttpPage {
|
public class HalAlertManager implements HttpPage {
|
||||||
private static final Logger logger = LogUtil.getLogger();
|
private static final Logger logger = LogUtil.getLogger();
|
||||||
private static final String TMPL_PATH = "resource/web/main_alerts.tmpl";
|
private static final String TMPL_PATH = "resource/web/main_alerts.tmpl";
|
||||||
|
|
|
||||||
|
|
@ -16,9 +16,6 @@ import java.io.IOException;
|
||||||
import java.sql.SQLException;
|
import java.sql.SQLException;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
/**
|
|
||||||
* Created by Ziver on 2016-06-23.
|
|
||||||
*/
|
|
||||||
public class MapHttpPage extends HalHttpPage {
|
public class MapHttpPage extends HalHttpPage {
|
||||||
private static final String TEMPLATE = "resource/web/map.tmpl";
|
private static final String TEMPLATE = "resource/web/map.tmpl";
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -13,8 +13,6 @@ import java.util.Map;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* TODO: This json endpoint might not be needed as we have SensorJsonPage?
|
* TODO: This json endpoint might not be needed as we have SensorJsonPage?
|
||||||
*
|
|
||||||
* Created by Ziver on 2016-06-23.
|
|
||||||
*/
|
*/
|
||||||
public class MapJsonPage extends HalJsonPage {
|
public class MapJsonPage extends HalJsonPage {
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -8,23 +8,23 @@ import zutil.parser.Templator;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
public class PCHeatMapHttpPage extends HalHttpPage {
|
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() {
|
public PCHeatMapHttpPage() {
|
||||||
super("pc_heatmap");
|
super("pc_heatmap");
|
||||||
super.getRootNav().createSubNav("Sensors").createSubNav(this.getId(), "Heatmap").setWeight(60);
|
super.getRootNav().createSubNav("Sensors").createSubNav(this.getId(), "Heatmap").setWeight(60);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Templator httpRespond(
|
public Templator httpRespond(
|
||||||
Map<String, Object> session,
|
Map<String, Object> session,
|
||||||
Map<String, String> cookie,
|
Map<String, String> cookie,
|
||||||
Map<String, String> request)
|
Map<String, String> request)
|
||||||
throws Exception{
|
throws Exception{
|
||||||
|
|
||||||
Templator tmpl = new Templator(FileUtil.find(TEMPLATE));
|
Templator tmpl = new Templator(FileUtil.find(TEMPLATE));
|
||||||
return tmpl;
|
return tmpl;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -24,7 +24,7 @@ import java.util.logging.Logger;
|
||||||
* type: sensor data type name
|
* type: sensor data type name
|
||||||
*
|
*
|
||||||
* Data filtering parameters:
|
* 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
|
||||||
* </pre>
|
* </pre>
|
||||||
*/
|
*/
|
||||||
public class SensorJsonPage extends HalJsonPage {
|
public class SensorJsonPage extends HalJsonPage {
|
||||||
|
|
|
||||||
|
|
@ -18,9 +18,6 @@ import java.util.concurrent.TimeUnit;
|
||||||
import java.util.logging.Level;
|
import java.util.logging.Level;
|
||||||
import java.util.logging.Logger;
|
import java.util.logging.Logger;
|
||||||
|
|
||||||
/**
|
|
||||||
* Created by Ziver on 2016-09-30.
|
|
||||||
*/
|
|
||||||
public class NetScanController implements HalEventController, HalAutoScannableController, InetScanListener, Runnable{
|
public class NetScanController implements HalEventController, HalAutoScannableController, InetScanListener, Runnable{
|
||||||
public static Logger logger = LogUtil.getLogger();
|
public static Logger logger = LogUtil.getLogger();
|
||||||
private static final int NETWORK_SYNC_INTERVAL = 3 * 60 * 60 * 1000; // 3 hours
|
private static final int NETWORK_SYNC_INTERVAL = 3 * 60 * 60 * 1000; // 3 hours
|
||||||
|
|
|
||||||
|
|
@ -6,9 +6,6 @@ import se.hal.intf.HalEventData;
|
||||||
import se.hal.struct.devicedata.SwitchEventData;
|
import se.hal.struct.devicedata.SwitchEventData;
|
||||||
import zutil.ui.Configurator;
|
import zutil.ui.Configurator;
|
||||||
|
|
||||||
/**
|
|
||||||
* Created by Ziver on 2016-10-02.
|
|
||||||
*/
|
|
||||||
public class NetworkDevice implements HalEventConfig {
|
public class NetworkDevice implements HalEventConfig {
|
||||||
|
|
||||||
@Configurator.Configurable("IP Address")
|
@Configurator.Configurable("IP Address")
|
||||||
|
|
|
||||||
|
|
@ -15,9 +15,6 @@ import java.util.concurrent.TimeUnit;
|
||||||
import java.util.logging.Level;
|
import java.util.logging.Level;
|
||||||
import java.util.logging.Logger;
|
import java.util.logging.Logger;
|
||||||
|
|
||||||
/**
|
|
||||||
* Created by Ziver on 2016-05-25.
|
|
||||||
*/
|
|
||||||
public class NutUpsController implements HalSensorController, HalAutoScannableController, Runnable{
|
public class NutUpsController implements HalSensorController, HalAutoScannableController, Runnable{
|
||||||
public static Logger logger = LogUtil.getLogger();
|
public static Logger logger = LogUtil.getLogger();
|
||||||
private static final int SYNC_INTERVAL = 60 * 1000;
|
private static final int SYNC_INTERVAL = 60 * 1000;
|
||||||
|
|
|
||||||
|
|
@ -7,9 +7,6 @@ import se.hal.struct.devicedata.PowerConsumptionSensorData;
|
||||||
import zutil.osal.linux.app.NutUPSClient;
|
import zutil.osal.linux.app.NutUPSClient;
|
||||||
import zutil.ui.Configurator;
|
import zutil.ui.Configurator;
|
||||||
|
|
||||||
/**
|
|
||||||
* Created by Ziver on 2016-05-25.
|
|
||||||
*/
|
|
||||||
public class NutUpsDevice implements HalSensorConfig{
|
public class NutUpsDevice implements HalSensorConfig{
|
||||||
|
|
||||||
@Configurator.Configurable("UPS id")
|
@Configurator.Configurable("UPS id")
|
||||||
|
|
|
||||||
|
|
@ -20,9 +20,6 @@ import java.util.List;
|
||||||
import java.util.logging.Level;
|
import java.util.logging.Level;
|
||||||
import java.util.logging.Logger;
|
import java.util.logging.Logger;
|
||||||
|
|
||||||
/**
|
|
||||||
* Created by Ziver on 2015-12-15.
|
|
||||||
*/
|
|
||||||
@DBBean.DBTable(value="event", superBean=true)
|
@DBBean.DBTable(value="event", superBean=true)
|
||||||
public class Event extends AbstractDevice<Event, HalEventConfig,HalEventData>{
|
public class Event extends AbstractDevice<Event, HalEventConfig,HalEventData>{
|
||||||
private static final Logger logger = LogUtil.getLogger();
|
private static final Logger logger = LogUtil.getLogger();
|
||||||
|
|
|
||||||
|
|
@ -23,16 +23,16 @@ import java.util.logging.Logger;
|
||||||
public class Sensor extends AbstractDevice<Sensor, HalSensorConfig,HalSensorData>{
|
public class Sensor extends AbstractDevice<Sensor, HalSensorConfig,HalSensorData>{
|
||||||
private static final Logger logger = LogUtil.getLogger();
|
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 **/
|
/** local sensor= if sensor should be public. external sensor= if sensor should be requested from host **/
|
||||||
private boolean sync = false;
|
private boolean sync = false;
|
||||||
private long aggr_version;
|
private long aggr_version;
|
||||||
|
|
||||||
|
|
||||||
public static List<Sensor> getExternalSensors(DBConnection db) throws SQLException{
|
public static List<Sensor> getExternalSensors(DBConnection db) throws SQLException{
|
||||||
PreparedStatement stmt = db.getPreparedStatement( "SELECT sensor.* FROM sensor,user WHERE user.external == 1 AND user.id == sensor.user_id" );
|
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) );
|
return DBConnection.exec(stmt, DBBeanSQLResultHandler.createList(Sensor.class, db) );
|
||||||
}
|
}
|
||||||
public static Sensor getExternalSensor(DBConnection db, User user, long external_id) throws SQLException{
|
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 == ?" );
|
PreparedStatement stmt = db.getPreparedStatement( "SELECT sensor.* FROM sensor WHERE ? == sensor.user_id AND sensor.external_id == ?" );
|
||||||
stmt.setLong(1, user.getId());
|
stmt.setLong(1, user.getId());
|
||||||
|
|
@ -40,31 +40,31 @@ public class Sensor extends AbstractDevice<Sensor, HalSensorConfig,HalSensorData
|
||||||
return DBConnection.exec(stmt, DBBeanSQLResultHandler.create(Sensor.class, db) );
|
return DBConnection.exec(stmt, DBBeanSQLResultHandler.create(Sensor.class, db) );
|
||||||
}
|
}
|
||||||
|
|
||||||
public static List<Sensor> getLocalSensors(DBConnection db) throws SQLException{
|
public static List<Sensor> getLocalSensors(DBConnection db) throws SQLException{
|
||||||
PreparedStatement stmt = db.getPreparedStatement( "SELECT sensor.* FROM sensor,user WHERE user.external == 0 AND user.id == sensor.user_id" );
|
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) );
|
return DBConnection.exec(stmt, DBBeanSQLResultHandler.createList(Sensor.class, db) );
|
||||||
}
|
}
|
||||||
|
|
||||||
public static List<Sensor> getSensors(DBConnection db, User user) throws SQLException{
|
public static List<Sensor> getSensors(DBConnection db, User user) throws SQLException{
|
||||||
PreparedStatement stmt = db.getPreparedStatement( "SELECT * FROM sensor WHERE user_id == ?" );
|
PreparedStatement stmt = db.getPreparedStatement( "SELECT * FROM sensor WHERE user_id == ?" );
|
||||||
stmt.setLong(1, user.getId());
|
stmt.setLong(1, user.getId());
|
||||||
return DBConnection.exec(stmt, DBBeanSQLResultHandler.createList(Sensor.class, db) );
|
return DBConnection.exec(stmt, DBBeanSQLResultHandler.createList(Sensor.class, db) );
|
||||||
}
|
}
|
||||||
|
|
||||||
public static List<Sensor> getSensors(DBConnection db) throws SQLException{
|
public static List<Sensor> getSensors(DBConnection db) throws SQLException{
|
||||||
PreparedStatement stmt = db.getPreparedStatement( "SELECT * FROM sensor" );
|
PreparedStatement stmt = db.getPreparedStatement( "SELECT * FROM sensor" );
|
||||||
return DBConnection.exec(stmt, DBBeanSQLResultHandler.createList(Sensor.class, db) );
|
return DBConnection.exec(stmt, DBBeanSQLResultHandler.createList(Sensor.class, db) );
|
||||||
}
|
}
|
||||||
|
|
||||||
public static Sensor getSensor(DBConnection db, long id) throws SQLException{
|
public static Sensor getSensor(DBConnection db, long id) throws SQLException{
|
||||||
return DBBean.load(db, Sensor.class, id);
|
return DBBean.load(db, Sensor.class, id);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static long getHighestSequenceId(long sensorId) throws SQLException{
|
public static long getHighestSequenceId(long sensorId) throws SQLException{
|
||||||
PreparedStatement stmt = HalContext.getDB().getPreparedStatement("SELECT MAX(sequence_id) FROM sensor_data_aggr WHERE sensor_id == ?");
|
PreparedStatement stmt = HalContext.getDB().getPreparedStatement("SELECT MAX(sequence_id) FROM sensor_data_aggr WHERE sensor_id == ?");
|
||||||
stmt.setLong(1, sensorId);
|
stmt.setLong(1, sensorId);
|
||||||
Integer id = DBConnection.exec(stmt, new SimpleSQLResult<Integer>());
|
Integer id = DBConnection.exec(stmt, new SimpleSQLResult<Integer>());
|
||||||
return (id != null ? id : 0);
|
return (id != null ? id : 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -90,12 +90,12 @@ public class Sensor extends AbstractDevice<Sensor, HalSensorConfig,HalSensorData
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public long getExternalId() {
|
public long getExternalId() {
|
||||||
return external_id;
|
return external_id;
|
||||||
}
|
}
|
||||||
public void setExternalId(long external_id) {
|
public void setExternalId(long external_id) {
|
||||||
this.external_id = external_id;
|
this.external_id = external_id;
|
||||||
}
|
}
|
||||||
public boolean isSynced() {
|
public boolean isSynced() {
|
||||||
return sync;
|
return sync;
|
||||||
}
|
}
|
||||||
|
|
@ -103,10 +103,10 @@ public class Sensor extends AbstractDevice<Sensor, HalSensorConfig,HalSensorData
|
||||||
this.sync = synced;
|
this.sync = synced;
|
||||||
}
|
}
|
||||||
public long getAggregationVersion(){
|
public long getAggregationVersion(){
|
||||||
return this.aggr_version;
|
return this.aggr_version;
|
||||||
}
|
}
|
||||||
public void setAggregationVersion(long aggr_version){
|
public void setAggregationVersion(long aggr_version){
|
||||||
this.aggr_version = aggr_version;
|
this.aggr_version = aggr_version;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -9,9 +9,6 @@ import java.sql.PreparedStatement;
|
||||||
import java.sql.SQLException;
|
import java.sql.SQLException;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
/**
|
|
||||||
* Created by Ziver on 2015-12-03.
|
|
||||||
*/
|
|
||||||
@DBBean.DBTable("user")
|
@DBBean.DBTable("user")
|
||||||
public class User extends DBBean{
|
public class User extends DBBean{
|
||||||
|
|
||||||
|
|
@ -25,80 +22,80 @@ public class User extends DBBean{
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
public static List<User> getExternalUsers(DBConnection db) throws SQLException{
|
public static List<User> getExternalUsers(DBConnection db) throws SQLException{
|
||||||
PreparedStatement stmt = db.getPreparedStatement( "SELECT * FROM user WHERE user.external == 1" );
|
PreparedStatement stmt = db.getPreparedStatement( "SELECT * FROM user WHERE user.external == 1" );
|
||||||
return DBConnection.exec(stmt, DBBeanSQLResultHandler.createList(User.class, db) );
|
return DBConnection.exec(stmt, DBBeanSQLResultHandler.createList(User.class, db) );
|
||||||
}
|
}
|
||||||
|
|
||||||
public static User getLocalUser(DBConnection db) throws SQLException{
|
public static User getLocalUser(DBConnection db) throws SQLException{
|
||||||
PreparedStatement stmt = db.getPreparedStatement( "SELECT * FROM user WHERE user.external == 0" );
|
PreparedStatement stmt = db.getPreparedStatement( "SELECT * FROM user WHERE user.external == 0" );
|
||||||
return DBConnection.exec(stmt, DBBeanSQLResultHandler.create(User.class, db) );
|
return DBConnection.exec(stmt, DBBeanSQLResultHandler.create(User.class, db) );
|
||||||
}
|
}
|
||||||
|
|
||||||
public static List<User> getUsers(DBConnection db) throws SQLException{
|
public static List<User> getUsers(DBConnection db) throws SQLException{
|
||||||
PreparedStatement stmt = db.getPreparedStatement( "SELECT * FROM user" );
|
PreparedStatement stmt = db.getPreparedStatement( "SELECT * FROM user" );
|
||||||
return DBConnection.exec(stmt, DBBeanSQLResultHandler.createList(User.class, db) );
|
return DBConnection.exec(stmt, DBBeanSQLResultHandler.createList(User.class, db) );
|
||||||
}
|
}
|
||||||
|
|
||||||
public static User getUser(DBConnection db, int id) throws SQLException {
|
public static User getUser(DBConnection db, int id) throws SQLException {
|
||||||
return DBBean.load(db, User.class, id);
|
return DBBean.load(db, User.class, id);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Will delete this user and all its Sensors
|
* Will delete this user and all its Sensors
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public void delete(DBConnection db) throws SQLException {
|
public void delete(DBConnection db) throws SQLException {
|
||||||
List<Sensor> sensorList = Sensor.getSensors(db, this);
|
List<Sensor> sensorList = Sensor.getSensors(db, this);
|
||||||
for(Sensor sensor : sensorList){
|
for(Sensor sensor : sensorList){
|
||||||
sensor.delete(db);
|
sensor.delete(db);
|
||||||
}
|
}
|
||||||
super.delete(db);
|
super.delete(db);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public String getUsername() {
|
public String getUsername() {
|
||||||
return username;
|
return username;
|
||||||
}
|
}
|
||||||
public void setUsername(String name) {
|
public void setUsername(String name) {
|
||||||
this.username = name;
|
this.username = name;
|
||||||
}
|
}
|
||||||
public String getEmail() {
|
public String getEmail() {
|
||||||
return email;
|
return email;
|
||||||
}
|
}
|
||||||
public void setEmail(String email) {
|
public void setEmail(String email) {
|
||||||
this.email = email;
|
this.email = email;
|
||||||
}
|
}
|
||||||
public String getAvatarUrl(){
|
public String getAvatarUrl(){
|
||||||
return Gravatar.getImageUrl(email, 130);
|
return Gravatar.getImageUrl(email, 130);
|
||||||
}
|
}
|
||||||
public String getLargeAvatarUrl(){
|
public String getLargeAvatarUrl(){
|
||||||
return Gravatar.getImageUrl(email, 250);
|
return Gravatar.getImageUrl(email, 250);
|
||||||
}
|
}
|
||||||
public String getAddress() {
|
public String getAddress() {
|
||||||
return address;
|
return address;
|
||||||
}
|
}
|
||||||
public void setAddress(String address) {
|
public void setAddress(String address) {
|
||||||
this.address = address;
|
this.address = address;
|
||||||
}
|
}
|
||||||
public boolean isExternal() {
|
public boolean isExternal() {
|
||||||
return external > 0;
|
return external > 0;
|
||||||
}
|
}
|
||||||
public void setExternal(boolean external) {
|
public void setExternal(boolean external) {
|
||||||
this.external = (external? 1:0 );
|
this.external = (external? 1:0 );
|
||||||
}
|
}
|
||||||
public String getHostname() {
|
public String getHostname() {
|
||||||
return hostname;
|
return hostname;
|
||||||
}
|
}
|
||||||
public void setHostname(String hostname) {
|
public void setHostname(String hostname) {
|
||||||
this.hostname = hostname;
|
this.hostname = hostname;
|
||||||
}
|
}
|
||||||
public int getPort() {
|
public int getPort() {
|
||||||
return port;
|
return port;
|
||||||
}
|
}
|
||||||
public void setPort(int port) {
|
public void setPort(int port) {
|
||||||
this.port = port;
|
this.port = port;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -24,9 +24,6 @@ package se.hal.struct.devicedata;
|
||||||
|
|
||||||
import se.hal.intf.HalEventData;
|
import se.hal.intf.HalEventData;
|
||||||
|
|
||||||
/**
|
|
||||||
* Created by Ziver on 2015-05-07.
|
|
||||||
*/
|
|
||||||
public class DimmerEventData extends HalEventData {
|
public class DimmerEventData extends HalEventData {
|
||||||
|
|
||||||
private double dimmValue;
|
private double dimmValue;
|
||||||
|
|
|
||||||
|
|
@ -3,9 +3,6 @@ package se.hal.struct.devicedata;
|
||||||
|
|
||||||
import se.hal.intf.HalSensorData;
|
import se.hal.intf.HalSensorData;
|
||||||
|
|
||||||
/**
|
|
||||||
* Created by Ziver on 2015-12-03.
|
|
||||||
*/
|
|
||||||
public class HumiditySensorData extends HalSensorData {
|
public class HumiditySensorData extends HalSensorData {
|
||||||
|
|
||||||
private double humidity;
|
private double humidity;
|
||||||
|
|
|
||||||
|
|
@ -2,9 +2,6 @@ package se.hal.struct.devicedata;
|
||||||
|
|
||||||
import se.hal.intf.HalSensorData;
|
import se.hal.intf.HalSensorData;
|
||||||
|
|
||||||
/**
|
|
||||||
* Created by Ziver on 2015-12-03.
|
|
||||||
*/
|
|
||||||
public class LightSensorData extends HalSensorData {
|
public class LightSensorData extends HalSensorData {
|
||||||
|
|
||||||
private double lux;
|
private double lux;
|
||||||
|
|
|
||||||
|
|
@ -2,9 +2,6 @@ package se.hal.struct.devicedata;
|
||||||
|
|
||||||
import se.hal.intf.HalSensorData;
|
import se.hal.intf.HalSensorData;
|
||||||
|
|
||||||
/**
|
|
||||||
* Created by Ziver on 2015-12-03.
|
|
||||||
*/
|
|
||||||
public class PowerConsumptionSensorData extends HalSensorData {
|
public class PowerConsumptionSensorData extends HalSensorData {
|
||||||
|
|
||||||
private double wattHours;
|
private double wattHours;
|
||||||
|
|
|
||||||
|
|
@ -24,9 +24,6 @@ package se.hal.struct.devicedata;
|
||||||
|
|
||||||
import se.hal.intf.HalEventData;
|
import se.hal.intf.HalEventData;
|
||||||
|
|
||||||
/**
|
|
||||||
* Created by Ziver on 2015-05-07.
|
|
||||||
*/
|
|
||||||
public class SwitchEventData extends HalEventData {
|
public class SwitchEventData extends HalEventData {
|
||||||
|
|
||||||
private boolean enabled;
|
private boolean enabled;
|
||||||
|
|
|
||||||
|
|
@ -2,9 +2,6 @@ package se.hal.struct.devicedata;
|
||||||
|
|
||||||
import se.hal.intf.HalSensorData;
|
import se.hal.intf.HalSensorData;
|
||||||
|
|
||||||
/**
|
|
||||||
* Created by Ziver on 2015-12-03.
|
|
||||||
*/
|
|
||||||
public class TemperatureSensorData extends HalSensorData {
|
public class TemperatureSensorData extends HalSensorData {
|
||||||
|
|
||||||
private double temperature;
|
private double temperature;
|
||||||
|
|
|
||||||
|
|
@ -31,19 +31,19 @@ import java.io.InputStreamReader;
|
||||||
public class ManualSTTClient implements HalSpeechToText {
|
public class ManualSTTClient implements HalSpeechToText {
|
||||||
private BufferedReader in;
|
private BufferedReader in;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void initialize() {
|
public void initialize() {
|
||||||
// open up standard input
|
// open up standard input
|
||||||
in = new BufferedReader(new InputStreamReader(System.in));
|
in = new BufferedReader(new InputStreamReader(System.in));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String listen() {
|
public String listen() {
|
||||||
try {
|
try {
|
||||||
return in.readLine();
|
return in.readLine();
|
||||||
} catch (IOException ioe) {
|
} catch (IOException ioe) {
|
||||||
ioe.printStackTrace();
|
ioe.printStackTrace();
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -30,9 +30,6 @@ import se.hal.intf.HalSpeechToText;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Created by Ziver on 2015-05-08.
|
|
||||||
*/
|
|
||||||
public class Sphinx4STTClient implements HalSpeechToText {
|
public class Sphinx4STTClient implements HalSpeechToText {
|
||||||
private LiveSpeechRecognizer recognizer;
|
private LiveSpeechRecognizer recognizer;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -7,9 +7,6 @@ import zutil.ui.Configurator.PreConfigurationActionListener;
|
||||||
|
|
||||||
import java.text.SimpleDateFormat;
|
import java.text.SimpleDateFormat;
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
public class DateTimeTrigger implements HalTrigger,Configurator.PostConfigurationActionListener {
|
public class DateTimeTrigger implements HalTrigger,Configurator.PostConfigurationActionListener {
|
||||||
|
|
||||||
@Configurator.Configurable("Minute (Cron format)")
|
@Configurator.Configurable("Minute (Cron format)")
|
||||||
|
|
|
||||||
|
|
@ -8,9 +8,6 @@ import java.sql.SQLException;
|
||||||
import java.util.logging.Level;
|
import java.util.logging.Level;
|
||||||
import java.util.logging.Logger;
|
import java.util.logging.Logger;
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
public class EventTrigger extends DeviceTrigger{
|
public class EventTrigger extends DeviceTrigger{
|
||||||
private static final Logger logger = LogUtil.getLogger();
|
private static final Logger logger = LogUtil.getLogger();
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -9,9 +9,6 @@ import java.sql.SQLException;
|
||||||
import java.util.logging.Level;
|
import java.util.logging.Level;
|
||||||
import java.util.logging.Logger;
|
import java.util.logging.Logger;
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
public class SensorTrigger extends DeviceTrigger{
|
public class SensorTrigger extends DeviceTrigger{
|
||||||
private static final Logger logger = LogUtil.getLogger();
|
private static final Logger logger = LogUtil.getLogger();
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -4,9 +4,6 @@ import se.hal.intf.HalTrigger;
|
||||||
import zutil.Timer;
|
import zutil.Timer;
|
||||||
import zutil.ui.Configurator;
|
import zutil.ui.Configurator;
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
public class TimerTrigger implements HalTrigger {
|
public class TimerTrigger implements HalTrigger {
|
||||||
|
|
||||||
@Configurator.Configurable("Countdown time (in seconds)")
|
@Configurator.Configurable("Countdown time (in seconds)")
|
||||||
|
|
|
||||||
|
|
@ -32,9 +32,6 @@ import se.hal.intf.HalTextToSpeech;
|
||||||
import javax.sound.sampled.AudioInputStream;
|
import javax.sound.sampled.AudioInputStream;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
public class MaryTTSLocalClient implements HalTextToSpeech {
|
public class MaryTTSLocalClient implements HalTextToSpeech {
|
||||||
private MaryInterface marytts;
|
private MaryInterface marytts;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -15,22 +15,22 @@ import java.util.List;
|
||||||
|
|
||||||
public class AggregateDataListSqlResult implements SQLResultHandler<ArrayList<AggregateDataListSqlResult.AggregateData>> {
|
public class AggregateDataListSqlResult implements SQLResultHandler<ArrayList<AggregateDataListSqlResult.AggregateData>> {
|
||||||
|
|
||||||
public static class AggregateData {
|
public static class AggregateData {
|
||||||
public int id;
|
public int id;
|
||||||
public long timestamp;
|
public long timestamp;
|
||||||
public Float data;
|
public Float data;
|
||||||
public String username;
|
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.id = id;
|
||||||
this.timestamp = time;
|
this.timestamp = time;
|
||||||
this.data = data;
|
this.data = data;
|
||||||
this.username = uname;
|
this.username = uname;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static List<AggregateData> getAggregateDataForPeriod(DBConnection db, Sensor sensor, AggregationPeriodLength aggrPeriodLength, long ageLimitInMs) throws SQLException {
|
public static List<AggregateData> getAggregateDataForPeriod(DBConnection db, Sensor sensor, AggregationPeriodLength aggrPeriodLength, long ageLimitInMs) throws SQLException {
|
||||||
PreparedStatement stmt = db.getPreparedStatement(
|
PreparedStatement stmt = db.getPreparedStatement(
|
||||||
"SELECT user.username as username,"
|
"SELECT user.username as username,"
|
||||||
+ " sensor.*,"
|
+ " sensor.*,"
|
||||||
+ " sensor_data_aggr.*"
|
+ " sensor_data_aggr.*"
|
||||||
|
|
@ -45,15 +45,15 @@ public class AggregateDataListSqlResult implements SQLResultHandler<ArrayList<Ag
|
||||||
stmt.setLong(1, sensor.getId());
|
stmt.setLong(1, sensor.getId());
|
||||||
stmt.setLong(2, sensor.getUser().getId());
|
stmt.setLong(2, sensor.getUser().getId());
|
||||||
switch(aggrPeriodLength){
|
switch(aggrPeriodLength){
|
||||||
case SECOND: stmt.setLong(3, UTCTimeUtility.SECOND_IN_MS-1); break;
|
case SECOND: stmt.setLong(3, UTCTimeUtility.SECOND_IN_MS-1); break;
|
||||||
case MINUTE: stmt.setLong(3, UTCTimeUtility.MINUTE_IN_MS-1); break;
|
case MINUTE: stmt.setLong(3, UTCTimeUtility.MINUTE_IN_MS-1); break;
|
||||||
case FIVE_MINUTES: stmt.setLong(3, UTCTimeUtility.FIVE_MINUTES_IN_MS-1); break;
|
case FIVE_MINUTES: stmt.setLong(3, UTCTimeUtility.FIVE_MINUTES_IN_MS-1); break;
|
||||||
case FIFTEEN_MINUTES: stmt.setLong(3, UTCTimeUtility.FIFTEEN_MINUTES_IN_MS-1); break;
|
case FIFTEEN_MINUTES: stmt.setLong(3, UTCTimeUtility.FIFTEEN_MINUTES_IN_MS-1); break;
|
||||||
case HOUR: stmt.setLong(3, UTCTimeUtility.HOUR_IN_MS-1); break;
|
case HOUR: stmt.setLong(3, UTCTimeUtility.HOUR_IN_MS-1); break;
|
||||||
case DAY: stmt.setLong(3, UTCTimeUtility.DAY_IN_MS-1); break;
|
case DAY: stmt.setLong(3, UTCTimeUtility.DAY_IN_MS-1); break;
|
||||||
case WEEK: stmt.setLong(3, UTCTimeUtility.WEEK_IN_MS-1); break;
|
case WEEK: stmt.setLong(3, UTCTimeUtility.WEEK_IN_MS-1); break;
|
||||||
default: throw new IllegalArgumentException("selected aggrPeriodLength is not supported");
|
default: throw new IllegalArgumentException("selected aggrPeriodLength is not supported");
|
||||||
}
|
}
|
||||||
stmt.setLong(4, (System.currentTimeMillis() - ageLimitInMs) );
|
stmt.setLong(4, (System.currentTimeMillis() - ageLimitInMs) );
|
||||||
return DBConnection.exec(stmt , new AggregateDataListSqlResult(sensor));
|
return DBConnection.exec(stmt , new AggregateDataListSqlResult(sensor));
|
||||||
}
|
}
|
||||||
|
|
@ -62,45 +62,45 @@ public class AggregateDataListSqlResult implements SQLResultHandler<ArrayList<Ag
|
||||||
private Sensor sensor;
|
private Sensor sensor;
|
||||||
|
|
||||||
private AggregateDataListSqlResult(Sensor sensor){
|
private AggregateDataListSqlResult(Sensor sensor){
|
||||||
this.sensor = sensor;
|
this.sensor = sensor;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public ArrayList<AggregateData> handleQueryResult(Statement stmt, ResultSet result) throws SQLException {
|
public ArrayList<AggregateData> handleQueryResult(Statement stmt, ResultSet result) throws SQLException {
|
||||||
ArrayList<AggregateData> list = new ArrayList<>();
|
ArrayList<AggregateData> list = new ArrayList<>();
|
||||||
long previousTimestampEnd = -1;
|
long previousTimestampEnd = -1;
|
||||||
while (result.next()){
|
while (result.next()){
|
||||||
|
|
||||||
int id = result.getInt("id");
|
int id = result.getInt("id");
|
||||||
long timestampStart = result.getLong("timestamp_start");
|
long timestampStart = result.getLong("timestamp_start");
|
||||||
long timestampEnd = result.getLong("timestamp_end");
|
long timestampEnd = result.getLong("timestamp_end");
|
||||||
String username = result.getString("username");
|
String username = result.getString("username");
|
||||||
float confidence = result.getFloat("confidence");
|
float confidence = result.getFloat("confidence");
|
||||||
|
|
||||||
// Calculate the data point
|
// Calculate the data point
|
||||||
float data = result.getFloat("data"); //the "raw" recorded data
|
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
|
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
|
// 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();
|
boolean shortInterval = timestampEnd-timestampStart < sensor.getDeviceConfig().getDataInterval();
|
||||||
long distance = timestampStart - (previousTimestampEnd + 1);
|
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 ||
|
!shortInterval && distance > 0 ||
|
||||||
// Only add nulls if space between aggr is larger than sensor report interval
|
// Only add nulls if space between aggr is larger than sensor report interval
|
||||||
shortInterval && distance > sensor.getDeviceConfig().getDataInterval())
|
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)
|
if (sensor.getDeviceConfig().getSensorDataClass() == PowerConsumptionSensorData.class)
|
||||||
estimatedData = (estimatedData/1000f);
|
estimatedData = (estimatedData/1000f);
|
||||||
list.add(new AggregateData(id, timestampEnd, estimatedData, username)); //add this data point to list
|
list.add(new AggregateData(id, timestampEnd, estimatedData, username)); //add this data point to list
|
||||||
|
|
||||||
// Update previous end timestamp
|
// Update previous end timestamp
|
||||||
previousTimestampEnd = timestampEnd;
|
previousTimestampEnd = timestampEnd;
|
||||||
}
|
}
|
||||||
return list;
|
return list;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -8,9 +8,6 @@ import java.sql.ResultSet;
|
||||||
import java.sql.SQLException;
|
import java.sql.SQLException;
|
||||||
import java.sql.Statement;
|
import java.sql.Statement;
|
||||||
|
|
||||||
/**
|
|
||||||
* Created by Ziver on 2016-08-22.
|
|
||||||
*/
|
|
||||||
public class DeviceDataSqlResult implements SQLResultHandler<HalDeviceData> {
|
public class DeviceDataSqlResult implements SQLResultHandler<HalDeviceData> {
|
||||||
|
|
||||||
private Class<? extends HalDeviceData> clazz;
|
private Class<? extends HalDeviceData> clazz;
|
||||||
|
|
|
||||||
|
|
@ -3,50 +3,50 @@ package se.hal.util;
|
||||||
import se.hal.daemon.SensorDataAggregatorDaemon.AggregationPeriodLength;
|
import se.hal.daemon.SensorDataAggregatorDaemon.AggregationPeriodLength;
|
||||||
|
|
||||||
public class UTCTimePeriod{
|
public class UTCTimePeriod{
|
||||||
private final long start;
|
private final long start;
|
||||||
private final long end;
|
private final long end;
|
||||||
private final AggregationPeriodLength periodLength;
|
private final AggregationPeriodLength periodLength;
|
||||||
|
|
||||||
public UTCTimePeriod(long timestamp, AggregationPeriodLength periodLength){
|
public UTCTimePeriod(long timestamp, AggregationPeriodLength periodLength){
|
||||||
start = UTCTimeUtility.getTimestampPeriodStart(periodLength, timestamp);
|
start = UTCTimeUtility.getTimestampPeriodStart(periodLength, timestamp);
|
||||||
end = UTCTimeUtility.getTimestampPeriodEnd(periodLength, timestamp);
|
end = UTCTimeUtility.getTimestampPeriodEnd(periodLength, timestamp);
|
||||||
this.periodLength = periodLength;
|
this.periodLength = periodLength;
|
||||||
}
|
}
|
||||||
|
|
||||||
public long getStartTimestamp(){
|
public long getStartTimestamp(){
|
||||||
return start;
|
return start;
|
||||||
}
|
}
|
||||||
|
|
||||||
public long getEndTimestamp(){
|
public long getEndTimestamp(){
|
||||||
return end;
|
return end;
|
||||||
}
|
}
|
||||||
|
|
||||||
public UTCTimePeriod getNextPeriod(){
|
public UTCTimePeriod getNextPeriod(){
|
||||||
return new UTCTimePeriod(end+1, periodLength);
|
return new UTCTimePeriod(end+1, periodLength);
|
||||||
}
|
}
|
||||||
|
|
||||||
public UTCTimePeriod getPreviosPeriod(){
|
public UTCTimePeriod getPreviosPeriod(){
|
||||||
return new UTCTimePeriod(start-1, periodLength);
|
return new UTCTimePeriod(start-1, periodLength);
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean containsTimestamp(long timestamp){
|
public boolean containsTimestamp(long timestamp){
|
||||||
return start <= timestamp && timestamp <= end;
|
return start <= timestamp && timestamp <= end;
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean equals(Object other){
|
public boolean equals(Object other){
|
||||||
if(other == null)
|
if(other == null)
|
||||||
return false;
|
return false;
|
||||||
if(other instanceof UTCTimePeriod){
|
if(other instanceof UTCTimePeriod){
|
||||||
UTCTimePeriod o = (UTCTimePeriod)other;
|
UTCTimePeriod o = (UTCTimePeriod)other;
|
||||||
return start == o.start
|
return start == o.start
|
||||||
&& end == o.end
|
&& end == o.end
|
||||||
&& periodLength == o.periodLength;
|
&& periodLength == o.periodLength;
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
public String toString(){
|
public String toString(){
|
||||||
return start + "=>" + end + " (" + UTCTimeUtility.getDateString(start) + "=>" + UTCTimeUtility.getDateString(end) + ")";
|
return start + "=>" + end + " (" + UTCTimeUtility.getDateString(start) + "=>" + UTCTimeUtility.getDateString(end) + ")";
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
@ -8,243 +8,243 @@ import java.util.Locale;
|
||||||
import java.util.TimeZone;
|
import java.util.TimeZone;
|
||||||
|
|
||||||
public class UTCTimeUtility {
|
public class UTCTimeUtility {
|
||||||
public static final TimeZone TIMEZONE = TimeZone.getTimeZone("UTC");
|
public static final TimeZone TIMEZONE = TimeZone.getTimeZone("UTC");
|
||||||
public static final Locale LOCALE = new Locale("sv","SE");
|
public static final Locale LOCALE = new Locale("sv","SE");
|
||||||
|
|
||||||
public static final long SECOND_IN_MS = 1000;
|
public static final long SECOND_IN_MS = 1000;
|
||||||
public static final long MINUTE_IN_MS = SECOND_IN_MS * 60;
|
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 FIVE_MINUTES_IN_MS = MINUTE_IN_MS * 5;
|
||||||
public static final long FIFTEEN_MINUTES_IN_MS = MINUTE_IN_MS * 15;
|
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 HOUR_IN_MS = MINUTE_IN_MS * 60;
|
||||||
public static final long DAY_IN_MS = HOUR_IN_MS * 24;
|
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 WEEK_IN_MS = DAY_IN_MS * 7;
|
||||||
public static final long INFINITY = Long.MAX_VALUE; //sort of true
|
public static final long INFINITY = Long.MAX_VALUE; //sort of true
|
||||||
|
|
||||||
public static long getTimestampPeriodStart(AggregationPeriodLength aggrPeriodLength, long timestamp) throws NumberFormatException{
|
public static long getTimestampPeriodStart(AggregationPeriodLength aggrPeriodLength, long timestamp) throws NumberFormatException{
|
||||||
Calendar cal = Calendar.getInstance(TIMEZONE, LOCALE);
|
Calendar cal = Calendar.getInstance(TIMEZONE, LOCALE);
|
||||||
cal.setTimeInMillis(timestamp);
|
cal.setTimeInMillis(timestamp);
|
||||||
cal.setFirstDayOfWeek(Calendar.MONDAY);
|
cal.setFirstDayOfWeek(Calendar.MONDAY);
|
||||||
switch(aggrPeriodLength){
|
switch(aggrPeriodLength){
|
||||||
case YEAR:
|
case YEAR:
|
||||||
cal.set(Calendar.DAY_OF_YEAR, 1);
|
cal.set(Calendar.DAY_OF_YEAR, 1);
|
||||||
cal.set(Calendar.HOUR_OF_DAY, 0);
|
cal.set(Calendar.HOUR_OF_DAY, 0);
|
||||||
cal.set(Calendar.MINUTE, 0);
|
cal.set(Calendar.MINUTE, 0);
|
||||||
cal.set(Calendar.SECOND, 0);
|
cal.set(Calendar.SECOND, 0);
|
||||||
cal.set(Calendar.MILLISECOND, 0);
|
cal.set(Calendar.MILLISECOND, 0);
|
||||||
break;
|
break;
|
||||||
case MONTH:
|
case MONTH:
|
||||||
cal.set(Calendar.DAY_OF_MONTH, 1);
|
cal.set(Calendar.DAY_OF_MONTH, 1);
|
||||||
cal.set(Calendar.HOUR_OF_DAY, 0);
|
cal.set(Calendar.HOUR_OF_DAY, 0);
|
||||||
cal.set(Calendar.MINUTE, 0);
|
cal.set(Calendar.MINUTE, 0);
|
||||||
cal.set(Calendar.SECOND, 0);
|
cal.set(Calendar.SECOND, 0);
|
||||||
cal.set(Calendar.MILLISECOND, 0);
|
cal.set(Calendar.MILLISECOND, 0);
|
||||||
break;
|
break;
|
||||||
case WEEK:
|
case WEEK:
|
||||||
cal.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);
|
cal.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);
|
||||||
cal.set(Calendar.HOUR_OF_DAY, 0);
|
cal.set(Calendar.HOUR_OF_DAY, 0);
|
||||||
cal.set(Calendar.MINUTE, 0);
|
cal.set(Calendar.MINUTE, 0);
|
||||||
cal.set(Calendar.SECOND, 0);
|
cal.set(Calendar.SECOND, 0);
|
||||||
cal.set(Calendar.MILLISECOND, 0);
|
cal.set(Calendar.MILLISECOND, 0);
|
||||||
break;
|
break;
|
||||||
case DAY:
|
case DAY:
|
||||||
cal.set(Calendar.HOUR_OF_DAY, 0);
|
cal.set(Calendar.HOUR_OF_DAY, 0);
|
||||||
cal.set(Calendar.MINUTE, 0);
|
cal.set(Calendar.MINUTE, 0);
|
||||||
cal.set(Calendar.SECOND, 0);
|
cal.set(Calendar.SECOND, 0);
|
||||||
cal.set(Calendar.MILLISECOND, 0);
|
cal.set(Calendar.MILLISECOND, 0);
|
||||||
break;
|
break;
|
||||||
case HOUR:
|
case HOUR:
|
||||||
cal.set(Calendar.MINUTE, 0);
|
cal.set(Calendar.MINUTE, 0);
|
||||||
cal.set(Calendar.SECOND, 0);
|
cal.set(Calendar.SECOND, 0);
|
||||||
cal.set(Calendar.MILLISECOND, 0);
|
cal.set(Calendar.MILLISECOND, 0);
|
||||||
break;
|
break;
|
||||||
case FIVE_MINUTES:
|
case FIVE_MINUTES:
|
||||||
cal.set(Calendar.MINUTE, (cal.get(Calendar.MINUTE)/5)*5);
|
cal.set(Calendar.MINUTE, (cal.get(Calendar.MINUTE)/5)*5);
|
||||||
cal.set(Calendar.SECOND, 0);
|
cal.set(Calendar.SECOND, 0);
|
||||||
cal.set(Calendar.MILLISECOND, 0);
|
cal.set(Calendar.MILLISECOND, 0);
|
||||||
break;
|
break;
|
||||||
case FIFTEEN_MINUTES:
|
case FIFTEEN_MINUTES:
|
||||||
cal.set(Calendar.MINUTE, (cal.get(Calendar.MINUTE)/15)*15);
|
cal.set(Calendar.MINUTE, (cal.get(Calendar.MINUTE)/15)*15);
|
||||||
cal.set(Calendar.SECOND, 0);
|
cal.set(Calendar.SECOND, 0);
|
||||||
cal.set(Calendar.MILLISECOND, 0);
|
cal.set(Calendar.MILLISECOND, 0);
|
||||||
break;
|
break;
|
||||||
case MINUTE:
|
case MINUTE:
|
||||||
cal.set(Calendar.SECOND, 0);
|
cal.set(Calendar.SECOND, 0);
|
||||||
cal.set(Calendar.MILLISECOND, 0);
|
cal.set(Calendar.MILLISECOND, 0);
|
||||||
break;
|
break;
|
||||||
case SECOND:
|
case SECOND:
|
||||||
cal.set(Calendar.MILLISECOND, 0);
|
cal.set(Calendar.MILLISECOND, 0);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
return cal.getTimeInMillis();
|
return cal.getTimeInMillis();
|
||||||
}
|
}
|
||||||
|
|
||||||
public static long getTimestampPeriodEnd(AggregationPeriodLength aggrPeriodLength, long timestamp) throws NumberFormatException{
|
public static long getTimestampPeriodEnd(AggregationPeriodLength aggrPeriodLength, long timestamp) throws NumberFormatException{
|
||||||
Calendar cal = Calendar.getInstance(TIMEZONE, LOCALE);
|
Calendar cal = Calendar.getInstance(TIMEZONE, LOCALE);
|
||||||
cal.setTimeInMillis(timestamp);
|
cal.setTimeInMillis(timestamp);
|
||||||
cal.setFirstDayOfWeek(Calendar.MONDAY);
|
cal.setFirstDayOfWeek(Calendar.MONDAY);
|
||||||
switch(aggrPeriodLength){
|
switch(aggrPeriodLength){
|
||||||
case YEAR:
|
case YEAR:
|
||||||
cal.set(Calendar.DAY_OF_YEAR, cal.getActualMaximum(Calendar.DAY_OF_YEAR));
|
cal.set(Calendar.DAY_OF_YEAR, cal.getActualMaximum(Calendar.DAY_OF_YEAR));
|
||||||
cal.set(Calendar.HOUR_OF_DAY, 23);
|
cal.set(Calendar.HOUR_OF_DAY, 23);
|
||||||
cal.set(Calendar.MINUTE, 59);
|
cal.set(Calendar.MINUTE, 59);
|
||||||
cal.set(Calendar.SECOND, 59);
|
cal.set(Calendar.SECOND, 59);
|
||||||
cal.set(Calendar.MILLISECOND, 1000);
|
cal.set(Calendar.MILLISECOND, 1000);
|
||||||
break;
|
break;
|
||||||
case MONTH:
|
case MONTH:
|
||||||
cal.set(Calendar.DAY_OF_MONTH, cal.getActualMaximum(Calendar.DAY_OF_MONTH));
|
cal.set(Calendar.DAY_OF_MONTH, cal.getActualMaximum(Calendar.DAY_OF_MONTH));
|
||||||
cal.set(Calendar.HOUR_OF_DAY, 23);
|
cal.set(Calendar.HOUR_OF_DAY, 23);
|
||||||
cal.set(Calendar.MINUTE, 59);
|
cal.set(Calendar.MINUTE, 59);
|
||||||
cal.set(Calendar.SECOND, 59);
|
cal.set(Calendar.SECOND, 59);
|
||||||
cal.set(Calendar.MILLISECOND, 1000);
|
cal.set(Calendar.MILLISECOND, 1000);
|
||||||
break;
|
break;
|
||||||
case WEEK:
|
case WEEK:
|
||||||
cal.set(Calendar.DAY_OF_WEEK, Calendar.SUNDAY);
|
cal.set(Calendar.DAY_OF_WEEK, Calendar.SUNDAY);
|
||||||
cal.set(Calendar.HOUR_OF_DAY, 23);
|
cal.set(Calendar.HOUR_OF_DAY, 23);
|
||||||
cal.set(Calendar.MINUTE, 59);
|
cal.set(Calendar.MINUTE, 59);
|
||||||
cal.set(Calendar.SECOND, 59);
|
cal.set(Calendar.SECOND, 59);
|
||||||
cal.set(Calendar.MILLISECOND, 1000);
|
cal.set(Calendar.MILLISECOND, 1000);
|
||||||
break;
|
break;
|
||||||
case DAY:
|
case DAY:
|
||||||
cal.set(Calendar.HOUR_OF_DAY, 23);
|
cal.set(Calendar.HOUR_OF_DAY, 23);
|
||||||
cal.set(Calendar.MINUTE, 59);
|
cal.set(Calendar.MINUTE, 59);
|
||||||
cal.set(Calendar.SECOND, 59);
|
cal.set(Calendar.SECOND, 59);
|
||||||
cal.set(Calendar.MILLISECOND, 1000);
|
cal.set(Calendar.MILLISECOND, 1000);
|
||||||
break;
|
break;
|
||||||
case HOUR:
|
case HOUR:
|
||||||
cal.set(Calendar.MINUTE, 59);
|
cal.set(Calendar.MINUTE, 59);
|
||||||
cal.set(Calendar.SECOND, 59);
|
cal.set(Calendar.SECOND, 59);
|
||||||
cal.set(Calendar.MILLISECOND, 1000);
|
cal.set(Calendar.MILLISECOND, 1000);
|
||||||
break;
|
break;
|
||||||
case FIVE_MINUTES:
|
case FIVE_MINUTES:
|
||||||
cal.set(Calendar.MINUTE, 4+(cal.get(Calendar.MINUTE)/5)*5);
|
cal.set(Calendar.MINUTE, 4+(cal.get(Calendar.MINUTE)/5)*5);
|
||||||
cal.set(Calendar.SECOND, 59);
|
cal.set(Calendar.SECOND, 59);
|
||||||
cal.set(Calendar.MILLISECOND, 1000);
|
cal.set(Calendar.MILLISECOND, 1000);
|
||||||
break;
|
break;
|
||||||
case FIFTEEN_MINUTES:
|
case FIFTEEN_MINUTES:
|
||||||
cal.set(Calendar.MINUTE, 14+(cal.get(Calendar.MINUTE)/15)*15);
|
cal.set(Calendar.MINUTE, 14+(cal.get(Calendar.MINUTE)/15)*15);
|
||||||
cal.set(Calendar.SECOND, 59);
|
cal.set(Calendar.SECOND, 59);
|
||||||
cal.set(Calendar.MILLISECOND, 1000);
|
cal.set(Calendar.MILLISECOND, 1000);
|
||||||
break;
|
break;
|
||||||
case MINUTE:
|
case MINUTE:
|
||||||
cal.set(Calendar.SECOND, 59);
|
cal.set(Calendar.SECOND, 59);
|
||||||
cal.set(Calendar.MILLISECOND, 1000);
|
cal.set(Calendar.MILLISECOND, 1000);
|
||||||
break;
|
break;
|
||||||
case SECOND:
|
case SECOND:
|
||||||
cal.set(Calendar.MILLISECOND, 1000);
|
cal.set(Calendar.MILLISECOND, 1000);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
return cal.getTimeInMillis()-1; //subtract one
|
return cal.getTimeInMillis()-1; //subtract one
|
||||||
}
|
}
|
||||||
|
|
||||||
public static int getMillisecondInSecondFromTimestamp(long ms) throws NumberFormatException{
|
public static int getMillisecondInSecondFromTimestamp(long ms) throws NumberFormatException{
|
||||||
if(ms < 0)
|
if(ms < 0)
|
||||||
throw new NumberFormatException("argument must be positive");
|
throw new NumberFormatException("argument must be positive");
|
||||||
Calendar cal = Calendar.getInstance(TIMEZONE, LOCALE);
|
Calendar cal = Calendar.getInstance(TIMEZONE, LOCALE);
|
||||||
cal.setTimeInMillis(ms);
|
cal.setTimeInMillis(ms);
|
||||||
return cal.get(Calendar.MILLISECOND);
|
return cal.get(Calendar.MILLISECOND);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static int getSecondOfMinuteFromTimestamp(long ms) throws NumberFormatException{
|
public static int getSecondOfMinuteFromTimestamp(long ms) throws NumberFormatException{
|
||||||
if(ms < 0)
|
if(ms < 0)
|
||||||
throw new NumberFormatException("argument must be positive");
|
throw new NumberFormatException("argument must be positive");
|
||||||
Calendar cal = Calendar.getInstance(TIMEZONE, LOCALE);
|
Calendar cal = Calendar.getInstance(TIMEZONE, LOCALE);
|
||||||
cal.setTimeInMillis(ms);
|
cal.setTimeInMillis(ms);
|
||||||
return cal.get(Calendar.SECOND);
|
return cal.get(Calendar.SECOND);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static int getMinuteOfHourFromTimestamp(long ms) throws NumberFormatException{
|
public static int getMinuteOfHourFromTimestamp(long ms) throws NumberFormatException{
|
||||||
if(ms < 0)
|
if(ms < 0)
|
||||||
throw new NumberFormatException("argument must be positive");
|
throw new NumberFormatException("argument must be positive");
|
||||||
Calendar cal = Calendar.getInstance(TIMEZONE, LOCALE);
|
Calendar cal = Calendar.getInstance(TIMEZONE, LOCALE);
|
||||||
cal.setTimeInMillis(ms);
|
cal.setTimeInMillis(ms);
|
||||||
return cal.get(Calendar.MINUTE);
|
return cal.get(Calendar.MINUTE);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static int getHourOfDayFromTimestamp(long ms) throws NumberFormatException{
|
public static int getHourOfDayFromTimestamp(long ms) throws NumberFormatException{
|
||||||
if(ms < 0)
|
if(ms < 0)
|
||||||
throw new NumberFormatException("argument must be positive");
|
throw new NumberFormatException("argument must be positive");
|
||||||
Calendar cal = Calendar.getInstance(TIMEZONE, LOCALE);
|
Calendar cal = Calendar.getInstance(TIMEZONE, LOCALE);
|
||||||
cal.setTimeInMillis(ms);
|
cal.setTimeInMillis(ms);
|
||||||
return cal.get(Calendar.HOUR_OF_DAY);
|
return cal.get(Calendar.HOUR_OF_DAY);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static int getDayOfWeekFromTimestamp(long ms) throws NumberFormatException{
|
public static int getDayOfWeekFromTimestamp(long ms) throws NumberFormatException{
|
||||||
if(ms < 0)
|
if(ms < 0)
|
||||||
throw new NumberFormatException("argument must be positive");
|
throw new NumberFormatException("argument must be positive");
|
||||||
Calendar cal = Calendar.getInstance(TIMEZONE, LOCALE);
|
Calendar cal = Calendar.getInstance(TIMEZONE, LOCALE);
|
||||||
cal.setTimeInMillis(ms);
|
cal.setTimeInMillis(ms);
|
||||||
return cal.get(Calendar.DAY_OF_WEEK);
|
return cal.get(Calendar.DAY_OF_WEEK);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static int getDayOfMonthFromTimestamp(long ms) throws NumberFormatException{
|
public static int getDayOfMonthFromTimestamp(long ms) throws NumberFormatException{
|
||||||
if(ms < 0)
|
if(ms < 0)
|
||||||
throw new NumberFormatException("argument must be positive");
|
throw new NumberFormatException("argument must be positive");
|
||||||
Calendar cal = Calendar.getInstance(TIMEZONE, LOCALE);
|
Calendar cal = Calendar.getInstance(TIMEZONE, LOCALE);
|
||||||
cal.setTimeInMillis(ms);
|
cal.setTimeInMillis(ms);
|
||||||
return cal.get(Calendar.DAY_OF_MONTH);
|
return cal.get(Calendar.DAY_OF_MONTH);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static int getDayOfYearFromTimestamp(long ms) throws NumberFormatException{
|
public static int getDayOfYearFromTimestamp(long ms) throws NumberFormatException{
|
||||||
if(ms < 0)
|
if(ms < 0)
|
||||||
throw new NumberFormatException("argument must be positive");
|
throw new NumberFormatException("argument must be positive");
|
||||||
Calendar cal = Calendar.getInstance(TIMEZONE, LOCALE);
|
Calendar cal = Calendar.getInstance(TIMEZONE, LOCALE);
|
||||||
cal.setTimeInMillis(ms);
|
cal.setTimeInMillis(ms);
|
||||||
return cal.get(Calendar.DAY_OF_YEAR);
|
return cal.get(Calendar.DAY_OF_YEAR);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static int getWeekOfYearFromTimestamp(long ms) throws NumberFormatException{
|
public static int getWeekOfYearFromTimestamp(long ms) throws NumberFormatException{
|
||||||
if(ms < 0)
|
if(ms < 0)
|
||||||
throw new NumberFormatException("argument must be positive");
|
throw new NumberFormatException("argument must be positive");
|
||||||
Calendar cal = Calendar.getInstance(TIMEZONE, LOCALE);
|
Calendar cal = Calendar.getInstance(TIMEZONE, LOCALE);
|
||||||
cal.setTimeInMillis(ms);
|
cal.setTimeInMillis(ms);
|
||||||
return cal.get(Calendar.WEEK_OF_YEAR);
|
return cal.get(Calendar.WEEK_OF_YEAR);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static int getMonthOfYearFromTimestamp(long ms) throws NumberFormatException{
|
public static int getMonthOfYearFromTimestamp(long ms) throws NumberFormatException{
|
||||||
if(ms < 0)
|
if(ms < 0)
|
||||||
throw new NumberFormatException("argument must be positive");
|
throw new NumberFormatException("argument must be positive");
|
||||||
Calendar cal = Calendar.getInstance(TIMEZONE, LOCALE);
|
Calendar cal = Calendar.getInstance(TIMEZONE, LOCALE);
|
||||||
cal.setTimeInMillis(ms);
|
cal.setTimeInMillis(ms);
|
||||||
return cal.get(Calendar.MONTH);
|
return cal.get(Calendar.MONTH);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static int getYearFromTimestamp(long ms) throws NumberFormatException{
|
public static int getYearFromTimestamp(long ms) throws NumberFormatException{
|
||||||
if(ms < 0)
|
if(ms < 0)
|
||||||
throw new NumberFormatException("argument must be positive");
|
throw new NumberFormatException("argument must be positive");
|
||||||
Calendar cal = Calendar.getInstance(TIMEZONE, LOCALE);
|
Calendar cal = Calendar.getInstance(TIMEZONE, LOCALE);
|
||||||
cal.setTimeInMillis(ms);
|
cal.setTimeInMillis(ms);
|
||||||
return cal.get(Calendar.YEAR);
|
return cal.get(Calendar.YEAR);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static String timeInMsToString(long ms) throws NumberFormatException{
|
public static String timeInMsToString(long ms) throws NumberFormatException{
|
||||||
if(ms < 0)
|
if(ms < 0)
|
||||||
throw new NumberFormatException("argument must be positive");
|
throw new NumberFormatException("argument must be positive");
|
||||||
String retval = "";
|
String retval = "";
|
||||||
int weeks = (int) (ms / WEEK_IN_MS);
|
int weeks = (int) (ms / WEEK_IN_MS);
|
||||||
if(weeks > 0){
|
if(weeks > 0){
|
||||||
retval += weeks + "w+";
|
retval += weeks + "w+";
|
||||||
}
|
}
|
||||||
int days = ((int) (ms / DAY_IN_MS)) % 7;
|
int days = ((int) (ms / DAY_IN_MS)) % 7;
|
||||||
if(days > 0){
|
if(days > 0){
|
||||||
retval += days + "d+";
|
retval += days + "d+";
|
||||||
}
|
}
|
||||||
int hours = (int) ((ms % DAY_IN_MS) / HOUR_IN_MS);
|
int hours = (int) ((ms % DAY_IN_MS) / HOUR_IN_MS);
|
||||||
retval += (hours<10?"0"+hours:hours);
|
retval += (hours<10?"0"+hours:hours);
|
||||||
int minutes = (int) ((ms % HOUR_IN_MS) / MINUTE_IN_MS);
|
int minutes = (int) ((ms % HOUR_IN_MS) / MINUTE_IN_MS);
|
||||||
retval += ":" + (minutes<10?"0"+minutes:minutes);
|
retval += ":" + (minutes<10?"0"+minutes:minutes);
|
||||||
int seconds = (int) ((ms % MINUTE_IN_MS) / SECOND_IN_MS);
|
int seconds = (int) ((ms % MINUTE_IN_MS) / SECOND_IN_MS);
|
||||||
retval += ":" + (seconds<10?"0"+seconds:seconds);
|
retval += ":" + (seconds<10?"0"+seconds:seconds);
|
||||||
int milliseconds = (int) (ms % SECOND_IN_MS);
|
int milliseconds = (int) (ms % SECOND_IN_MS);
|
||||||
retval += "." + (milliseconds<100?"0"+(milliseconds<10?"0"+milliseconds:milliseconds):milliseconds);
|
retval += "." + (milliseconds<100?"0"+(milliseconds<10?"0"+milliseconds:milliseconds):milliseconds);
|
||||||
return retval;
|
return retval;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static String getDateString(long timestamp){
|
public static String getDateString(long timestamp){
|
||||||
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
|
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
|
||||||
format.setTimeZone(TIMEZONE);
|
format.setTimeZone(TIMEZONE);
|
||||||
Calendar cal = Calendar.getInstance(TIMEZONE, LOCALE);
|
Calendar cal = Calendar.getInstance(TIMEZONE, LOCALE);
|
||||||
cal.setTimeInMillis(timestamp);
|
cal.setTimeInMillis(timestamp);
|
||||||
return format.format(cal.getTime());
|
return format.format(cal.getTime());
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue