View Javadoc
1   /*
2    * To change this license header, choose License Headers in Project Properties.
3    * To change this template file, choose Tools | Templates
4    * and open the template in the editor.
5    */
6   package org.miloss.fgsms.services.rs.impl;
7   
8   import java.io.File;
9   import java.io.FileOutputStream;
10  import java.io.OutputStreamWriter;
11  import java.sql.Connection;
12  import java.sql.PreparedStatement;
13  import java.sql.ResultSet;
14  import java.util.ArrayList;
15  import java.util.Calendar;
16  import java.util.Date;
17  import java.util.GregorianCalendar;
18  import java.util.List;
19  import java.util.UUID;
20  import javax.servlet.http.HttpServletRequest;
21  import javax.xml.ws.WebServiceContext;
22  import javax.xml.ws.handler.MessageContext;
23  import org.apache.log4j.Level;
24  import org.miloss.fgsms.common.Constants;
25  import org.miloss.fgsms.common.DBUtils;
26  import org.miloss.fgsms.common.UserIdentityUtil;
27  import org.miloss.fgsms.common.Utility;
28  import org.miloss.fgsms.services.interfaces.common.PolicyType;
29  import org.miloss.fgsms.services.interfaces.common.SecurityWrapper;
30  import org.miloss.fgsms.services.interfaces.faults.ServiceUnavailableFaultCodes;
31  import org.miloss.fgsms.services.interfaces.reportingservice.ExportCSVDataRequestMsg;
32  import org.miloss.fgsms.services.interfaces.reportingservice.ExportDataToCSVResponseMsg;
33  import org.miloss.fgsms.services.interfaces.reportingservice.ExportRecordsEnum;
34  import org.miloss.fgsms.services.interfaces.reportingservice.ServiceUnavailableException;
35  import static org.miloss.fgsms.services.rs.impl.Reporting.delimiter;
36  import static org.miloss.fgsms.services.rs.impl.Reporting.getFilePathDelimitor;
37  import static org.miloss.fgsms.services.rs.impl.Reporting.isPolicyTypeOf;
38  import static org.miloss.fgsms.services.rs.impl.Reporting.log;
39  import static org.miloss.fgsms.services.rs.impl.Reporting.name;
40  import static org.miloss.fgsms.services.rs.impl.Reporting.toSafeFileName;
41  
42  /**
43   *
44   * @author AO
45   */
46  public class CsvExporter {
47  
48      static ExportDataToCSVResponseMsg exportDataToCSV(WebServiceContext ctx, String currentUser, SecurityWrapper classlevel, ExportCSVDataRequestMsg request) throws ServiceUnavailableException {
49          ExportDataToCSVResponseMsg res = new ExportDataToCSVResponseMsg();
50          res.setClassification(classlevel);
51  
52          String path = "";
53  
54          String currentFolder = "";
55          File targetfolder = null;
56          UUID id = UUID.randomUUID();
57          try {
58              currentFolder = System.getProperty("jboss.server.temp.dir");
59              if (currentFolder == null || currentFolder.equals("") || currentFolder.equalsIgnoreCase("null")) {
60                  currentFolder = System.getProperty("java.io.tmpdir");
61              }
62  
63              path = currentFolder + getFilePathDelimitor() + id.toString();
64              targetfolder = new File(path);
65              boolean mkdir = targetfolder.mkdir();
66              if (!mkdir) {
67                  HttpServletRequest session = ((HttpServletRequest) ctx.getMessageContext().get(MessageContext.SERVLET_REQUEST));
68  
69                  targetfolder = (File) session.getAttribute("javax.servlet.context.tmpdir");
70  
71              }
72  
73              if (!targetfolder.exists()) {
74                  log.log(Level.INFO, name + "exportDataToHTML, unable to create temporary directory " + currentFolder + targetfolder.getAbsolutePath());
75                  ServiceUnavailableException f = new ServiceUnavailableException("", null);
76                  f.getFaultInfo().setCode(ServiceUnavailableFaultCodes.MISCONFIGURATION);
77                  throw f;
78              }
79  
80          } catch (Exception e) {
81              log.log(Level.INFO, name + "exportDataToHTML, load props" + e);
82              ServiceUnavailableException f = new ServiceUnavailableException("", null);
83              f.getFaultInfo().setCode(ServiceUnavailableFaultCodes.MISCONFIGURATION);
84              throw f;
85          }
86          List<String> files = new ArrayList<String>();
87  
88          generateCSVReport(request, path, files, currentUser, ctx, classlevel);
89  
90          res.setZipFile(Reporting.generateZipFileandDelete(files, path));
91          return res;
92      }
93  
94      /**
95       * if all services is true and not a global admin user returns a list of all
96       * services that the current user has at least AUDIT access if all services
97       * is true and is a global admin user, all service urls are returned
98       *
99       * else, only the list of services from which the user has AUDIT access is
100      * returned
101      *
102      * @param allServices
103      * @param requestedurls
104      * @param currentUser
105      * @param sec
106      * @return
107      */
108     private static List<String> urlListAudit(boolean allServices, List<String> requestedurls, String currentUser, SecurityWrapper sec, WebServiceContext ctx) {
109         List<String> urls = new ArrayList<String>();
110         if (allServices) {
111             Connection con = Utility.getConfigurationDBConnection();
112             PreparedStatement cmd = null;
113             ResultSet rs = null;
114             try {
115                 if (UserIdentityUtil.hasGlobalAdministratorRole(currentUser, "GenerateReports", (sec), ctx)) {
116                     cmd = con.prepareStatement("select URI from servicepolicies;");
117                 } else if (UserIdentityUtil.hasGlobalAuditRole(currentUser, "GenerateReports", (sec), ctx)) {
118                     cmd = con.prepareStatement("select URI from servicepolicies;");
119                 } else {
120                     cmd = con.prepareStatement("select ObjectURI as URI from UserPermissions "
121                             + "where username=? and "
122                             + "AdministerObject=1 or AuditObject=1;");
123                     cmd.setString(1, currentUser);
124                 }
125                 rs = cmd.executeQuery();
126                 while (rs.next()) {
127                     urls.add(rs.getString("URI"));
128                 }
129 
130             } catch (Exception ex) {
131                 log.log(Level.INFO, name + "GenerateReports", ex);
132             } finally {
133                 DBUtils.safeClose(rs);
134                 DBUtils.safeClose(cmd);
135                 DBUtils.safeClose(con);
136             }
137         } else {
138 
139             if (requestedurls != null
140                     && requestedurls.size() > 0) {
141                 for (int i = 0; i < requestedurls.size(); i++) {
142                     urls.add(requestedurls.get(i));
143                     UserIdentityUtil.assertReadAccess(urls.get(i), currentUser, "urlListAudit", sec, ctx);
144                 }
145             }
146         }
147         return urls;
148     }
149 
150     protected static void generateCSVReport(ExportCSVDataRequestMsg request, String filenameandpath, List<String> filelist, String currentuser, WebServiceContext ctx, SecurityWrapper security) {
151 
152         if (request == null) {
153             throw new IllegalArgumentException("request");
154         }
155         if (request.getExportType() == null) {
156             throw new IllegalArgumentException("report type");
157         }
158         validateCSVRequest(request);
159 
160         if (request.getExportType().value().equalsIgnoreCase(ExportRecordsEnum.AUDIT_LOGS.value())) {
161             UserIdentityUtil.assertGlobalAuditRole(currentuser, "GenerateCSVReport", request.getClassification(), ctx);
162             generateAuditCSVReport(request, filenameandpath, filelist, currentuser, security);
163             return;
164         }
165         if (request.getExportType().value().equalsIgnoreCase(ExportRecordsEnum.ALL.value())
166                 && UserIdentityUtil.hasGlobalAuditRole(currentuser, "GenerateCSVReport", security, ctx)) {
167             generateAuditCSVReport(request, filenameandpath, filelist, currentuser, security);
168         }
169 
170         List<String> urlstoprocess = urlListAudit(request.isAllServices(), request.getURLs(), currentuser, request.getClassification(), ctx);
171 
172         for (int i = 0; i < urlstoprocess.size(); i++) {
173 
174             switch (request.getExportType()) {
175                 case ALL:
176                     generateAvailabilityCSVReport(request, filenameandpath, filelist, currentuser, urlstoprocess.get(i), security);
177                     generateStatisticsCSVReport(request, filenameandpath, filelist, currentuser, urlstoprocess.get(i), security);
178                     generateTransactionsCSVReport(request, filenameandpath, filelist, currentuser, urlstoprocess.get(i), security);
179                     generateMachineCSVReport(request, filenameandpath, filelist, currentuser, urlstoprocess.get(i), security);
180                     generateProcessCSVReport(request, filenameandpath, filelist, currentuser, urlstoprocess.get(i), security);
181                     break;
182                 case AVAILABILITY:
183                     generateAvailabilityCSVReport(request, filenameandpath, filelist, currentuser, urlstoprocess.get(i), security);
184                     break;
185                 case STATISTICS:
186                     generateStatisticsCSVReport(request, filenameandpath, filelist, currentuser, urlstoprocess.get(i), security);
187                     break;
188                 case TRANSACTIONS:
189                     generateTransactionsCSVReport(request, filenameandpath, filelist, currentuser, urlstoprocess.get(i), security);
190                     break;
191                 case MACHINE:
192                     generateMachineCSVReport(request, filenameandpath, filelist, currentuser, urlstoprocess.get(i), security);
193                     break;
194                 case PROCESS:
195                     generateProcessCSVReport(request, filenameandpath, filelist, currentuser, urlstoprocess.get(i), security);
196                     break;
197                 default:
198                     throw new IllegalArgumentException();
199             }
200 
201         }
202 
203     }
204 
205     private static void generateTransactionsCSVReport(ExportCSVDataRequestMsg request, String filenameandpath, List<String> filelist, String currentuser, String url, SecurityWrapper security) {
206         if (!Reporting.isPolicyTypeOf(url, PolicyType.TRANSACTIONAL)) {
207             return;
208         }
209         StringBuilder data = new StringBuilder();
210         Connection con = Utility.getPerformanceDBConnection();
211         PreparedStatement com = null;
212         ResultSet rs = null;
213         OutputStreamWriter out = null;
214         try {
215             out = new OutputStreamWriter(
216                     new FileOutputStream(filenameandpath + getFilePathDelimitor() + "TransactionExport-" + toSafeFileName(url) + ".csv"),
217                     Constants.CHARSET
218             );
219 
220             filelist.add(filenameandpath + getFilePathDelimitor() + "TransactionExport-" + Reporting.toSafeFileName(url) + ".csv");
221             data = data.append("%CLASSIFICATION% Generated at %DATETIME_NOW% for %DATETIME_FROM% until %DATETIME_TO% ").append(System.getProperty("line.separator"));
222             data = data.append(url).append(System.getProperty("line.separator"));
223             data = data.append("URI").append(delimiter).append("Response Time (ms)").append(delimiter).append("Recorded at (DCS Host)").append(delimiter).append("Service Hostname").append(delimiter).append("Consumer").append(delimiter).append("Transaction Id").append(delimiter).append("Action").append(delimiter).append("Response size (bytes)").append(delimiter).append("Request size (bytes)").append(delimiter).append("Timestamp (ms since epoch)").append(delimiter).append("Success").append(delimiter).append("SLA Fault").append(delimiter).append("Agent type").append(delimiter).append("Original Request Url").append(delimiter).append("memo/notes from the agent").append(delimiter).append("Related Transaction ID").append(delimiter).append("Thread Id").append(delimiter).append("Request Headers").append(delimiter).append("Response Headers").append(delimiter).append("Request").append(delimiter).append("Response").append(System.getProperty("line.separator"));
224 
225             Calendar time = Calendar.getInstance();
226             String t = data.toString();
227             String[] ampm = new String[]{"AM", "PM"};
228             t = t.replaceAll("%DATETIME_NOW%",
229                     new Date().toString());
230 
231             time = request.getRange().getStart();
232             t = t.replaceAll("%DATETIME_FROM%",
233                     time.getTime().toString());
234             time = request.getRange().getEnd();
235             t = t.replaceAll("%DATETIME_TO%",
236                     time.getTime().toString());
237 
238             if (request.getClassification() == null) {
239                 request.setClassification(security);
240             }
241             t = t.replaceAll("%CLASSIFICATION%", (Utility.ICMClassificationToString(request.getClassification().getClassification()) + " Caveat: " + request.getClassification().getCaveats()));
242 
243             out.write(t, 0, t.length());
244 
245             com = con.prepareStatement(
246                     "select * from rawdata  "
247                     + "where uri=? and utcdatetime > ? and utcdatetime < ? order by utcdatetime desc ;");
248             com.setString(1, url);
249             com.setLong(2, request.getRange().getStart().getTimeInMillis());
250             com.setLong(3, request.getRange().getEnd().getTimeInMillis());
251 
252             rs = com.executeQuery();
253             while (rs.next()) {
254                 data = new StringBuilder();
255                 data = data.append(rs.getString("uri")).append(delimiter).append(rs.getLong("responsetimems")).append(delimiter).append(rs.getString("monitorsource")).append(delimiter).append(rs.getString("hostingsource")).append(delimiter).append(rs.getString("consumeridentity")).append(delimiter).append(rs.getString("transactionid")).append(delimiter).append(rs.getString("soapaction")).append(delimiter).append(rs.getLong("responsesize")).append(delimiter).append(rs.getLong("requestsize")).append(delimiter).append(rs.getLong("utcdatetime")).append(delimiter);
256                 data = data.append(rs.getBoolean("success")).append(delimiter);
257                 String sla = rs.getString("slafault");
258                 if (Utility.stringIsNullOrEmpty(sla)) {
259                     data = data.append("false").append(delimiter);
260                 } else {
261                     data = data.append("true").append(delimiter);
262                 }
263                 data = data.append(rs.getString("agenttype")).append(delimiter).append(rs.getString("originalurl")).append(delimiter);
264 
265                 byte[] msg = rs.getBytes("message");
266                 if (msg != null && msg.length > 0) {
267                     data = data.append(new String(msg, Constants.CHARSET)).append(delimiter);
268                 } else {
269                     data = data.append(delimiter);
270                 }
271                 data = data.append(rs.getString("relatedtransactionid")).append(delimiter).append(rs.getString("threadid")).append(delimiter);
272 
273                 msg = rs.getBytes("requestheaders");
274                 if (msg != null && msg.length > 0) {
275                     data = data.append(Utility.DE(new String(msg, Constants.CHARSET)).replace('|', ' ')).append(delimiter);
276                 } else {
277                     data = data.append(delimiter);
278                 }
279                 msg = rs.getBytes("responseheaders");
280                 if (msg != null && msg.length > 0) {
281                     data = data.append(Utility.DE(new String(msg, Constants.CHARSET)).replace('|', ' ')).append(delimiter);
282                 } else {
283                     data = data.append(delimiter);
284                 }
285                 msg = rs.getBytes("requestxml");
286                 if (msg != null && msg.length > 0) {
287                     data = data.append(Utility.DE(new String(msg, Constants.CHARSET))).append(delimiter);
288                 } else {
289                     data = data.append(delimiter);
290                 }
291 
292                 msg = rs.getBytes("responsexml");
293                 if (msg != null && msg.length > 0) {
294                     data = data.append(Utility.DE(new String(msg, Constants.CHARSET))).append(delimiter);
295                 } else {
296                     data = data.append(delimiter);
297                 }
298                 data = data.append(System.getProperty("line.separator"));
299                 t = data.toString();
300                 out.write(t, 0, t.length());
301 
302             }
303 
304         } catch (Exception ex) {
305             log.log(Level.ERROR, "", ex);
306         } finally {
307             DBUtils.safeClose(rs);
308             DBUtils.safeClose(com);
309             DBUtils.safeClose(con);
310             if (out != null) {
311                 try {
312                     out.close();
313                 } catch (Exception ex) {
314                 }
315             }
316         }
317 
318     }
319 
320     private static void generateStatisticsCSVReport(ExportCSVDataRequestMsg request, String filenameandpath, List<String> filelist, String currentuser, String url, SecurityWrapper security) {
321         if (!Reporting.isPolicyTypeOf(url, PolicyType.STATISTICAL)) {
322             return;
323         }
324         StringBuilder data = new StringBuilder();
325         Connection con = Utility.getPerformanceDBConnection();
326         PreparedStatement com = null;
327         OutputStreamWriter out = null;
328         ResultSet rs = null;
329         try {
330 
331             filelist.add(filenameandpath + getFilePathDelimitor() + "StatisticsExport-" + Reporting.toSafeFileName(url) + ".csv");
332 
333             out = new OutputStreamWriter(
334                     new FileOutputStream(filenameandpath + getFilePathDelimitor() + "StatisticsExport-" + toSafeFileName(url) + ".csv"),
335                     Constants.CHARSET
336             );
337 
338             data = data.append("%CLASSIFICATION% Generated at %DATETIME_NOW% for %DATETIME_FROM% until %DATETIME_TO% ").append(System.getProperty("line.separator"));
339             data = data.append(url).append(System.getProperty("line.separator"));
340             data = data.append("Host").append(delimiter).append("Timestamp (ms since epoch)").append(delimiter).append("Name").append(delimiter).append("Consumer Count").append(delimiter).append("Active Consumer Count").append(delimiter).append("Type").append(delimiter).append("Agent Type").append(delimiter).append("Messages Sent").append(delimiter).append("Messages Recieved").append(delimiter).append("Messages Dropped").append(delimiter).append("Bytes Sent").append(delimiter).append("Bytes Recieved").append(delimiter).append("Bytes Dropped").append(delimiter).append("Queue Depth").append(delimiter).append("Canonical Name").append(delimiter).append(System.getProperty("line.separator"));
341 
342             Calendar time = Calendar.getInstance();
343 
344             String[] ampm = new String[]{"AM", "PM"};
345             String t = data.toString();
346             t = t.replaceAll("%DATETIME_NOW%",
347                     time.get(Calendar.YEAR) + "/"
348                     + (time.get(Calendar.MONTH) + 1) + "/"
349                     + time.get(Calendar.DATE) + " at "
350                     + time.get(Calendar.HOUR) + ":"
351                     + time.get(Calendar.MINUTE) + ":"
352                     + time.get(Calendar.SECOND) + " "
353                     + ampm[time.get(Calendar.AM_PM)]);
354             time = request.getRange().getStart();
355             t = t.replaceAll("%DATETIME_FROM%",
356                     time.get(Calendar.YEAR) + "/"
357                     + (time.get(Calendar.MONTH) + 1) + "/"
358                     + time.get(Calendar.DATE) + " "
359                     + time.get(Calendar.HOUR) + ":"
360                     + time.get(Calendar.MINUTE) + ":"
361                     + time.get(Calendar.SECOND) + " "
362                     + ampm[time.get(Calendar.AM_PM)]);
363             time = request.getRange().getEnd();
364             t = t.replaceAll("%DATETIME_TO%",
365                     time.get(Calendar.YEAR) + "/"
366                     + (time.get(Calendar.MONTH) + 1) + "/"
367                     + time.get(Calendar.DATE) + " "
368                     + time.get(Calendar.HOUR) + ":"
369                     + time.get(Calendar.MINUTE) + ":"
370                     + time.get(Calendar.SECOND) + " "
371                     + ampm[time.get(Calendar.AM_PM)]);
372 
373             if (request.getClassification() == null) {
374                 request.setClassification(security);
375             }
376             t = t.replaceAll("%CLASSIFICATION%", (Utility.ICMClassificationToString(request.getClassification().getClassification()) + " Caveat: " + request.getClassification().getCaveats()));
377 
378             data = new StringBuilder(t);
379 
380             data = data.append(System.getProperty("line.separator"));
381             t = data.toString();
382             out.write(t, 0, t.length());
383 
384             com = con.prepareStatement(
385                     "select * from brokerhistory "
386                     + "where host=? and utcdatetime > ? and utcdatetime < ? order by utcdatetime desc ;");
387             com.setString(1, url);
388             com.setLong(2, request.getRange().getStart().getTimeInMillis());
389             com.setLong(3, request.getRange().getEnd().getTimeInMillis());
390 
391             rs = com.executeQuery();
392             while (rs.next()) {
393                 data = new StringBuilder();
394                 data.append(rs.getString("host"));
395                 data.append(delimiter);
396                 data.append(rs.getLong("utcdatetime"));
397                 data.append(delimiter);
398                 data.append(rs.getString("namecol"));
399                 data.append(delimiter);
400                 data.append(rs.getLong("consumercount"));
401                 data.append(delimiter);
402                 data.append(rs.getLong("activeconsumercount"));
403                 data.append(delimiter);
404                 data.append(rs.getString("typecol"));
405                 data.append(delimiter);
406                 data.append(rs.getString("agenttype"));
407                 data.append(delimiter);
408                 data.append(rs.getLong("messagecount"));
409                 data.append(delimiter);
410                 data.append(rs.getLong("recievedmessagecount"));
411                 data.append(delimiter);
412                 data.append(rs.getLong("messagedropcount"));
413                 data.append(delimiter);
414                 data.append(rs.getLong("bytesout"));
415                 data.append(delimiter);
416                 data.append(rs.getLong("bytesin"));
417                 data.append(delimiter);
418                 data.append(rs.getLong("bytesdropcount"));
419                 data.append(delimiter);
420                 data.append(rs.getLong("queuedepth"));
421                 data.append(delimiter);
422                 data.append(rs.getString("canonicalname"));
423                 data.append(delimiter);
424                 data.append(System.getProperty("line.separator"));
425                 t = data.toString();
426                 out.write(t, 0, t.length());
427 
428             }
429 
430         } catch (Exception ex) {
431             log.log(Level.ERROR, "", ex);
432         } finally {
433             DBUtils.safeClose(rs);
434             DBUtils.safeClose(com);
435             DBUtils.safeClose(con);
436             if (out != null) {
437                 try {
438                     out.close();
439                 } catch (Exception ex) {
440                 }
441             }
442         }
443 
444     }
445 
446     private static void generateAvailabilityCSVReport(ExportCSVDataRequestMsg request, String filenameandpath,
447             List<String> filelist, String currentuser, String url, SecurityWrapper security) {
448         StringBuilder data = new StringBuilder();
449         Connection con = Utility.getPerformanceDBConnection();
450         PreparedStatement com = null;
451         OutputStreamWriter out = null;
452         ResultSet rs = null;
453         try {
454             filelist.add(filenameandpath + getFilePathDelimitor() + "AvailabilityExport-" + Reporting.toSafeFileName(url) + ".csv");
455             out = new OutputStreamWriter(
456                     new FileOutputStream(filenameandpath + getFilePathDelimitor() + "AvailabilityExport-" + toSafeFileName(url) + ".csv"),
457                     Constants.CHARSET
458             );
459 
460             /*
461              * uri text, "utcdatetime" bigint, id text, message text, status
462              * boolean
463              */
464             data = data.append("%CLASSIFICATION% Generated at %DATETIME_NOW% for %DATETIME_FROM% until %DATETIME_TO% ").append(System.getProperty("line.separator"));
465             data = data.append(url).append(System.getProperty("line.separator"));
466             data = data.append("URI").append(delimiter).append("Timestamp (ms since epoch)").append(delimiter).append("Record Id").append(delimiter).append("Message").append(delimiter).append("Operational").append(System.getProperty("line.separator"));
467 
468             Calendar time = Calendar.getInstance();
469             String t = data.toString();
470             String[] ampm = new String[]{"AM", "PM"};
471             t = t.replaceAll("%DATETIME_NOW%",
472                     time.get(Calendar.YEAR) + "/"
473                     + (time.get(Calendar.MONTH) + 1) + "/"
474                     + time.get(Calendar.DATE) + " at "
475                     + time.get(Calendar.HOUR) + ":"
476                     + time.get(Calendar.MINUTE) + ":"
477                     + time.get(Calendar.SECOND) + " "
478                     + ampm[time.get(Calendar.AM_PM)]);
479             time = request.getRange().getStart();
480             t = t.replaceAll("%DATETIME_FROM%",
481                     time.get(Calendar.YEAR) + "/"
482                     + (time.get(Calendar.MONTH) + 1) + "/"
483                     + time.get(Calendar.DATE) + " "
484                     + time.get(Calendar.HOUR) + ":"
485                     + time.get(Calendar.MINUTE) + ":"
486                     + time.get(Calendar.SECOND) + " "
487                     + ampm[time.get(Calendar.AM_PM)]);
488             time = request.getRange().getEnd();
489             t = t.replaceAll("%DATETIME_TO%",
490                     time.get(Calendar.YEAR) + "/"
491                     + (time.get(Calendar.MONTH) + 1) + "/"
492                     + time.get(Calendar.DATE) + " "
493                     + time.get(Calendar.HOUR) + ":"
494                     + time.get(Calendar.MINUTE) + ":"
495                     + time.get(Calendar.SECOND) + " "
496                     + ampm[time.get(Calendar.AM_PM)]);
497 
498             if (request.getClassification() == null) {
499                 request.setClassification(security);
500             }
501             t = t.replaceAll("%CLASSIFICATION%", (Utility.ICMClassificationToString(request.getClassification().getClassification()) + " Caveat: " + request.getClassification().getCaveats()));
502 
503             t += System.getProperty("line.separator");
504             out.write(t, 0, t.length());
505 
506             com = con.prepareStatement(
507                     "select * from availability "
508                     + "where uri=? and utcdatetime  > ? and utcdatetime < ? order by utcdatetime desc ;");
509             com.setString(1, url);
510             com.setLong(2, request.getRange().getStart().getTimeInMillis());
511             com.setLong(3, request.getRange().getEnd().getTimeInMillis());
512 
513             /*
514              * uri text, "utcdatetime" bigint, id text, message text, status
515              * boolean
516              */
517             rs = com.executeQuery();
518             while (rs.next()) {
519                 data = new StringBuilder();
520                 data.append(rs.getString("uri"));
521                 data.append(delimiter);
522                 data.append(rs.getLong("utcdatetime"));
523                 data.append(delimiter);
524                 data.append(rs.getString("id"));
525                 data.append(delimiter);
526                 data.append(Reporting.stripCommas(rs.getString("message")));
527                 data.append(delimiter);
528                 data.append(rs.getBoolean("status"));
529                 data.append(System.getProperty("line.separator"));
530                 t = data.toString();
531                 out.write(t, 0, t.length());
532 
533             }
534         } catch (Exception ex) {
535             log.log(Level.ERROR, "", ex);
536         } finally {
537             DBUtils.safeClose(rs);
538             DBUtils.safeClose(com);
539             DBUtils.safeClose(con);
540             if (out != null) {
541                 try {
542                     out.close();
543                 } catch (Exception ex) {
544                 }
545             }
546         }
547 
548     }
549 
550     private static void generateAuditCSVReport(ExportCSVDataRequestMsg request,
551             String filenameandpath, List<String> filelist, String currentuser,
552             SecurityWrapper security) {
553         StringBuilder data = new StringBuilder();
554         Connection con = Utility.getConfigurationDBConnection();
555         OutputStreamWriter out = null;
556         PreparedStatement com = null;
557         ResultSet rs = null;
558         try {
559             // File f = new File(filenameandpath + getFilePathDelimitor() + "availability.csv");
560 
561             filelist.add(filenameandpath + getFilePathDelimitor() + "AuditExport.csv");
562             out = new OutputStreamWriter(
563                     new FileOutputStream(filenameandpath + getFilePathDelimitor() + "AuditExport.csv"),
564                     Constants.CHARSET
565             );
566 
567             /*
568              * "utcdatetime" bigint, username text, classname text, method text,
569              * memo bytea, classification text, ipaddress text
570              */
571             data = data.append("%CLASSIFICATION% Generated at %DATETIME_NOW% for %DATETIME_FROM% until %DATETIME_TO% ").append(System.getProperty("line.separator"));
572             data = data.append("fgsms Audit Logs").append(System.getProperty("line.separator"));
573             data = data.append("Timestamp (ms since epoch)").append(delimiter).append("Username").append(delimiter).append("Class").append(delimiter).append("Method").append(delimiter).append("Memo").append(delimiter).append("Classification").append(delimiter).append("IP Address").append(System.getProperty("line.separator"));
574 
575             Calendar time = Calendar.getInstance();
576             String t = data.toString();
577             String[] ampm = new String[]{"AM", "PM"};
578             t = t.replaceAll("%DATETIME_NOW%",
579                     time.get(Calendar.YEAR) + "/"
580                     + (time.get(Calendar.MONTH) + 1) + "/"
581                     + time.get(Calendar.DATE) + " at "
582                     + time.get(Calendar.HOUR) + ":"
583                     + time.get(Calendar.MINUTE) + ":"
584                     + time.get(Calendar.SECOND) + " "
585                     + ampm[time.get(Calendar.AM_PM)]);
586             time = request.getRange().getStart();
587             t = t.replaceAll("%DATETIME_FROM%",
588                     time.get(Calendar.YEAR) + "/"
589                     + (time.get(Calendar.MONTH) + 1) + "/"
590                     + time.get(Calendar.DATE) + " "
591                     + time.get(Calendar.HOUR) + ":"
592                     + time.get(Calendar.MINUTE) + ":"
593                     + time.get(Calendar.SECOND) + " "
594                     + ampm[time.get(Calendar.AM_PM)]);
595             time = request.getRange().getEnd();
596             t = t.replaceAll("%DATETIME_TO%",
597                     time.get(Calendar.YEAR) + "/"
598                     + (time.get(Calendar.MONTH) + 1) + "/"
599                     + time.get(Calendar.DATE) + " "
600                     + time.get(Calendar.HOUR) + ":"
601                     + time.get(Calendar.MINUTE) + ":"
602                     + time.get(Calendar.SECOND) + " "
603                     + ampm[time.get(Calendar.AM_PM)]);
604 
605             if (request.getClassification() == null) {
606                 request.setClassification(security);
607             }
608             t = t.replaceAll("%CLASSIFICATION%", (Utility.ICMClassificationToString(request.getClassification().getClassification()) + " Caveat: " + request.getClassification().getCaveats()));
609 
610             t += System.getProperty("line.separator");
611             out.write(t, 0, t.length());
612 
613             com = con.prepareStatement(
614                     "select * from auditlog "
615                     + "where utcdatetime  > ? and utcdatetime < ? order by utcdatetime desc ;");
616 
617             com.setLong(1, request.getRange().getStart().getTimeInMillis());
618             com.setLong(2, request.getRange().getEnd().getTimeInMillis());
619 
620             /*
621              * "utcdatetime" bigint, username text, classname text, method text,
622              * memo bytea, classification text, ipaddress text
623              */
624             rs = com.executeQuery();
625             while (rs.next()) {
626                 data = new StringBuilder();
627                 data = data.append(rs.getString("utcdatetime")).append(delimiter).
628                         append(rs.getString("username")).
629                         append(delimiter).append(rs.getString("classname")).
630                         append(delimiter).
631                         append(rs.getString("method")).
632                         append(delimiter).
633                         append(new String(rs.getBytes("memo"), Constants.CHARSET)).
634                         append(delimiter).append(rs.getString("classification")).
635                         append(delimiter).append(rs.getString("ipaddress"));
636                 data = data.append(System.getProperty("line.separator"));
637                 t = data.toString();
638                 out.write(t, 0, t.length());
639 
640             }
641         } catch (Exception ex) {
642             log.log(Level.ERROR, "", ex);
643         } finally {
644             DBUtils.safeClose(rs);
645             DBUtils.safeClose(com);
646             DBUtils.safeClose(con);
647             if (out != null) {
648                 try {
649                     out.close();
650                 } catch (Exception ex) {
651                 }
652             }
653         }
654 
655     }
656 
657     private static void generateHardDriveCSVReport(ExportCSVDataRequestMsg request,
658             String filenameandpath, List<String> filelist,
659             String currentuser, String url, SecurityWrapper security) {
660         if (!Reporting.isPolicyTypeOf(url, PolicyType.MACHINE)) {
661             return;
662         }
663         StringBuilder data = new StringBuilder();
664         Connection con = Utility.getConfigurationDBConnection();
665         OutputStreamWriter out = null;
666         PreparedStatement com = null;
667         ResultSet rs = null;
668         try {
669             // File f = new File(filenameandpath + getFilePathDelimitor() + "availability.csv");
670 
671             filelist.add(filenameandpath + getFilePathDelimitor() + "DiskExport-" + Reporting.toSafeFileName(url) + ".csv");
672             out = new OutputStreamWriter(
673                     new FileOutputStream(filenameandpath + getFilePathDelimitor() + "DiskExport-" + toSafeFileName(url) + ".csv"),
674                     Constants.CHARSET
675             );
676 
677             data = data.append("%CLASSIFICATION% Generated at %DATETIME_NOW% for %DATETIME_FROM% until %DATETIME_TO% ").append(System.getProperty("line.separator"));
678             data = data.append(url).append(System.getProperty("line.separator"));
679             data = data.append("URI").
680                     append(delimiter).append("Timestamp (ms since epoch)").
681                     append(delimiter).append("Record Id").
682                     append(delimiter).append("Free space").
683                     append(delimiter).append("Write KB/sec").
684                     append(delimiter).append("Read KB/sec").
685                     append(delimiter).append("Dev ID").
686                     append(delimiter).append("Drive ID").
687                     append(delimiter).append("Operational").
688                     append(delimiter).append("Status Message").
689                     append(System.getProperty("line.separator"));
690 
691             Calendar time = Calendar.getInstance();
692             String t = data.toString();
693             String[] ampm = new String[]{"AM", "PM"};
694             t = t.replaceAll("%DATETIME_NOW%",
695                     time.get(Calendar.YEAR) + "/"
696                     + (time.get(Calendar.MONTH) + 1) + "/"
697                     + time.get(Calendar.DATE) + " at "
698                     + time.get(Calendar.HOUR) + ":"
699                     + time.get(Calendar.MINUTE) + ":"
700                     + time.get(Calendar.SECOND) + " "
701                     + ampm[time.get(Calendar.AM_PM)]);
702             time = request.getRange().getStart();
703             t = t.replaceAll("%DATETIME_FROM%",
704                     time.get(Calendar.YEAR) + "/"
705                     + (time.get(Calendar.MONTH) + 1) + "/"
706                     + time.get(Calendar.DATE) + " "
707                     + time.get(Calendar.HOUR) + ":"
708                     + time.get(Calendar.MINUTE) + ":"
709                     + time.get(Calendar.SECOND) + " "
710                     + ampm[time.get(Calendar.AM_PM)]);
711             time = request.getRange().getEnd();
712             t = t.replaceAll("%DATETIME_TO%",
713                     time.get(Calendar.YEAR) + "/"
714                     + (time.get(Calendar.MONTH) + 1) + "/"
715                     + time.get(Calendar.DATE) + " "
716                     + time.get(Calendar.HOUR) + ":"
717                     + time.get(Calendar.MINUTE) + ":"
718                     + time.get(Calendar.SECOND) + " "
719                     + ampm[time.get(Calendar.AM_PM)]);
720 
721             if (request.getClassification() == null) {
722                 request.setClassification(security);
723             }
724             t = t.replaceAll("%CLASSIFICATION%", (Utility.ICMClassificationToString(request.getClassification().getClassification()) + " Caveat: " + request.getClassification().getCaveats()));
725 
726             t += System.getProperty("line.separator");
727             out.write(t, 0, t.length());
728 
729             com = con.prepareStatement(
730                     "select * from rawdatadrives "
731                     + "where uri=? and utcdatetime  > ? and utcdatetime < ? order by utcdatetime desc ;");
732             com.setString(1, url);
733             com.setLong(2, request.getRange().getStart().getTimeInMillis());
734             com.setLong(3, request.getRange().getEnd().getTimeInMillis());
735 
736             /*
737              * uri text, "utcdatetime" bigint, id text, message text, status
738              * boolean
739              */
740             rs = com.executeQuery();
741             while (rs.next()) {
742                 data = new StringBuilder();
743                 data = data.append(rs.getString("uri")).
744                         append(delimiter).append(rs.getLong("utcdatetime")).
745                         append(delimiter).append(rs.getString("id")).
746                         append(delimiter).append(rs.getLong("freespace")).
747                         append(delimiter).append(rs.getLong("writeKBs")).
748                         append(delimiter).append(rs.getLong("readKBs")).
749                         append(delimiter).append(rs.getString("deviceidentifier")).
750                         append(delimiter).append(rs.getString("driveidentifier")).
751                         append(delimiter).append(rs.getBoolean("status")).
752                         append(delimiter).append(rs.getString("statusmsg"));
753 
754                 data = data.append(System.getProperty("line.separator"));
755                 t = data.toString();
756                 out.write(t, 0, t.length());
757             }
758 
759         } catch (Exception ex) {
760             log.log(Level.WARN, null, ex);
761         } finally {
762             DBUtils.safeClose(rs);
763             DBUtils.safeClose(com);
764             DBUtils.safeClose(con);
765             if (out != null) {
766                 try {
767                     out.close();
768                 } catch (Exception ex) {
769                 }
770             }
771         }
772     }
773 
774     private static void generateNetworkCSVReport(ExportCSVDataRequestMsg request,
775             String filenameandpath, List<String> filelist,
776             String currentuser, String url, SecurityWrapper security) {
777         if (!Reporting.isPolicyTypeOf(url, PolicyType.MACHINE)) {
778             return;
779         }
780         StringBuilder data = new StringBuilder();
781         Connection con = Utility.getConfigurationDBConnection();
782         OutputStreamWriter out = null;
783         PreparedStatement com = null;
784         ResultSet rs = null;
785         try {
786             // File f = new File(filenameandpath + getFilePathDelimitor() + "availability.csv");
787 
788             filelist.add(filenameandpath + getFilePathDelimitor() + "NetworkExport-" + Reporting.toSafeFileName(url) + ".csv");
789             out = new OutputStreamWriter(
790                     new FileOutputStream(filenameandpath + getFilePathDelimitor() + "NetworkExport-" + toSafeFileName(url) + ".csv"),
791                     Constants.CHARSET
792             );
793 
794             data = data.append("%CLASSIFICATION% Generated at %DATETIME_NOW% for %DATETIME_FROM% until %DATETIME_TO% ").append(System.getProperty("line.separator"));
795             data = data.append(url).append(System.getProperty("line.separator"));
796             data = data.append("URI").
797                     append(delimiter).append("Timestamp (ms since epoch)").
798                     append(delimiter).append("Record Id").
799                     append(delimiter).append("NIC id").
800                     append(delimiter).append("RX KB/sec").
801                     append(delimiter).append("TX KB/sec").
802                     append(System.getProperty("line.separator"));
803 
804             Calendar time = GregorianCalendar.getInstance();
805             String t = data.toString();
806             String[] ampm = new String[]{"AM", "PM"};
807             t = t.replaceAll("%DATETIME_NOW%",
808                     time.get(Calendar.YEAR) + "/"
809                     + (time.get(Calendar.MONTH) + 1) + "/"
810                     + time.get(Calendar.DATE) + " at "
811                     + time.get(Calendar.HOUR) + ":"
812                     + time.get(Calendar.MINUTE) + ":"
813                     + time.get(Calendar.SECOND) + " "
814                     + ampm[time.get(Calendar.AM_PM)]);
815             time = request.getRange().getStart();
816             t = t.replaceAll("%DATETIME_FROM%",
817                     time.get(Calendar.YEAR) + "/"
818                     + (time.get(Calendar.MONTH) + 1) + "/"
819                     + time.get(Calendar.DATE) + " "
820                     + time.get(Calendar.HOUR) + ":"
821                     + time.get(Calendar.MINUTE) + ":"
822                     + time.get(Calendar.SECOND) + " "
823                     + ampm[time.get(Calendar.AM_PM)]);
824             time = request.getRange().getEnd();
825             t = t.replaceAll("%DATETIME_TO%",
826                     time.get(Calendar.YEAR) + "/"
827                     + (time.get(Calendar.MONTH) + 1) + "/"
828                     + time.get(Calendar.DATE) + " "
829                     + time.get(Calendar.HOUR) + ":"
830                     + time.get(Calendar.MINUTE) + ":"
831                     + time.get(Calendar.SECOND) + " "
832                     + ampm[time.get(Calendar.AM_PM)]);
833 
834             if (request.getClassification() == null) {
835                 request.setClassification(security);
836             }
837             t = t.replaceAll("%CLASSIFICATION%", (Utility.ICMClassificationToString(request.getClassification().getClassification()) + " Caveat: " + request.getClassification().getCaveats()));
838 
839             t += System.getProperty("line.separator");
840             out.write(t, 0, t.length());
841 
842             com = con.prepareStatement(
843                     "select * from rawdatanic "
844                     + "where uri=? and utcdatetime  > ? and utcdatetime < ? order by utcdatetime desc ;");
845             com.setString(1, url);
846             com.setLong(2, request.getRange().getStart().getTimeInMillis());
847             com.setLong(3, request.getRange().getEnd().getTimeInMillis());
848 
849             /*
850              * uri text, "utcdatetime" bigint, id text, message text, status
851              * boolean
852              */
853             rs = com.executeQuery();
854             while (rs.next()) {
855                 data = new StringBuilder();
856                 data = data.append(rs.getString("uri")).
857                         append(delimiter).append(rs.getLong("utcdatetime")).
858                         append(delimiter).append(rs.getString("id")).
859                         append(delimiter).append(rs.getString("nicid")).
860                         append(delimiter).append(rs.getLong("receiveKBs")).
861                         append(delimiter).append(rs.getLong("sendKBs"));
862 
863                 data = data.append(System.getProperty("line.separator"));
864                 t = data.toString();
865                 out.write(t, 0, t.length());
866             }
867 
868         } catch (Exception ex) {
869             log.log(Level.ERROR, "", ex);
870         } finally {
871             DBUtils.safeClose(rs);
872             DBUtils.safeClose(com);
873             DBUtils.safeClose(con);
874             if (out != null) {
875                 try {
876                     out.close();
877                 } catch (Exception ex) {
878                 }
879             }
880         }
881     }
882 
883     @SuppressWarnings("fallthrough")
884     private static void validateCSVRequest(ExportCSVDataRequestMsg request) {
885         if (request.getExportType() == null) {
886             throw new IllegalArgumentException("specify an export type");
887         }
888         switch (request.getExportType()) {
889             case AUDIT_LOGS:
890                 break;
891             case AVAILABILITY:
892                 if (request.isAllServices() == null && request.getURLs().isEmpty()) {
893                     throw new IllegalArgumentException("either all services needs to be set, or specify a list of urls from which to export data.");
894                 }
895                 break;
896             case STATISTICS:
897                 if (request.isAllServices() == null && request.getURLs().isEmpty()) {
898                     throw new IllegalArgumentException("either all services needs to be set, or specify a list of urls from which to export data.");
899                 }
900 
901                 break;
902             case TRANSACTIONS:
903                 if (request.isAllServices() == null && request.getURLs().isEmpty()) {
904                     throw new IllegalArgumentException("either all services needs to be set, or specify a list of urls from which to export data.");
905                 }
906 
907             case MACHINE:
908             case PROCESS:
909                 if (request.isAllServices() == null && request.getURLs().isEmpty()) {
910                     throw new IllegalArgumentException("either all services needs to be set, or specify a list of urls from which to export data.");
911                 }
912                 break;
913         }
914 
915     }
916 
917     private static void generateMachineCSVReport(ExportCSVDataRequestMsg request,
918             String filenameandpath, List<String> filelist, String currentuser,
919             String url, SecurityWrapper security) {
920         if (!isPolicyTypeOf(url, PolicyType.MACHINE)) {
921             return;
922         }
923         StringBuilder data = new StringBuilder();
924         Connection con = Utility.getConfigurationDBConnection();
925         OutputStreamWriter out = null;
926         PreparedStatement com = null;
927         ResultSet rs = null;
928         try {
929             // File f = new File(filenameandpath + getFilePathDelimitor() + "availability.csv");
930 
931             filelist.add(filenameandpath + getFilePathDelimitor() + "MachineExport-" + toSafeFileName(url) + ".csv");
932             out = new OutputStreamWriter(
933                     new FileOutputStream(filenameandpath + getFilePathDelimitor() + "MachineExport-" + toSafeFileName(url) + ".csv"),
934                     Constants.CHARSET
935             );
936 
937             /*
938              * uri text, "utcdatetime" bigint, id text, message text, status
939              * boolean
940              */
941             data = data.append("%CLASSIFICATION% Generated at %DATETIME_NOW% for %DATETIME_FROM% until %DATETIME_TO% ").append(System.getProperty("line.separator"));
942             data = data.append(url).append(System.getProperty("line.separator"));
943             data = data.append("URI").
944                     append(delimiter).append("Timestamp (ms since epoch)").
945                     append(delimiter).append("Record Id").
946                     append(delimiter).append("Percent CPU").
947                     append(delimiter).append("Memory").
948                     append(delimiter).append("Threads").
949                     append(delimiter).append("Open Files").
950                     append(delimiter).append("Started At").
951                     append(System.getProperty("line.separator"));
952 
953             Calendar time = Calendar.getInstance();
954             String t = data.toString();
955             String[] ampm = new String[]{"AM", "PM"};
956             t = t.replaceAll("%DATETIME_NOW%",
957                     time.get(Calendar.YEAR) + "/"
958                     + (time.get(Calendar.MONTH) + 1) + "/"
959                     + time.get(Calendar.DATE) + " at "
960                     + time.get(Calendar.HOUR) + ":"
961                     + time.get(Calendar.MINUTE) + ":"
962                     + time.get(Calendar.SECOND) + " "
963                     + ampm[time.get(Calendar.AM_PM)]);
964             time = request.getRange().getStart();
965             t = t.replaceAll("%DATETIME_FROM%",
966                     time.get(Calendar.YEAR) + "/"
967                     + (time.get(Calendar.MONTH) + 1) + "/"
968                     + time.get(Calendar.DATE) + " "
969                     + time.get(Calendar.HOUR) + ":"
970                     + time.get(Calendar.MINUTE) + ":"
971                     + time.get(Calendar.SECOND) + " "
972                     + ampm[time.get(Calendar.AM_PM)]);
973             time = request.getRange().getEnd();
974             t = t.replaceAll("%DATETIME_TO%",
975                     time.get(Calendar.YEAR) + "/"
976                     + (time.get(Calendar.MONTH) + 1) + "/"
977                     + time.get(Calendar.DATE) + " "
978                     + time.get(Calendar.HOUR) + ":"
979                     + time.get(Calendar.MINUTE) + ":"
980                     + time.get(Calendar.SECOND) + " "
981                     + ampm[time.get(Calendar.AM_PM)]);
982 
983             if (request.getClassification() == null) {
984                 request.setClassification(security);
985             }
986             t = t.replaceAll("%CLASSIFICATION%", (Utility.ICMClassificationToString(request.getClassification().getClassification()) + " Caveat: " + request.getClassification().getCaveats()));
987 
988             t += System.getProperty("line.separator");
989             out.write(t, 0, t.length());
990 
991             com = con.prepareStatement(
992                     "select * from rawdatamachineprocess "
993                     + "where uri=? and utcdatetime  > ? and utcdatetime < ? order by utcdatetime desc ;");
994             com.setString(1, url);
995             com.setLong(2, request.getRange().getStart().getTimeInMillis());
996             com.setLong(3, request.getRange().getEnd().getTimeInMillis());
997 
998             /*
999              * uri text, "utcdatetime" bigint, id text, message text, status
1000              * boolean
1001              */
1002             rs = com.executeQuery();
1003             while (rs.next()) {
1004                 data = new StringBuilder();
1005                 data = data.append(rs.getString("uri")).
1006                         append(delimiter).append(rs.getLong("utcdatetime")).
1007                         append(delimiter).append(rs.getString("id")).
1008                         append(delimiter).append(rs.getInt("percentCPU"));
1009                 Long l = rs.getLong("memoryused");
1010                 if (l != null) {
1011                     data = data.append(delimiter).append(l.toString());
1012                 }
1013                 l = rs.getLong("threads");
1014                 if (l != null) {
1015                     data = data.append(delimiter).append(l.toString());
1016                 }
1017                 l = rs.getLong("openfiles");
1018                 if (l != null) {
1019                     data = data.append(delimiter).append(l.toString());
1020                 }
1021                 l = rs.getLong("startedat");
1022                 if (l != null) {
1023                     data = data.append(delimiter).append(l.toString());
1024                 }
1025                 data = data.append(System.getProperty("line.separator"));
1026                 t = data.toString();
1027                 out.write(t, 0, t.length());
1028 
1029             }
1030         } catch (Exception ex) {
1031             log.log(Level.ERROR, "", ex);
1032         } finally {
1033             DBUtils.safeClose(rs);
1034             DBUtils.safeClose(com);
1035             DBUtils.safeClose(con);
1036             if (out != null) {
1037                 try {
1038                     out.close();
1039                 } catch (Exception ex) {
1040                 }
1041             }
1042         }
1043 
1044         generateHardDriveCSVReport(request, filenameandpath, filelist, currentuser, url, security);
1045         generateNetworkCSVReport(request, filenameandpath, filelist, currentuser, url, security);
1046     }
1047 
1048     private static void generateProcessCSVReport(ExportCSVDataRequestMsg request,
1049             String filenameandpath, List<String> filelist, String currentuser,
1050             String url, SecurityWrapper security) {
1051         if (!isPolicyTypeOf(url, PolicyType.PROCESS)) {
1052             return;
1053         }
1054         StringBuilder data = new StringBuilder();
1055         Connection con = Utility.getConfigurationDBConnection();
1056         OutputStreamWriter out = null;
1057         PreparedStatement com = null;
1058         ResultSet rs = null;
1059         try {
1060             // File f = new File(filenameandpath + getFilePathDelimitor() + "availability.csv");
1061 
1062             filelist.add(filenameandpath + getFilePathDelimitor() + "ProcessExport-" + toSafeFileName(url) + ".csv");
1063             out = new OutputStreamWriter(
1064                     new FileOutputStream(filenameandpath + getFilePathDelimitor() + "ProcessExport-" + toSafeFileName(url) + ".csv"),
1065                     Constants.CHARSET
1066             );
1067 
1068             //BufferedWriter out = new BufferedWriter(new FileWriter(filenameandpath + getFilePathDelimitor() + "ProcessExport-" + toSafeFileName(url) + ".csv"));
1069             data = data.append("%CLASSIFICATION% Generated at %DATETIME_NOW% for %DATETIME_FROM% until %DATETIME_TO% ").append(System.getProperty("line.separator"));
1070             data = data.append(url).append(System.getProperty("line.separator"));
1071             data = data.append("URI").
1072                     append(delimiter).append("Timestamp (ms since epoch)").
1073                     append(delimiter).append("Record Id").
1074                     append(delimiter).append("Percent CPU").
1075                     append(delimiter).append("Memory").
1076                     append(delimiter).append("Threads").
1077                     append(delimiter).append("Open Files").
1078                     append(delimiter).append("Started At").
1079                     append(System.getProperty("line.separator"));
1080 
1081             Calendar time = Calendar.getInstance();
1082             String t = data.toString();
1083             String[] ampm = new String[]{"AM", "PM"};
1084             t = t.replaceAll("%DATETIME_NOW%",
1085                     time.get(Calendar.YEAR) + "/"
1086                     + (time.get(Calendar.MONTH) + 1) + "/"
1087                     + time.get(Calendar.DATE) + " at "
1088                     + time.get(Calendar.HOUR) + ":"
1089                     + time.get(Calendar.MINUTE) + ":"
1090                     + time.get(Calendar.SECOND) + " "
1091                     + ampm[time.get(Calendar.AM_PM)]);
1092             time = request.getRange().getStart();
1093             t = t.replaceAll("%DATETIME_FROM%",
1094                     time.get(Calendar.YEAR) + "/"
1095                     + (time.get(Calendar.MONTH) + 1) + "/"
1096                     + time.get(Calendar.DATE) + " "
1097                     + time.get(Calendar.HOUR) + ":"
1098                     + time.get(Calendar.MINUTE) + ":"
1099                     + time.get(Calendar.SECOND) + " "
1100                     + ampm[time.get(Calendar.AM_PM)]);
1101             time = request.getRange().getEnd();
1102             t = t.replaceAll("%DATETIME_TO%",
1103                     time.get(Calendar.YEAR) + "/"
1104                     + (time.get(Calendar.MONTH) + 1) + "/"
1105                     + time.get(Calendar.DATE) + " "
1106                     + time.get(Calendar.HOUR) + ":"
1107                     + time.get(Calendar.MINUTE) + ":"
1108                     + time.get(Calendar.SECOND) + " "
1109                     + ampm[time.get(Calendar.AM_PM)]);
1110 
1111             if (request.getClassification() == null) {
1112                 request.setClassification(security);
1113             }
1114             t = t.replaceAll("%CLASSIFICATION%", (Utility.ICMClassificationToString(request.getClassification().getClassification()) + " Caveat: " + request.getClassification().getCaveats()));
1115 
1116             t += System.getProperty("line.separator");
1117             out.write(t, 0, t.length());
1118 
1119             com = con.prepareStatement(
1120                     "select * from rawdatamachineprocess "
1121                     + "where uri=? and utcdatetime  > ? and utcdatetime < ? order by utcdatetime desc ;");
1122             com.setString(1, url);
1123             com.setLong(2, request.getRange().getStart().getTimeInMillis());
1124             com.setLong(3, request.getRange().getEnd().getTimeInMillis());
1125 
1126             /*
1127              * uri text, "utcdatetime" bigint, id text, message text, status
1128              * boolean
1129              */
1130             rs = com.executeQuery();
1131             while (rs.next()) {
1132                 data = new StringBuilder();
1133                 data = data.append(rs.getString("uri")).
1134                         append(delimiter).append(rs.getLong("utcdatetime")).
1135                         append(delimiter).append(rs.getString("id")).
1136                         append(delimiter).append(rs.getInt("percentCPU"));
1137                 Long l = rs.getLong("memoryused");
1138                 if (l != null) {
1139                     data = data.append(delimiter).append(l.toString());
1140                 }
1141                 l = rs.getLong("threads");
1142                 if (l != null) {
1143                     data = data.append(delimiter).append(l.toString());
1144                 }
1145                 l = rs.getLong("openfiles");
1146                 if (l != null) {
1147                     data = data.append(delimiter).append(l.toString());
1148                 }
1149                 l = rs.getLong("startedat");
1150                 if (l != null) {
1151                     data = data.append(delimiter).append(l.toString());
1152                 }
1153                 data = data.append(System.getProperty("line.separator"));
1154                 t = data.toString();
1155                 out.write(t, 0, t.length());
1156 
1157             }
1158 
1159         } catch (Exception ex) {
1160             log.log(Level.ERROR, "", ex);
1161         } finally {
1162             DBUtils.safeClose(rs);
1163             DBUtils.safeClose(com);
1164             DBUtils.safeClose(con);
1165             if (out != null) {
1166                 try {
1167                     out.close();
1168                 } catch (Exception ex) {
1169                 }
1170             }
1171         }
1172     }
1173 
1174 }