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