001    package org.hackystat.dailyprojectdata.resource.devtime;
002    
003    import java.math.BigInteger;
004    import java.util.HashMap;
005    import java.util.HashSet;
006    import java.util.Map;
007    import java.util.Set;
008    
009    import javax.xml.datatype.XMLGregorianCalendar;
010    
011    /**
012     * An abstraction that collects the DevTime associated with a set of Project Members.
013     * Implemented using a map of Members to DevTimeCounter instances.  
014     * @author Philip Johnson
015     *
016     */
017    public class MemberDevTimeCounter {
018      
019      /** The map of member emails to their DevTimeCounter. */ 
020      private Map<String, DevTimeCounter> member2devtime = new HashMap<String, DevTimeCounter>();
021      
022      /** Create a new MemberDevTimeCounter. */
023      public MemberDevTimeCounter() {
024        // does nothing. 
025      }
026    
027      /**
028       * Updates this abstraction with the DevEvent associated with the Project member. 
029       * @param member The member. 
030       * @param timestamp The timestamp associated with the DevEvent associated with the member. 
031       */
032      public void addMemberDevEvent(String member, XMLGregorianCalendar timestamp) {
033        if (!member2devtime.containsKey(member)) {
034          member2devtime.put(member, new DevTimeCounter());
035        }
036        member2devtime.get(member).addDevEvent(timestamp);
037      }
038      
039      /**
040       * Return the aggregate DevTime for all members. 
041       * @return The total DevTime. 
042       */
043      public BigInteger getTotalDevTime() {
044        BigInteger totalDevTime = BigInteger.valueOf(0);
045        for (DevTimeCounter counter : member2devtime.values()) {
046          totalDevTime = totalDevTime.add(counter.getDevTime());
047        }
048        return totalDevTime;
049      }
050      
051      /**
052       * Returns the DevTime associated with Member, or zero if member does not exist. 
053       * @param member The member
054       * @return The member's devtime. 
055       */
056      public BigInteger getMemberDevTime(String member) {
057        if (member2devtime.containsKey(member)) {
058          return member2devtime.get(member).getDevTime();
059        }
060        else {
061          return BigInteger.valueOf(0);
062        }
063      }
064      
065      /**
066       * Returns a newly created Set containing all of the members in this MemberDevTimeCounter. 
067       * @return The set of all members in this MemberDevTimeCounter. 
068       */
069      public Set<String> getMembers() {
070        Set<String> members = new HashSet<String>();
071        members.addAll(member2devtime.keySet());
072        return members;
073      }
074    }