001    package org.hackystat.telemetry.analyzer.reducer.impl;
002    
003    import java.util.ArrayList;
004    import java.util.List;
005    
006    import org.hackystat.dailyprojectdata.client.DailyProjectDataClient;
007    import org.hackystat.sensorbase.resource.projects.jaxb.Project;
008    import org.hackystat.sensorbase.resource.projects.jaxb.Property;
009    import org.hackystat.telemetry.analyzer.model.TelemetryStreamCollection;
010    import org.hackystat.telemetry.analyzer.reducer.TelemetryReducer;
011    import org.hackystat.telemetry.analyzer.reducer.TelemetryReducerException;
012    import org.hackystat.telemetry.service.server.ServerProperties;
013    import org.hackystat.utilities.time.interval.Interval;
014    
015    /**
016     * Returns a set of streams providing Commit counts for each member of the project. 
017     * <p>
018     * Options:
019     * <ol>
020     * <li> isCumulative: True or false. Default is false.
021     * </ol>
022     * 
023     * @author Philip Johnson
024     */
025    public class MemberCommitReducer implements TelemetryReducer { 
026      private static CommitReducer genericCommitReducer = new CommitReducer();
027      
028      /**
029       * Computes and returns the required telemetry streams object.
030       *
031       * @param project The project.
032       * @param dpdClient The DPD Client.
033       * @param interval The interval.
034       * @param options The optional parameters.
035       *
036       * @return Telemetry stream collection.
037       * @throws TelemetryReducerException If there is any error.
038       */
039      public TelemetryStreamCollection compute(Project project, DailyProjectDataClient dpdClient, 
040          Interval interval, String[] options) throws TelemetryReducerException {
041        boolean isCumulative = false;
042        //process options
043        if (options.length > 1) {
044          throw new TelemetryReducerException("Commit reducer takes 1 optional parameter.");
045        }
046        if (options.length == 1) {
047          try {
048            isCumulative = Boolean.valueOf(options[0]);
049          }
050          catch (Exception e) {
051            throw new TelemetryReducerException("Illegal cumulative value.", e);
052          }
053        }
054        
055        // Find out the DailyProjectData host, throw error if not found.
056        String dpdHost = System.getProperty(ServerProperties.DAILYPROJECTDATA_FULLHOST_KEY);
057        if (dpdHost == null) {
058          throw new TelemetryReducerException("Null DPD host in MemberCommitReducer");
059        }
060    
061        // now get the telemetry stream. 
062        try {
063          TelemetryStreamCollection streams = new TelemetryStreamCollection(null, project, interval);
064          // Make a list of emails containing all members plus the owner. 
065          List<String> emails = new ArrayList<String>(); 
066          emails.addAll(project.getMembers().getMember());
067          emails.add(project.getOwner());
068          // Now remove any email that has been specified as an agent.
069          for (Property property : project.getProperties().getProperty()) {
070            if (property.getKey().equals("agent")) {
071              emails.remove(property.getValue());
072            }
073          }
074          for (String email : emails) {
075            streams.add(genericCommitReducer.getStream(dpdClient, project, interval, email, 
076                isCumulative, email));
077          }
078          return streams;
079        } 
080        catch (Exception e) {
081          throw new TelemetryReducerException(e);
082        }
083      }
084    }