001    package org.hackystat.projectbrowser.page.dailyprojectdata.filemetric;
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.filemetric.jaxb.FileMetricDailyProjectData;
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 FileMetric DPD display.  This data model accommodates multiple Projects.
021     * For each project, the data model indicates the file types in the Project along with how
022     * much LOC they had for the day.
023     * @author Philip Johnson
024     *
025     */
026    public class FileMetricDataModel implements Serializable {
027    
028      /** Support serialization. */
029      private static final long serialVersionUID = 1L;
030      
031      /** Holds the build data, organized by Project.*/
032      private Map<Project, FileMetricData> fileMetricDataMap = new HashMap<Project, FileMetricData>();
033      
034      /**
035       * The default FileMetricDataModel, which contains no build information.
036       */
037      public FileMetricDataModel() {
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 FileMetric DPD for project: " + project.getName());
054          try {
055            FileMetricDailyProjectData fileMetricDpd = dpdClient.getFileMetric(project.getOwner(),
056                project.getName(), Tstamp.makeTimestamp(session.getDate().getTime()), "TotalLines");
057            logger.fine("Finished getting FileMetric DPD for project: " + project.getName());
058            FileMetricData data = new FileMetricData(project, fileMetricDpd.getFileData());
059            this.fileMetricDataMap.put(project, data);
060          }
061          catch (DailyProjectDataClientException e) {
062            session.setFeedback("Exception getting FileMetric DPD for project " + project + ": " +
063                e.getMessage());
064          }
065        }
066      }
067      
068      
069      /**
070       * Sets this model to its empty state. 
071       */
072      public void clear() {
073        this.fileMetricDataMap.clear();
074      }
075      
076    
077      /**
078       * Returns true if this data model contains no information.
079       * Used to figure out if the associated panel should be visible. 
080       * @return True if the data model is empty. 
081       */
082      public boolean isEmpty() {
083        return this.fileMetricDataMap.isEmpty();
084      }
085      
086      /**
087       * Return the FileMetricData instance associated with the specified project.
088       * Creates and returns a new FileMetricData instance if one is not yet present.
089       * @param project The project. 
090       * @return The FileMetricData instance for this project.  
091       */
092      public FileMetricData getFileMetricData(Project project) {
093        if (!fileMetricDataMap.containsKey(project)) {
094          fileMetricDataMap.put(project, new FileMetricData(project));
095        }
096        return fileMetricDataMap.get(project);
097      }
098      
099      /**
100       * Returns the list of FileMetricData instances, needed for markup.
101       * @return The list of FileMetricData instances. 
102       */
103      public List<FileMetricData> getFileMetricDataList() {
104        return new ArrayList<FileMetricData>(this.fileMetricDataMap.values());
105      }
106      
107    }