01: /**
02: * BSD-style license; for more info see http://pmd.sourceforge.net/license.html
03: */package net.sourceforge.pmd.cpd;
04:
05: import net.sourceforge.pmd.PMD;
06: import net.sourceforge.pmd.util.StringUtil;
07:
08: import java.util.Iterator;
09:
10: /**
11: * @author Philippe T'Seyen
12: */
13: public class XMLRenderer implements Renderer {
14:
15: private String encoding;
16:
17: public XMLRenderer() {
18: this (System.getProperty("file.encoding"));
19: }
20:
21: public XMLRenderer(String e) {
22: this .encoding = e;
23: }
24:
25: public String render(Iterator<Match> matches) {
26: StringBuffer buffer = new StringBuffer(300);
27: buffer.append("<?xml version=\"1.0\" encoding=\"");
28: buffer.append(encoding);
29: buffer.append("\"?>").append(PMD.EOL);
30: buffer.append("<pmd-cpd>").append(PMD.EOL);
31: Match match;
32: while (matches.hasNext()) {
33: match = matches.next();
34: buffer.append("<duplication lines=\"");
35: buffer.append(match.getLineCount());
36: buffer.append("\" tokens=\"");
37: buffer.append(match.getTokenCount());
38: buffer.append("\">").append(PMD.EOL);
39:
40: TokenEntry mark;
41: for (Iterator<TokenEntry> iterator = match.iterator(); iterator
42: .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(
55: StringUtil.replaceString(codeFragment, "]]>",
56: "]]>")).append(
57: PMD.EOL + "]]>" + PMD.EOL + "</codefragment>"
58: + PMD.EOL);
59: }
60: buffer.append("</duplication>").append(PMD.EOL);
61: }
62: buffer.append("</pmd-cpd>");
63: return buffer.toString();
64: }
65: }
|