import groovy.xml.MarkupBuilder class XmlRenderer { private _xml; def XmlRenderer(counter) { _xml = render(counter.project) } def render() { _xml } protected render(project) { def writer = new StringWriter() def xml = new MarkupBuilder(writer) xml.project(pathCount: project.pathCount, fileCount: project.fileCount, directoryCount: project.directoryCount, byteCount: project.byteCount, lineCount: project.lineCount) { renderTypeBreakdown(xml, project) if (project.paths.size() > 1) { project.paths.each({ path -> delegate.path(path: path.path, fileCount: path.fileCount, directoryCount: path.directoryCount, byteCount: path.byteCount, lineCount: path.lineCount) { renderTypeBreakdown(xml, path) } }) } } writer.toString() } protected renderTypeBreakdown(xml, item) { [text: item.textFiles, binary: item.binaryFiles].each({ key, value -> def isText = key == "text" xml.type(buildAttributes(key, "type", value, isText)) { new TreeMap(value.groupBy({ it.extension })).each({k, v -> extension(buildAttributes(k, "extension", v, isText)) }) } }) } protected buildAttributes(key, keyName, items, includeLineCount) { def attrs = [ (keyName): key, fileCount: items.size(), byteCount: items.sum(0, { it.byteCount }) ] if (includeLineCount) { attrs.lineCount = items.sum(0, { it.lineCount }) attrs.realLineCount = items.sum(0, { it.realLineCount }) } attrs } }