001 package org.hackystat.projectbrowser.page.dailyprojectdata.devtime; 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.devtime.jaxb.DevTimeDailyProjectData; 013 import org.hackystat.projectbrowser.ProjectBrowserApplication; 014 import org.hackystat.projectbrowser.ProjectBrowserSession; 015 import org.hackystat.projectbrowser.page.dailyprojectdata.DailyProjectDataSession; 016 import org.hackystat.sensorbase.resource.projects.jaxb.Project; 017 import org.hackystat.utilities.tstamp.Tstamp; 018 019 /** 020 * The data model for DevTime DPD display. This data model accommodates multiple Projects. 021 * For each project, the data model indicates the members in the Project along with how 022 * much DevTime they worked on the associated project for the day. 023 * @author Philip Johnson 024 * 025 */ 026 public class DevTimeDataModel implements Serializable { 027 028 /** Support serialization. */ 029 private static final long serialVersionUID = 1L; 030 031 /** Holds the DevTime data, organized by Project.*/ 032 private Map<Project, DevTimeData> devTimeDataMap = new HashMap<Project, DevTimeData>(); 033 034 /** 035 * The default DevTimeDataModel, which contains no commit information. 036 */ 037 public DevTimeDataModel() { 038 // Do nothing 039 } 040 041 /** 042 * Updates this data model to reflect the build information associated with the selected 043 * projects. 044 */ 045 public void update() { 046 this.clear(); 047 DailyProjectDataClient dpdClient = ProjectBrowserSession.get().getDailyProjectDataClient(); 048 DailyProjectDataSession session = ProjectBrowserSession.get().getDailyProjectDataSession(); 049 List<Project> projects = session.getSelectedProjects(); 050 051 for (Project project : projects) { 052 Logger logger = ((ProjectBrowserApplication)ProjectBrowserApplication.get()).getLogger(); 053 logger.fine("Getting DevTime DPD for project: " + project.getName()); 054 try { 055 DevTimeDailyProjectData devTimeDpd = dpdClient.getDevTime(project.getOwner(), 056 project.getName(), Tstamp.makeTimestamp(session.getDate().getTime())); 057 logger.fine("Finished getting DevTime DPD for project: " + project.getName()); 058 DevTimeData data = new DevTimeData(project, devTimeDpd.getMemberData()); 059 this.devTimeDataMap.put(project, data); 060 } 061 062 catch (DailyProjectDataClientException e) { 063 session.setFeedback("Exception getting DevTime DPD for project " + project + ": " + 064 e.getMessage()); 065 } 066 } 067 } 068 069 070 /** 071 * Sets this model to its empty state. 072 */ 073 public void clear() { 074 this.devTimeDataMap.clear(); 075 } 076 077 078 /** 079 * Returns true if this data model contains no information. 080 * Used to figure out if the associated panel should be visible. 081 * @return True if the data model is empty. 082 */ 083 public boolean isEmpty() { 084 return this.devTimeDataMap.isEmpty(); 085 } 086 087 /** 088 * Return the DevTimeData instance associated with the specified project. 089 * Creates and returns a new DevTimeData instance if one is not yet present. 090 * @param project The project. 091 * @return The DevTimeData instance for this project. 092 */ 093 public DevTimeData getDevTimeData(Project project) { 094 if (!devTimeDataMap.containsKey(project)) { 095 devTimeDataMap.put(project, new DevTimeData(project)); 096 } 097 return devTimeDataMap.get(project); 098 } 099 100 /** 101 * Returns the list of DevTimeData instances, needed for markup. 102 * @return The list of DevTimeData instances. 103 */ 104 public List<DevTimeData> getDevTimeDataList() { 105 return new ArrayList<DevTimeData>(this.devTimeDataMap.values()); 106 } 107 108 }