/**
* BSD-style license; for more info see http://pmd.sourceforge.net/license.html
*/
package org.rubypeople.rdt.internal.core.pmd;
import java.util.Comparator;
import java.util.Iterator;
import java.util.Set;
import java.util.TreeSet;
public class Match implements Comparable {
private int tokenCount;
private int lineCount;
private Set<TokenEntry> markSet = new TreeSet<TokenEntry>();
private TokenEntry[] marks = new TokenEntry[2];
private String code;
private MatchCode mc;
private String label;
public static final Comparator MatchesComparator = new Comparator() {
public int compare(Object a, Object b) {
Match ma = (Match)a;
Match mb = (Match)b;
return mb.getMarkCount() - ma.getMarkCount();
}
};
public static final Comparator LinesComparator = new Comparator() {
public int compare(Object a, Object b) {
Match ma = (Match)a;
Match mb = (Match)b;
return mb.getLineCount() - ma.getLineCount();
}
};
public static final Comparator LabelComparator = new Comparator() {
public int compare(Object a, Object b) {
Match ma = (Match)a;
Match mb = (Match)b;
if (ma.getLabel() == null) return 1;
if (mb.getLabel() == null) return -1;
return mb.getLabel().compareTo(ma.getLabel());
}
};
public static final Comparator LengthComparator = new Comparator() {
public int compare(Object o1, Object o2) {
Match m1 = (Match) o1;
Match m2 = (Match) o2;
return m2.getLineCount() - m1.getLineCount();
}
};
public static class MatchCode {
private int first;
private int second;
public MatchCode() {
}
public MatchCode(TokenEntry m1, TokenEntry m2) {
first = m1.getIndex();
second = m2.getIndex();
}
public int hashCode() {
return first + 37 * second;
}
public boolean equals(Object other) {
MatchCode mc = (MatchCode) other;
return mc.first == first && mc.second == second;
}
public void setFirst(int first) {
this.first = first;
}
public void setSecond(int second) {
this.second = second;
}
}
public Match(int tokenCount, TokenEntry first, TokenEntry second) {
markSet.add(first);
markSet.add(second);
marks[0] = first;
marks[1] = second;
this.tokenCount = tokenCount;
}
public int getMarkCount() {
return markSet.size();
}
public void setLineCount(int lineCount) {
this.lineCount = lineCount;
}
public int getLineCount() {
return this.lineCount;
}
public int getTokenCount() {
return this.tokenCount;
}
public String getSourceCodeSlice() {
return this.code;
}
public void setSourceCodeSlice(String code) {
this.code = code;
}
public Iterator<TokenEntry> iterator() {
return markSet.iterator();
}
public int compareTo(Object o) {
Match other = (Match) o;
int diff = other.getTokenCount() - getTokenCount();
if (diff != 0) {
return diff;
}
return other.getFirstMark().getIndex() - getFirstMark().getIndex();
}
public TokenEntry getFirstMark() {
return marks[0];
}
public TokenEntry getSecondMark() {
return marks[1];
}
public String toString() {
return "Match: " + PMD.EOL + "tokenCount = " + tokenCount + PMD.EOL + "marks = " + markSet.size();
}
public Set<TokenEntry> getMarkSet() {
return markSet;
}
public MatchCode getMatchCode() {
if (mc == null) {
mc = new MatchCode(marks[0], marks[1]);
}
return mc;
}
public int getEndIndex() {
return marks[1].getIndex() + getTokenCount() - 1;
}
public void setMarkSet(Set<TokenEntry> markSet) {
this.markSet = markSet;
}
public void setLabel(String aLabel) {
label = aLabel;
}
public String getLabel() {
return label;
}
}