/* * Sonar PDF Report (Maven plugin) * Copyright (C) 2010 klicap - ingenieria del puzle * dev@sonar.codehaus.org * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 3 of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02 */ package org.sonar.report.pdf; import java.awt.Color; import java.io.IOException; import java.net.URL; import java.util.Iterator; import java.util.LinkedList; import java.util.List; import java.util.Properties; import org.sonar.report.pdf.entity.Project; import org.sonar.report.pdf.entity.Rule; import org.sonar.report.pdf.entity.Violation; import org.sonar.report.pdf.entity.exception.ReportException; import com.lowagie.text.ChapterAutoNumber; import com.lowagie.text.Document; import com.lowagie.text.DocumentException; import com.lowagie.text.Paragraph; import com.lowagie.text.Phrase; import com.lowagie.text.Section; import com.lowagie.text.pdf.PdfPTable; public class TeamWorkbookPDFReporter extends ExecutivePDFReporter { public TeamWorkbookPDFReporter(URL logo, String projectKey, String sonarUrl, Properties configProperties, Properties langProperties) { super(logo, projectKey, sonarUrl, configProperties, langProperties); reportType = "workbook"; } public void printPdfBody(Document document) throws DocumentException, IOException, org.dom4j.DocumentException, ReportException { Project project = super.getProject(); // Chapter 1: Report Overview (Parent project) ChapterAutoNumber chapter1 = new ChapterAutoNumber(new Paragraph(project.getName(), Style.CHAPTER_FONT)); chapter1.add(new Paragraph(getTextProperty("main.text.misc.overview"), Style.NORMAL_FONT)); Section section11 = chapter1 .addSection(new Paragraph(getTextProperty("general.report_overview"), Style.TITLE_FONT)); printDashboard(project, section11); Section section12 = chapter1.addSection(new Paragraph(getTextProperty("general.violations_analysis"), Style.TITLE_FONT)); printMostViolatedRules(project, section12); printMostViolatedFiles(project, section12); printMostComplexFiles(project, section12); printMostDuplicatedFiles(project, section12); Section section13 = chapter1.addSection(new Paragraph(getTextProperty("general.violations_details"), Style.TITLE_FONT)); printMostViolatedRulesDetails(project, section13); document.add(chapter1); Iterator<Project> it = project.getSubprojects().iterator(); while (it.hasNext()) { Project subproject = it.next(); ChapterAutoNumber chapterN = new ChapterAutoNumber(new Paragraph(subproject.getName(), Style.CHAPTER_FONT)); Section sectionN1 = chapterN.addSection(new Paragraph(getTextProperty("general.report_overview"), Style.TITLE_FONT)); printDashboard(subproject, sectionN1); Section sectionN2 = chapterN.addSection(new Paragraph(getTextProperty("general.violations_analysis"), Style.TITLE_FONT)); printMostViolatedRules(subproject, sectionN2); printMostViolatedFiles(subproject, sectionN2); printMostComplexFiles(subproject, sectionN2); printMostDuplicatedFiles(subproject, sectionN2); Section sectionN3 = chapterN.addSection(new Paragraph(getTextProperty("general.violations_details"), Style.TITLE_FONT)); printMostViolatedRulesDetails(subproject, sectionN3); document.add(chapterN); } } private void printMostViolatedRulesDetails(Project project, Section section13) { Iterator<Rule> it = project.getMostViolatedRules().iterator(); while (it.hasNext()) { Rule rule = it.next(); List<String> files = new LinkedList<String>(); List<String> lines = new LinkedList<String>(); Iterator<Violation> itViolations = rule.getTopViolations().iterator(); while (itViolations.hasNext()) { Violation violation = itViolations.next(); String[] components = violation.getResource().split("\\."); files.add(components[components.length - 1]); lines.add(violation.getLine()); } section13.add(createViolationsDetailedTable(rule.getName(), files, lines)); } } private PdfPTable createViolationsDetailedTable(String ruleName, List<String> files, List<String> lines) { // TODO: internationalize this PdfPTable table = new PdfPTable(10); Iterator<String> itLeft = files.iterator(); Iterator<String> itRight = lines.iterator(); table.getDefaultCell().setColspan(1); table.getDefaultCell().setBackgroundColor(new Color(255, 228, 181)); table.addCell(new Phrase("Rule", Style.NORMAL_FONT)); table.getDefaultCell().setColspan(9); table.getDefaultCell().setBackgroundColor(Color.WHITE); table.addCell(new Phrase(ruleName, Style.NORMAL_FONT)); table.getDefaultCell().setColspan(10); table.getDefaultCell().setBackgroundColor(Color.GRAY); table.addCell(""); table.getDefaultCell().setColspan(7); table.getDefaultCell().setBackgroundColor(new Color(255, 228, 181)); table.addCell(new Phrase("File", Style.NORMAL_FONT)); table.getDefaultCell().setColspan(3); table.addCell(new Phrase("Line", Style.NORMAL_FONT)); table.getDefaultCell().setBackgroundColor(Color.WHITE); int i = 0; String lineNumbers = ""; while (i < files.size() - 1) { if (lineNumbers.equals("")) { lineNumbers += lines.get(i); } else { lineNumbers += ", " + lines.get(i); } if (!files.get(i).equals(files.get(i + 1))) { table.getDefaultCell().setColspan(7); table.addCell(files.get(i)); table.getDefaultCell().setColspan(3); table.addCell(lineNumbers); lineNumbers = ""; } i++; } table.getDefaultCell().setColspan(7); table.addCell(files.get(files.size() - 1)); table.getDefaultCell().setColspan(3); if (lineNumbers.equals("")) { lineNumbers += lines.get(i); } else { lineNumbers += ", " + lines.get(lines.size() - 1); } table.addCell(lineNumbers); table.setSpacingBefore(20); table.setSpacingAfter(20); table.setLockedWidth(false); table.setWidthPercentage(90); return table; } }