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    }