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 public String render(Iterator matches) {
17 StringBuffer buffer = new StringBuffer(300);
18 buffer.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
19 buffer.append("<pmd-cpd>").append(PMD.EOL);
20 Match match;
21 while (matches.hasNext()) {
22 match = (Match) matches.next();
23 buffer.append("<duplication lines=\"");
24 buffer.append(match.getLineCount());
25 buffer.append("\" tokens=\"");
26 buffer.append(match.getTokenCount());
27 buffer.append("\">").append(PMD.EOL);
28
29 TokenEntry mark;
30 for (Iterator iterator = match.iterator(); iterator.hasNext();) {
31 mark = (TokenEntry) iterator.next();
32 buffer.append("<file line=\"");
33 buffer.append(mark.getBeginLine());
34 buffer.append("\" path=\"");
35 buffer.append(mark.getTokenSrcID());
36 buffer.append("\"/>").append(PMD.EOL);
37 }
38 String codeFragment = match.getSourceCodeSlice();
39 if (codeFragment != null) {
40 buffer.append("<codefragment>").append(PMD.EOL);
41 buffer.append("<![CDATA[").append(PMD.EOL);
42 buffer.append(StringUtil.replaceString(codeFragment, "]]>", "]]>")).append(PMD.EOL + "]]>" + PMD.EOL + "</codefragment>" + PMD.EOL);
43 }
44 buffer.append("</duplication>").append(PMD.EOL);
45 }
46 buffer.append("</pmd-cpd>");
47 return buffer.toString();
48 }
49 }