1 package net.sf.statcvs.reports;
2
3 import java.util.ArrayList;
4 import java.util.Collection;
5 import java.util.Collections;
6 import java.util.Date;
7 import java.util.HashSet;
8 import java.util.Iterator;
9 import java.util.List;
10 import java.util.Set;
11 import java.util.SortedSet;
12
13 import net.sf.statcvs.model.Author;
14 import net.sf.statcvs.model.Repository;
15 import net.sf.statcvs.model.Revision;
16 import net.sf.statcvs.model.SymbolicName;
17 import net.sf.statcvs.output.ReportConfig;
18 import net.sf.statcvs.pages.HTML;
19 import net.sf.statcvs.pages.CommitLogPageMaker;
20 import net.sf.statcvs.reportmodel.IntegerColumn;
21 import net.sf.statcvs.reportmodel.LinkColumn;
22 import net.sf.statcvs.reportmodel.SimpleTextColumn;
23 import net.sf.statcvs.reportmodel.Table;
24
25 /**
26 * Collects information about repository tags.
27 *
28 * @author Richard Cyganiak (richard@cyganiak.de)
29 * @version $Id: TagReport.java,v 1.3 2009/08/22 10:30:42 benoitx Exp $
30 */
31 public class TagReport implements TableReport {
32 private final ReportConfig config;
33 private final Repository repository;
34 private Table table;
35
36 public TagReport(final ReportConfig config) {
37 this.config = config;
38 this.repository = config.getRepository();
39 }
40
41 public void calculate() {
42 final LinkColumn tags = new LinkColumn("Name");
43 final SimpleTextColumn dates = new SimpleTextColumn("Date");
44 final IntegerColumn loc = new IntegerColumn("Lines");
45 loc.setShowPercentages(false);
46 final IntegerColumn churn = new IntegerColumn("LOC Churn");
47 final IntegerColumn developers = new IntegerColumn("Developers");
48 developers.setShowPercentages(false);
49
50 this.table = new Table("Repository Tags");
51 this.table.setKeysInFirstColumn(true);
52 this.table.addColumn(tags);
53 this.table.addColumn(dates);
54 this.table.addColumn(loc);
55 this.table.addColumn(churn);
56 this.table.addColumn(developers);
57
58 final List tagList = new ArrayList(this.repository.getSymbolicNames());
59 tagList.add(this.repository.getHead());
60 Collections.reverse(tagList);
61 final Iterator it = tagList.iterator();
62 while (it.hasNext()) {
63 final SymbolicName tag = (SymbolicName) it.next();
64 final Date startDate = getStartDate(tag);
65 final List revisions = getRevisionsBetween(startDate, tag.getDate());
66 if (tag == this.repository.getHead()) {
67 tags.addValue(null, "(now)");
68 } else {
69 tags.addValue(CommitLogPageMaker.getURL(tag.getDate()) + "#" + CommitLogPageMaker.getAnchor(tag), tag.getName());
70 }
71 dates.addValue(HTML.getDate(tag.getDate()));
72 loc.addValue(getLOC(tag));
73 churn.addValue(getLOCChurn(revisions));
74 developers.addValue(countDevelopers(revisions));
75 }
76 }
77
78 public Table getTable() {
79 return this.table;
80 }
81
82 private int getLOC(final SymbolicName tag) {
83 int loc = 0;
84 final Iterator it = tag.getRevisions().iterator();
85 while (it.hasNext()) {
86 final Revision revision = (Revision) it.next();
87 loc += revision.getLines();
88 }
89 return loc;
90 }
91
92 /**
93 * @param start Exclusive
94 * @param end Inclusive
95 */
96 private List getRevisionsBetween(final Date start, final Date end) {
97 final List revisions = new ArrayList();
98 final Iterator it = this.repository.getRevisions().iterator();
99 while (it.hasNext()) {
100 final Revision revision = (Revision) it.next();
101 final long time = revision.getDate().getTime();
102 if (time > start.getTime() && time <= end.getTime()) {
103 revisions.add(revision);
104 }
105 }
106 return revisions;
107 }
108
109 private int getLOCChurn(final List revisions) {
110 int churn = 0;
111 final Iterator it = revisions.iterator();
112 while (it.hasNext()) {
113 final Revision revision = (Revision) it.next();
114 churn += revision.getNewLines();
115 }
116 return churn;
117 }
118
119 private Date getStartDate(final SymbolicName tag) {
120 final SortedSet earlierTags = this.repository.getSymbolicNames().headSet(tag);
121 if (earlierTags.isEmpty()) {
122 return this.repository.getFirstDate();
123 }
124 return ((SymbolicName) earlierTags.last()).getDate();
125 }
126
127 private int countDevelopers(final Collection revisions) {
128 final Set authors = new HashSet();
129 Iterator it = revisions.iterator();
130 while (it.hasNext()) {
131 final Revision revision = (Revision) it.next();
132 authors.add(revision.getAuthor());
133 }
134 int result = 0;
135 it = authors.iterator();
136 while (it.hasNext()) {
137 final Author author = (Author) it.next();
138 if (this.config.isDeveloper(author)) {
139 result++;
140 }
141 }
142 return result;
143 }
144 }