View Javadoc

1   package net.sf.statcvs.reports;
2   
3   import java.util.Calendar;
4   import java.util.Collection;
5   import java.util.Date;
6   import java.util.GregorianCalendar;
7   import java.util.Iterator;
8   
9   import net.sf.statcvs.model.Author;
10  import net.sf.statcvs.model.Repository;
11  import net.sf.statcvs.model.Revision;
12  import net.sf.statcvs.output.ConfigurationOptions;
13  import net.sf.statcvs.output.ReportConfig;
14  import net.sf.statcvs.pages.CommitLogPageMaker;
15  import net.sf.statcvs.pages.TwitterHelp;
16  import net.sf.statcvs.reportmodel.AuthorColumn;
17  import net.sf.statcvs.reportmodel.IntegerColumn;
18  import net.sf.statcvs.reportmodel.LinkColumn;
19  import net.sf.statcvs.reportmodel.SimpleTextColumn;
20  import net.sf.statcvs.reportmodel.Table;
21  import net.sf.statcvs.util.IntegerMap;
22  
23  /**
24   * Table report which creates a table containing the names of all developers,
25   * their LOC contributions and number of changes.
26   * 
27   * @author Anja Jentzsch (anja@anjeve.de)
28   * @version $Id: DevelopersTableReport.java,v 1.1 2006/12/08 16:19:25 cyganiak
29   *          Exp $
30   */
31  public class DevelopersOfTheMonthTable implements TableReport {
32      private final ReportConfig config;
33      private final Repository repository;
34      private Table table;
35  
36      private final static String[] MONTH_NAME = { "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November",
37              "December" };
38  
39      /**
40       * Creates a table report containing all authors, their number of changes
41       * and LOC contributions.
42       * 
43       * @param content
44       *            the version control source data
45       */
46      public DevelopersOfTheMonthTable(final ReportConfig config) {
47          this.repository = config.getRepository();
48          this.config = config;
49      }
50  
51      public void calculate() {
52          final LinkColumn months = new LinkColumn("Month");
53          final AuthorColumn developers = new AuthorColumn();
54          final IntegerColumn loc = new IntegerColumn("Lines");
55          final SimpleTextColumn twitter = new SimpleTextColumn("Tweet This");
56          loc.setShowPercentages(false);
57  
58          this.table = new Table("Repository Tags");
59          this.table.setKeysInFirstColumn(true);
60          this.table.addColumn(months);
61          this.table.addColumn(developers);
62          this.table.addColumn(loc);
63          if (ConfigurationOptions.isEnableTwitterButton()) {
64              this.table.addColumn(twitter);
65          }
66          final Date start = this.repository.getFirstDate();
67          final Date end = this.repository.getLastDate();
68          final Calendar calendar = new GregorianCalendar();
69          calendar.setTime(end);
70          final Calendar startCal = new GregorianCalendar();
71          startCal.setTime(start);
72          while (true) {
73              final int year = calendar.get(Calendar.YEAR);
74              final int month = calendar.get(Calendar.MONTH);
75              final String month_year = MONTH_NAME[month] + " " + year;
76              final IntegerMap developerMap = getMostActiveUserOfMonth(month, year);
77              if (developerMap.size() > 0) {
78                  months.addValue(CommitLogPageMaker.getURL(calendar.getTime()), month_year);
79                  final Iterator it = developerMap.iteratorSortedByValueReverse();
80                  final Author developer = (Author) it.next();
81                  developers.addValue(developer);
82                  loc.addValue(developerMap.get(developer));
83                  twitter.addValue(TwitterHelp.buildDeveloperOfMonthLink(developer, developerMap.get(developer), repository, month_year, config));
84              }
85  
86              if (calendar.get(Calendar.YEAR) == startCal.get(Calendar.YEAR) && calendar.get(Calendar.MONTH) == startCal.get(Calendar.MONTH)) {
87                  break;
88              }
89              calendar.add(Calendar.MONTH, -1);
90          }
91      }
92  
93      private IntegerMap getMostActiveUserOfMonth(final int month, final int year) {
94          final Collection revisions = this.repository.getRevisions();
95          final Calendar calendar = new GregorianCalendar();
96          final IntegerMap developerMap = new IntegerMap();
97          final Iterator it = revisions.iterator();
98          while (it.hasNext()) {
99              final Revision revision = (Revision) it.next();
100             calendar.setTime(revision.getDate());
101             if (calendar.get(Calendar.YEAR) != year || calendar.get(Calendar.MONTH) != month || revision.getAuthor() == null) {
102                 continue;
103             }
104             if (developerMap.contains(revision.getAuthor())) {
105                 final int loc = developerMap.get(revision.getAuthor());
106                 developerMap.put(revision.getAuthor(), revision.getNewLines() + loc);
107             } else {
108                 developerMap.put(revision.getAuthor(), revision.getNewLines());
109             }
110         }
111         return developerMap;
112     }
113 
114     public Table getTable() {
115         return this.table;
116     }
117 }