/**
  * Returns a summary string regarding Build info, or the empty string if no info available.
  *
  * @param client The SensorBaseClient.
  * @param dpdClient The DailyProjectData client.
  * @param startTime The start time.
  * @param endTime The end time.
  * @return The summary string, or an empty string.
  */
 private String getCoverageInfo(
     SensorBaseClient client,
     DailyProjectDataClient dpdClient,
     XMLGregorianCalendar startTime,
     XMLGregorianCalendar endTime) {
   String message = "";
   try {
     SensorDataIndex index =
         client.getProjectSensorData(projectOwner, projectName, startTime, endTime, "Coverage");
     if (!index.getSensorDataRef().isEmpty()) {
       CoverageDailyProjectData dpd =
           dpdClient.getCoverage(projectOwner, projectName, startTime, "Line");
       double covered = 0.0;
       double total = 0.0;
       for (ConstructData data : dpd.getConstructData()) {
         covered += data.getNumCovered();
         total += data.getNumCovered() + data.getNumUncovered();
       }
       int percentCovered = (total == 0) ? 0 : (int) ((covered / total) * 100);
       message = String.format("Line coverage is %s percent.", percentCovered);
     }
   } catch (SensorBaseClientException e) {
     message = "Error retrieving Coverage sensor data. ";
   } catch (DailyProjectDataClientException e) {
     message = "Error retrieving Coverage DPD data. ";
   }
   return message;
 }
 /**
  * Returns a summary string regarding Size info, or the empty string if no info available.
  *
  * @param client The SensorBaseClient.
  * @param dpdClient The DailyProjectData client.
  * @param startTime The start time.
  * @param endTime The end time.
  * @return The summary string, or an empty string.
  */
 private String getSizeInfo(
     SensorBaseClient client,
     DailyProjectDataClient dpdClient,
     XMLGregorianCalendar startTime,
     XMLGregorianCalendar endTime) {
   String message = "";
   try {
     SensorDataIndex index =
         client.getProjectSensorData(projectOwner, projectName, startTime, endTime, "FileMetric");
     if (!index.getSensorDataRef().isEmpty()) {
       FileMetricDailyProjectData dpd =
           dpdClient.getFileMetric(projectOwner, projectName, startTime, "TotalLines");
       int totalLines = 0;
       for (FileData data : dpd.getFileData()) {
         totalLines += data.getSizeMetricValue();
       }
       message = String.format("The system has %s lines of code.", totalLines);
     }
   } catch (SensorBaseClientException e) {
     message = "Error retrieving FileMetric sensor data. ";
   } catch (DailyProjectDataClientException e) {
     message = "Error retrieving FileMetric DPD data. ";
   }
   return message;
 }
  /**
   * Returns an UnitTestDailyProjectData instance.
   *
   * @param variant The representational variant requested.
   * @return The representation.
   */
  @Override
  public Representation represent(Variant variant) {
    Logger logger = this.server.getLogger();
    logger.fine("UnitTest DPD: Starting");
    if (variant.getMediaType().equals(MediaType.TEXT_XML)) {
      try {
        // [1] get the SensorBaseClient for the user making this request.
        SensorBaseClient client = super.getSensorBaseClient();
        // [2] Check the front side cache and return if the DPD is found and is OK to access.
        String cachedDpd = this.server.getFrontSideCache().get(uriUser, project, uriString);
        if ((cachedDpd != null) && client.inProject(uriUser, project)) {
          return super.getStringRepresentation(cachedDpd);
        }
        // [2] get a SensorDataIndex of UnitTest sensor data for this Project on the requested day.
        XMLGregorianCalendar startTime = Tstamp.makeTimestamp(this.timestamp);
        XMLGregorianCalendar endTime = Tstamp.incrementDays(startTime, 1);
        logger.fine("UnitTest DPD: Requesting index: " + uriUser + " " + project);
        SensorDataIndex index =
            client.getProjectSensorData(uriUser, project, startTime, endTime, "UnitTest");
        // [3] Update the counter with this data.
        logger.fine("UnitTest DPD: Got index.  " + index.getSensorDataRef().size() + " instances");
        UnitTestCounter counter = new UnitTestCounter();
        for (SensorDataRef ref : index.getSensorDataRef()) {
          counter.add(client.getSensorData(ref));
        }
        logger.fine("UnitTest DPD: Finished retrieving instances. ");

        // return resulting data
        UnitTestDailyProjectData unitTestDPD = new UnitTestDailyProjectData();
        // create the individual MemberData elements.
        String sensorBaseHost = this.server.getServerProperties().get(SENSORBASE_FULLHOST_KEY);
        for (String member : counter.getMembers()) {
          MemberData memberData = new MemberData();
          memberData.setMemberUri(sensorBaseHost + "users/" + member);
          memberData.setSuccess(counter.getPassCount(member));
          memberData.setFailure(counter.getFailCount(member));
          unitTestDPD.getMemberData().add(memberData);
        }

        unitTestDPD.setOwner(uriUser);
        unitTestDPD.setProject(project);
        unitTestDPD.setStartTime(startTime);
        unitTestDPD.setUriPattern("**"); // we don't support UriPatterns yet.

        String xmlData = makeUnitTestDPD(unitTestDPD);
        if (!Tstamp.isTodayOrLater(startTime)) {
          this.server.getFrontSideCache().put(uriUser, project, uriString, xmlData);
        }
        logRequest("UnitTest");
        return super.getStringRepresentation(xmlData);

      } catch (Exception e) {
        setStatusError("Error creating UnitTest DPD.", e);
        return null;
      }
    }
    return null;
  }
 /**
  * Returns a summary string regarding Build info, or the empty string if no info available.
  *
  * @param client The SensorBaseClient.
  * @param startTime The start time.
  * @param endTime The end time.
  * @return The summary string, or an empty string.
  */
 private String getBuildInfo(
     SensorBaseClient client, XMLGregorianCalendar startTime, XMLGregorianCalendar endTime) {
   String message = "";
   try {
     SensorDataIndex index =
         client.getProjectSensorData(projectOwner, projectName, startTime, endTime, "Build");
     message = getWorkers(index, "built the system.");
   } catch (Exception e) {
     message = "Error retrieving Build data. ";
   }
   return message;
 }
 /**
  * Returns a summary string regarding Commit info, or the empty string if no info available.
  *
  * @param client The SensorBaseClient.
  * @param startTime The start time.
  * @param endTime The end time.
  * @return The summary string, or an empty string.
  */
 private String getUnitTestInfo(
     SensorBaseClient client, XMLGregorianCalendar startTime, XMLGregorianCalendar endTime) {
   String message = "";
   try {
     SensorDataIndex index =
         client.getProjectSensorData(projectOwner, projectName, startTime, endTime, "UnitTest");
     message = getWorkers(index, "run tests.");
   } catch (Exception e) {
     message = "Error retrieving UnitTest data. ";
   }
   return message;
 }
 /**
  * Returns a summary string regarding DevEvent info, or the empty string if no info available.
  *
  * @param client The SensorBaseClient.
  * @param startTime The start time.
  * @param endTime The end time.
  * @return The summary string, or an empty string.
  */
 private String getDevEventInfo(
     SensorBaseClient client, XMLGregorianCalendar startTime, XMLGregorianCalendar endTime) {
   String message = "";
   try {
     SensorDataIndex index =
         client.getProjectSensorData(projectOwner, projectName, startTime, endTime, "DevEvent");
     message = getWorkers(index, "been editing files.");
   } catch (Exception e) {
     message = "Error retrieving DevEvent data. ";
   }
   return message;
 }
 /**
  * Used by the SdtSummary link to indicate how the model should be updated.
  *
  * @param sdtName The sdtName.
  * @param tool The tool.
  * @param start The start time.
  */
 public void setSensorDataDetailsProvider(String sdtName, String tool, long start) {
   detailsList.clear();
   SensorBaseClient client = ProjectBrowserSession.get().getSensorBaseClient();
   SensorDataSession session = ProjectBrowserSession.get().getSensorDataSession();
   String projectName = session.getProject().getName();
   String owner = session.getProject().getOwner();
   XMLGregorianCalendar startTime = Tstamp.makeTimestamp(start);
   XMLGregorianCalendar endTime = Tstamp.incrementDays(startTime, 1);
   try {
     SensorDataIndex index =
         client.getProjectSensorData(owner, projectName, startTime, endTime, sdtName, tool);
     for (SensorDataRef ref : index.getSensorDataRef()) {
       detailsList.add(new SensorDataDetails(ref));
     }
   } catch (Exception e) {
     System.out.println("Error getting sensor data: " + StackTrace.toString(e));
   }
 }