/** * BSD-style license; for more info see http://pmd.sourceforge.net/license.html */ package net.sourceforge.pmd.cpd; 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 markSet = new TreeSet(); private TokenEntry[] marks = new TokenEntry[2]; private String code; private MatchCode mc; 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 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:\r\ntokenCount = " + tokenCount + "\r\nmarks = " + markSet.size(); } public Set 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 markSet) { this.markSet = markSet; } }