1 /***
2 * BSD-style license; for more info see http://pmd.sourceforge.net/license.html
3 */
4 package net.sourceforge.pmd.cpd;
5
6 import net.sourceforge.pmd.PMD;
7
8 import java.util.Iterator;
9 import java.util.Set;
10 import java.util.TreeSet;
11
12 public class Match implements Comparable {
13
14 private int tokenCount;
15 private int lineCount;
16 private Set markSet = new TreeSet();
17 private TokenEntry[] marks = new TokenEntry[2];
18 private String code;
19 private MatchCode mc;
20
21 public static class MatchCode {
22
23 private int first;
24 private int second;
25
26 public MatchCode() {
27 }
28
29 public MatchCode(TokenEntry m1, TokenEntry m2) {
30 first = m1.getIndex();
31 second = m2.getIndex();
32 }
33
34 public int hashCode() {
35 return first + 37 * second;
36 }
37
38 public boolean equals(Object other) {
39 MatchCode mc = (MatchCode) other;
40 return mc.first == first && mc.second == second;
41 }
42
43 public void setFirst(int first) {
44 this.first = first;
45 }
46
47 public void setSecond(int second) {
48 this.second = second;
49 }
50
51 }
52
53 public Match(int tokenCount, TokenEntry first, TokenEntry second) {
54 markSet.add(first);
55 markSet.add(second);
56 marks[0] = first;
57 marks[1] = second;
58 this.tokenCount = tokenCount;
59 }
60
61 public int getMarkCount() {
62 return markSet.size();
63 }
64
65 public void setLineCount(int lineCount) {
66 this.lineCount = lineCount;
67 }
68
69 public int getLineCount() {
70 return this.lineCount;
71 }
72
73 public int getTokenCount() {
74 return this.tokenCount;
75 }
76
77 public String getSourceCodeSlice() {
78 return this.code;
79 }
80
81 public void setSourceCodeSlice(String code) {
82 this.code = code;
83 }
84
85 public Iterator iterator() {
86 return markSet.iterator();
87 }
88
89 public int compareTo(Object o) {
90 Match other = (Match) o;
91 int diff = other.getTokenCount() - getTokenCount();
92 if (diff != 0) {
93 return diff;
94 }
95 return other.getFirstMark().getIndex() - getFirstMark().getIndex();
96 }
97
98 public TokenEntry getFirstMark() {
99 return marks[0];
100 }
101
102 public TokenEntry getSecondMark() {
103 return marks[1];
104 }
105
106 public String toString() {
107 return "Match: " + PMD.EOL + "tokenCount = " + tokenCount + PMD.EOL + "marks = " + markSet.size();
108 }
109
110 public Set getMarkSet() {
111 return markSet;
112 }
113
114 public MatchCode getMatchCode() {
115 if (mc == null) {
116 mc = new MatchCode(marks[0], marks[1]);
117 }
118 return mc;
119 }
120
121 public int getEndIndex() {
122 return marks[1].getIndex() + getTokenCount() - 1;
123 }
124
125 public void setMarkSet(Set markSet) {
126 this.markSet = markSet;
127 }
128
129 }