Merge "User guide documentation for data router"
[dmaap/datarouter.git] / datarouter-prov / src / main / java / org / onap / dmaap / datarouter / provisioning / StatisticsServlet.java
1 /*******************************************************************************\r
2  * ============LICENSE_START==================================================\r
3  * * org.onap.dmaap\r
4  * * ===========================================================================\r
5  * * Copyright © 2017 AT&T Intellectual Property. All rights reserved.\r
6  * * ===========================================================================\r
7  * * Licensed under the Apache License, Version 2.0 (the "License");\r
8  * * you may not use this file except in compliance with the License.\r
9  * * You may obtain a copy of the License at\r
10  * *\r
11  *  *      http://www.apache.org/licenses/LICENSE-2.0\r
12  * *\r
13  *  * Unless required by applicable law or agreed to in writing, software\r
14  * * distributed under the License is distributed on an "AS IS" BASIS,\r
15  * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
16  * * See the License for the specific language governing permissions and\r
17  * * limitations under the License.\r
18  * * ============LICENSE_END====================================================\r
19  * *\r
20  * * ECOMP is a trademark and service mark of AT&T Intellectual Property.\r
21  * *\r
22  ******************************************************************************/\r
23 \r
24 package org.onap.dmaap.datarouter.provisioning;\r
25 \r
26 import java.io.IOException;\r
27 import java.sql.Connection;\r
28 import java.sql.PreparedStatement;\r
29 import java.sql.ResultSet;\r
30 import java.sql.SQLException;\r
31 import java.text.ParseException;\r
32 import java.text.SimpleDateFormat;\r
33 import java.util.Calendar;\r
34 import java.util.Date;\r
35 import java.util.HashMap;\r
36 import java.util.Map;\r
37 import java.util.TimeZone;\r
38 import javax.servlet.ServletOutputStream;\r
39 import javax.servlet.http.HttpServletRequest;\r
40 import javax.servlet.http.HttpServletResponse;\r
41 import org.json.JSONException;\r
42 import org.onap.dmaap.datarouter.provisioning.beans.EventLogRecord;\r
43 import org.onap.dmaap.datarouter.provisioning.utils.DB;\r
44 import org.onap.dmaap.datarouter.provisioning.utils.LOGJSONObject;\r
45 \r
46 import static org.onap.dmaap.datarouter.provisioning.utils.HttpServletUtils.sendResponseError;\r
47 \r
48 /**\r
49  * This Servlet handles requests to the <Statistics API> and  <Statistics consilidated\r
50  * resultset>,\r
51  *\r
52  * @author Manish Singh\r
53  * @version $Id: StatisticsServlet.java,v 1.11 2016/08/10 17:27:02 Manish Exp $\r
54  */\r
55 @SuppressWarnings("serial")\r
56 \r
57 public class StatisticsServlet extends BaseServlet {\r
58 \r
59   private static final long TWENTYFOUR_HOURS = (24 * 60 * 60 * 1000L);\r
60   private static final String fmt1 = "yyyy-MM-dd'T'HH:mm:ss'Z'";\r
61   private static final String fmt2 = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'";\r
62 \r
63 \r
64   /**\r
65    * DELETE a logging URL -- not supported.\r
66    */\r
67   @Override\r
68   public void doDelete(HttpServletRequest req, HttpServletResponse resp) {\r
69     String message = "DELETE not allowed for the logURL.";\r
70     EventLogRecord elr = new EventLogRecord(req);\r
71     elr.setMessage(message);\r
72     elr.setResult(HttpServletResponse.SC_METHOD_NOT_ALLOWED);\r
73     eventlogger.info(elr);\r
74     sendResponseError(resp, HttpServletResponse.SC_METHOD_NOT_ALLOWED, message, eventlogger);\r
75   }\r
76 \r
77   /**\r
78    * GET a Statistics URL -- retrieve Statistics data for a feed or subscription. See the\r
79    * <b>Statistics API</b> document for details on how this     method should be invoked.\r
80    */\r
81   @Override\r
82   public void doGet(HttpServletRequest req, HttpServletResponse resp) {\r
83 \r
84     Map<String, String> map = buildMapFromRequest(req);\r
85     if (map.get("err") != null) {\r
86       sendResponseError(resp, HttpServletResponse.SC_BAD_REQUEST, "Invalid arguments: " + map.get("err"), eventlogger);\r
87       return;\r
88     }\r
89     // check Accept: header??\r
90 \r
91     resp.setStatus(HttpServletResponse.SC_OK);\r
92     resp.setContentType(LOGLIST_CONTENT_TYPE);\r
93 \r
94     String outputType = "json";\r
95     String feedids = null;\r
96 \r
97     if (req.getParameter("feedid") == null && req.getParameter("groupid") == null) {\r
98       try {\r
99         resp.getOutputStream().print("Invalid request, Feedid or Group ID is required.");\r
100       } catch (IOException ioe) {\r
101         eventlogger.error("IOException: " + ioe.getMessage());\r
102       }\r
103     }\r
104 \r
105     if (req.getParameter("feedid") != null && req.getParameter("groupid") == null) {\r
106       map.put("feedids", req.getParameter("feedid").replace("|", ",").toString());\r
107     }\r
108 \r
109     if (req.getParameter("groupid") != null && req.getParameter("feedid") == null) {\r
110       StringBuffer groupid1 = new StringBuffer();\r
111 \r
112       try {\r
113         System.out.println("feeedidsssssssss");\r
114         groupid1 = this.getFeedIdsByGroupId(Integer.parseInt(req.getParameter("groupid")));\r
115         System.out.println("feeedids" + req.getParameter("groupid"));\r
116 \r
117         map.put("feedids", groupid1.toString());\r
118         System.out.println("groupid1" + groupid1.toString());\r
119 \r
120 \r
121       } catch (NumberFormatException | SQLException e) {\r
122         eventlogger.error(e.getMessage());\r
123       }\r
124     }\r
125     if (req.getParameter("groupid") != null && req.getParameter("feedid") != null) {\r
126       StringBuffer groupid1 = new StringBuffer();\r
127 \r
128       try {\r
129         System.out.println("both r not null");\r
130         groupid1 = this.getFeedIdsByGroupId(Integer.parseInt(req.getParameter("groupid")));\r
131         System.out.println("feeedids" + req.getParameter("groupid"));\r
132         groupid1.append(",");\r
133         groupid1.append(req.getParameter("feedid").replace("|", ",").toString());\r
134 \r
135         map.put("feedids", groupid1.toString());\r
136 \r
137         System.out.println("groupid1" + groupid1.toString());\r
138 \r
139 \r
140       } catch (NumberFormatException | SQLException e) {\r
141         eventlogger.error(e.getMessage());\r
142       }\r
143     }\r
144 \r
145     if (req.getParameter("subid") != null && req.getParameter("feedid") != null) {\r
146       StringBuffer subidstr = new StringBuffer();\r
147       subidstr.append("and e.DELIVERY_SUBID in(");\r
148 \r
149       subidstr.append(req.getParameter("subid").replace("|", ",").toString());\r
150       subidstr.append(")");\r
151       map.put("subid", subidstr.toString());\r
152     }\r
153     if (req.getParameter("subid") != null && req.getParameter("groupid") != null) {\r
154       StringBuffer subidstr = new StringBuffer();\r
155       subidstr.append("and e.DELIVERY_SUBID in(");\r
156 \r
157       subidstr.append(req.getParameter("subid").replace("|", ",").toString());\r
158       subidstr.append(")");\r
159       map.put("subid", subidstr.toString());\r
160     }\r
161     if (req.getParameter("type") != null) {\r
162       map.put("eventType", req.getParameter("type").replace("|", ",").toString());\r
163     }\r
164     if (req.getParameter("output_type") != null) {\r
165       map.put("output_type", req.getParameter("output_type").toString());\r
166     }\r
167     if (req.getParameter("start_time") != null) {\r
168       map.put("start_time", req.getParameter("start_time").toString());\r
169     }\r
170     if (req.getParameter("end_time") != null) {\r
171       map.put("end_time", req.getParameter("end_time").toString());\r
172     }\r
173 \r
174     if (req.getParameter("time") != null) {\r
175       map.put("start_time", req.getParameter("time").toString());\r
176       map.put("end_time", null);\r
177     }\r
178 \r
179     if (req.getParameter("output_type") != null) {\r
180       outputType = req.getParameter("output_type");\r
181     }\r
182     try {\r
183       this.getRecordsForSQL(map, outputType, resp.getOutputStream(), resp);\r
184     } catch (IOException ioe) {\r
185       eventlogger.error("IOException: " + ioe.getMessage());\r
186     }\r
187 \r
188   }\r
189 \r
190 \r
191   /**\r
192    * rsToJson - Converting RS to JSON object\r
193    *\r
194    * @param out ServletOutputStream, rs as ResultSet\r
195    * @throws IOException, SQLException\r
196    */\r
197   public void rsToCSV(ResultSet rs, ServletOutputStream out) throws IOException, SQLException {\r
198     String header = "FEEDNAME,FEEDID,FILES_PUBLISHED,PUBLISH_LENGTH, FILES_DELIVERED, DELIVERED_LENGTH, SUBSCRIBER_URL, SUBID, PUBLISH_TIME,DELIVERY_TIME, AverageDelay\n";\r
199 \r
200     out.write(header.getBytes());\r
201 \r
202     while (rs.next()) {\r
203       StringBuffer line = new StringBuffer();\r
204       line.append(rs.getString("FEEDNAME"));\r
205       line.append(",");\r
206       line.append(rs.getString("FEEDID"));\r
207       line.append(",");\r
208       line.append(rs.getString("FILES_PUBLISHED"));\r
209       line.append(",");\r
210       line.append(rs.getString("PUBLISH_LENGTH"));\r
211       line.append(",");\r
212       line.append(rs.getString("FILES_DELIVERED"));\r
213       line.append(",");\r
214       line.append(rs.getString("DELIVERED_LENGTH"));\r
215       line.append(",");\r
216       line.append(rs.getString("SUBSCRIBER_URL"));\r
217       line.append(",");\r
218       line.append(rs.getString("SUBID"));\r
219       line.append(",");\r
220       line.append(rs.getString("PUBLISH_TIME"));\r
221       line.append(",");\r
222       line.append(rs.getString("DELIVERY_TIME"));\r
223       line.append(",");\r
224       line.append(rs.getString("AverageDelay"));\r
225       line.append(",");\r
226 \r
227       line.append("\n");\r
228       out.write(line.toString().getBytes());\r
229       out.flush();\r
230     }\r
231   }\r
232 \r
233   /**\r
234    * rsToJson - Converting RS to JSON object\r
235    *\r
236    * @param out ServletOutputStream, rs as ResultSet\r
237    * @throws IOException, SQLException\r
238    */\r
239   public void rsToJson(ResultSet rs, ServletOutputStream out) throws IOException, SQLException {\r
240 \r
241     String fields[] = {"FEEDNAME", "FEEDID", "FILES_PUBLISHED", "PUBLISH_LENGTH", "FILES_DELIVERED",\r
242         "DELIVERED_LENGTH", "SUBSCRIBER_URL", "SUBID", "PUBLISH_TIME", "DELIVERY_TIME",\r
243         "AverageDelay"};\r
244     StringBuffer line = new StringBuffer();\r
245 \r
246     line.append("[\n");\r
247 \r
248     while (rs.next()) {\r
249       LOGJSONObject j2 = new LOGJSONObject();\r
250       for (String key : fields) {\r
251         Object v = rs.getString(key);\r
252         if (v != null) {\r
253           j2.put(key.toLowerCase(), v);\r
254         } else {\r
255           j2.put(key.toLowerCase(), "");\r
256         }\r
257       }\r
258       line = line.append(j2.toString());\r
259       line.append(",\n");\r
260     }\r
261     line.append("]");\r
262     out.print(line.toString());\r
263   }\r
264 \r
265   /**\r
266    * getFeedIdsByGroupId - Getting FEEDID's by GROUP ID.\r
267    *\r
268    * @throws SQLException Query SQLException.\r
269    */\r
270   public StringBuffer getFeedIdsByGroupId(int groupIds) throws SQLException {\r
271 \r
272     DB db = null;\r
273     Connection conn = null;\r
274     //PreparedStatement prepareStatement = null;\r
275     ResultSet resultSet = null;\r
276     String sqlGoupid = null;\r
277     StringBuffer feedIds = new StringBuffer();\r
278 \r
279     try {\r
280       db = new DB();\r
281       conn = db.getConnection();\r
282       sqlGoupid = " SELECT FEEDID from FEEDS  WHERE GROUPID = ?";\r
283       try(PreparedStatement prepareStatement = conn.prepareStatement(sqlGoupid)) {\r
284           prepareStatement.setInt(1, groupIds);\r
285           resultSet = prepareStatement.executeQuery();\r
286           while (resultSet.next()) {\r
287               feedIds.append(resultSet.getInt("FEEDID"));\r
288               feedIds.append(",");\r
289           }\r
290           feedIds.deleteCharAt(feedIds.length() - 1);\r
291           System.out.println("feedIds" + feedIds.toString());\r
292       }\r
293     } catch (SQLException e) {\r
294       eventlogger.error(e.getMessage());\r
295     } finally {\r
296       try {\r
297         if (resultSet != null) {\r
298           resultSet.close();\r
299           resultSet = null;\r
300         }\r
301           if (conn != null) {\r
302           db.release(conn);\r
303         }\r
304       } catch (Exception e) {\r
305         eventlogger.error(e.getMessage());\r
306       }\r
307     }\r
308     return feedIds;\r
309   }\r
310 \r
311 \r
312   /**\r
313    * queryGeneretor - Generating sql query\r
314    *\r
315    * @param map as key value pare of all user input fields\r
316    */\r
317   public String queryGeneretor(Map<String, String> map) throws ParseException {\r
318 \r
319     String sql = null;\r
320     String eventType = null;\r
321     String feedids = null;\r
322     String start_time = null;\r
323     String end_time = null;\r
324     String subid = " ";\r
325     if (map.get("eventType") != null) {\r
326       eventType = (String) map.get("eventType");\r
327     }\r
328     if (map.get("feedids") != null) {\r
329       feedids = (String) map.get("feedids");\r
330     }\r
331     if (map.get("start_time") != null) {\r
332       start_time = (String) map.get("start_time");\r
333     }\r
334     if (map.get("end_time") != null) {\r
335       end_time = (String) map.get("end_time");\r
336     }\r
337     if ("all".equalsIgnoreCase(eventType)) {\r
338       eventType = "PUB','DEL, EXP, PBF";\r
339     }\r
340     if (map.get("subid") != null) {\r
341       subid = (String) map.get("subid");\r
342     }\r
343 \r
344     eventlogger.info("Generating sql query to get Statistics resultset. ");\r
345 \r
346     if (end_time == null && start_time == null) {\r
347 \r
348       sql = "SELECT (SELECT NAME FROM FEEDS AS f WHERE f.FEEDID in(" + feedids\r
349           + ") and f.FEEDID=e.FEEDID) AS FEEDNAME, e.FEEDID as FEEDID, (SELECT COUNT(*) FROM LOG_RECORDS AS c WHERE c.FEEDID in("\r
350           + feedids\r
351           + ") and c.FEEDID=e.FEEDID AND c.TYPE='PUB') AS FILES_PUBLISHED,(SELECT SUM(content_length) FROM LOG_RECORDS AS c WHERE c.FEEDID in("\r
352           + feedids\r
353           + ")  and c.FEEDID=e.FEEDID AND c.TYPE='PUB') AS PUBLISH_LENGTH, COUNT(e.EVENT_TIME) as FILES_DELIVERED,  sum(m.content_length) as DELIVERED_LENGTH,SUBSTRING_INDEX(e.REQURI,'/',+3) as SUBSCRIBER_URL, e.DELIVERY_SUBID as SUBID, e.EVENT_TIME AS PUBLISH_TIME, m.EVENT_TIME AS DELIVERY_TIME,  AVG(e.EVENT_TIME - m.EVENT_TIME)/1000 as AverageDelay FROM LOG_RECORDS e JOIN LOG_RECORDS m ON m.PUBLISH_ID = e.PUBLISH_ID AND e.FEEDID IN ("\r
354           + feedids + ") " + subid + " AND m.STATUS=204 AND e.RESULT=204  group by SUBID";\r
355 \r
356       return sql;\r
357     } else if (start_time != null && end_time == null) {\r
358 \r
359       long inputTimeInMilli = 60000 * Long.parseLong(start_time);\r
360       Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("GMT"));\r
361       long currentTimeInMilli = cal.getTimeInMillis();\r
362       long compareTime = currentTimeInMilli - inputTimeInMilli;\r
363 \r
364       sql = "SELECT (SELECT NAME FROM FEEDS AS f WHERE f.FEEDID in(" + feedids\r
365           + ") and f.FEEDID=e.FEEDID) AS FEEDNAME, e.FEEDID as FEEDID, (SELECT COUNT(*) FROM LOG_RECORDS AS c WHERE c.FEEDID in("\r
366           + feedids\r
367           + ") and c.FEEDID=e.FEEDID AND c.TYPE='PUB') AS FILES_PUBLISHED,(SELECT SUM(content_length) FROM LOG_RECORDS AS c WHERE c.FEEDID in("\r
368           + feedids\r
369           + ")  and c.FEEDID=e.FEEDID AND c.TYPE='PUB') AS PUBLISH_LENGTH, COUNT(e.EVENT_TIME) as FILES_DELIVERED,  sum(m.content_length) as DELIVERED_LENGTH,SUBSTRING_INDEX(e.REQURI,'/',+3) as SUBSCRIBER_URL, e.DELIVERY_SUBID as SUBID, e.EVENT_TIME AS PUBLISH_TIME, m.EVENT_TIME AS DELIVERY_TIME,  AVG(e.EVENT_TIME - m.EVENT_TIME)/1000 as AverageDelay FROM LOG_RECORDS e JOIN LOG_RECORDS m ON m.PUBLISH_ID = e.PUBLISH_ID AND e.FEEDID IN ("\r
370           + feedids + ") " + subid + " AND m.STATUS=204 AND e.RESULT=204 and e.event_time>="\r
371           + compareTime + " group by SUBID";\r
372 \r
373       return sql;\r
374 \r
375     } else {\r
376       SimpleDateFormat inFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");\r
377       Date startDate = inFormat.parse(start_time);\r
378       Date endDate = inFormat.parse(end_time);\r
379 \r
380       long startInMillis = startDate.getTime();\r
381       long endInMillis = endDate.getTime();\r
382 \r
383       {\r
384 \r
385         sql = "SELECT (SELECT NAME FROM FEEDS AS f WHERE f.FEEDID in(" + feedids\r
386             + ") and f.FEEDID=e.FEEDID) AS FEEDNAME, e.FEEDID as FEEDID, (SELECT COUNT(*) FROM LOG_RECORDS AS c WHERE c.FEEDID in("\r
387             + feedids\r
388             + ") and c.FEEDID=e.FEEDID AND c.TYPE='PUB') AS FILES_PUBLISHED,(SELECT SUM(content_length) FROM LOG_RECORDS AS c WHERE c.FEEDID in("\r
389             + feedids\r
390             + ")  and c.FEEDID=e.FEEDID AND c.TYPE='PUB') AS PUBLISH_LENGTH, COUNT(e.EVENT_TIME) as FILES_DELIVERED,  sum(m.content_length) as DELIVERED_LENGTH,SUBSTRING_INDEX(e.REQURI,'/',+3) as SUBSCRIBER_URL, e.DELIVERY_SUBID as SUBID, e.EVENT_TIME AS PUBLISH_TIME, m.EVENT_TIME AS DELIVERY_TIME,  AVG(e.EVENT_TIME - m.EVENT_TIME)/1000 as AverageDelay FROM LOG_RECORDS e JOIN LOG_RECORDS m ON m.PUBLISH_ID = e.PUBLISH_ID AND e.FEEDID IN ("\r
391             + feedids + ") " + subid\r
392             + " AND m.STATUS=204 AND e.RESULT=204 and e.event_time between " + startInMillis\r
393             + " and " + endInMillis + " group by SUBID";\r
394 \r
395       }\r
396       return sql;\r
397     }\r
398   }\r
399 \r
400 \r
401   /**\r
402    * PUT a Statistics URL -- not supported.\r
403    */\r
404   @Override\r
405   public void doPut(HttpServletRequest req, HttpServletResponse resp) {\r
406     String message = "PUT not allowed for the StatisticsURL.";\r
407     EventLogRecord elr = new EventLogRecord(req);\r
408     elr.setMessage(message);\r
409     elr.setResult(HttpServletResponse.SC_METHOD_NOT_ALLOWED);\r
410     eventlogger.info(elr);\r
411     sendResponseError(resp, HttpServletResponse.SC_METHOD_NOT_ALLOWED, message, eventlogger);\r
412   }\r
413 \r
414   /**\r
415    * POST a Statistics URL -- not supported.\r
416    */\r
417   @Override\r
418   public void doPost(HttpServletRequest req, HttpServletResponse resp) {\r
419     String message = "POST not allowed for the StatisticsURL.";\r
420     EventLogRecord elr = new EventLogRecord(req);\r
421     elr.setMessage(message);\r
422     elr.setResult(HttpServletResponse.SC_METHOD_NOT_ALLOWED);\r
423     eventlogger.info(elr);\r
424     sendResponseError(resp, HttpServletResponse.SC_METHOD_NOT_ALLOWED, message, eventlogger);\r
425   }\r
426 \r
427   private Map<String, String> buildMapFromRequest(HttpServletRequest req) {\r
428     Map<String, String> map = new HashMap<String, String>();\r
429     String s = req.getParameter("type");\r
430     if (s != null) {\r
431       if (s.equals("pub") || s.equals("del") || s.equals("exp")) {\r
432         map.put("type", s);\r
433       } else {\r
434         map.put("err", "bad type");\r
435         return map;\r
436       }\r
437     } else {\r
438       map.put("type", "all");\r
439     }\r
440     map.put("publishSQL", "");\r
441     map.put("statusSQL", "");\r
442     map.put("resultSQL", "");\r
443     map.put("reasonSQL", "");\r
444 \r
445     s = req.getParameter("publishId");\r
446     if (s != null) {\r
447       if (s.indexOf("'") >= 0) {\r
448         map.put("err", "bad publishId");\r
449         return map;\r
450       }\r
451       map.put("publishSQL", " AND PUBLISH_ID = '" + s + "'");\r
452     }\r
453 \r
454     s = req.getParameter("statusCode");\r
455     if (s != null) {\r
456       String sql = null;\r
457       if (s.equals("success")) {\r
458         sql = " AND STATUS >= 200 AND STATUS < 300";\r
459       } else if (s.equals("redirect")) {\r
460         sql = " AND STATUS >= 300 AND STATUS < 400";\r
461       } else if (s.equals("failure")) {\r
462         sql = " AND STATUS >= 400";\r
463       } else {\r
464         try {\r
465           Integer n = Integer.parseInt(s);\r
466           if ((n >= 100 && n < 600) || (n == -1)) {\r
467             sql = " AND STATUS = " + n;\r
468           }\r
469         } catch (NumberFormatException e) {\r
470         }\r
471       }\r
472       if (sql == null) {\r
473         map.put("err", "bad statusCode");\r
474         return map;\r
475       }\r
476       map.put("statusSQL", sql);\r
477       map.put("resultSQL", sql.replaceAll("STATUS", "RESULT"));\r
478     }\r
479 \r
480     s = req.getParameter("expiryReason");\r
481     if (s != null) {\r
482       map.put("type", "exp");\r
483       if (s.equals("notRetryable")) {\r
484         map.put("reasonSQL", " AND REASON = 'notRetryable'");\r
485       } else if (s.equals("retriesExhausted")) {\r
486         map.put("reasonSQL", " AND REASON = 'retriesExhausted'");\r
487       } else if (s.equals("diskFull")) {\r
488         map.put("reasonSQL", " AND REASON = 'diskFull'");\r
489       } else if (s.equals("other")) {\r
490         map.put("reasonSQL", " AND REASON = 'other'");\r
491       } else {\r
492         map.put("err", "bad expiryReason");\r
493         return map;\r
494       }\r
495     }\r
496 \r
497     long stime = getTimeFromParam(req.getParameter("start"));\r
498     if (stime < 0) {\r
499       map.put("err", "bad start");\r
500       return map;\r
501     }\r
502     long etime = getTimeFromParam(req.getParameter("end"));\r
503     if (etime < 0) {\r
504       map.put("err", "bad end");\r
505       return map;\r
506     }\r
507     if (stime == 0 && etime == 0) {\r
508       etime = System.currentTimeMillis();\r
509       stime = etime - TWENTYFOUR_HOURS;\r
510     } else if (stime == 0) {\r
511       stime = etime - TWENTYFOUR_HOURS;\r
512     } else if (etime == 0) {\r
513       etime = stime + TWENTYFOUR_HOURS;\r
514     }\r
515     map.put("timeSQL", String.format(" AND EVENT_TIME >= %d AND EVENT_TIME <= %d", stime, etime));\r
516     return map;\r
517   }\r
518 \r
519   private long getTimeFromParam(final String s) {\r
520     if (s == null) {\r
521       return 0;\r
522     }\r
523     try {\r
524       // First, look for an RFC 3339 date\r
525       String fmt = (s.indexOf('.') > 0) ? fmt2 : fmt1;\r
526       SimpleDateFormat sdf = new SimpleDateFormat(fmt);\r
527       Date d = sdf.parse(s);\r
528       return d.getTime();\r
529     } catch (ParseException e) {\r
530     }\r
531     try {\r
532       // Also allow a long (in ms); useful for testing\r
533       long n = Long.parseLong(s);\r
534       return n;\r
535     } catch (NumberFormatException e) {\r
536     }\r
537     intlogger.info("Error parsing time=" + s);\r
538     return -1;\r
539   }\r
540 \r
541   private void getRecordsForSQL(Map<String, String> map, String outputType, ServletOutputStream out, HttpServletResponse resp) {\r
542     try {\r
543 \r
544       String filterQuery = this.queryGeneretor(map);\r
545       eventlogger.debug("SQL Query for Statistics resultset. " + filterQuery);\r
546       intlogger.debug(filterQuery);\r
547       long start = System.currentTimeMillis();\r
548       DB db = new DB();\r
549       ResultSet rs = null;\r
550       try (Connection conn = db.getConnection()) {\r
551         try (PreparedStatement pst = conn.prepareStatement(filterQuery)) {\r
552           rs = pst.executeQuery();\r
553           if (outputType.equals("csv")) {\r
554             resp.setContentType("application/octet-stream");\r
555             Date date = new Date();\r
556             SimpleDateFormat dateFormat = new SimpleDateFormat("dd-MM-YYYY HH:mm:ss");\r
557             resp.setHeader("Content-Disposition",\r
558                     "attachment; filename=\"result:" + dateFormat.format(date) + ".csv\"");\r
559             eventlogger.info("Generating CSV file from Statistics resultset");\r
560 \r
561             rsToCSV(rs, out);\r
562           } else {\r
563             eventlogger.info("Generating JSON for Statistics resultset");\r
564             this.rsToJson(rs, out);\r
565           }\r
566         }\r
567       } catch (SQLException e) {\r
568         eventlogger.error("SQLException:" + e);\r
569       }\r
570       intlogger.debug("Time: " + (System.currentTimeMillis() - start) + " ms");\r
571     } catch (IOException e) {\r
572       eventlogger.error("IOException - Generating JSON/CSV:" + e);\r
573     } catch (JSONException e) {\r
574       eventlogger.error("JSONException - executing SQL query:" + e);\r
575     } catch (ParseException e) {\r
576       eventlogger.error("ParseException - executing SQL query:" + e);\r
577     }\r
578   }\r
579 }\r
580 \r