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