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