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 /**
12 * @author Philippe T'Seyen
13 */
14 public class XMLRenderer implements Renderer {
15
16 private String encoding;
17
18 public XMLRenderer() {
19 this(System.getProperty("file.encoding"));
20 }
21
22 public XMLRenderer(String e) {
23 this.encoding = e;
24 }
25
26 public String render(Iterator<Match> matches) {
27 StringBuffer buffer = new StringBuffer(300);
28 buffer.append("<?xml version=\"1.0\" encoding=\"");
29 buffer.append(encoding);
30 buffer.append("\"?>").append(PMD.EOL);
31 buffer.append("<pmd-cpd>").append(PMD.EOL);
32 Match match;
33 while (matches.hasNext()) {
34 match = matches.next();
35 buffer.append("<duplication lines=\"");
36 buffer.append(match.getLineCount());
37 buffer.append("\" tokens=\"");
38 buffer.append(match.getTokenCount());
39 buffer.append("\">").append(PMD.EOL);
40
41 TokenEntry mark;
42 for (Iterator<TokenEntry> iterator = match.iterator(); iterator.hasNext();) {
43 mark = iterator.next();
44 buffer.append("<file line=\"");
45 buffer.append(mark.getBeginLine());
46 buffer.append("\" path=\"");
47 buffer.append(mark.getTokenSrcID());
48 buffer.append("\"/>").append(PMD.EOL);
49 }
50 String codeFragment = match.getSourceCodeSlice();
51 if (codeFragment != null) {
52 buffer.append("<codefragment>").append(PMD.EOL);
53 buffer.append("<![CDATA[").append(PMD.EOL);
54 buffer.append(StringUtil.replaceString(codeFragment, "]]>", "]]>")).append(PMD.EOL + "]]>" + PMD.EOL + "</codefragment>" + PMD.EOL);
55 }
56 buffer.append("</duplication>").append(PMD.EOL);
57 }
58 buffer.append("</pmd-cpd>");
59 return buffer.toString();
60 }
61 }