1
2
3
4 package net.sourceforge.pmd.cpd;
5
6 import net.sourceforge.pmd.PMD;
7
8 import java.util.Comparator;
9 import java.util.Iterator;
10 import java.util.Set;
11 import java.util.TreeSet;
12
13 public class Match implements Comparable<Match> {
14
15 private int tokenCount;
16 private int lineCount;
17 private Set<TokenEntry> markSet = new TreeSet<TokenEntry>();
18 private String code;
19 private String label;
20
21 public static final Comparator<Match> MATCHES_COMPARATOR = new Comparator<Match>() {
22 public int compare(Match ma, Match mb) {
23 return mb.getMarkCount() - ma.getMarkCount();
24 }
25 };
26
27 public static final Comparator<Match> LINES_COMPARATOR = new Comparator<Match>() {
28 public int compare(Match ma, Match mb) {
29 return mb.getLineCount() - ma.getLineCount();
30 }
31 };
32
33 public static final Comparator<Match> LABEL_COMPARATOR = new Comparator<Match>() {
34 public int compare(Match ma, Match mb) {
35 if (ma.getLabel() == null) {
36 return 1;
37 }
38 if (mb.getLabel() == null) {
39 return -1;
40 }
41 return mb.getLabel().compareTo(ma.getLabel());
42 }
43 };
44
45 public static final Comparator<Match> LENGTH_COMPARATOR = new Comparator<Match>() {
46 public int compare(Match ma, Match mb) {
47 return mb.getLineCount() - ma.getLineCount();
48 }
49 };
50
51 public Match(int tokenCount, TokenEntry first, TokenEntry second) {
52 markSet.add(first);
53 markSet.add(second);
54 this.tokenCount = tokenCount;
55 }
56
57 public int getMarkCount() {
58 return markSet.size();
59 }
60
61 public void setLineCount(int lineCount) {
62 this.lineCount = lineCount;
63 }
64
65 public int getLineCount() {
66 return this.lineCount;
67 }
68
69 public int getTokenCount() {
70 return this.tokenCount;
71 }
72
73 public String getSourceCodeSlice() {
74 return this.code;
75 }
76
77 public void setSourceCodeSlice(String code) {
78 this.code = code;
79 }
80
81 public Iterator<TokenEntry> iterator() {
82 return markSet.iterator();
83 }
84
85 public int compareTo(Match other) {
86 int diff = other.getTokenCount() - getTokenCount();
87 if (diff != 0) {
88 return diff;
89 }
90 return getFirstMark().getIndex() - other.getFirstMark().getIndex();
91 }
92
93 public TokenEntry getFirstMark() {
94 return getMark(0);
95 }
96
97 public TokenEntry getSecondMark() {
98 return getMark(1);
99 }
100
101 public String toString() {
102 return "Match: " + PMD.EOL + "tokenCount = " + tokenCount + PMD.EOL + "marks = " + markSet.size();
103 }
104
105 public Set<TokenEntry> getMarkSet() {
106 return markSet;
107 }
108
109 public int getEndIndex() {
110 return getMark(0).getIndex() + getTokenCount() - 1;
111 }
112
113 public void setMarkSet(Set<TokenEntry> markSet) {
114 this.markSet = markSet;
115 }
116
117 public void setLabel(String aLabel) {
118 label = aLabel;
119 }
120
121 public String getLabel() {
122 return label;
123 }
124
125 public void addTokenEntry(TokenEntry entry){
126 markSet.add(entry);
127 }
128
129 private TokenEntry getMark(int index) {
130 TokenEntry result = null;
131 int i = 0;
132 for (Iterator<TokenEntry> it = markSet.iterator(); it.hasNext() && i < index + 1; ){
133 result = it.next();
134 i++;
135 }
136 return result;
137 }
138 }