001    package org.hackystat.projectbrowser.page.sensordata;
002    
003    import java.io.Serializable;
004    import java.math.BigInteger;
005    import java.text.SimpleDateFormat;
006    import java.util.ArrayList;
007    import java.util.List;
008    import java.util.Locale;
009    
010    import javax.xml.datatype.XMLGregorianCalendar;
011    
012    import org.hackystat.sensorbase.resource.projects.jaxb.ProjectSummary;
013    import org.hackystat.sensorbase.resource.projects.jaxb.SensorDataSummaries;
014    import org.hackystat.sensorbase.resource.projects.jaxb.SensorDataSummary;
015    
016    /**
017     * A model for an individual row in the sensor data table.
018     * @author Philip Johnson
019     */
020    public class SensorDataTableRowModel implements Serializable { 
021      
022      /** Required for serialization. */
023      private static final long serialVersionUID = 1L;
024      private ProjectSummary projectSummary = null;
025      private SimpleDateFormat dayFormat = new SimpleDateFormat("EEE, MMM d yyyy", Locale.US);
026    
027      /**
028       * Creates a row given a project summary for a given day. 
029       * @param summary The ProjectSummary instance. 
030       */
031      public SensorDataTableRowModel (ProjectSummary summary) {
032        this.projectSummary = summary;
033      }
034      
035      /**
036       * Returns a string indicating the day associated with this row. 
037       * @return The day as a string. 
038       */
039      public String getDayString () {
040        return dayFormat.format(this.projectSummary.getStartTime().toGregorianCalendar().getTime());
041      }
042      
043      /**
044       * Returns the start time for this day. 
045       * @return The start time. 
046       */
047      public XMLGregorianCalendar getStartTime() {
048        return this.projectSummary.getStartTime();
049      }
050      
051      /**
052       * Returns the total number of sensor data instances sent on this day. 
053       * @return The total number of sensor data instances. 
054       */
055      public int getTotal() {
056        SensorDataSummaries summary = this.projectSummary.getSensorDataSummaries();
057        BigInteger numInstances;
058        if (summary == null) {
059          return 0;
060        }
061        else {
062          numInstances = summary.getNumInstances();
063          if (numInstances == null) {
064            return 0;
065          }
066        }
067        return numInstances.intValue(); 
068      }
069      
070    
071      /**
072       * Returns a list of SensorDataSummary instances associated with the passed sdt. 
073       * @param sdt The sdt of interest. 
074       * @return The SensorDataSummary instances associated with this SDT.
075       */
076      public List<SensorDataSummary> getSensorDataSummaryList(String sdt) {
077        List<SensorDataSummary> summaryList = new ArrayList<SensorDataSummary>();
078        if (this.projectSummary.isSetSensorDataSummaries()) {
079          for (SensorDataSummary summary : 
080            this.projectSummary.getSensorDataSummaries().getSensorDataSummary()) {
081            String summarySdt = summary.getSensorDataType();
082            if ((sdt.equals(summarySdt)) ||
083                (isUnknownSdt(sdt) && isUnknownSdt(summarySdt))) {
084              summaryList.add(summary);
085            }
086          }
087        }
088        return summaryList;
089      }
090      
091      /**
092       * True if there is no SDT associated with this sensor data instance.
093       * @param sdt The SDT field.
094       * @return True if the SDT field value indicates no SDT.
095       */
096      private boolean isUnknownSdt(String sdt) {
097        return ((sdt == null) ||
098                ("".equals(sdt)) ||
099                ("Unknown".equals(sdt)));
100      }
101    }