View Javadoc

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.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 TokenEntry[] marks = new TokenEntry[2];
19      private String code;
20      private MatchCode mc;
21      private String label;
22      
23      public static final Comparator<Match> MatchesComparator = new Comparator<Match>() {
24      	public int compare(Match ma, Match mb) {
25      		return mb.getMarkCount() - ma.getMarkCount();
26      	}
27      };
28      
29      public static final Comparator<Match> LinesComparator = new Comparator<Match>() {
30      	public int compare(Match ma, Match mb) {
31      		return mb.getLineCount() - ma.getLineCount();
32      	}
33      };
34      
35      public static final Comparator<Match> LabelComparator = new Comparator<Match>() {
36      	public int compare(Match ma, Match mb) {
37      		if (ma.getLabel() == null) return 1;
38      		if (mb.getLabel() == null) return -1;
39      		return mb.getLabel().compareTo(ma.getLabel());
40      	}
41      };
42      
43      public static final Comparator<Match> LengthComparator = new Comparator<Match>() {
44          public int compare(Match ma, Match mb) {
45              return mb.getLineCount() - ma.getLineCount();
46          }
47      };
48      
49      public static class MatchCode {
50  
51          private int first;
52          private int second;
53  
54          public MatchCode() {
55          }
56  
57          public MatchCode(TokenEntry m1, TokenEntry m2) {
58              first = m1.getIndex();
59              second = m2.getIndex();
60          }
61  
62          public int hashCode() {
63              return first + 37 * second;
64          }
65  
66          public boolean equals(Object other) {
67              MatchCode mc = (MatchCode) other;
68              return mc.first == first && mc.second == second;
69          }
70  
71          public void setFirst(int first) {
72              this.first = first;
73          }
74  
75          public void setSecond(int second) {
76              this.second = second;
77          }
78  
79      }
80  
81      public Match(int tokenCount, TokenEntry first, TokenEntry second) {
82          markSet.add(first);
83          markSet.add(second);
84          marks[0] = first;
85          marks[1] = second;
86          this.tokenCount = tokenCount;
87      }
88  
89      public int getMarkCount() {
90          return markSet.size();
91      }
92  
93      public void setLineCount(int lineCount) {
94          this.lineCount = lineCount;
95      }
96  
97      public int getLineCount() {
98          return this.lineCount;
99      }
100 
101     public int getTokenCount() {
102         return this.tokenCount;
103     }
104 
105     public String getSourceCodeSlice() {
106         return this.code;
107     }
108 
109     public void setSourceCodeSlice(String code) {
110         this.code = code;
111     }
112 
113     public Iterator<TokenEntry> iterator() {
114         return markSet.iterator();
115     }
116 
117     public int compareTo(Match other) {
118         int diff = other.getTokenCount() - getTokenCount();
119         if (diff != 0) {
120             return diff;
121         }
122         return other.getFirstMark().getIndex() - getFirstMark().getIndex();
123     }
124 
125     public TokenEntry getFirstMark() {
126         return marks[0];
127     }
128 
129     public TokenEntry getSecondMark() {
130         return marks[1];
131     }
132 
133     public String toString() {
134         return "Match: " + PMD.EOL + "tokenCount = " + tokenCount + PMD.EOL + "marks = " + markSet.size();
135     }
136 
137     public Set<TokenEntry> getMarkSet() {
138         return markSet;
139     }
140 
141     public MatchCode getMatchCode() {
142         if (mc == null) {
143             mc = new MatchCode(marks[0], marks[1]);
144         }
145         return mc;
146     }
147 
148     public int getEndIndex() {
149         return marks[1].getIndex() + getTokenCount() - 1;
150     }
151 
152     public void setMarkSet(Set<TokenEntry> markSet) {
153         this.markSet = markSet;
154     }
155 
156     public void setLabel(String aLabel) {
157     	label = aLabel;
158     }
159     
160     public String getLabel() {
161     	return label;
162     }
163 }