/** * BSD-style license; for more info see http://pmd.sourceforge.net/license.html */ package net.sourceforge.pmd.cpd; import java.util.Comparator; import java.util.Iterator; import java.util.Set; import java.util.TreeSet; import net.sourceforge.pmd.PMD; public class Match implements Comparable<Match>, Iterable<Mark> { private int tokenCount; private Set<Mark> markSet = new TreeSet<>(); private String label; public static final Comparator<Match> MATCHES_COMPARATOR = new Comparator<Match>() { @Override public int compare(Match ma, Match mb) { return mb.getMarkCount() - ma.getMarkCount(); } }; public static final Comparator<Match> LINES_COMPARATOR = new Comparator<Match>() { @Override public int compare(Match ma, Match mb) { return mb.getLineCount() - ma.getLineCount(); } }; public static final Comparator<Match> LABEL_COMPARATOR = new Comparator<Match>() { @Override public int compare(Match ma, Match mb) { if (ma.getLabel() == null) { return 1; } if (mb.getLabel() == null) { return -1; } return mb.getLabel().compareTo(ma.getLabel()); } }; public static final Comparator<Match> LENGTH_COMPARATOR = new Comparator<Match>() { @Override public int compare(Match ma, Match mb) { return mb.getLineCount() - ma.getLineCount(); } }; public Match(int tokenCount, Mark first, Mark second) { markSet.add(first); markSet.add(second); this.tokenCount = tokenCount; } public Match(int tokenCount, TokenEntry first, TokenEntry second) { this(tokenCount, new Mark(first), new Mark(second)); } public int getMarkCount() { return markSet.size(); } public int getLineCount() { return getMark(0).getLineCount(); } public int getTokenCount() { return this.tokenCount; } public String getSourceCodeSlice() { return this.getMark(0).getSourceCodeSlice(); } @Override public Iterator<Mark> iterator() { return markSet.iterator(); } @Override public int compareTo(Match other) { int diff = other.getTokenCount() - getTokenCount(); if (diff != 0) { return diff; } return getFirstMark().compareTo(other.getFirstMark()); } public Mark getFirstMark() { return getMark(0); } public Mark getSecondMark() { return getMark(1); } @Override public String toString() { return "Match: " + PMD.EOL + "tokenCount = " + tokenCount + PMD.EOL + "marks = " + markSet.size(); } public Set<Mark> getMarkSet() { return markSet; } public int getEndIndex() { return getMark(0).getToken().getIndex() + getTokenCount() - 1; } public void setMarkSet(Set<Mark> markSet) { this.markSet = markSet; } public void setLabel(String aLabel) { label = aLabel; } public String getLabel() { return label; } public void addTokenEntry(TokenEntry entry) { markSet.add(new Mark(entry)); } private Mark getMark(int index) { Mark result = null; int i = 0; for (Iterator<Mark> it = markSet.iterator(); it.hasNext() && i < index + 1;) { result = it.next(); i++; } return result; } }