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