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 }