001    package org.hackystat.projectbrowser.page.dailyprojectdata.devtime;
002    
003    import java.io.Serializable;
004    import java.util.List;
005    import java.util.Map;
006    import java.util.TreeMap;
007    
008    import org.hackystat.dailyprojectdata.resource.devtime.jaxb.MemberData;
009    import org.hackystat.sensorbase.resource.projects.jaxb.Project;
010    
011    /**
012     * Provides data about DevTime for a single project and day. 
013     * @author Philip Johnson
014     */
015    public class DevTimeData implements Serializable {
016      
017      /** Support serialization. */
018      private static final long serialVersionUID = 1L;
019      
020      /** The project whose data is kept in this instance. */
021      private Project project;
022      
023      /** Holds the total DevTime in minutes. */
024      private int totalDevTime = 0;
025      
026      /** Maintains the (user, devtime) data. DevTime is in minutes. */
027      private Map<String, Integer> user2devTime = new TreeMap<String, Integer>(); 
028      
029      /**
030       * Constructs a DevTimeData instance with member data. 
031       * @param project The project associated with this DevTime data. 
032       * @param memberData The individual member data. 
033       */
034      public DevTimeData(Project project, List<MemberData> memberData) {
035        this.project = project;
036        for (MemberData data : memberData) {
037          String member = convertUriToEmail(data.getMemberUri());
038          int devTime = data.getDevTime().intValue();
039          this.totalDevTime += devTime;
040          user2devTime.put(member, devTime);
041        }
042      }
043      
044      /**
045       * Constructs an empty DevTimeData instance.
046       * Used to initialize the session state.  
047       * @param project The project.
048       */
049      public DevTimeData(Project project) {
050        this.project = project;
051      }
052      
053      /**
054       * Returns the project associated with this instance. 
055       * @return The project. 
056       */
057      public Project getProject() {
058        return this.project;
059      }
060      
061      /**
062       * Returns the total aggregate DevTime for this project and day. 
063       * @return The total DevTime. 
064       */
065      public int getTotalDevTime () {
066        return this.totalDevTime;
067      }
068      
069      /**
070       * Returns a String listing each project member with DevTime and their associated
071       * DevTime in minutes. 
072       * @return A String of DevTime info for this project and day. 
073       */
074      public String getDevTimeData() {
075        StringBuffer buff = new StringBuffer();
076        for (Map.Entry<String, Integer> entry : user2devTime.entrySet()) {
077          buff.append(String.format("%s(%d) ", entry.getKey(), entry.getValue()));
078        }
079        return buff.toString();
080      }
081      
082      /**
083       * Converts a project member string to an email address.
084       * The member string might be a URI (starting with http) or the desired email address. 
085       * @param member The member string. 
086       * @return The email address corresponding to the member string. 
087       */
088      private String convertUriToEmail(String member) {
089        if (member.startsWith("http:")) {
090          int lastSlash = member.lastIndexOf('/');
091          if (lastSlash < 0) {
092            throw new IllegalArgumentException("Could not convert owner to URI");
093          }
094          return member.substring(lastSlash + 1); 
095        }
096        // Otherwise owner is already the email. 
097        return member;
098      }
099    }