Java tutorial
/** * Copyright (C) 2008-2010, Squale Project - http://www.squale.org * * This file is part of Squale. * * Squale 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 any later version. * * Squale 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 General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with Squale. If not, see <http://www.gnu.org/licenses/>. */ package org.squale.squaleweb.applicationlayer.action.export.ppt; import java.awt.Color; import java.awt.GraphicsEnvironment; import java.awt.Rectangle; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.net.URL; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.SortedMap; import java.util.TreeMap; import javax.servlet.http.HttpServletRequest; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.poi.hslf.model.MasterSheet; import org.apache.poi.hslf.model.Slide; import org.apache.poi.hslf.model.Table; import org.apache.poi.hslf.model.TableCell; import org.jfree.chart.JFreeChart; import org.squale.squalecommon.datatransfertobject.export.audit.PracticeReportDTO; import org.squale.squalecommon.datatransfertobject.export.audit.PracticeReportDetailedDTO; import org.squale.squalecommon.datatransfertobject.export.audit.ProjectReportDTO; import org.squale.squalecommon.datatransfertobject.export.audit.QualityReportDTO; import org.squale.squalecommon.enterpriselayer.businessobject.result.rulechecking.RuleCheckingTransgressionItemBO; import org.squale.squaleweb.applicationlayer.action.accessRights.BaseDispatchAction; import org.squale.squaleweb.applicationlayer.formbean.export.AuditReportParamForm; import org.squale.squaleweb.resources.WebMessages; import org.squale.squaleweb.util.SqualeWebActionUtils; import org.squale.squaleweb.util.graph.BubbleMaker; import org.squale.squaleweb.util.graph.KiviatMaker; import org.squale.squaleweb.util.graph.PieChartMaker; /** * Data needed to create a return audit report */ public class AuditReportPPTData extends PPTData { /** List of projects data needed to create ppt */ protected List projectReports; /** * Logger */ private static Log log = LogFactory.getLog(AuditReportPPTData.class); public AuditReportPPTData(HttpServletRequest pRequest, File prez, File model, File mapping, List pProjectReports) throws PPTGeneratorException { projectReports = pProjectReports; this.request = pRequest; try { setPresentation(new FileInputStream(prez)); setModel(new FileInputStream(model)); setMapping(new FileInputStream(mapping)); } catch (FileNotFoundException e) { throw new PPTGeneratorException(e.getMessage()); } } /** * Constructor * * @param pRequest request * @param params bean containing information * @param pProjectReports list of results * @throws PPTGeneratorException if error */ public AuditReportPPTData(HttpServletRequest pRequest, AuditReportParamForm params, List pProjectReports) throws PPTGeneratorException { projectReports = pProjectReports; this.request = pRequest; if (!GraphicsEnvironment.isHeadless()) { log.warn("java.awt.headless is not activated on WAS JVM. Graphic generation will fail !"); } try { setPresentation(params.getPresentation().getInputStream()); setModel(params.getModel().getInputStream()); setMapping(params.getMapping().getInputStream()); } catch (FileNotFoundException e) { throw new PPTGeneratorException(e.getMessage()); } catch (IOException e) { throw new PPTGeneratorException(e.getMessage()); } } /** * Add pie chart by profile * * @param slideToSet slide to modify * @param where place to add shape * @throws IOException if error */ public void setProfilePieChart(Slide slideToSet, Rectangle where) throws IOException { log.info("AuditReturn - setProfilePieChart"); // Build volumetry map by profile HashMap profileVolMap = new HashMap(); for (int i = 0; i < projectReports.size(); i++) { log.info("AuditReturn - setProfilePieChart Project n" + i); ProjectReportDTO curProject = (ProjectReportDTO) projectReports.get(i); String profileName = curProject.getProfileName(); Long nbLinesByProfile = (Long) profileVolMap.get(profileName); if (nbLinesByProfile == null) { nbLinesByProfile = new Long(0); } profileVolMap.put(profileName, new Long(curProject.getNbLines() + nbLinesByProfile.intValue())); } // Create profilePieChart PieChartMaker pieMaker = new PieChartMaker(null, null, null); pieMaker.setValues(profileVolMap); JFreeChart pieChart = pieMaker.getChart(new HashMap(), request); // Image of pieChart addJFreeChart(slideToSet, pieChart, where); log.info("AuditReturn - setProfilePieChart done"); } /** * Add pie chart for the application * * @param slideToSet slide to modify * @param where place to add shape * @throws IOException if error */ public void setPieChart(Slide slideToSet, Rectangle where) throws IOException { log.info("AuditReturn - setPieChart"); // Build volumetry map HashMap volMap = new HashMap(); for (int i = 0; i < projectReports.size(); i++) { log.info("AuditReturn - setPieChart Project n" + i); ProjectReportDTO curProject = (ProjectReportDTO) projectReports.get(i); Long nbLinesByProfile = (Long) volMap.get(curProject.getName()); if (nbLinesByProfile == null) { nbLinesByProfile = new Long(0); } volMap.put(curProject.getName(), new Long(curProject.getNbLines() + nbLinesByProfile.intValue())); } // Create profilePieChart PieChartMaker pieMaker = new PieChartMaker(null, null, null); pieMaker.setValues(volMap); JFreeChart pieChart = pieMaker.getChart(new HashMap(), request); // add graph in slide addJFreeChart(slideToSet, pieChart, where); log.info("AuditReturn - setPieChart done"); } /** * Add pie chart for the application * * @param slideToSet slide to modify * @param where place to add shape * @throws IOException if error */ public void setKiviatChart(Slide slideToSet, Rectangle where) throws IOException { log.info("AuditReturn - setKiviatChart"); // Build factors results map KiviatMaker kiviatMaker = new KiviatMaker(); for (int i = 0; i < projectReports.size(); i++) { log.info("AuditReturn - setKiviatChart Project n" + i); ProjectReportDTO curProject = (ProjectReportDTO) projectReports.get(i); kiviatMaker.addValues(curProject.getName(), buildSortedMapForKiviat(curProject.getQualityResults()), request); } JFreeChart kiviatChart = kiviatMaker.getChart(); // add kiviat addJFreeChart(slideToSet, kiviatChart, where); log.info("AuditReturn - setKiviatChart done"); } /** * Build factors sorted map : key = factorName value = result for current audit * * @param qualityResults quality results * @return the sorted map for kiviat graph */ private SortedMap buildSortedMapForKiviat(List qualityResults) { SortedMap results = new TreeMap(); for (int i = 0; i < qualityResults.size(); i++) { QualityReportDTO factor = (QualityReportDTO) qualityResults.get(i); results.put(factor.getRule().getName().replaceFirst("rule\\.", ""), new Float(factor.getMeanMark())); } return results; } /** * Add an array for the volumetry of projects by profile. The array contains: columns: {Profile, projectName1, * projectName2,..., projectNameN, Total, Comments} rows: {profile1, tre1OfProfile1, ..., treNOfProfileN, ..., * profileN, tre1OfprofileN, ..., treNOfProfileN} * * @param slideToSet slide to modify * @param where place to add shape * @throws IOException if error * @throws PPTGeneratorException */ public void setProfileVolTab(Slide slideToSet, Rectangle where) throws IOException, PPTGeneratorException { log.info("AuditReturn - setProfileVolTab"); // Create a map of map of lists in order to create the volumetry profile array // key: profileName; value: mapTre // mapTre --> key: treName; value: List of String final int nbPredefinedCols = 2; final int nbCols = nbPredefinedCols + projectReports.size(); TreeMap globalMap = new TreeMap(); List titles = new ArrayList(nbCols); // col 1: profile titles.add(WebMessages.getString(request, "export.audit_report.set.volByProfile.profile_col.title")); for (int i = 0; i < projectReports.size(); i++) { ProjectReportDTO curProject = (ProjectReportDTO) projectReports.get(i); log.info("AuditReturn - setProfileVolTab Project n" + i + " : " + curProject.getName()); // add project name on titles line titles.add(curProject.getName()); TreeMap tresMap = (TreeMap) globalMap.get(curProject.getProfileName()); if (null == tresMap) { tresMap = new TreeMap(); } for (Iterator tresIt = curProject.getVolumetryMeasures().keySet().iterator(); tresIt.hasNext();) { String curTre = (String) tresIt.next(); log.debug("AuditReturn - setProfileVolTab Measure : " + curTre); // add line in tab for this tre ArrayList valuesForTre = (ArrayList) tresMap.get(curTre); if (null == valuesForTre) { valuesForTre = createEmptyList(projectReports.size()); } // set value for project cell for this tre valuesForTre.set(i, curProject.getVolumetryMeasures().get(curTre).toString()); tresMap.put(curTre, valuesForTre); } log.debug("AuditReturn - setProfileVolTab Measure iteration done "); globalMap.put(curProject.getProfileName(), tresMap); } // add the two last titles titles.add(WebMessages.getString(request, "export.audit_report.set.volByProfile.total_col.title")); // create table with map // addPicture( slideToSet, htmlToImage( createVolByProfileTable( where, titles, globalMap ).toString() ), where // ); log.debug("AuditReturn - setProfileVolTab end processing "); addHtmlPicture(slideToSet, createVolByProfileTable(where, titles, globalMap).toString(), where.x, where.y); log.info("AuditReturn - setProfileVolTab done"); } /** * Create table of volumetry by profile * * @param where place to add table * @param titles columns title * @param globalMap map getting informations to create table * @return table representing volumetry by profile */ private StringBuffer createVolByProfileTable(Rectangle where, List titles, TreeMap globalMap) { StringBuffer tableHtml = new StringBuffer("<html><body><table border='1'><tr>"); // first line: titles for (int i = 0; i < titles.size(); i++) { tableHtml.append("<td>" + (String) titles.get(i) + "</td>"); } tableHtml.append("</tr>"); // volumetry by profile for (Iterator profileIt = globalMap.keySet().iterator(); profileIt.hasNext();) { String curProfile = (String) profileIt.next(); // add cyan line for profile tableHtml.append("<tr bgcolor=\"#00FFFF\">"); tableHtml.append("<td colspan='" + titles.size() + "'>" + curProfile.toUpperCase() + "</td>"); tableHtml.append("</tr>"); // get tres TreeMap curTres = (TreeMap) globalMap.get(curProfile); for (Iterator tresIt = curTres.keySet().iterator(); tresIt.hasNext();) { tableHtml.append("<tr>"); String curTre = (String) tresIt.next(); tableHtml.append("<td>" + WebMessages.getString(request, curTre) + "</td>"); // get values for this tre ArrayList treLine = (ArrayList) curTres.get(curTre); int total = 0; for (int i = 0; i < treLine.size(); i++) { tableHtml.append("<td>" + (String) treLine.get(i) + "</td>"); try { total += Integer.parseInt((String) treLine.get(i)); } catch (NumberFormatException nfe) { // do nothing } } tableHtml.append("<td>" + total + "</td>"); tableHtml.append("</tr>"); } } tableHtml.append("</table></body></html>"); return tableHtml; } /** * Create a list of string which are initialized with an empty string * * @param size size of list * @return a list of empty String */ private ArrayList createEmptyList(int size) { ArrayList emptyList = new ArrayList(size); for (int i = 0; i < size; i++) { emptyList.add(""); } return emptyList; } /** * Add array of results for the application in a slide * * @param slideToSet slide to set * @param where place to add results * @throws IOException if error * @throws PPTGeneratorException */ public void setApplicationQualityResults(Slide slideToSet, Rectangle where) throws IOException, PPTGeneratorException { log.info("AuditReturn - setApplicationQualityResults"); // Create map for fill table TreeMap factorsMap = new TreeMap(); for (int i = 0; i < projectReports.size(); i++) { log.info("AuditReturn - setApplicationQualityResults Project n" + i); ProjectReportDTO curProject = (ProjectReportDTO) projectReports.get(i); for (int j = 0; j < curProject.getQualityResults().size(); j++) { QualityReportDTO factor = (QualityReportDTO) curProject.getQualityResults().get(j); String factorName = WebMessages.getString(request, factor.getRule().getName()); TreeMap results = (TreeMap) factorsMap.get(factorName); if (results == null) { results = new TreeMap(); } results.put(curProject.getName(), new Float[] { new Float(factor.getMeanMark()), new Float(factor.getPreviousScore()) }); factorsMap.put(factorName, results); } } // create table and add it to the slide in function of the map previously created createApplicationResultsTable(slideToSet, where, factorsMap); log.info("AuditReturn - setApplicationQualityResults done"); } /** * Create and add the array of results for the application in a slide * * @param slideToSet slide to set * @param where place to add results * @param factorsMap information about cells * @throws IOException if error * @throws PPTGeneratorException */ private void createApplicationResultsTable(Slide slideToSet, Rectangle where, TreeMap factorsMap) throws IOException, PPTGeneratorException { StringBuffer html = new StringBuffer("<html><body><table border='1'>"); StringBuffer title = new StringBuffer("<tr bgcolor=\"#00FFFF\">"); List resultsBuffers = new ArrayList(); // title of first column title.append("<td><b>" + WebMessages.getString(request, "component.project") + "</b></td>"); for (Iterator it = factorsMap.keySet().iterator(); it.hasNext();) { String factorName = (String) it.next(); // factor title title.append("<td><b>" + factorName + "</b></td>"); Map results = (TreeMap) factorsMap.get(factorName); int rowProj = 1; for (Iterator projIt = results.keySet().iterator(); projIt.hasNext(); rowProj++) { String projName = (String) projIt.next(); StringBuffer projectResults = null; if (rowProj > resultsBuffers.size()) { projectResults = new StringBuffer("<td>" + projName + "</td>"); resultsBuffers.add(projectResults); } else { projectResults = (StringBuffer) resultsBuffers.get(rowProj - 1); } // project title // fill factor column appendFactorResultToProjectRow(projectResults, (Float[]) results.get(projName)); projectResults.append("</td>"); } } html.append(title + "</tr>"); for (int i = 0; i < resultsBuffers.size(); i++) { html.append("<tr>"); html.append((StringBuffer) resultsBuffers.get(i)); html.append("</tr>"); } html.append("</table></body></html>"); addHtmlPicture(slideToSet, html.toString(), where.x, where.y); } /** * Append score, evolution and image representation to the buffer stands for results table. * * @param projectResults buffer to complete * @param scores factor scores */ private void appendFactorResultToProjectRow(StringBuffer projectResults, Float[] scores) { String score = SqualeWebActionUtils.formatFloat(scores[0]); // score projectResults.append("<td>"); projectResults.append(score); if (scores[0].floatValue() != -1 && scores[1].floatValue() != -1) { // arrow URL arrowSrc = this.getClass().getResource( "/" + SqualeWebActionUtils.getImageForTrend(scores[0].toString(), scores[1].toString())); if (arrowSrc != null) { projectResults.append("<img src=\"" + arrowSrc.toString() + "\"></img>"); } } if (scores[0].floatValue() != -1) { // picto URL pictoSrc = this.getClass() .getResource("/" + SqualeWebActionUtils.IMG[SqualeWebActionUtils.generatePicto(score)]); if (pictoSrc != null) { projectResults.append("<img src=\"" + pictoSrc.toString() + "\" border=\"0\"></img>"); } } } /** * Add slide for each project containing : - bubble graph - ratio * * @param model model to use * @throws IOException is error while creating slide */ public void addScatterplotSlides(MasterSheet model) throws IOException { log.info("AuditReturn - addScatterplotSlides"); // for each project we create a new slide containing: // scatterplot graph and ratio for (int i = 0; i < projectReports.size(); i++) { log.info("AuditReturn - addScatterplotSlides Project n" + i); ProjectReportDTO curProject = (ProjectReportDTO) projectReports.get(i); if (null != curProject.getScatterplotMeasures()) { // create slide Slide slide = getPresentation().createSlide(); // set model slide.setMasterSheet(model); // set title addTitle(slide, WebMessages.getString(request, "export.audit_report.presentation.add.slide.scatterplot.title")); // add bulleted list int sumOfLines = getTotalNbLines(); if (sumOfLines == 0) { sumOfLines = 1; // in order to not have a division by zero } final int firstBulletTextSize = 24; final int firstBulletX = 30; final int firstBulletY = 100; final int firstBulletWidth = 300; final int firstBulletHeight = 350; String textToAdd = curProject.getName() + "\r" + (int) ((double) ((double) curProject.getNbLines() / (double) sumOfLines) * 100) + "%\r" + WebMessages.getString(request, "export.audit_report.presentation.add.slide.scatterplot.bullet2"); addTextBox(slide, textToAdd, firstBulletTextSize, new Rectangle(firstBulletX, firstBulletY, firstBulletWidth, firstBulletHeight), true); // add footer comment final int footerSize = 14; final int footerX = 12; final int footerY = 480; final int footerWidth = 500; final int footerHeight = 30; textToAdd = WebMessages.getString(request, "export.audit_report.presentation.add.slide.scatterplot.footer"); addTextBox(slide, textToAdd, footerSize, new Rectangle(footerX, footerY, footerWidth, footerHeight), false); // add bubble graph final int bubbleX = 280; final int bubbleY = 90; final int bubbleWidth = 415; final int bubbleHeight = 380; addJFreeChart(slide, getBubbleChart(curProject), new Rectangle(bubbleX, bubbleY, bubbleWidth, bubbleHeight)); } } log.info("AuditReturn - addScatterplotSlides done"); } /** * Get buuble chart for a project PRECONDITION: bubble chart measures are not null * * @param curProject project * @return bubble chart */ private JFreeChart getBubbleChart(ProjectReportDTO curProject) { int indexInParam = 0; // create scatterplot BubbleMaker bubbleMaker = new BubbleMaker(request.getLocale(), (Long) curProject.getScatterplotMeasures()[indexInParam++], (Long) curProject.getScatterplotMeasures()[indexInParam++]); bubbleMaker.addSerie((String) curProject.getScatterplotMeasures()[indexInParam++], (double[]) curProject.getScatterplotMeasures()[indexInParam++], (double[]) curProject.getScatterplotMeasures()[indexInParam++], (double[]) curProject.getScatterplotMeasures()[indexInParam++]); JFreeChart chartBubble = bubbleMaker.getChart(null, null, null, (double[]) curProject.getScatterplotMeasures()[indexInParam++], (double[]) curProject.getScatterplotMeasures()[indexInParam++], (double[]) curProject.getScatterplotMeasures()[indexInParam++], (String[]) curProject.getScatterplotMeasures()[indexInParam]); return chartBubble; } /** * Give number of lines in the application * * @return number of lines in the application */ private int getTotalNbLines() { int sum = 0; for (int i = 0; i < projectReports.size(); i++) { ProjectReportDTO curProject = (ProjectReportDTO) projectReports.get(i); sum += curProject.getNbLines(); } return sum; } /** * Add all projects results For each project and each factor we add a slide containing an array of quality results * (>=0) for each practices add slide with the "ten" (can be change by a configuration key: * export.audit_report.nb_top) worst components (or transgression) for each practice worst component have a score * inferior to 2 (configurable with key: export.audit_report.max_score_top) * * @param model model to applied * @throws IOException if error * @throws PPTGeneratorException */ public void addAllAuditResultsDetailed(MasterSheet model) throws IOException, PPTGeneratorException { log.info("AuditReturn - addAllAuditResultsDetailed"); final Rectangle pictAnchor = new Rectangle(30, 150, 600, 200); for (int i = 0; i < projectReports.size(); i++) { log.info("AuditReturn - addAllAuditResultsDetailed Project n" + i); ProjectReportDTO curProject = (ProjectReportDTO) projectReports.get(i); List practiceTopId = new ArrayList(); // iterate on its results for (int f = 0; f < curProject.getQualityResults().size(); f++) { Slide slide = createFactorResultsSlide(model, curProject.getName()); // build factor table int rowspan = 0; QualityReportDTO factor = (QualityReportDTO) curProject.getQualityResults().get(f); StringBuffer crietriaAndPracticeTable = new StringBuffer(); for (int c = 0; c < factor.getQualityResults().size(); c++) { QualityReportDTO criterium = (QualityReportDTO) factor.getQualityResults().get(c); // Add criterium name and its score if (c > 0) { crietriaAndPracticeTable.append("<tr>"); } appendQualityResultsDetail(crietriaAndPracticeTable, criterium); rowspan += criterium.getQualityResults().size(); for (int p = 0; p < criterium.getQualityResults().size(); p++) { QualityReportDTO practice = (QualityReportDTO) criterium.getQualityResults().get(p); if (p > 0) { crietriaAndPracticeTable.append("<tr>"); } appendQualityResultsDetail(crietriaAndPracticeTable, practice); crietriaAndPracticeTable.append("</tr>"); // add slide for each practice addTopForPractice((PracticeReportDTO) criterium.getQualityResults().get(p), model, practiceTopId); } } // add table for this factor StringBuffer factorTable = new StringBuffer("<html><body><table border='1'>"); // add titles appendFactorResultTitles(factorTable); factorTable.append("<tr>"); // Add factor name and its score appendQualityResultsDetail(factorTable, factor, rowspan); // append criteria and practice table factorTable.append(crietriaAndPracticeTable); // add image to slide factorTable.append("</td></table></tr></table></body></html>"); addPicture(slide, htmlToImage(factorTable.toString()), pictAnchor); addTextBoxInFactorResultSlide(slide, WebMessages.getString(request, factor.getRule().getName()), factor.getMeanMark()); } } log.info("AuditReturn - addAllAuditResultsDetailed done"); } /** * Create factor results slide * * @param model model to use * @param projectName name of project * @return the slide * @throws IOException if error */ private Slide createFactorResultsSlide(MasterSheet model, String projectName) throws IOException { Slide slide = getPresentation().createSlide(); slide.setMasterSheet(model); final int titleSize = 22; // title addTitle(slide, WebMessages.getString(request, "export.audit_report.presentation.add.slide.factor_results.title") + "\r" + (String) WebMessages.getString(request.getLocale(), "export.audit_report.presentation.add.slide.factor_results.subtitle", new String[] { projectName }), titleSize); return slide; } /** * Add titles to the html table * * @param factorTable buffer for html table */ private void appendFactorResultTitles(StringBuffer factorTable) { factorTable.append("<tr bgcolor=\"#C0C0C0\" color=\"#FFFFFF\">"); final int nbTitles = 6; for (int t = 1; t < nbTitles + 1; t++) { factorTable .append("<td>" + WebMessages.getString(request, "export.audit_report.presentation.add.slide.factor_results.table.title" + t) + "</td>"); } factorTable.append("</tr>"); } /** * Add text box with information about factor * * @param slide slide to set * @param factorName name of factor * @param score score of factor */ private void addTextBoxInFactorResultSlide(Slide slide, String factorName, float score) { final int fontSize = 18; final Rectangle anchor = new Rectangle(20, 85, 635, 430); String status = WebMessages.getString(request, "mark.less." + ((int) score + 1)); if (null == status) { status = WebMessages.getString(request, "export.audit_report.presentation.add.slide.factor_results.not_noted"); } String textToAdd = (String) WebMessages.getString(request.getLocale(), "export.audit_report.presentation.add.slide.factor_results.bullet1", new String[] { factorName, status }) + "\r\r\r\r\r\r\r\r\r\r\r\r" + WebMessages.getString(request, "export.audit_report.presentation.add.slide.factor_results.bullet2"); addTextBox(slide, textToAdd, fontSize, anchor, true); } /** * Append name and score of a result for quality results table * * @param factorTable buffer stands for table * @param result quality result * @param rowspan rowspan for td tag */ private void appendQualityResultsDetail(StringBuffer factorTable, QualityReportDTO result, int rowspan) { factorTable.append("<td rowspan='" + rowspan + "'>" + WebMessages.getString(request, result.getRule().getName()) + "</td>"); // and its score for this audit factorTable.append("<td rowspan='" + rowspan + "'>" + SqualeWebActionUtils.formatFloat(new Float(result.getMeanMark()))); if (result.getMeanMark() != -1 && result.getPreviousScore() != -1) { // arrow URL arrowSrc = this.getClass().getResource("/" + SqualeWebActionUtils .getImageForTrend("" + result.getMeanMark(), "" + result.getPreviousScore())); if (arrowSrc != null) { factorTable.append("<img src=\"" + arrowSrc.toString() + "\"></img>"); } } factorTable.append("</td>"); } /** * Append name and score of a result for quality results table * * @param factorTable buffer stands for table * @param result quality result */ private void appendQualityResultsDetail(StringBuffer factorTable, QualityReportDTO result) { appendQualityResultsDetail(factorTable, result, result.getQualityResults().size()); } /** * Add top slide for a practice * * @param practiceReportDTO the practice * @param model model to use * @param practicesId id of practices which have already a top slide * @throws IOException if error */ private void addTopForPractice(PracticeReportDTO practiceReportDTO, MasterSheet model, List practicesId) throws IOException { log.info("AuditReturn - addTopForPractice " + practiceReportDTO.getRule().getName()); Long practiceId = new Long(practiceReportDTO.getRule().getId()); if (practiceReportDTO.getWorstResults().size() > 0 && !practicesId.contains(practiceId)) { practicesId.add(practiceId); Slide newSlide = getPresentation().createSlide(); newSlide.setMasterSheet(model); // Add title String practiceName = WebMessages.getString(request, practiceReportDTO.getRule().getName()); addTitle(newSlide, (String) WebMessages.getString(request.getLocale(), "export.audit_report.presentation.add.slide.practice.details.title", new String[] { practiceName })); // Add practice info String practiceDesc = WebMessages.getString(request, practiceReportDTO.getRule().getHelpKey() + ".description"); if (null != practiceDesc) { final int infoSize = 10; final Rectangle infoAnchor = new Rectangle(0, 90, getPresentation().getPageSize().width, 300); addTextBox(newSlide, (String) WebMessages.getString(request.getLocale(), "export.audit_report.presentation.add.slide.practice.details.info", new String[] { practiceDesc }), infoSize, infoAnchor, false); } if (practiceReportDTO.isRulechecking()) { addTopTransgressionsSlide(newSlide, practiceReportDTO); } else { addTopComponentSlide(newSlide, practiceReportDTO); } } } /** * Add slide for listing worst components for this practice PRECONDITION: at least one top exists * * @param newSlide slide to set * @param practiceReportDTO the practice */ private void addTopComponentSlide(Slide newSlide, PracticeReportDTO practiceReportDTO) { final int columnWidth = 300; // Get metrics for title Map metrics = ((PracticeReportDetailedDTO) practiceReportDTO.getWorstResults().get(0)).getMetrics(); // Create list for titles and reference List metricsList = new ArrayList(metrics.keySet()); Table table = createTableWithBorder(practiceReportDTO.getWorstResults().size() + 1, metrics.size() + 2); // Add titles int titleId = 0; addWorstComponentsTitles(table, titleId++, WebMessages.getString(request, "component.name")); addWorstComponentsTitles(table, titleId++, WebMessages.getString(request, "project.result.practice.value")); for (int i = 0; i < metricsList.size(); i++) { String shortTre = (String) metricsList.get(i); addWorstComponentsTitles(table, titleId++, WebMessages.getString(request, shortTre)); } for (int i = 0; i < practiceReportDTO.getWorstResults().size(); i++) { PracticeReportDetailedDTO detail = (PracticeReportDetailedDTO) practiceReportDTO.getWorstResults() .get(i); TableCell cell = table.getCell(i + 1, 0); setTabCell(cell, detail.getComponent().getFullName()); cell = table.getCell(i + 1, 1); setTabCell(cell, SqualeWebActionUtils.formatFloat(new Float(detail.getScore()))); for (int m = 0; m < metricsList.size(); m++) { cell = table.getCell(i + 1, m + 2); setTabCell(cell, SqualeWebActionUtils .formatFloat(detail.getMetrics().get((String) metricsList.get(m)).toString())); } } // set column width table.setColumnWidth(0, columnWidth); newSlide.addShape(table); } /** * Add a title for the column <code>col</code> * * @param table table to set * @param col column index * @param title title for this column */ private void addWorstComponentsTitles(Table table, int col, String title) { final int titleSize = 8; TableCell cell = table.getCell(0, col); setTabCell(cell, title, DEFAULT_FONT_NAME, titleSize, Color.CYAN, true, Color.BLACK); } /** * Add the table of top for a rulechecking practice * * @param newSlide slide to set * @param practiceReportDTO practice */ private void addTopTransgressionsSlide(Slide newSlide, PracticeReportDTO practiceReportDTO) { final int borderWidth = 50; final int columnWidth = getPresentation().getPageSize().width - borderWidth; Table table = createTableWithBorder(practiceReportDTO.getWorstResults().size(), 1); for (int i = 0; i < practiceReportDTO.getWorstResults().size(); i++) { TableCell cell = table.getCell(i, 0); setTabCell(cell, ((RuleCheckingTransgressionItemBO) practiceReportDTO.getWorstResults().get(i)) .getMessage().replace('\n', '\r')); } // set column width and height table.setColumnWidth(0, columnWidth); newSlide.addShape(table); } }