@Override public void run() { try { if (!checkLock()) { return; } Log.info("Report thread running.."); // Fetch GPS data Log.info("Fetching GPS data.."); boolean isGPS = generateGPSInitScript(); if (!isGPS) { Log.error("Generating GPS samples failed.."); } else { Log.info("Fetching GPS data done"); } // Read report template String reportTemplate = FileUtils.readFileToString(new File(REPORT_TEMPLATE_PATH)); if (reportTemplate == null) { Log.error("Error reading report template."); return; } for (String curSensor : REPORT_SENSORS) { generateReportForSensor(curSensor, reportTemplate); } String reportIdxFileName = generateReportIndexPage(); if (reportIdxFileName == null) { Log.error("Error generating report index."); return; } sendEmailToOwner(owner, reportIdxFileName); Log.info("Report thread done!."); } catch (IOException e) { e.printStackTrace(); } finally { releaseLock(); } }
private List<Range> getUnsharedRanges(String streamOwner, String streamName) throws ClassNotFoundException, SQLException, IOException, NamingException, NoSuchAlgorithmException { /*double start = 1392883208801.0; double end = 1392936762729.0; double d = (end - start) / 24; resultRanges.add(new Range(start, start + d)); resultRanges.add(new Range(start + 2*d, start + 3*d)); resultRanges.add(new Range(start + 4*d, start + 5*d)); resultRanges.add(new Range(start + 6*d, start + 7*d)); resultRanges.add(new Range(start + 8*d, start + 9*d));*/ prepareDummyStream(streamOwner, streamName); int[] shareflags = queryUsingDummyStreamAsOtherUser(streamOwner, streamName); // dump share flags StringBuilder sb = new StringBuilder(); sb.append("flags = ["); for (int f : shareflags) { sb.append(f); sb.append(","); } sb.deleteCharAt(sb.length() - 1); sb.append("]"); Log.info(sb.toString()); // Generate unshared ranges List<Range> resultRanges = new ArrayList<Range>(); int prevflag = shareflags[0]; double curStartTime = -1; if (shareflags[0] == 0) { curStartTime = startDate.getMillis(); } for (int i = 1; i < shareflags.length; i++) { int curflag = shareflags[i]; if (prevflag == curflag) { continue; } else if (prevflag == 0 && curflag == 1) { if (curStartTime < 0) { Log.error("invalid curStartTime at " + i); } double endTime = startDate.getMillis() + i * DUMMY_STREAM_INTERVAL * 1000; resultRanges.add(new Range(curStartTime, endTime)); curStartTime = -1; } else if (prevflag == 1 && curflag == 0) { curStartTime = startDate.getMillis() + i * DUMMY_STREAM_INTERVAL * 1000; } prevflag = shareflags[i]; } if (curStartTime > 0) { double endTime = startDate.getMillis() + shareflags.length * DUMMY_STREAM_INTERVAL * 1000; resultRanges.add(new Range(curStartTime, endTime)); } return resultRanges; }
private void sendEmailToOwner(String username, String reportIdxFileName) { String link = basePath + REPORTS_URL + "/" + reportIdxFileName; link = "<a href=\"" + link + "\">" + link + "</a>"; String title = EMAIL_TITLE + " (" + titleFmt.print(startDate) + " ~ " + titleFmt.print(endDate) + ")"; String body = "Your data reports are ready for your review at the following address:<br/><br/>" + link; body += "<br/><br/>Please access the above link and provide us your feedback!<br/><br/>"; body += "Regards,<br/>SensorPrivacy Research Team"; // Get email address UserDatabaseDriver db = null; String email = null; try { db = DatabaseConnector.getUserDatabase(); email = db.getUserEmail(username); } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (SQLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } catch (NamingException e) { e.printStackTrace(); } finally { if (db != null) { try { db.close(); } catch (SQLException e) { e.printStackTrace(); } } } if (email == null) { Log.error("No email address for " + username); return; } try { MailSender.send(email, title, body); } catch (MessagingException e) { e.printStackTrace(); Log.error("Error while sending email.."); return; } Log.info("Done sending email!"); }
private void prepareDummyStream(String streamOwner, String streamName) throws ClassNotFoundException, SQLException, IOException, NamingException, NoSuchAlgorithmException { // Check if dummy stream exists List<Stream> streams = null; StreamDatabaseDriver db = null; try { db = DatabaseConnector.getStreamDatabase(); streams = db.getStreamList(streamOwner); } finally { if (db != null) { try { db.close(); } catch (SQLException e) { e.printStackTrace(); } } } boolean isFound = false; for (Stream stream : streams) { if (stream.name.equals(DUMMY_STREAM_NAME)) { isFound = true; } } if (!isFound) { createDummyStream(streamOwner); } // Check if dummy stream has desired amount of data on today. DateTime day = simpleFmt.parseDateTime(startDate.toString(simpleFmt)); int targetNumSamples = MAX_SEC_A_DAY / DUMMY_STREAM_INTERVAL; while (day.isBefore(endDate)) { Log.info("current day: " + fmt.print(day)); String startTime = fmt.print(day); String endTime = fmt.print(day.plusDays(1).minusMillis(1)); try { db = DatabaseConnector.getStreamDatabase(); boolean isData = db.prepareQuery( streamOwner, streamOwner, DUMMY_STREAM_NAME, startTime, endTime, null, null, 0, 0, 0, true, null); Stream stream = db.getStoredStreamInfo(); if (!isData) { Log.error("isData false"); throw new UnsupportedOperationException("idData false."); } if (stream.num_samples != targetNumSamples) { Log.info("dummy stream is no good. Bulkloading dummy stream.."); bulkloadDummyStreamData(streamOwner, day); } else { Log.info("dummy stream is good."); } } finally { if (db != null) { try { db.close(); } catch (SQLException e) { e.printStackTrace(); } } } day = day.plusDays(1); } }
private int[] queryUsingDummyStreamAsOtherUser(String streamOwner, String streamName) throws ClassNotFoundException, SQLException, IOException, NamingException { StreamDatabaseDriver db = null; String startTime = fmt.print(startDate); String endTime = fmt.print(endDate.minusMillis(1)); Log.info("startTime: " + startTime + ", endTime: " + endTime); long durationInSecs = (endDate.getMillis() / 1000) - (startDate.getMillis() / 1000); int size = (int) (durationInSecs / DUMMY_STREAM_INTERVAL); if (size <= 0) { size = 1; } int[] shareflags = new int[size]; Log.info("size: " + (int) (durationInSecs / DUMMY_STREAM_INTERVAL)); try { db = DatabaseConnector.getStreamDatabase(); boolean isData = db.prepareQuery( OTHER_USER_NAME, streamOwner, DUMMY_STREAM_NAME, startTime, endTime, null, null, 0, 0, 0, false, streamName); if (!isData) { Log.info("No data shared with " + OTHER_USER_NAME + " for " + streamName); return shareflags; } Object[] tuple = new Object[db.getStoredStreamInfo().channels.size() + 1]; long todayMillis = startDate.getMillis(); while (db.getNextTuple(tuple)) { long timestamp = (Long) tuple[0]; // Log.info("timestamp: " + timestamp); int idx = (int) ((timestamp - todayMillis) / 1000 / DUMMY_STREAM_INTERVAL); if (idx >= size) { Log.error( "idx >= size, timestamp = " + fmt.print(new DateTime(timestamp)) + ", idx = " + idx + ", size = " + size); } else { shareflags[idx] = 1; } } return shareflags; } finally { if (db != null) { try { db.close(); } catch (SQLException e) { e.printStackTrace(); } } } }