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 }