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