extensions/net.sf.basedb.labenv/trunk/src/net/sf/basedb/labenv/servlet/LabEnvironmentServlet.java

Code
Comments
Other
Rev Date Author Line
2303 02 Apr 14 olle 1 /**
2303 02 Apr 14 olle 2   $Id $
2303 02 Apr 14 olle 3
2303 02 Apr 14 olle 4   Copyright (C) 2014 Olle MÃ¥nsson
2303 02 Apr 14 olle 5
2303 02 Apr 14 olle 6   This file is part of the LabEnv extension for BASE.
2303 02 Apr 14 olle 7   Available at http://baseplugins.thep.lu.se/
2303 02 Apr 14 olle 8   BASE main site: http://base.thep.lu.se/
2303 02 Apr 14 olle 9   -----------------------------------------------------------
2303 02 Apr 14 olle 10   
2303 02 Apr 14 olle 11   This is free software; you can redistribute it and/or
2303 02 Apr 14 olle 12   modify it under the terms of the GNU General Public License
2303 02 Apr 14 olle 13   as published by the Free Software Foundation; either version 3
2303 02 Apr 14 olle 14   of the License, or (at your option) any later version.
2303 02 Apr 14 olle 15   
2303 02 Apr 14 olle 16   The software is distributed in the hope that it will be useful,
2303 02 Apr 14 olle 17   but WITHOUT ANY WARRANTY; without even the implied warranty of
2303 02 Apr 14 olle 18   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
2303 02 Apr 14 olle 19   GNU General Public License for more details.
2303 02 Apr 14 olle 20   
2303 02 Apr 14 olle 21   You should have received a copy of the GNU General Public License
2303 02 Apr 14 olle 22   along with BASE. If not, see <http://www.gnu.org/licenses/>.
2303 02 Apr 14 olle 23
2303 02 Apr 14 olle 24 */
2303 02 Apr 14 olle 25 package net.sf.basedb.labenv.servlet;
2303 02 Apr 14 olle 26
4527 20 Jun 17 nicklas 27 import java.io.BufferedReader;
2303 02 Apr 14 olle 28 import java.io.IOException;
4527 20 Jun 17 nicklas 29 import java.io.InputStreamReader;
2303 02 Apr 14 olle 30 import java.io.PrintWriter;
4527 20 Jun 17 nicklas 31 import java.io.Reader;
4527 20 Jun 17 nicklas 32 import java.nio.charset.Charset;
2303 02 Apr 14 olle 33 import java.text.SimpleDateFormat;
2303 02 Apr 14 olle 34 import java.util.Date;
2303 02 Apr 14 olle 35 import java.util.List;
2303 02 Apr 14 olle 36
2303 02 Apr 14 olle 37 import javax.servlet.ServletException;
2303 02 Apr 14 olle 38 import javax.servlet.http.HttpServlet;
2303 02 Apr 14 olle 39 import javax.servlet.http.HttpServletRequest;
2303 02 Apr 14 olle 40 import javax.servlet.http.HttpServletResponse;
2303 02 Apr 14 olle 41
2303 02 Apr 14 olle 42 import net.sf.basedb.core.Application;
2415 09 May 14 olle 43 import net.sf.basedb.core.DbControl;
2303 02 Apr 14 olle 44 import net.sf.basedb.core.SessionControl;
2415 09 May 14 olle 45 import net.sf.basedb.core.User;
2303 02 Apr 14 olle 46 import net.sf.basedb.labenv.LabEnvironment;
2303 02 Apr 14 olle 47 import net.sf.basedb.labenv.LabEnvironmentConfiguration;
2303 02 Apr 14 olle 48 import net.sf.basedb.labenv.converter.StringToDateConverter;
2303 02 Apr 14 olle 49 import net.sf.basedb.labenv.dao.LabEnvironmentData;
2415 09 May 14 olle 50 import net.sf.basedb.labenv.dao.LabSensorAlarmConfig;
2424 14 May 14 olle 51 import net.sf.basedb.labenv.dao.LabSensorAlarmUserConfig;
2303 02 Apr 14 olle 52 import net.sf.basedb.labenv.dao.LabSensorConfig;
2303 02 Apr 14 olle 53 import net.sf.basedb.labenv.util.LabEnvironmentStorageUtil;
2303 02 Apr 14 olle 54 import net.sf.basedb.labenv.util.LabSensorUtil;
2303 02 Apr 14 olle 55 import net.sf.basedb.util.Values;
2303 02 Apr 14 olle 56 import net.sf.basedb.util.error.ThrowableUtil;
2303 02 Apr 14 olle 57 import net.sf.basedb.util.formatter.DateFormatter;
2303 02 Apr 14 olle 58
2303 02 Apr 14 olle 59 import org.json.simple.JSONObject;
4527 20 Jun 17 nicklas 60 import org.json.simple.parser.JSONParser;
2303 02 Apr 14 olle 61 import org.json.simple.JSONArray;
2303 02 Apr 14 olle 62
2328 08 Apr 14 olle 63 import org.slf4j.Logger;
2328 08 Apr 14 olle 64 import org.slf4j.LoggerFactory;
2303 02 Apr 14 olle 65
2303 02 Apr 14 olle 66 public class LabEnvironmentServlet 
2303 02 Apr 14 olle 67   extends HttpServlet 
2303 02 Apr 14 olle 68 {
3013 05 Dec 14 nicklas 69
3013 05 Dec 14 nicklas 70   private static final long serialVersionUID = 7199127151554044351L;
3013 05 Dec 14 nicklas 71   
2328 08 Apr 14 olle 72   private static final Logger log = LoggerFactory.getLogger(LabEnvironmentServlet.class);
2303 02 Apr 14 olle 73   /**
2303 02 Apr 14 olle 74     Default converter for string values to date+time values: yyyyMMdd HHmm
2303 02 Apr 14 olle 75     @since 1.0
2303 02 Apr 14 olle 76    */
2303 02 Apr 14 olle 77   public static final StringToDateConverter CONVERTER_STRING_TO_DATETIME = new StringToDateConverter(new SimpleDateFormat("yyyyMMdd HHmm"));
2303 02 Apr 14 olle 78
2303 02 Apr 14 olle 79
2303 02 Apr 14 olle 80   public LabEnvironmentServlet()
2303 02 Apr 14 olle 81   {}
2303 02 Apr 14 olle 82
2303 02 Apr 14 olle 83   @Override
2303 02 Apr 14 olle 84   protected void doGet(HttpServletRequest req, HttpServletResponse resp)
2303 02 Apr 14 olle 85     throws ServletException, IOException 
2303 02 Apr 14 olle 86   {
2303 02 Apr 14 olle 87     String ID = req.getParameter("ID");
2303 02 Apr 14 olle 88     String cmd = req.getParameter("cmd");
2303 02 Apr 14 olle 89     resp.setContentType("application/json");
2303 02 Apr 14 olle 90     resp.setCharacterEncoding("UTF-8");
2303 02 Apr 14 olle 91     
4519 13 Jun 17 nicklas 92     final SessionControl sc = Application.getSessionControl(ID, null, req.getRemoteAddr(), true);
2431 16 May 14 olle 93     DbControl dc = sc.newDbControl();
2303 02 Apr 14 olle 94     log.debug("Start " + new Date() + " cmd = " + cmd);
2303 02 Apr 14 olle 95     JSONObject json = new JSONObject();
2303 02 Apr 14 olle 96     json.put("status", "ok");
2303 02 Apr 14 olle 97     try
2303 02 Apr 14 olle 98     {
2401 06 May 14 olle 99       if ("GetLabEnvDatabaseConfig".equals(cmd))
2303 02 Apr 14 olle 100       {
2401 06 May 14 olle 101         json = createLabEnvDatabaseConfig(json);
2433 16 May 14 olle 102         //log.debug("json = " + json);        
2401 06 May 14 olle 103       }
2401 06 May 14 olle 104       else if ("GetLabSensorConfigList".equals(cmd))
2401 06 May 14 olle 105       {
2431 16 May 14 olle 106         json = createLabSensorConfigList(json, sc, dc);
2433 16 May 14 olle 107         //log.debug("json = " + json);
2415 09 May 14 olle 108       }
4524 15 Jun 17 nicklas 109       else if ("GetSensorInfo".equals(cmd))
2303 02 Apr 14 olle 110       {
4524 15 Jun 17 nicklas 111         LabEnvironment labEnvironment = LabEnvironment.getInstance();
4524 15 Jun 17 nicklas 112         LabEnvironmentConfiguration labConfig = labEnvironment.getLabEnvironmentConfiguration();
4524 15 Jun 17 nicklas 113         int timeoutInSeconds = labConfig.getTimeoutInSeconds();
4524 15 Jun 17 nicklas 114         LabSensorUtil sensorUtil = new LabSensorUtil(timeoutInSeconds);
2303 02 Apr 14 olle 115         DateFormatter dateFormat = new DateFormatter("yyyy-MM-dd HH:mm:ss");
4524 15 Jun 17 nicklas 116
4524 15 Jun 17 nicklas 117         JSONArray jsonSensors = new JSONArray();
4524 15 Jun 17 nicklas 118         for (LabSensorConfig sensorCfg : labConfig.getLabSensorConfigList())
2303 02 Apr 14 olle 119         {
4524 15 Jun 17 nicklas 120           JSONObject jsonSensor = new JSONObject();
4524 15 Jun 17 nicklas 121           jsonSensor.put("id", sensorCfg.getNumber());
4524 15 Jun 17 nicklas 122           jsonSensor.put("name", sensorCfg.getName());
4524 15 Jun 17 nicklas 123           jsonSensor.put("url", sensorCfg.getUrl());
4525 15 Jun 17 nicklas 124           jsonSensor.put("active", false);
4524 15 Jun 17 nicklas 125           
4524 15 Jun 17 nicklas 126           String startDate = Values.getStringOrNull(sensorCfg.getStartDate());
4524 15 Jun 17 nicklas 127           // Get data from sensor
4524 15 Jun 17 nicklas 128           if (startDate != null)
2303 02 Apr 14 olle 129           {
4524 15 Jun 17 nicklas 130             LabEnvironmentData sensorData = sensorUtil.createLabEnvironmentData(sensorCfg.getUrl(), true);
4524 15 Jun 17 nicklas 131             if (sensorData != null)
2303 02 Apr 14 olle 132             {
4525 15 Jun 17 nicklas 133               jsonSensor.put("active", true);
4524 15 Jun 17 nicklas 134               jsonSensor.put("alternateName", sensorData.getSensorName());
4524 15 Jun 17 nicklas 135               jsonSensor.put("serial", sensorData.getSerialNumber());
4524 15 Jun 17 nicklas 136               jsonSensor.put("time", dateFormat.format(sensorData.getDateTime()));
4524 15 Jun 17 nicklas 137               jsonSensor.put("temperature", sensorData.getTemperature());
4524 15 Jun 17 nicklas 138               jsonSensor.put("humidity", sensorData.getHumidity());
2303 02 Apr 14 olle 139             }
2303 02 Apr 14 olle 140           }
4527 20 Jun 17 nicklas 141           
4534 21 Jun 17 nicklas 142           // Get alarms
4534 21 Jun 17 nicklas 143           List<LabSensorAlarmConfig> alarms = sensorCfg.getAlarmList();
4534 21 Jun 17 nicklas 144           JSONArray jsonAlarms = new JSONArray();
4534 21 Jun 17 nicklas 145           if (alarms != null)
4534 21 Jun 17 nicklas 146           {
4534 21 Jun 17 nicklas 147             for (LabSensorAlarmConfig alarm: alarms)
4534 21 Jun 17 nicklas 148             {
4534 21 Jun 17 nicklas 149               if (alarm.getAlarmText() != null)
4534 21 Jun 17 nicklas 150               {
4534 21 Jun 17 nicklas 151                 jsonAlarms.add(alarm.getAlarmText());
4534 21 Jun 17 nicklas 152               }
4534 21 Jun 17 nicklas 153             }
4534 21 Jun 17 nicklas 154           }
4534 21 Jun 17 nicklas 155           jsonSensor.put("alarms", jsonAlarms);
4534 21 Jun 17 nicklas 156           
4524 15 Jun 17 nicklas 157           jsonSensors.add(jsonSensor);
2303 02 Apr 14 olle 158         }
4524 15 Jun 17 nicklas 159         json.put("sensors", jsonSensors);
2303 02 Apr 14 olle 160       }
2303 02 Apr 14 olle 161       else if ("LabEnvironmentDatabaseQuery".equals(cmd))
2303 02 Apr 14 olle 162       {
2303 02 Apr 14 olle 163         // Get sensor(s)
2303 02 Apr 14 olle 164         String sensorUrl = "http://givare2.onk.lu.se/";
2303 02 Apr 14 olle 165         String sensorUrlParameter = Values.getString(req.getParameter("sensorurl"), null);
2303 02 Apr 14 olle 166         if (sensorUrlParameter != null)
2303 02 Apr 14 olle 167         {
2303 02 Apr 14 olle 168           sensorUrl = sensorUrlParameter;
2303 02 Apr 14 olle 169         }
2303 02 Apr 14 olle 170         log.debug("sensorUrl = " + sensorUrl);
2303 02 Apr 14 olle 171         // Get query time interval
2303 02 Apr 14 olle 172         String startDateStr = Values.getString(req.getParameter("fdate"), null);
2303 02 Apr 14 olle 173         String startTimeStr = Values.getString(req.getParameter("ftime"), null);
2303 02 Apr 14 olle 174         String endDateStr = Values.getString(req.getParameter("tdate"), null);
2303 02 Apr 14 olle 175         String endTimeStr = Values.getString(req.getParameter("ttime"), null);
2303 02 Apr 14 olle 176         String startDateTimeStr = dateAndTimeStringsToDateTimeString(startDateStr, startTimeStr);
2303 02 Apr 14 olle 177         String endDateTimeStr = dateAndTimeStringsToDateTimeString(endDateStr, endTimeStr);
2303 02 Apr 14 olle 178         Date startTime = dateTimeStringToDate(startDateTimeStr);
2303 02 Apr 14 olle 179         Date endTime = dateTimeStringToDate(endDateTimeStr);
2303 02 Apr 14 olle 180         String displayIndexStr = Values.getString(req.getParameter("displayindex"), null);
2303 02 Apr 14 olle 181         boolean displayIndex = false;
2303 02 Apr 14 olle 182         if (displayIndexStr != null && displayIndexStr.equals("true"))
2303 02 Apr 14 olle 183         {
2303 02 Apr 14 olle 184           displayIndex = true;
2303 02 Apr 14 olle 185         }
2303 02 Apr 14 olle 186         log.debug("displayIndexStr = " + displayIndexStr + " displayIndex = " + displayIndex);
2303 02 Apr 14 olle 187         // Get return type
2303 02 Apr 14 olle 188         String returnType = "export";
2303 02 Apr 14 olle 189         String returnTypeStr = Values.getString(req.getParameter("returntype"), null);
2303 02 Apr 14 olle 190         if (returnTypeStr != null && !returnTypeStr.equals(""))
2303 02 Apr 14 olle 191         {
2303 02 Apr 14 olle 192           returnType = returnTypeStr;
2303 02 Apr 14 olle 193         }
2303 02 Apr 14 olle 194         log.debug("returnTypeStr = " + returnTypeStr + " returnType = " + returnType);
2303 02 Apr 14 olle 195         // Get sensor name for export filename
2303 02 Apr 14 olle 196         String sensorName = "Lab ?";
2303 02 Apr 14 olle 197         String sensorNameParameter = Values.getString(req.getParameter("sensorname"), null);
2303 02 Apr 14 olle 198         if (sensorNameParameter != null)
2303 02 Apr 14 olle 199         {
2303 02 Apr 14 olle 200           sensorName = sensorNameParameter;
2303 02 Apr 14 olle 201         }
2303 02 Apr 14 olle 202         log.debug("sensorName = " + sensorName);
2303 02 Apr 14 olle 203         // Get lab environment configuration from singleton LabEnvironment
2303 02 Apr 14 olle 204         LabEnvironment labEnvironment = LabEnvironment.getInstance();
2303 02 Apr 14 olle 205         LabEnvironmentConfiguration labEnvironmentConfiguration = labEnvironment.getLabEnvironmentConfiguration();        
2303 02 Apr 14 olle 206         // Get lab sensor number from lab sensor url
2303 02 Apr 14 olle 207         LabSensorConfig labSensorConfig = labEnvironmentConfiguration.findByUrl(sensorUrl);
2303 02 Apr 14 olle 208         log.debug("labSensorConfig = " + labSensorConfig);
2303 02 Apr 14 olle 209         Integer labSensorNumber = null;
2303 02 Apr 14 olle 210         if (labSensorConfig != null)
2303 02 Apr 14 olle 211         {
2303 02 Apr 14 olle 212           labSensorNumber = labSensorConfig.getNumber();
2303 02 Apr 14 olle 213         }
2303 02 Apr 14 olle 214         log.debug("labSensorNumber = " + labSensorNumber + " startTime = " + startTime + " endTime = " + endTime);
2303 02 Apr 14 olle 215         // Perform database query
3018 09 Dec 14 nicklas 216         LabEnvironmentStorageUtil storage = new LabEnvironmentStorageUtil();
3018 09 Dec 14 nicklas 217         List<LabEnvironmentData> lthdlist = storage.queryLabEnvDb(labSensorNumber, startTime, endTime);
2303 02 Apr 14 olle 218         if (returnType.equals("export"))
2303 02 Apr 14 olle 219         {
2303 02 Apr 14 olle 220           // Create export filename
2303 02 Apr 14 olle 221           String filename = createExportFilename(sensorName, startTime, endTime);
2303 02 Apr 14 olle 222           log.debug("labSensorNumber = " + labSensorNumber + " startTime = " + startTime + " endTime = " + endTime + " filename = " + filename);
2303 02 Apr 14 olle 223           // Create table header
2303 02 Apr 14 olle 224           String tableHeaderStart = "Sensor\tSerial Number\tDateTime\tTemp(C)\tHumidity(%)";
2303 02 Apr 14 olle 225           // Check if database index should be displayed
2303 02 Apr 14 olle 226           if (displayIndex)
2303 02 Apr 14 olle 227           {
2303 02 Apr 14 olle 228             tableHeaderStart = "Id\t" + tableHeaderStart;
2303 02 Apr 14 olle 229           }
2303 02 Apr 14 olle 230           // Write labSensor file
2303 02 Apr 14 olle 231           resp.setHeader("Content-Disposition", "attachment; filename=" + filename);
2303 02 Apr 14 olle 232           resp.setContentType("text/plain");
2303 02 Apr 14 olle 233           resp.setCharacterEncoding("UTF-8");
2303 02 Apr 14 olle 234           PrintWriter os = resp.getWriter();
2303 02 Apr 14 olle 235           os.write(tableHeaderStart);
2303 02 Apr 14 olle 236           os.write("\n");
2303 02 Apr 14 olle 237           for (LabEnvironmentData lthd : lthdlist)
2303 02 Apr 14 olle 238           {
2303 02 Apr 14 olle 239             // Check if database index should be displayed
2303 02 Apr 14 olle 240             if (displayIndex)
2303 02 Apr 14 olle 241             {
2303 02 Apr 14 olle 242               Long id = lthd.getId();
2303 02 Apr 14 olle 243               os.write(id + "\t" + lthd.toString());
2303 02 Apr 14 olle 244             }
2303 02 Apr 14 olle 245             else
2303 02 Apr 14 olle 246             {
2303 02 Apr 14 olle 247               os.write(lthd.toString());
2303 02 Apr 14 olle 248             }
2303 02 Apr 14 olle 249             os.write("\n");
2303 02 Apr 14 olle 250           }        
2303 02 Apr 14 olle 251           os.flush();
2303 02 Apr 14 olle 252           os.close();
2303 02 Apr 14 olle 253         }
2303 02 Apr 14 olle 254         else if (returnType.equals("json"))
2303 02 Apr 14 olle 255         {
2303 02 Apr 14 olle 256           json = createLabEnvironmentJsonObject(json, lthdlist);
2303 02 Apr 14 olle 257         }
2303 02 Apr 14 olle 258       }
2303 02 Apr 14 olle 259     }
2303 02 Apr 14 olle 260     catch (Throwable t)
2303 02 Apr 14 olle 261     {
2303 02 Apr 14 olle 262       t.printStackTrace();
2303 02 Apr 14 olle 263       resp.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, t.getMessage());
2303 02 Apr 14 olle 264       json.clear();
2303 02 Apr 14 olle 265       json.put("status", "error");
2303 02 Apr 14 olle 266       json.put("message", t.getMessage());
2303 02 Apr 14 olle 267       json.put("stacktrace", ThrowableUtil.stackTraceToString(t));
2303 02 Apr 14 olle 268     }
2303 02 Apr 14 olle 269     finally
2303 02 Apr 14 olle 270     {
2431 16 May 14 olle 271       if (dc != null)
2431 16 May 14 olle 272       {
2431 16 May 14 olle 273         dc.close();
2431 16 May 14 olle 274       }
2303 02 Apr 14 olle 275       json.writeJSONString(resp.getWriter());
2303 02 Apr 14 olle 276     }
2303 02 Apr 14 olle 277   }
4527 20 Jun 17 nicklas 278   
4527 20 Jun 17 nicklas 279   @Override
4527 20 Jun 17 nicklas 280   protected void doPost(HttpServletRequest req, HttpServletResponse resp)
4527 20 Jun 17 nicklas 281     throws ServletException, IOException 
4527 20 Jun 17 nicklas 282   {
4527 20 Jun 17 nicklas 283     String ID = req.getParameter("ID");
4527 20 Jun 17 nicklas 284     String cmd = req.getParameter("cmd");
4527 20 Jun 17 nicklas 285     resp.setContentType("application/json");
4527 20 Jun 17 nicklas 286     resp.setCharacterEncoding("UTF-8");
4527 20 Jun 17 nicklas 287     
4527 20 Jun 17 nicklas 288     final SessionControl sc = Application.getSessionControl(ID, null, req.getRemoteAddr(), true);
4527 20 Jun 17 nicklas 289     
4527 20 Jun 17 nicklas 290     JSONObject json = new JSONObject();
4527 20 Jun 17 nicklas 291     json.put("status", "ok");    
4527 20 Jun 17 nicklas 292     JSONArray jsonMessages = new JSONArray();
4527 20 Jun 17 nicklas 293   
4527 20 Jun 17 nicklas 294     DbControl dc = null;
4527 20 Jun 17 nicklas 295     try
4527 20 Jun 17 nicklas 296     {
4527 20 Jun 17 nicklas 297       if ("SetLabEnvAlarmConfig".equals(cmd))
4527 20 Jun 17 nicklas 298       {
4527 20 Jun 17 nicklas 299         dc = sc.newDbControl();
4527 20 Jun 17 nicklas 300         Reader reader = new BufferedReader(new InputStreamReader(req.getInputStream(), Charset.forName("UTF-8")));
4527 20 Jun 17 nicklas 301         JSONObject jsonReq = (JSONObject)new JSONParser().parse(reader);
2303 02 Apr 14 olle 302
4527 20 Jun 17 nicklas 303         // Get lab environment configuration from singleton LabEnvironment
4527 20 Jun 17 nicklas 304         LabEnvironment labEnvironment = LabEnvironment.getInstance();
4527 20 Jun 17 nicklas 305         LabEnvironmentConfiguration labEnvironmentConfiguration = labEnvironment.getLabEnvironmentConfiguration();
4527 20 Jun 17 nicklas 306         List<LabSensorConfig> labSensorConfigList = labEnvironmentConfiguration.getLabSensorConfigList();
4527 20 Jun 17 nicklas 307         for (LabSensorConfig labSensorConfig: labSensorConfigList)
4527 20 Jun 17 nicklas 308         {
4527 20 Jun 17 nicklas 309           if (labSensorConfig != null)
4527 20 Jun 17 nicklas 310           {
4527 20 Jun 17 nicklas 311             List<LabSensorAlarmConfig> alarmList = labSensorConfig.getAlarmList();
4527 20 Jun 17 nicklas 312             if (alarmList != null)
4527 20 Jun 17 nicklas 313             {
4527 20 Jun 17 nicklas 314               for (LabSensorAlarmConfig alarm: alarmList)
4527 20 Jun 17 nicklas 315               {                  
4527 20 Jun 17 nicklas 316                 JSONObject jsonAlarm = (JSONObject)jsonReq.get("alarm." + alarm.getNo());
4527 20 Jun 17 nicklas 317                 boolean currentBlocked = alarm.isAlarmBlocked();
4527 20 Jun 17 nicklas 318                 boolean alarmBlocked = Boolean.TRUE.equals(jsonAlarm.get("blocked"));
4527 20 Jun 17 nicklas 319                 
4527 20 Jun 17 nicklas 320                 if (currentBlocked != alarmBlocked)
4527 20 Jun 17 nicklas 321                 {
4527 20 Jun 17 nicklas 322                   // Check if logged-in user has permission to edit current alarm
4527 20 Jun 17 nicklas 323                   boolean alarmPermission = fetchAlarmPermission(alarm, sc, dc);
4527 20 Jun 17 nicklas 324                   if (alarmPermission)
4527 20 Jun 17 nicklas 325                   {
4527 20 Jun 17 nicklas 326                     alarm.setAlarmBlocked(alarmBlocked);
4527 20 Jun 17 nicklas 327                     jsonMessages.add("Alarm " + alarm.getNo() + " is now " + (alarmBlocked ? "blocked" : "unblocked"));
4527 20 Jun 17 nicklas 328                     if (!alarmBlocked) 
4527 20 Jun 17 nicklas 329                     {
4527 20 Jun 17 nicklas 330                       alarm.setAlarmBlockType(null);
4527 20 Jun 17 nicklas 331                       alarm.setAlarmText(null);
4527 20 Jun 17 nicklas 332                     }
4527 20 Jun 17 nicklas 333                   }
4527 20 Jun 17 nicklas 334                 }
4527 20 Jun 17 nicklas 335               }
4527 20 Jun 17 nicklas 336             }
4527 20 Jun 17 nicklas 337           }
4527 20 Jun 17 nicklas 338         }
4527 20 Jun 17 nicklas 339         
4527 20 Jun 17 nicklas 340         if (jsonMessages.size() == 0) jsonMessages.add("No changes");
4527 20 Jun 17 nicklas 341       }
4527 20 Jun 17 nicklas 342       
4527 20 Jun 17 nicklas 343       json.put("messages", jsonMessages);
4527 20 Jun 17 nicklas 344     }
4527 20 Jun 17 nicklas 345     catch (Throwable t)
4527 20 Jun 17 nicklas 346     {
4527 20 Jun 17 nicklas 347       t.printStackTrace();
4527 20 Jun 17 nicklas 348       json.clear();
4527 20 Jun 17 nicklas 349       json.put("status", "error");
4527 20 Jun 17 nicklas 350       json.put("message", t.getMessage());
4527 20 Jun 17 nicklas 351       json.put("stacktrace", ThrowableUtil.stackTraceToString(t));
4527 20 Jun 17 nicklas 352     }
4527 20 Jun 17 nicklas 353     finally
4527 20 Jun 17 nicklas 354     {
4527 20 Jun 17 nicklas 355       if (dc != null) dc.close();
4527 20 Jun 17 nicklas 356       json.writeJSONString(resp.getWriter());
4527 20 Jun 17 nicklas 357     }
4527 20 Jun 17 nicklas 358   }
2303 02 Apr 14 olle 359
2401 06 May 14 olle 360   private JSONObject createLabEnvDatabaseConfig(JSONObject json)
2401 06 May 14 olle 361     throws ServletException, IOException 
2401 06 May 14 olle 362   {  
2401 06 May 14 olle 363     log.debug("Start " + new Date());
2401 06 May 14 olle 364     // Get lab environment configuration from singleton LabEnvironment
2401 06 May 14 olle 365     LabEnvironment labEnvironment = LabEnvironment.getInstance();
2401 06 May 14 olle 366     LabEnvironmentConfiguration labEnvironmentConfiguration = labEnvironment.getLabEnvironmentConfiguration();
2401 06 May 14 olle 367     long storageIntervalInSeconds = labEnvironmentConfiguration.getStorageIntervalInSeconds();
2401 06 May 14 olle 368     JSONObject jsonConfig = new JSONObject();
2401 06 May 14 olle 369     jsonConfig.put("storageIntervalInSeconds", storageIntervalInSeconds);
2401 06 May 14 olle 370     //
2401 06 May 14 olle 371     json.put("labEnvDatabaseConfig", jsonConfig);
2401 06 May 14 olle 372     return json;
2401 06 May 14 olle 373   }
2401 06 May 14 olle 374
2401 06 May 14 olle 375
2431 16 May 14 olle 376   /**
2431 16 May 14 olle 377    * Returns a JSON object with a lab sensor configuration JSONArray.
2431 16 May 14 olle 378    * 
2431 16 May 14 olle 379    * @param json JSONObject The JSONObject to add the lab sensor configuration JSONArray to.
2431 16 May 14 olle 380    * @param sc SessionControl The SessionControl object to use for the current session.
2431 16 May 14 olle 381    * @param dc DbControl The DbControl object to use for the current session.
2431 16 May 14 olle 382    * @return JSONObject Returns a JSON object with a lab sensor configuration JSONArray.
2431 16 May 14 olle 383    */
2431 16 May 14 olle 384   private JSONObject createLabSensorConfigList(JSONObject json, SessionControl sc, DbControl dc)
2303 02 Apr 14 olle 385     throws ServletException, IOException 
2303 02 Apr 14 olle 386   {  
2303 02 Apr 14 olle 387     log.debug("Start " + new Date());
2303 02 Apr 14 olle 388     // Get lab environment configuration from singleton LabEnvironment
2326 07 Apr 14 olle 389     LabEnvironment labEnvironment = LabEnvironment.getInstance();
2303 02 Apr 14 olle 390     LabEnvironmentConfiguration labEnvironmentConfiguration = labEnvironment.getLabEnvironmentConfiguration();
2303 02 Apr 14 olle 391     List<LabSensorConfig> labSensorConfigList = labEnvironmentConfiguration.getLabSensorConfigList();
4527 20 Jun 17 nicklas 392     JSONArray jsonSensors = new JSONArray();
2303 02 Apr 14 olle 393     for (LabSensorConfig labSensorConfig: labSensorConfigList)
2303 02 Apr 14 olle 394     {
2303 02 Apr 14 olle 395       if (labSensorConfig != null)
2303 02 Apr 14 olle 396       {
4527 20 Jun 17 nicklas 397         JSONObject jsonSensor = new JSONObject();
4527 20 Jun 17 nicklas 398         jsonSensor.put("url", labSensorConfig.getUrl());
4527 20 Jun 17 nicklas 399         jsonSensor.put("name", labSensorConfig.getName());
2415 09 May 14 olle 400         List<LabSensorAlarmConfig> alarmList = labSensorConfig.getAlarmList();
4527 20 Jun 17 nicklas 401         JSONArray jsonAlarms = new JSONArray();
2415 09 May 14 olle 402         if (alarmList != null)
2415 09 May 14 olle 403         {
2415 09 May 14 olle 404           for (LabSensorAlarmConfig alarm: alarmList)
2415 09 May 14 olle 405           {
4527 20 Jun 17 nicklas 406             JSONObject jsonAlarm = new JSONObject();
4527 20 Jun 17 nicklas 407             jsonAlarm.put("no", alarm.getNo());
4527 20 Jun 17 nicklas 408             jsonAlarm.put("startTime", alarm.getStartTime());
4527 20 Jun 17 nicklas 409             jsonAlarm.put("endTime", alarm.getEndTime());
4527 20 Jun 17 nicklas 410             jsonAlarm.put("weekdayFilter", alarm.getWeekdayFilter());
4527 20 Jun 17 nicklas 411             jsonAlarm.put("temperatureMin", alarm.getTemperatureMin());
4527 20 Jun 17 nicklas 412             jsonAlarm.put("temperatureMax", alarm.getTemperatureMax());
4527 20 Jun 17 nicklas 413             jsonAlarm.put("humidityMin", alarm.getHumidityMin());
4527 20 Jun 17 nicklas 414             jsonAlarm.put("humidityMax", alarm.getHumidityMax());
4527 20 Jun 17 nicklas 415             jsonAlarm.put("blocked", alarm.isAlarmBlocked());
4527 20 Jun 17 nicklas 416             jsonAlarm.put("alarmText", alarm.getAlarmText());
2419 13 May 14 olle 417             // Check if logged-in user has permission to edit current alarm
2431 16 May 14 olle 418             boolean alarmPermission = fetchAlarmPermission(alarm, sc, dc);
4527 20 Jun 17 nicklas 419             jsonAlarm.put("alarmPermission", alarmPermission);
4527 20 Jun 17 nicklas 420             jsonAlarms.add(jsonAlarm);
2415 09 May 14 olle 421           }
2415 09 May 14 olle 422         }
4527 20 Jun 17 nicklas 423         jsonSensor.put("alarms", jsonAlarms);
4527 20 Jun 17 nicklas 424         jsonSensors.add(jsonSensor);
2433 16 May 14 olle 425         //log.debug("Adding url = " + labSensorConfig.getUrl() + " name = \"" + labSensorConfig.getName() + "\" to JSONArray");
2303 02 Apr 14 olle 426       }
2303 02 Apr 14 olle 427     }
2303 02 Apr 14 olle 428     //
4527 20 Jun 17 nicklas 429     json.put("sensors", jsonSensors);
2303 02 Apr 14 olle 430     return json;
2303 02 Apr 14 olle 431   }
2303 02 Apr 14 olle 432
2303 02 Apr 14 olle 433
2415 09 May 14 olle 434   /**
2419 13 May 14 olle 435    * Returns `true` if the alarm user list contains
2419 13 May 14 olle 436    * the logged-in user log-in id, else `false`.
2419 13 May 14 olle 437    * 
2419 13 May 14 olle 438    * @param alarm LabSensorAlarmConfig The lab sensor alarm configuration to check permission for.
2431 16 May 14 olle 439    * @param sc SessionControl The SessionControl object to use for the current session.
2431 16 May 14 olle 440    * @param dc DbControl The DbControl object to use for the current session.
2419 13 May 14 olle 441    * @return boolean Returns `true` if the alarm user list contains the logged-in user log-in id, else `false`.
2419 13 May 14 olle 442    */
2431 16 May 14 olle 443   private boolean fetchAlarmPermission(LabSensorAlarmConfig alarm, SessionControl sc, DbControl dc)
2419 13 May 14 olle 444   {
2419 13 May 14 olle 445     boolean alarmPermission = false;
2424 14 May 14 olle 446     if (alarm != null)
2419 13 May 14 olle 447     {
2424 14 May 14 olle 448       // Get logged-in user log-in id
2431 16 May 14 olle 449       String loggedInUserLogInId = fetchLoggedInUserLogInId(sc, dc);
2424 14 May 14 olle 450       if (loggedInUserLogInId != null && !loggedInUserLogInId.equals(""))
2419 13 May 14 olle 451       {
2424 14 May 14 olle 452         // Get alarm user list
2424 14 May 14 olle 453         List<LabSensorAlarmUserConfig> alarmUserList = alarm.getUserList();
2424 14 May 14 olle 454         if (alarmUserList != null)
2419 13 May 14 olle 455         {
2424 14 May 14 olle 456           for (LabSensorAlarmUserConfig alarmUser: alarmUserList)
2424 14 May 14 olle 457           {
2424 14 May 14 olle 458             if (alarmUser != null)
2424 14 May 14 olle 459             {
2424 14 May 14 olle 460               if (loggedInUserLogInId.equals(alarmUser.getId()))
2424 14 May 14 olle 461               {
2424 14 May 14 olle 462                 alarmPermission = true;
2424 14 May 14 olle 463               }
2424 14 May 14 olle 464             }
2424 14 May 14 olle 465           }
2419 13 May 14 olle 466         }
2419 13 May 14 olle 467       }
2419 13 May 14 olle 468     }
2419 13 May 14 olle 469     return alarmPermission;
2419 13 May 14 olle 470   }
2419 13 May 14 olle 471
2419 13 May 14 olle 472
2419 13 May 14 olle 473   /**
2415 09 May 14 olle 474    * Returns the log-in id for the logged-in user,
2415 09 May 14 olle 475    * or `null` if the id could not be obtained.
2415 09 May 14 olle 476    * 
2431 16 May 14 olle 477    * @param sc SessionControl The SessionControl object to use for the current session.
2431 16 May 14 olle 478    * @param dc DbControl The DbControl object to use for the current session.
2415 09 May 14 olle 479    * @return String The log-in id for the logged-in user, or `null` if the id could not be obtained.
2415 09 May 14 olle 480    */
2431 16 May 14 olle 481   private String fetchLoggedInUserLogInId(SessionControl sc, DbControl dc)
2415 09 May 14 olle 482   {
2415 09 May 14 olle 483     int userId = sc.getLoggedInUserId();
2415 09 May 14 olle 484     User loggedInUser = User.getById(dc, userId);
2415 09 May 14 olle 485     String loggedInUserLogInId = null;
2415 09 May 14 olle 486     if (loggedInUser != null)
2415 09 May 14 olle 487     {
2415 09 May 14 olle 488       loggedInUserLogInId = loggedInUser.getLogin();
2415 09 May 14 olle 489     }
2415 09 May 14 olle 490     return loggedInUserLogInId;
2415 09 May 14 olle 491   }
2415 09 May 14 olle 492
2415 09 May 14 olle 493
2303 02 Apr 14 olle 494   String createExportFilename(String sensorName, Date startTime, Date endTime)
2303 02 Apr 14 olle 495   {
2303 02 Apr 14 olle 496     // Default settings for lab temperature and humidity report export filename
2303 02 Apr 14 olle 497     String filenamePrefix = "lab_env-";
2303 02 Apr 14 olle 498     // Get lab sensor name string to use in filename
2303 02 Apr 14 olle 499     String labSensorName = "Lab";
2303 02 Apr 14 olle 500     if (sensorName != null && !sensorName.equals(""))
2303 02 Apr 14 olle 501     {
2303 02 Apr 14 olle 502       labSensorName = "" + sensorName;
2303 02 Apr 14 olle 503       // Remove parentheses
2303 02 Apr 14 olle 504       labSensorName = labSensorName.replaceAll("\\(", "");
2303 02 Apr 14 olle 505       labSensorName = labSensorName.replaceAll("\\)", "");
2303 02 Apr 14 olle 506       // Replace spaces with underscores
2303 02 Apr 14 olle 507       labSensorName = labSensorName.replaceAll("\\ ", "_");
2303 02 Apr 14 olle 508     }
2303 02 Apr 14 olle 509     DateFormatter filenameDateFormat = new DateFormatter("yyyyMMdd_HHmmss");
2303 02 Apr 14 olle 510     // Set current date
2303 02 Apr 14 olle 511     //Date today = new Date();
2303 02 Apr 14 olle 512     String dateStringFrom = "first";
2303 02 Apr 14 olle 513     if (startTime != null)
2303 02 Apr 14 olle 514     {
2303 02 Apr 14 olle 515       dateStringFrom = filenameDateFormat.format(startTime);
2303 02 Apr 14 olle 516     }
2303 02 Apr 14 olle 517     String dateStringTo = "last";
2303 02 Apr 14 olle 518     if (endTime != null)
2303 02 Apr 14 olle 519     {
2303 02 Apr 14 olle 520       dateStringTo = filenameDateFormat.format(endTime);
2303 02 Apr 14 olle 521     }
2303 02 Apr 14 olle 522     String intervalString = dateStringFrom + "-" + dateStringTo;
2303 02 Apr 14 olle 523     String filename= filenamePrefix + labSensorName + "-" + intervalString + ".tsv";
2303 02 Apr 14 olle 524     return filename;
2303 02 Apr 14 olle 525   }
2303 02 Apr 14 olle 526
2303 02 Apr 14 olle 527
2303 02 Apr 14 olle 528   private JSONObject createLabEnvironmentJsonObject(JSONObject json, List<LabEnvironmentData> lthdlist)
2303 02 Apr 14 olle 529   {
2303 02 Apr 14 olle 530     DateFormatter dateFormat = new DateFormatter("yyyy-MM-dd HH:mm:ss");
2303 02 Apr 14 olle 531     JSONArray jsonArray = new JSONArray();
2303 02 Apr 14 olle 532     for (LabEnvironmentData lthd : lthdlist)
2303 02 Apr 14 olle 533     {
2303 02 Apr 14 olle 534       JSONObject labenv = new JSONObject();
2303 02 Apr 14 olle 535       labenv.put("index", lthd.getId());
2303 02 Apr 14 olle 536       labenv.put("url", lthd.getSensorUrl());
2303 02 Apr 14 olle 537       labenv.put("sensorname", lthd.getSensorName());
2303 02 Apr 14 olle 538       labenv.put("unixtime", lthd.getUnixTime());
2303 02 Apr 14 olle 539       labenv.put("date", dateFormat.format(lthd.getDateTime()));
2303 02 Apr 14 olle 540       labenv.put("temperature", lthd.getTemperature());
2303 02 Apr 14 olle 541       labenv.put("humidity", lthd.getHumidity());
2303 02 Apr 14 olle 542       jsonArray.add(labenv);
2303 02 Apr 14 olle 543     }
2303 02 Apr 14 olle 544     json.put("labenvarray", jsonArray);
2303 02 Apr 14 olle 545     return json;
2303 02 Apr 14 olle 546   }
2303 02 Apr 14 olle 547
2303 02 Apr 14 olle 548   /**
2303 02 Apr 14 olle 549    * Returns a Date object from input dateTime string in format (yyyyMMdd HHmm).
2303 02 Apr 14 olle 550    * Returns `null` if input dateTime string is
2303 02 Apr 14 olle 551    * `null` or blank.
2303 02 Apr 14 olle 552    * 
2303 02 Apr 14 olle 553    * @param dateTimeStr String Input dateTime string in (yyyyMMdd HHmm) format.
2303 02 Apr 14 olle 554    * @return Date Date object from input dateTime string.
2303 02 Apr 14 olle 555    */
2303 02 Apr 14 olle 556   private Date dateTimeStringToDate(String dateTimeStr)
2303 02 Apr 14 olle 557   {
2303 02 Apr 14 olle 558     Date date = null;
2303 02 Apr 14 olle 559     if (dateTimeStr != null && !dateTimeStr.equals(""))
2303 02 Apr 14 olle 560     {
2303 02 Apr 14 olle 561       date = CONVERTER_STRING_TO_DATETIME.convert(dateTimeStr);
2303 02 Apr 14 olle 562     }
2303 02 Apr 14 olle 563     return date;
2303 02 Apr 14 olle 564   }
2303 02 Apr 14 olle 565
2303 02 Apr 14 olle 566
2303 02 Apr 14 olle 567   /**
2303 02 Apr 14 olle 568    * Returns a dateTime string in format (yyyyMMdd HHmm) from input
2303 02 Apr 14 olle 569    * date and time strings. Returns `null` if input date string is
2303 02 Apr 14 olle 570    * `null` or blank. Provided input date string is OK; if input time
2303 02 Apr 14 olle 571    * string is `null` or blank, time is set to "0000".
2303 02 Apr 14 olle 572    * 
2303 02 Apr 14 olle 573    * @param dateStr String Input date string in (yyyyMMdd) format.
2303 02 Apr 14 olle 574    * @param timeStr String Input time string in (HHmm) format.
2303 02 Apr 14 olle 575    * @return String DateTime string in format (yyyyMMdd HHmm) from input date and time strings.
2303 02 Apr 14 olle 576    */
2303 02 Apr 14 olle 577   private String dateAndTimeStringsToDateTimeString(String dateStr, String timeStr)
2303 02 Apr 14 olle 578   {
2303 02 Apr 14 olle 579     String dateTimeStr = null;
2303 02 Apr 14 olle 580     if (dateStr != null && !dateStr.equals(""))
2303 02 Apr 14 olle 581     {
2303 02 Apr 14 olle 582       dateStr.replaceAll("-", "");
2303 02 Apr 14 olle 583       dateTimeStr = "" + dateStr;
2303 02 Apr 14 olle 584       if (timeStr != null && !timeStr.equals(""))
2303 02 Apr 14 olle 585       {
2303 02 Apr 14 olle 586         timeStr.replaceAll(":", "");
2303 02 Apr 14 olle 587       }
2303 02 Apr 14 olle 588       else
2303 02 Apr 14 olle 589       {
2303 02 Apr 14 olle 590         timeStr = "0000";
2303 02 Apr 14 olle 591       }
2303 02 Apr 14 olle 592       dateTimeStr += " " + timeStr;    
2303 02 Apr 14 olle 593     }
2303 02 Apr 14 olle 594     return dateTimeStr;
2303 02 Apr 14 olle 595   }
2303 02 Apr 14 olle 596 }