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