/**
*
*/
package org.akaza.openclinica.dao.hibernate;
import java.sql.Timestamp;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.akaza.openclinica.domain.usageStats.LogUsageStatsBean;
import org.akaza.openclinica.service.usageStats.LogUsageStatsService;
import org.springframework.transaction.annotation.Transactional;
/**
* @author pgawade
*
*/
public class UsageStatsServiceDAO extends AbstractDomainDao<LogUsageStatsBean> {
private final org.slf4j.Logger logger = org.slf4j.LoggerFactory.getLogger(this.getClass().getName());
@Override
public Class<LogUsageStatsBean> domainClass() {
return LogUsageStatsBean.class;
}
public LogUsageStatsBean findLatestUsageStatParamValue(String param_key) {
// logger.debug("UsageStatsServiceDAO -> findLatestUsageStatParamValue");
String query =
"from " + getDomainClassName() + " usageStatParams where param_key = :param_key order by update_timestamp desc";
List<LogUsageStatsBean> logUsageStatsBeanLst = new ArrayList<LogUsageStatsBean>();
LogUsageStatsBean logUsageStatsBeanRet = new LogUsageStatsBean();
org.hibernate.Query q = getCurrentSession().createQuery(query);
q.setString("param_key", param_key);
q.setMaxResults(1);
logUsageStatsBeanLst = q.list();
if ((null != logUsageStatsBeanLst) && (logUsageStatsBeanLst.size() != 0)) {
logUsageStatsBeanRet = logUsageStatsBeanLst.get(0);
}
return logUsageStatsBeanRet;
}
@Transactional
public void saveOCStartTimeToDB() {
Timestamp ocStartTime = new Timestamp(new java.util.Date().getTime());
LogUsageStatsBean logUsageStatsBean = new LogUsageStatsBean();
logUsageStatsBean.setParam_key(LogUsageStatsService.OC_start_time);
logUsageStatsBean.setParam_value(ocStartTime.toString());
logUsageStatsBean.setUpdate_timestamp(ocStartTime);
saveOrUpdate(logUsageStatsBean);
}
@Transactional
public void saveOCStopTimeToDB() {
Timestamp ocStopTime = new Timestamp(new java.util.Date().getTime());
LogUsageStatsBean logUsageStatsBean = new LogUsageStatsBean();
logUsageStatsBean.setParam_key(LogUsageStatsService.OC_stop_time);
logUsageStatsBean.setParam_value(ocStopTime.toString());
logUsageStatsBean.setUpdate_timestamp(ocStopTime);
saveOrUpdate(logUsageStatsBean);
}
@Transactional
public Map<String, String> getEventDetailsOCStart() {
Map<String, String> OCStartedEventDetails = new HashMap<String, String>();
// Get Last system start from table "usage_statistics_data"
LogUsageStatsBean lastOCStartBean = new LogUsageStatsBean();
lastOCStartBean = findLatestUsageStatParamValue(LogUsageStatsService.OC_start_time);
if (null != lastOCStartBean) {
OCStartedEventDetails.put(LogUsageStatsService.OC_last_system_start, lastOCStartBean.getParam_value());
logger.debug(LogUsageStatsService.OC_last_system_start + ": " + lastOCStartBean.getParam_value());
}
// Get Last system stop time from table "usage_statistics_data"
LogUsageStatsBean lastOCStopBean = new LogUsageStatsBean();
lastOCStopBean = findLatestUsageStatParamValue(LogUsageStatsService.OC_stop_time);
// get last system Uptime
if ((null != lastOCStopBean) && (null != lastOCStartBean)) {
String stopTime = lastOCStopBean.getParam_value();
String startTime = lastOCStartBean.getParam_value();
Date parsedStopDate = null;
Date parsedStartDate = null;
try {
if (null != stopTime) {
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss.SSS");
parsedStopDate = dateFormat.parse(stopTime);
}
} catch (ParseException pe) {
logger.error("Last OpenClinica stop time from database cannot be parsed");
}
try {
if (null != startTime) {
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss.SSS");
parsedStartDate = dateFormat.parse(startTime);
}
} catch (ParseException pe) {
logger.error("Last OpenClinica start time from database cannot be parsed");
}
if ((null != parsedStopDate) && (null != parsedStartDate)) {
long diff = (parsedStopDate.getTime()) - (parsedStartDate.getTime());
long hrs = 0;
long min = 0;
long sec = 0;
long days = diff / (1000 * 60 * 60 * 24);
if (days > 0) {
diff -= days * (1000 * 60 * 60 * 24);
}
hrs = (((diff / (1000 * 60 * 60)) > 0) ? (diff / (1000 * 60 * 60)) : 0);
if (hrs > 0) {
diff -= hrs * (1000 * 60 * 60);
}
min = (((diff / (1000 * 60)) > 0) ? (diff / (1000 * 60)) : 0);
if (min > 0) {
diff -= min * (1000 * 60);
}
sec = (((diff / (1000)) > 0) ? (diff / (1000)) : 0);
StringBuffer finalDiff = new StringBuffer();
if (days > 0) {
finalDiff.append(days + " days ");
}
if (hrs > 0) {
finalDiff.append(hrs + " hrs ");
}
if (min > 0) {
finalDiff.append(min + " min ");
}
if (sec > 0) {
finalDiff.append(sec + " sec ");
}
logger.debug("Last System Uptime: " + finalDiff.toString());
OCStartedEventDetails.put(LogUsageStatsService.OC_last_up_time, finalDiff.toString());
}
}
return OCStartedEventDetails;
}
}