1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 package net.sf.statcvs.model;
21
22 import java.util.Date;
23 import java.util.HashSet;
24 import java.util.Iterator;
25 import java.util.Set;
26
27 /**
28 * Represents a commit, which may consist of several {@link Revision}
29 * objects. A commit means that several files were committed at once by the
30 * same author with the same message.
31 *
32 * TODO: Rename getAuthor() to getLogin(), getAffectedFiles() to getAffectedFileNames() (or change to return CvsFiles?)
33 *
34 * @author Richard Cyganiak <richard@cyganiak.de>
35 * @version $Id: Commit.java,v 1.17 2009/08/20 17:44:05 benoitx Exp $
36 */
37 public class Commit implements Comparable {
38 private final Set revisions = new HashSet();
39 private final Revision aRevision;
40
41 /**
42 * Creates a new instance which consists of the given revision.
43 * @param revision the single revision out of which the commit will
44 * be created
45 */
46 public Commit(final Revision revision) {
47 revisions.add(revision);
48 aRevision = revision;
49 }
50
51 /**
52 * Adds a revision to the commit. The revision must be part of the
53 * commit, that is, it must have the same date, author and message
54 * as all other revisions in the commit.
55 * @param revision the <code>Revision</code> to add.
56 */
57 public void addRevision(final Revision revision) {
58 revisions.add(revision);
59 }
60
61 /**
62 * Returns the {@link Revision} objects that make up this commit.
63 *
64 * @return a set of <tt>Revision</tt> instances
65 */
66 public Set getRevisions() {
67 return revisions;
68 }
69
70 /**
71 * Returns the author of the commit.
72 * @return the author
73 */
74 public Author getAuthor() {
75 return aRevision.getAuthor();
76 }
77
78 /**
79 * Returns the comment of the commit.
80 * @return the comment
81 */
82 public String getComment() {
83 return aRevision.getComment();
84 }
85
86 /**
87 * Returns the date when the commit took place. The implementation
88 * simply returns the timestamp of the first change of the commit.
89 * @return a date within the timeframe of the commit
90 */
91 public Date getDate() {
92 return aRevision.getDate();
93 }
94
95 /**
96 * Returns a <code>String</code> <code>Set</code> containing all filenames
97 * which were affected by this <code>Commit</code>.
98 * @return a <code>Set</code> of <code>String</code>s
99 */
100 public Set getAffectedFiles() {
101 final Set result = new HashSet();
102 final Iterator it = revisions.iterator();
103 while (it.hasNext()) {
104 final Revision element = (Revision) it.next();
105 result.add(element.getFile().getFilenameWithPath());
106 }
107 return result;
108 }
109
110 /**
111 * Compares this commit to another revision, based on their date.
112 * @see java.lang.Comparable#compareTo(java.lang.Object)
113 */
114 public int compareTo(final Object other) {
115 final Commit otherCommit = (Commit) other;
116 return getDate().compareTo(otherCommit.getDate());
117 }
118
119 public boolean equals(final Object rhs) {
120 if (rhs == null) {
121 return false;
122 }
123 if (!(rhs instanceof Commit)) {
124 return false;
125 }
126 final Commit that = (Commit) rhs;
127 if (this.getDate() == null || that.getDate() == null) {
128 return false;
129 }
130 return this.getDate().equals(that.getDate());
131 }
132
133 public int hashCode() {
134 return getDate().hashCode();
135 }
136 }