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