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 java.util.ArrayList;
7 import java.util.HashSet;
8 import java.util.List;
9 import java.util.Set;
10
11 public class MatchCollector {
12
13 private List marks;
14 private MarkComparator markComparator;
15
16 public MatchCollector(List marks, MarkComparator mc) {
17 this.marks = marks;
18 this.markComparator = mc;
19 }
20
21 public List collect(int minimumLength) {
22 List matches = new ArrayList();
23 Set filesUsedSoFar = new HashSet();
24 for (int i = 1; i < marks.size(); i++) {
25 Mark mark1 = (Mark)marks.get(i);
26 Mark mark2 = (Mark)marks.get(i - 1);
27 if (!filesUsedSoFar.contains(mark1.getTokenSrcID()) && !filesUsedSoFar.contains(mark2.getTokenSrcID())) {
28 int dupes = countDuplicateTokens(mark1, mark2);
29 if (dupes >= minimumLength) {
30 filesUsedSoFar.add(mark1.getTokenSrcID());
31 filesUsedSoFar.add(mark2.getTokenSrcID());
32 Match match = new Match(dupes, mark1, mark2);
33 matches.add(match);
34 }
35 }
36 }
37 return matches;
38 }
39
40 private int countDuplicateTokens(Mark mark1, Mark mark2) {
41 int index = 0;
42 while (!matchEnded(markComparator.tokenAt(index, mark1), markComparator.tokenAt(index, mark2))) {
43 index++;
44 }
45 return index;
46 }
47
48 private boolean matchEnded(TokenEntry token1, TokenEntry token2) {
49 return !token1.equals(token2) || token1 == TokenEntry.EOF || token2 == TokenEntry.EOF;
50 }
51 }
This page was automatically generated by Maven