Removing code smells
[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     public static final String FEEDID = "FEEDID";\r
63 \r
64 \r
65     /**\r
66      * DELETE a logging URL -- not supported.\r
67      */\r
68     @Override\r
69     public void doDelete(HttpServletRequest req, HttpServletResponse resp) {\r
70         String message = "DELETE not allowed for the logURL.";\r
71         EventLogRecord elr = new EventLogRecord(req);\r
72         elr.setMessage(message);\r
73         elr.setResult(HttpServletResponse.SC_METHOD_NOT_ALLOWED);\r
74         eventlogger.error(elr.toString());\r
75         sendResponseError(resp, HttpServletResponse.SC_METHOD_NOT_ALLOWED, message, eventlogger);\r
76     }\r
77 \r
78     /**\r
79      * GET a Statistics URL -- retrieve Statistics data for a feed or subscription. See the\r
80      * <b>Statistics API</b> document for details on how this     method should be invoked.\r
81      */\r
82     @Override\r
83     public void doGet(HttpServletRequest req, HttpServletResponse resp) {\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         resp.setStatus(HttpServletResponse.SC_OK);\r
91         resp.setContentType(LOGLIST_CONTENT_TYPE);\r
92         String outputType = "json";\r
93         if (req.getParameter(FEEDID) == null && req.getParameter(GROUPID) == null) {\r
94             try {\r
95                 resp.getOutputStream().print("Invalid request, Feedid or Group ID is required.");\r
96             } catch (IOException ioe) {\r
97                 eventlogger.error("PROV0171 StatisticsServlet.doGet: " + ioe.getMessage(), ioe);\r
98             }\r
99         }\r
100         if (req.getParameter(FEEDID) != null && req.getParameter(GROUPID) == null) {\r
101             map.put(FEEDIDS, req.getParameter(FEEDID).replace("|", ","));\r
102         }\r
103         if (req.getParameter(GROUPID) != null && req.getParameter(FEEDID) == null) {\r
104             StringBuilder groupid1;\r
105             try {\r
106                 groupid1 = this.getFeedIdsByGroupId(Integer.parseInt(req.getParameter(GROUPID)));\r
107                 map.put(FEEDIDS, groupid1.toString());\r
108             } catch (NumberFormatException | SQLException e) {\r
109                 eventlogger.error("PROV0172 StatisticsServlet.doGet: " + e.getMessage(), e);\r
110             }\r
111         }\r
112         if (req.getParameter(GROUPID) != null && req.getParameter(FEEDID) != null) {\r
113             StringBuilder groupid1;\r
114             try {\r
115                 groupid1 = this.getFeedIdsByGroupId(Integer.parseInt(req.getParameter(GROUPID)));\r
116                 groupid1.append(",");\r
117                 groupid1.append(req.getParameter(FEEDID).replace("|", ","));\r
118                 map.put(FEEDIDS, groupid1.toString());\r
119             } catch (NumberFormatException | SQLException e) {\r
120                 eventlogger.error("PROV0173 StatisticsServlet.doGet: " + e.getMessage(), e);\r
121             }\r
122         }\r
123         if (req.getParameter(SUBID) != null && req.getParameter(FEEDID) != null) {\r
124             String subidstr = "and e.DELIVERY_SUBID in("\r
125                 + req.getParameter(SUBID).replace("|", ",") + ")";\r
126             map.put(SUBID, subidstr);\r
127         }\r
128         if (req.getParameter(SUBID) != null && req.getParameter(GROUPID) != null) {\r
129             String subidstr = "and e.DELIVERY_SUBID in("\r
130                 + req.getParameter(SUBID).replace("|", ",") + ")";\r
131             map.put(SUBID, subidstr);\r
132         }\r
133         if (req.getParameter("type") != null) {\r
134             map.put(EVENT_TYPE, req.getParameter("type").replace("|", ","));\r
135         }\r
136         if (req.getParameter(OUTPUT_TYPE) != null) {\r
137             map.put(OUTPUT_TYPE, req.getParameter(OUTPUT_TYPE));\r
138         }\r
139         if (req.getParameter(START_TIME) != null) {\r
140             map.put(START_TIME, req.getParameter(START_TIME));\r
141         }\r
142         if (req.getParameter(END_TIME) != null) {\r
143             map.put(END_TIME, req.getParameter(END_TIME));\r
144         }\r
145         if (req.getParameter("time") != null) {\r
146             map.put(START_TIME, req.getParameter("time"));\r
147             map.put(END_TIME, null);\r
148         }\r
149         if (req.getParameter(OUTPUT_TYPE) != null) {\r
150             outputType = req.getParameter(OUTPUT_TYPE);\r
151         }\r
152         try {\r
153             this.getRecordsForSQL(map, outputType, resp.getOutputStream(), resp);\r
154         } catch (IOException ioe) {\r
155             eventlogger.error("PROV0174 StatisticsServlet.doGet: " +  ioe.getMessage(), ioe);\r
156         }\r
157 \r
158     }\r
159 \r
160 \r
161     /**\r
162      * rsToJson - Converting RS to JSON object\r
163      *\r
164      * @param out ServletOutputStream, rs as ResultSet\r
165      * @throws IOException, SQLException\r
166      */\r
167     public void rsToCSV(ResultSet rs, ServletOutputStream out) throws IOException, SQLException {\r
168         String header = "FEEDNAME,FEEDID,FILES_PUBLISHED,PUBLISH_LENGTH, FILES_DELIVERED, "\r
169             + "DELIVERED_LENGTH, SUBSCRIBER_URL, SUBID, PUBLISH_TIME,DELIVERY_TIME, AverageDelay\n";\r
170         out.write(header.getBytes());\r
171 \r
172         while (rs.next()) {\r
173             String line = rs.getString("FEEDNAME")\r
174                 + ","\r
175                 + rs.getString(FEEDID)\r
176                 + ","\r
177                 + rs.getString("FILES_PUBLISHED")\r
178                 + ","\r
179                 + rs.getString("PUBLISH_LENGTH")\r
180                 + ","\r
181                 + rs.getString("FILES_DELIVERED")\r
182                 + ","\r
183                 + rs.getString("DELIVERED_LENGTH")\r
184                 + ","\r
185                 + rs.getString("SUBSCRIBER_URL")\r
186                 + ","\r
187                 + rs.getString("SUBID")\r
188                 + ","\r
189                 + rs.getString("PUBLISH_TIME")\r
190                 + ","\r
191                 + rs.getString("DELIVERY_TIME")\r
192                 + ","\r
193                 + rs.getString("AverageDelay")\r
194                 + ","\r
195                 + "\n";\r
196             out.write(line.getBytes());\r
197             out.flush();\r
198         }\r
199     }\r
200 \r
201     /**\r
202      * rsToJson - Converting RS to JSON object\r
203      *\r
204      * @param out ServletOutputStream, rs as ResultSet\r
205      * @throws IOException, SQLException\r
206      */\r
207     private void rsToJson(ResultSet rs, ServletOutputStream out) throws IOException, SQLException {\r
208         String[] fields = {"FEEDNAME", FEEDID, "FILES_PUBLISHED", "PUBLISH_LENGTH", "FILES_DELIVERED",\r
209             "DELIVERED_LENGTH", "SUBSCRIBER_URL", "SUBID", "PUBLISH_TIME", "DELIVERY_TIME",\r
210             "AverageDelay"};\r
211         StringBuilder line = new StringBuilder();\r
212         line.append("[\n");\r
213         while (rs.next()) {\r
214             LOGJSONObject j2 = new LOGJSONObject();\r
215             for (String key : fields) {\r
216                 Object v = rs.getString(key);\r
217                 if (v != null) {\r
218                     j2.put(key.toLowerCase(), v);\r
219                 } else {\r
220                     j2.put(key.toLowerCase(), "");\r
221                 }\r
222             }\r
223             line.append(j2.toString());\r
224             line.append(",\n");\r
225         }\r
226         line.append("]");\r
227         out.print(line.toString());\r
228     }\r
229 \r
230     /**\r
231      * getFeedIdsByGroupId - Getting FEEDID's by GROUP ID.\r
232      *\r
233      * @throws SQLException Query SQLException.\r
234      */\r
235     private StringBuilder getFeedIdsByGroupId(int groupIds) throws SQLException {\r
236         DB db = null;\r
237         Connection conn = null;\r
238         ResultSet resultSet = null;\r
239         String sqlGoupid = null;\r
240         StringBuilder feedIds = new StringBuilder();\r
241         try {\r
242             db = new DB();\r
243             conn = db.getConnection();\r
244             sqlGoupid = " SELECT FEEDID from FEEDS  WHERE GROUPID = ?";\r
245             try (PreparedStatement prepareStatement = conn.prepareStatement(sqlGoupid)) {\r
246                 prepareStatement.setInt(1, groupIds);\r
247                 resultSet = prepareStatement.executeQuery();\r
248                 while (resultSet.next()) {\r
249                     feedIds.append(resultSet.getInt(FEEDID));\r
250                     feedIds.append(",");\r
251                 }\r
252                 feedIds.deleteCharAt(feedIds.length() - 1);\r
253                 eventlogger.info("PROV0177 StatisticsServlet.getFeedIdsByGroupId: feedIds = " + feedIds.toString());\r
254             }\r
255         } catch (SQLException e) {\r
256             eventlogger.error("PROV0175 StatisticsServlet.getFeedIdsByGroupId: " + e.getMessage(), e);\r
257         } finally {\r
258             try {\r
259                 if (resultSet != null) {\r
260                     resultSet.close();\r
261                 }\r
262                 if (conn != null) {\r
263                     db.release(conn);\r
264                 }\r
265             } catch (Exception e) {\r
266                 eventlogger.error("PROV0176 StatisticsServlet.getFeedIdsByGroupId: " + e.getMessage(), e);\r
267             }\r
268         }\r
269         return feedIds;\r
270     }\r
271 \r
272 \r
273     /**\r
274      * queryGeneretor - Generating sql query\r
275      *\r
276      * @param map as key value pare of all user input fields\r
277      */\r
278     private String queryGeneretor(Map<String, String> map) throws ParseException {\r
279 \r
280         String sql;\r
281         String eventType = null;\r
282         String feedids = null;\r
283         String startTime = null;\r
284         String endTime = null;\r
285         String subid = " ";\r
286         if (map.get(EVENT_TYPE) != null) {\r
287             eventType =  map.get(EVENT_TYPE);\r
288         }\r
289         if (map.get(FEEDIDS) != null) {\r
290             feedids = map.get(FEEDIDS);\r
291         }\r
292         if (map.get(START_TIME) != null) {\r
293             startTime = map.get(START_TIME);\r
294         }\r
295         if (map.get(END_TIME) != null) {\r
296             endTime =  map.get(END_TIME);\r
297         }\r
298         if ("all".equalsIgnoreCase(eventType)) {\r
299             eventType = "PUB','DEL, EXP, PBF";\r
300         }\r
301         if (map.get(SUBID) != null) {\r
302             subid = map.get(SUBID);\r
303         }\r
304 \r
305         eventlogger.info("Generating sql query to get Statistics resultset. ");\r
306 \r
307         if (endTime == null && startTime == null) {\r
308 \r
309             sql = "SELECT (SELECT NAME FROM FEEDS AS f WHERE f.FEEDID in(" + feedids\r
310                 + ") and f.FEEDID=e.FEEDID) AS FEEDNAME, e.FEEDID as FEEDID, (SELECT COUNT(*) FROM LOG_RECORDS AS c WHERE c.FEEDID in("\r
311                 + feedids\r
312                 + ") 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
313                 + feedids\r
314                 + ")  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
315                 + feedids + ") " + subid + " AND m.STATUS=204 AND e.RESULT=204  group by SUBID";\r
316 \r
317             return sql;\r
318         } else if (startTime != null && endTime == null) {\r
319 \r
320             long inputTimeInMilli = 60000 * Long.parseLong(startTime);\r
321             Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("GMT"));\r
322             long currentTimeInMilli = cal.getTimeInMillis();\r
323             long compareTime = currentTimeInMilli - inputTimeInMilli;\r
324 \r
325             sql = "SELECT (SELECT NAME FROM FEEDS AS f WHERE f.FEEDID in(" + feedids\r
326                 + ") and f.FEEDID=e.FEEDID) AS FEEDNAME, e.FEEDID as FEEDID, (SELECT COUNT(*) FROM LOG_RECORDS AS c WHERE c.FEEDID in("\r
327                 + feedids\r
328                 + ") 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
329                 + feedids\r
330                 + ")  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
331                 + feedids + ") " + subid + " AND m.STATUS=204 AND e.RESULT=204 and e.event_time>="\r
332                 + compareTime + " group by SUBID";\r
333 \r
334             return sql;\r
335 \r
336         } else {\r
337             SimpleDateFormat inFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");\r
338             Date startDate = inFormat.parse(startTime);\r
339             Date endDate = inFormat.parse(endTime);\r
340 \r
341             long startInMillis = startDate.getTime();\r
342             long endInMillis = endDate.getTime();\r
343 \r
344             sql = "SELECT (SELECT NAME FROM FEEDS AS f WHERE f.FEEDID in(" + feedids\r
345                 + ") and f.FEEDID=e.FEEDID) AS FEEDNAME, e.FEEDID as FEEDID, (SELECT COUNT(*) FROM LOG_RECORDS AS c WHERE c.FEEDID in("\r
346                 + feedids\r
347                 + ") 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
348                 + feedids\r
349                 + ")  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
350                 + feedids + ") " + subid + " AND m.STATUS=204 AND e.RESULT=204 and e.event_time between " + startInMillis\r
351                 + " and " + endInMillis + " group by SUBID";\r
352 \r
353 \r
354             return sql;\r
355         }\r
356     }\r
357 \r
358 \r
359     /**\r
360      * PUT a Statistics URL -- not supported.\r
361      */\r
362     @Override\r
363     public void doPut(HttpServletRequest req, HttpServletResponse resp) {\r
364         String message = "PUT not allowed for the StatisticsURL.";\r
365         EventLogRecord elr = new EventLogRecord(req);\r
366         elr.setMessage(message);\r
367         elr.setResult(HttpServletResponse.SC_METHOD_NOT_ALLOWED);\r
368         eventlogger.error(elr.toString());\r
369         sendResponseError(resp, HttpServletResponse.SC_METHOD_NOT_ALLOWED, message, eventlogger);\r
370     }\r
371 \r
372     /**\r
373      * POST a Statistics URL -- not supported.\r
374      */\r
375     @Override\r
376     public void doPost(HttpServletRequest req, HttpServletResponse resp) {\r
377         String message = "POST not allowed for the StatisticsURL.";\r
378         EventLogRecord elr = new EventLogRecord(req);\r
379         elr.setMessage(message);\r
380         elr.setResult(HttpServletResponse.SC_METHOD_NOT_ALLOWED);\r
381         eventlogger.error(elr.toString());\r
382         sendResponseError(resp, HttpServletResponse.SC_METHOD_NOT_ALLOWED, message, eventlogger);\r
383     }\r
384 \r
385     private Map<String, String> buildMapFromRequest(HttpServletRequest req) {\r
386         Map<String, String> map = new HashMap<>();\r
387         String s = req.getParameter("type");\r
388         if (s != null) {\r
389             if ("pub".equals(s) || "del".equals(s) || "exp".equals(s)) {\r
390                 map.put("type", s);\r
391             } else {\r
392                 map.put("err", "bad type");\r
393                 return map;\r
394             }\r
395         } else {\r
396             map.put("type", "all");\r
397         }\r
398         map.put("publishSQL", "");\r
399         map.put("statusSQL", "");\r
400         map.put("resultSQL", "");\r
401         map.put(REASON_SQL, "");\r
402 \r
403         s = req.getParameter("publishId");\r
404         if (s != null) {\r
405             if (s.indexOf("'") >= 0) {\r
406                 map.put("err", "bad publishId");\r
407                 return map;\r
408             }\r
409             map.put("publishSQL", " AND PUBLISH_ID = '" + s + "'");\r
410         }\r
411 \r
412         s = req.getParameter("statusCode");\r
413         if (s != null) {\r
414             String sql = null;\r
415             switch (s) {\r
416                 case "success":\r
417                     sql = " AND STATUS >= 200 AND STATUS < 300";\r
418                     break;\r
419                 case "redirect":\r
420                     sql = " AND STATUS >= 300 AND STATUS < 400";\r
421                     break;\r
422                 case "failure":\r
423                     sql = " AND STATUS >= 400";\r
424                     break;\r
425                 default:\r
426                     try {\r
427                         int n = Integer.parseInt(s);\r
428                         if ((n >= 100 && n < 600) || (n == -1)) {\r
429                             sql = " AND STATUS = " + n;\r
430                         }\r
431                     } catch (NumberFormatException e) {\r
432                         eventlogger.error("Failed to parse input", e);\r
433                     }\r
434                     break;\r
435             }\r
436             if (sql == null) {\r
437                 map.put("err", "bad statusCode");\r
438                 return map;\r
439             }\r
440             map.put("statusSQL", sql);\r
441             map.put("resultSQL", sql.replaceAll("STATUS", "RESULT"));\r
442         }\r
443 \r
444         s = req.getParameter("expiryReason");\r
445         if (s != null) {\r
446             map.put("type", "exp");\r
447             switch (s) {\r
448                 case "notRetryable":\r
449                     map.put(REASON_SQL, " AND REASON = 'notRetryable'");\r
450                     break;\r
451                 case "retriesExhausted":\r
452                     map.put(REASON_SQL, " AND REASON = 'retriesExhausted'");\r
453                     break;\r
454                 case "diskFull":\r
455                     map.put(REASON_SQL, " AND REASON = 'diskFull'");\r
456                     break;\r
457                 case "other":\r
458                     map.put(REASON_SQL, " AND REASON = 'other'");\r
459                     break;\r
460                 default:\r
461                     map.put("err", "bad expiryReason");\r
462                     return map;\r
463             }\r
464         }\r
465 \r
466         long stime = getTimeFromParam(req.getParameter("start"));\r
467         if (stime < 0) {\r
468             map.put("err", "bad start");\r
469             return map;\r
470         }\r
471         long etime = getTimeFromParam(req.getParameter("end"));\r
472         if (etime < 0) {\r
473             map.put("err", "bad end");\r
474             return map;\r
475         }\r
476         if (stime == 0 && etime == 0) {\r
477             etime = System.currentTimeMillis();\r
478             stime = etime - TWENTYFOUR_HOURS;\r
479         } else if (stime == 0) {\r
480             stime = etime - TWENTYFOUR_HOURS;\r
481         } else if (etime == 0) {\r
482             etime = stime + TWENTYFOUR_HOURS;\r
483         }\r
484         map.put("timeSQL", String.format(" AND EVENT_TIME >= %d AND EVENT_TIME <= %d", stime, etime));\r
485         return map;\r
486     }\r
487 \r
488     private long getTimeFromParam(final String s) {\r
489         if (s == null) {\r
490             return 0;\r
491         }\r
492         try {\r
493             // First, look for an RFC 3339 date\r
494             String fmt = (s.indexOf('.') > 0) ? FMT2 : FMT1;\r
495             SimpleDateFormat sdf = new SimpleDateFormat(fmt);\r
496             Date d = sdf.parse(s);\r
497             return d.getTime();\r
498         } catch (ParseException e) {\r
499             intlogger.error("Exception in getting Time :- " + e.getMessage(), e);\r
500         }\r
501         try {\r
502             // Also allow a long (in ms); useful for testing\r
503             return Long.parseLong(s);\r
504         } catch (NumberFormatException e) {\r
505             intlogger.error("Exception in getting Time :- " + e.getMessage(), e);\r
506         }\r
507         intlogger.info("Error parsing time=" + s);\r
508         return -1;\r
509     }\r
510 \r
511     private void getRecordsForSQL(Map<String, String> map, String outputType, ServletOutputStream out, HttpServletResponse resp) {\r
512         try {\r
513             String filterQuery = this.queryGeneretor(map);\r
514             eventlogger.debug("SQL Query for Statistics resultset. " + filterQuery);\r
515             intlogger.debug(filterQuery);\r
516             long start = System.currentTimeMillis();\r
517             DB db = new DB();\r
518             try (Connection conn = db.getConnection()) {\r
519                 try (ResultSet rs = conn.prepareStatement(filterQuery).executeQuery()) {\r
520                     if ("csv".equals(outputType)) {\r
521                         resp.setContentType("application/octet-stream");\r
522                         Date date = new Date();\r
523                         SimpleDateFormat dateFormat = new SimpleDateFormat("dd-MM-YYYY HH:mm:ss");\r
524                         resp.setHeader("Content-Disposition",\r
525                             "attachment; filename=\"result:" + dateFormat.format(date) + ".csv\"");\r
526                         eventlogger.info("Generating CSV file from Statistics resultset");\r
527                         rsToCSV(rs, out);\r
528                     } else {\r
529                         eventlogger.info("Generating JSON for Statistics resultset");\r
530                         this.rsToJson(rs, out);\r
531                     }\r
532                 }\r
533                 db.release(conn);\r
534             } catch (SQLException e) {\r
535                 eventlogger.error("SQLException:" + e);\r
536             }\r
537             intlogger.debug("Time: " + (System.currentTimeMillis() - start) + " ms");\r
538         } catch (IOException e) {\r
539             eventlogger.error("IOException - Generating JSON/CSV:" + e);\r
540         } catch (JSONException e) {\r
541             eventlogger.error("JSONException - executing SQL query:" + e);\r
542         } catch (ParseException e) {\r
543             eventlogger.error("ParseException - executing SQL query:" + e);\r
544         }\r
545     }\r
546 }\r
547 \r