예제 #1
0
  @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();
    }
  }
예제 #2
0
  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;
  }
예제 #3
0
  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!");
  }
예제 #4
0
  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);
    }
  }
예제 #5
0
 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();
       }
     }
   }
 }