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   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 DEFAULT_SEPARATOR = "=====================================================================";
17  	
18  	public SimpleRenderer() {
19  		this(false);
20  	}
21  	
22  	public SimpleRenderer(boolean trimLeadingWhitespace) {
23  		this(DEFAULT_SEPARATOR);
24          this.trimLeadingWhitespace = trimLeadingWhitespace;
25  	}
26  	
27  	public SimpleRenderer(String theSeparator) {
28  		separator = theSeparator;
29  	}
30  	
31  	private void renderOn(StringBuilder 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            for (Iterator<Mark> occurrences = match.iterator(); occurrences.hasNext();) {
36                Mark mark = occurrences.next();
37                rpt.append("Starting at line ").append(mark.getBeginLine()).append(" of ").append(mark.getFilename()).append(PMD.EOL);
38            }
39            
40            rpt.append(PMD.EOL);	// add a line to separate the source from the desc above
41            
42            String source = match.getSourceCodeSlice();
43  
44            if (trimLeadingWhitespace) {
45                String[] lines = source.split("[" + PMD.EOL + "]");
46          	  int trimDepth = StringUtil.maxCommonLeadingWhitespaceForAll(lines);
47          	  if (trimDepth > 0) {
48          		  lines = StringUtil.trimStartOn(lines, trimDepth);
49          	  }
50          	  for (int i=0; i<lines.length; i++) {
51          		  rpt.append(lines[i]).append(PMD.EOL);
52          	  }  
53          	  return;
54            }
55            
56            rpt.append(source).append(PMD.EOL);
57  	}
58  	
59  	
60      public String render(Iterator<Match> matches) {
61      	
62      	StringBuilder rpt = new StringBuilder(300);
63          
64          if (matches.hasNext()) {
65          	renderOn(rpt, matches.next());
66          }
67          
68          Match match;
69          while (matches.hasNext()) {
70              match = matches.next();
71              rpt.append(separator).append(PMD.EOL);
72              renderOn(rpt, match);
73            
74          }
75          return rpt.toString();
76      }
77  }