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 import net.sourceforge.pmd.util.StringUtil;
8
9 import java.util.Iterator;
10
11 public class SimpleRenderer implements Renderer {
12
13 private String separator;
14 private boolean trimLeadingWhitespace;
15
16 public static final String defaultSeparator = "=====================================================================";
17
18 public SimpleRenderer() {
19 this(false);
20 }
21
22 public SimpleRenderer(boolean trimLeadingWhitespace) {
23 this(defaultSeparator);
24 this.trimLeadingWhitespace = trimLeadingWhitespace;
25 }
26
27 public SimpleRenderer(String theSeparator) {
28 separator = theSeparator;
29 }
30
31 private void renderOn(StringBuffer rpt, Match match) {
32
33 rpt.append("Found a ").append(match.getLineCount()).append(" line (").append(match.getTokenCount()).append(" tokens) duplication in the following files: ").append(PMD.EOL);
34
35 TokenEntry mark;
36 for (Iterator occurrences = match.iterator(); occurrences.hasNext();) {
37 mark = (TokenEntry) occurrences.next();
38 rpt.append("Starting at line ").append(mark.getBeginLine()).append(" of ").append(mark.getTokenSrcID()).append(PMD.EOL);
39 }
40
41 rpt.append(PMD.EOL);
42
43 String source = match.getSourceCodeSlice();
44
45 if (trimLeadingWhitespace) {
46 String[] lines = source.split("[" + PMD.EOL + "]");
47 int trimDepth = StringUtil.maxCommonLeadingWhitespaceForAll(lines);
48 if (trimDepth > 0) {
49 lines = StringUtil.trimStartOn(lines, trimDepth);
50 }
51 for (int i=0; i<lines.length; i++) {
52 rpt.append(lines[i]).append(PMD.EOL);
53 }
54 return;
55 }
56
57 rpt.append(source).append(PMD.EOL);
58 }
59
60
61 public String render(Iterator matches) {
62
63 StringBuffer rpt = new StringBuffer(300);
64
65 if (matches.hasNext()) {
66 renderOn(rpt, (Match)matches.next());
67 }
68
69 Match match;
70 while (matches.hasNext()) {
71 match = (Match) matches.next();
72 rpt.append(separator).append(PMD.EOL);
73 renderOn(rpt, match);
74
75 }
76 return rpt.toString();
77 }
78 }