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