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 }