001    package org.hackystat.projectbrowser.page.dailyprojectdata.coverage;
002    
003    import java.io.Serializable;
004    import java.util.ArrayList;
005    import java.util.HashMap;
006    import java.util.List;
007    import java.util.Map;
008    import java.util.logging.Logger;
009    
010    import org.hackystat.dailyprojectdata.client.DailyProjectDataClient;
011    import org.hackystat.dailyprojectdata.client.DailyProjectDataClientException;
012    import org.hackystat.dailyprojectdata.resource.coverage.jaxb.ConstructData;
013    import org.hackystat.dailyprojectdata.resource.coverage.jaxb.CoverageDailyProjectData;
014    import org.hackystat.projectbrowser.ProjectBrowserApplication;
015    import org.hackystat.projectbrowser.ProjectBrowserSession;
016    import org.hackystat.projectbrowser.page.dailyprojectdata.DailyProjectDataSession;
017    import org.hackystat.sensorbase.resource.projects.jaxb.Project;
018    import org.hackystat.utilities.tstamp.Tstamp;
019    
020    /**
021     * The data model for Coverage DPD display.  This data model accommodates multiple Projects.
022     * For each project, the data model indicates the number of classes whose method-level percentage
023     * falls into each of five buckets, from 0-20% to 80-100%.
024     * @author Philip Johnson
025     * @author Shaoxuan Zhang
026     *
027     */
028    public class CoverageDataModel implements Serializable {
029    
030      /** Support serialization. */
031      private static final long serialVersionUID = 1L;
032      
033      /** Holds the coverage data, organized by Project.*/
034      private Map<Project, CoverageData> coverageDataMap = new HashMap<Project, CoverageData>();
035      
036      /**
037       * The default CoverageDataModel, which contains no coverage information.
038       */
039      public CoverageDataModel() {
040        // Do nothing
041      }
042      
043      /**
044       * Updates this data model to reflect the coverage information associated with the selected 
045       * projects and granularity.
046       */
047      public void update() {
048        this.clear();
049        DailyProjectDataClient dpdClient = ProjectBrowserSession.get().getDailyProjectDataClient();
050        DailyProjectDataSession session = ProjectBrowserSession.get().getDailyProjectDataSession();
051        List<Project> projects = session.getSelectedProjects();
052        String granularity = session.getContextSensitiveMenu("Coverage Type").getSelectedValue();
053        
054        for (Project project : projects) {
055          Logger logger = ((ProjectBrowserApplication)ProjectBrowserApplication.get()).getLogger();
056          logger.fine("Getting Coverage DPD for project: " + project.getName());
057          try {
058            CoverageDailyProjectData classData = dpdClient.getCoverage(project.getOwner(),
059                project.getName(), Tstamp.makeTimestamp(session.getDate().getTime()), granularity);
060            logger.fine("Finished getting Coverage DPD for project: " + project.getName());
061            // Create a CoverageData instance for this project.
062            CoverageData coverageData = this.getCoverageData(project);
063            for (ConstructData data : classData.getConstructData()) {
064              coverageData.addEntry(data);
065            }
066          }
067          catch (DailyProjectDataClientException e) {
068            session.setFeedback("Exception when getting coverage DPD for project " + project + ": " +
069                e.getMessage());
070          }
071        }
072      }
073      
074      
075      /**
076       * Sets this model to its empty state. 
077       */
078      public void clear() {
079        this.coverageDataMap.clear();
080      }
081      
082    
083      /**
084       * Returns true if this data model contains no information.
085       * Used to figure out if the associated panel should be visible. 
086       * @return True if the data model is empty. 
087       */
088      public boolean isEmpty() {
089        return this.coverageDataMap.isEmpty();
090      }
091      
092      /**
093       * Return the CoverageData instance associated with the specified project.
094       * Creates and returns a new CoverageData instance if one is not yet present.
095       * @param project The project. 
096       * @return The CoverageData instance for this project.  
097       */
098      public CoverageData getCoverageData(Project project) {
099        if (!coverageDataMap.containsKey(project)) {
100          coverageDataMap.put(project, new CoverageData(project));
101        }
102        return coverageDataMap.get(project);
103      }
104      
105      /**
106       * Returns the list of CoverageData instances, needed for markup.
107       * @return The list of CoverageData instances. 
108       */
109      public List<CoverageData> getCoverageDataList() {
110        return new ArrayList<CoverageData>(this.coverageDataMap.values());
111      }
112      
113    }