Author: echatellier Date: 2012-08-20 18:38:27 +0200 (Mon, 20 Aug 2012) New Revision: 1061 Url: http://forge.codelutin.com/repositories/revision/coser/1061 Log: Dans les rapports pdf : le controle.pdf est en fait le modification.pdf. Il manque actuellement le controle.pdf avec les warning etc. Modified: trunk/coser-business/src/main/java/fr/ifremer/coser/services/ProjectService.java trunk/coser-business/src/main/java/fr/ifremer/coser/services/PublicationService.java trunk/coser-business/src/test/java/fr/ifremer/coser/services/ProjectServiceTest.java Modified: trunk/coser-business/src/main/java/fr/ifremer/coser/services/ProjectService.java =================================================================== --- trunk/coser-business/src/main/java/fr/ifremer/coser/services/ProjectService.java 2012-08-20 16:37:59 UTC (rev 1060) +++ trunk/coser-business/src/main/java/fr/ifremer/coser/services/ProjectService.java 2012-08-20 16:38:27 UTC (rev 1061) @@ -88,6 +88,7 @@ import fr.ifremer.coser.command.DeleteLineCommand; import fr.ifremer.coser.command.MergeSpeciesCommand; import fr.ifremer.coser.command.ModifyFieldCommand; +import fr.ifremer.coser.control.ControlError; import fr.ifremer.coser.data.AbstractDataEntity; import fr.ifremer.coser.data.Catch; import fr.ifremer.coser.data.Haul; @@ -844,10 +845,11 @@ * Genère également les PDF des rapports de contrôle. * * @param project project to save + * @param validationErrors controls errors used to fill pdf * @throws CoserBusinessException * @since 1.3 */ - public void validControl(Project project) throws CoserBusinessException { + public void validControl(Project project, List<ControlError> validationErrors) throws CoserBusinessException { Control control = project.getControl(); control.setValidated(true); @@ -860,7 +862,7 @@ File projectDirectory = new File(projectsDirectory, project.getName()); File controlDirectory = new File(projectDirectory, CoserConstants.STORAGE_CONTROL_DIRECTORY); File controlReportPdf = new File(controlDirectory, "control.pdf"); - publicationService.extractControlLogAsPDF(project, control, controlReportPdf); + publicationService.extractControlLogAsPDF(project, control, validationErrors, controlReportPdf); } /** Modified: trunk/coser-business/src/main/java/fr/ifremer/coser/services/PublicationService.java =================================================================== --- trunk/coser-business/src/main/java/fr/ifremer/coser/services/PublicationService.java 2012-08-20 16:37:59 UTC (rev 1060) +++ trunk/coser-business/src/main/java/fr/ifremer/coser/services/PublicationService.java 2012-08-20 16:38:27 UTC (rev 1061) @@ -52,6 +52,7 @@ import java.util.TreeMap; import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.io.FileUtils; import org.apache.commons.io.IOUtils; import org.apache.commons.lang3.StringUtils; import org.apache.commons.logging.Log; @@ -73,6 +74,7 @@ import org.jfree.data.category.DefaultCategoryDataset; import org.jfree.data.statistics.DefaultStatisticalCategoryDataset; import org.jfree.util.ShapeUtilities; +import org.nuiton.util.FileUtil; import org.w3c.dom.Document; import org.xhtmlrenderer.pdf.ITextRenderer; @@ -260,15 +262,6 @@ protected JFreeChart displayGraph(CategoryDataset categoryDataSet, String title) { - // create a chart with the dataset - //DefaultCategoryDataset dataset = new DefaultCategoryDataset(); - - /*for (Map.Entry<String, SortedMap<String, Double>> resultSerie : resultSeries.entrySet()) { - for (Map.Entry<String, Double> data : resultSerie.getValue().entrySet()) { - dataset.setValue(data.getValue(), resultSerie.getKey(), data.getKey()); - } - }*/ - CategoryAxis categoryAxis = new CategoryAxis(_("coser.business.common.year")); categoryAxis.setCategoryMargin(0); // label horizontaux @@ -282,11 +275,6 @@ Shape firstShape = ShapeUtilities.createDiamond(5F); renderer.setSeriesShape(0, firstShape); - // n'affiche pas les nombre sur le graphique - //StandardCategoryItemLabelGenerator itemLabelGenerator = new StandardCategoryItemLabelGenerator(); - //renderer.setBaseItemLabelGenerator(itemLabelGenerator); - //renderer.setBaseItemLabelsVisible(true); - CategoryToolTipGenerator cttg = new StandardCategoryToolTipGenerator("{0}: {2}", NumberFormat.getInstance()); renderer.setBaseToolTipGenerator(cttg); @@ -311,135 +299,171 @@ * @return export html file * @throws CoserBusinessException */ - public File exportErrorsAsHTML(Project project, AbstractDataContainer container, List<ControlError> validationErrors) throws CoserBusinessException { + public File exportErrorsAsHTML(Project project, AbstractDataContainer container, + List<ControlError> validationErrors) throws CoserBusinessException { File exportHtmlFile = null; - PrintStream out = null; + Writer out = null; try { exportHtmlFile = File.createTempFile("errors-", ".html"); + exportHtmlFile.deleteOnExit(); if (log.isInfoEnabled()) { log.info("Generating HTML report to " + exportHtmlFile.getAbsolutePath()); } - List<String> speciesGraph = new ArrayList<String>(); - File imageDirectory = new File(exportHtmlFile.getParentFile(), "images"); - imageDirectory.mkdirs(); - out = new PrintStream(exportHtmlFile, "utf-8"); - out.println("<html><head>"); - out.println("<title>" + _("coser.business.publication.errorexporttitle", project.getName())+ "</title>"); - out.println("<meta http-equiv='Content-Type' content='text/html; charset=utf-8'>"); - out.println("</head><body>"); + out = new OutputStreamWriter(new FileOutputStream(exportHtmlFile), "utf-8"); - // convert all errors as tree (code duplicated from ui tree model) - Map<String, List<ControlErrorGroup>> validationCategoryChild = new HashMap<String, List<ControlErrorGroup>>(); - Map<ControlErrorGroup, List<ControlError>> validationErrorsChilds = new HashMap<ControlErrorGroup, List<ControlError>>(); - for (ControlError validationError : validationErrors) { + exportErrorsAsHTML(project, container, validationErrors, out, false); + } catch (IOException ex) { + throw new CoserBusinessException("Can't export errors", ex); + } finally { + IOUtils.closeQuietly(out); + } + return exportHtmlFile; + } + + /** + * Export la liste d'erreurs dans un fichier html avec la liste des graphes + * si necessaire. + * + * Genere les graphes en fin de fichier avec des liens html pour voir les + * graphes depuis les erreurs. + * + * @param project project + * @param container data container + * @param validationErrors errors list + * @param includeProjectInfo add project info to generate persistant pdf + * @return export html file + * @throws CoserBusinessException + * @throws IOException + */ + protected void exportErrorsAsHTML(Project project, AbstractDataContainer container, + List<ControlError> validationErrors, Writer out, boolean includeProjectInfo) throws CoserBusinessException, IOException { - String category = validationError.getCategory() == null ? _("coser.business.control.error.allCategories") : _(validationError.getCategory().getTranslationKey()); - List<ControlErrorGroup> errorGroup = validationCategoryChild.get(category); - if (errorGroup == null) { - errorGroup = new ArrayList<ControlErrorGroup>(); - validationCategoryChild.put(category, errorGroup); - } - ControlErrorGroup group = new ControlErrorGroup(validationError.getCategory(), validationError.getLevel(), validationError.getMessage()); - List<ControlError> childErrors = validationErrorsChilds.get(group); - if (childErrors == null) { - childErrors = new ArrayList<ControlError>(); - validationErrorsChilds.put(group, childErrors); - errorGroup.add(group); - } + List<String> speciesGraph = new ArrayList<String>(); + File imageDirectory = FileUtil.createTempDirectory("images", "pdf"); + imageDirectory.mkdirs(); + imageDirectory.deleteOnExit(); - if (validationError instanceof SpeciesControlError) { - SpeciesControlError diffError = (SpeciesControlError)validationError; - speciesGraph.add(diffError.getSpecies()); - } - childErrors.add(validationError); + out.write("<html><head>"); + out.write("<title>" + _("coser.business.publication.errorexporttitle", project.getName())+ "</title>"); + out.write("<meta http-equiv='Content-Type' content='text/html; charset=utf-8' />"); + out.write("</head><body>"); + + // convert all errors as tree (code duplicated from ui tree model) + Map<String, List<ControlErrorGroup>> validationCategoryChild = new HashMap<String, List<ControlErrorGroup>>(); + Map<ControlErrorGroup, List<ControlError>> validationErrorsChilds = new HashMap<ControlErrorGroup, List<ControlError>>(); + for (ControlError validationError : validationErrors) { + + String category = validationError.getCategory() == null ? _("coser.business.control.error.allCategories") : _(validationError.getCategory().getTranslationKey()); + List<ControlErrorGroup> errorGroup = validationCategoryChild.get(category); + if (errorGroup == null) { + errorGroup = new ArrayList<ControlErrorGroup>(); + validationCategoryChild.put(category, errorGroup); } - - Map<String, JFreeChart> charts = getCompareCatchLengthGraph(project, container, speciesGraph); + ControlErrorGroup group = new ControlErrorGroup(validationError.getCategory(), validationError.getLevel(), validationError.getMessage()); + List<ControlError> childErrors = validationErrorsChilds.get(group); + if (childErrors == null) { + childErrors = new ArrayList<ControlError>(); + validationErrorsChilds.put(group, childErrors); + errorGroup.add(group); + } - // render output html - out.println("<h1 style='text-align:center'>" + _("coser.business.publication.errorexporttitle", project.getName()) + "</h1>"); - for (Map.Entry<String, List<ControlErrorGroup>> categoriesEntry : validationCategoryChild.entrySet()) { - out.println("<h2>" + categoriesEntry.getKey() + "</h2>"); + if (validationError instanceof SpeciesControlError) { + SpeciesControlError diffError = (SpeciesControlError)validationError; + speciesGraph.add(diffError.getSpecies()); + } + childErrors.add(validationError); + } + + Map<String, JFreeChart> charts = getCompareCatchLengthGraph(project, container, speciesGraph); - out.println("<ul>"); - for (ControlErrorGroup group : categoriesEntry.getValue()) { + // render output html + out.write("<h1 style='text-align:center'>" + _("coser.business.publication.errorexporttitle", project.getName()) + "</h1>"); - out.println("<li style='margin-bottom:20px'><span style='color:"); - switch (group.getValidationLevel()) { - case FATAL: - out.print("rgb(88,0,0)"); - break; - case ERROR: - out.print("red"); - break; - case WARNING: - out.print("orange"); - break; - case INFO: - out.print("green"); - break; - } - out.print(";font-weight:bold'>" + _(group.getMessage())); - out.println("</span>"); + if (includeProjectInfo) { + // partie detail + extractProjectReport(project, out); + // partie specific : commandes + extractHistoryCommandReport(project, container, out); + } - out.println("<ul>"); - for (ControlError error : validationErrorsChilds.get(group)) { - out.println("<li type='circle'>"); - out.print(_(error.getDetailMessage())); - List<String> lineNumbers = error.getLineNumbers(); - if (CollectionUtils.isNotEmpty(lineNumbers)) { - out.print(" (" + _("coser.business.publication.errorexportlines") + " : "); - Iterator<String> itLineNumbers = lineNumbers.iterator(); - while (itLineNumbers.hasNext()) { - out.print(itLineNumbers.next()); - if (itLineNumbers.hasNext()) { - out.print(", "); - } + for (Map.Entry<String, List<ControlErrorGroup>> categoriesEntry : validationCategoryChild.entrySet()) { + out.write("<h2>" + categoriesEntry.getKey() + "</h2>"); + + out.write("<ul>"); + for (ControlErrorGroup group : categoriesEntry.getValue()) { + + out.write("<li style='margin-bottom:20px'><span style='color:"); + switch (group.getValidationLevel()) { + case FATAL: + out.write("rgb(88,0,0)"); + break; + case ERROR: + out.write("red"); + break; + case WARNING: + out.write("orange"); + break; + case INFO: + out.write("green"); + break; + } + out.write(";font-weight:bold'>" + _(group.getMessage())); + out.write("</span>"); + + out.write("<ul>"); + for (ControlError error : validationErrorsChilds.get(group)) { + out.write("<li type='circle'>"); + out.write(_(error.getDetailMessage())); + List<String> lineNumbers = error.getLineNumbers(); + if (CollectionUtils.isNotEmpty(lineNumbers)) { + out.write(" (" + _("coser.business.publication.errorexportlines") + " : "); + Iterator<String> itLineNumbers = lineNumbers.iterator(); + while (itLineNumbers.hasNext()) { + out.write(itLineNumbers.next()); + if (itLineNumbers.hasNext()) { + out.write(", "); } - out.println(")"); } - - // ajout d'un graph si necessaire - if (error instanceof DiffCatchLengthControlError) { - DiffCatchLengthControlError diffError = (DiffCatchLengthControlError)error; - String species = diffError.getSpecies(); - out.println(" (<a href='#graph" + species + "'>" + _("coser.business.publication.errorgraph") + "</a>)"); - } + out.write(")"); + } + + // ajout d'un graph si necessaire + if (error instanceof DiffCatchLengthControlError) { + DiffCatchLengthControlError diffError = (DiffCatchLengthControlError)error; + String species = diffError.getSpecies(); + out.write(" (<a href='#graph" + species + "'>" + _("coser.business.publication.errorgraph") + "</a>)"); + } - String tipMessage = _(error.getTipMessage()); - if (StringUtils.isNotEmpty(error.getTipMessage())) { - out.println("<p style='font-style:italic'>" + tipMessage + "</p>"); - } - - out.println("</li>"); + String tipMessage = _(error.getTipMessage()); + if (StringUtils.isNotEmpty(error.getTipMessage())) { + out.write("<p style='font-style:italic'>" + tipMessage + "</p>"); } - out.println("</ul>"); - out.println("</li>"); + + out.write("</li>"); } - out.println("</ul>"); + out.write("</ul>"); + out.write("</li>"); } + out.write("</ul>"); + } - out.println("<h2>" + _("coser.business.publication.errorgraphs") + "</h2>"); - out.println("<ul>"); - // generation des graphiques - for (Map.Entry<String, JFreeChart> chartEntry : charts.entrySet()) { - JFreeChart chart = chartEntry.getValue(); - File tmpChartImage = File.createTempFile("chart-", ".jpg", imageDirectory); - ChartUtilities.saveChartAsJPEG(tmpChartImage, chart, 800, 400); - out.println("<li><p><a name='graph" + chartEntry.getKey() + "'>" + chartEntry.getKey() + "</a></p>"); - out.println("<img src='images/" + tmpChartImage.getName() + "' /></li>"); - } - out.println("</ul>"); + out.write("<h2>" + _("coser.business.publication.errorgraphs") + "</h2>"); + out.write("<ul>"); + // generation des graphiques + for (Map.Entry<String, JFreeChart> chartEntry : charts.entrySet()) { + JFreeChart chart = chartEntry.getValue(); + File tmpChartImage = File.createTempFile("chart-", ".jpg", imageDirectory); + tmpChartImage.deleteOnExit(); + ChartUtilities.saveChartAsJPEG(tmpChartImage, chart, 600, 300); + out.write("<li><p><a name='graph" + chartEntry.getKey() + "'>"); + out.write(project.getDisplaySpeciesText(chartEntry.getKey()) + "</a></p>"); + out.write("<img src='" + imageDirectory.getName() + "/" + tmpChartImage.getName() + "' /></li>"); + } + out.write("</ul>"); - out.println("</body></html>"); - } catch (IOException ex) { - throw new CoserBusinessException("Can't export errors", ex); - } finally { - IOUtils.closeQuietly(out); - } - return exportHtmlFile; + out.write("</body></html>"); } /** @@ -504,6 +528,7 @@ * * @param project project * @param control data container + * @param validationErrors * @param pdfFile output pdf file * @return extractedFile * @throws CoserBusinessException @@ -511,13 +536,14 @@ * * @see AbstractDataContainer#getHistoryCommands() */ - public void extractControlLogAsPDF(Project project, Control control, File pdfFile) throws CoserBusinessException { + public void extractControlLogAsPDF(Project project, Control control, + List<ControlError> validationErrors, File pdfFile) throws CoserBusinessException { OutputStream os = null; try { Writer out = new StringWriter(); - extractControlLogAsHTML(project, control, out); + exportErrorsAsHTML(project, control, validationErrors, out, true); out.flush(); // get content as w3c document @@ -527,7 +553,9 @@ os = new FileOutputStream(pdfFile); ITextRenderer renderer = new ITextRenderer(); - renderer.setDocument(document, null); + // TODO la base de generation est fixé en dur a java.io.tmpdir + // car je sais que exportErrorsAsHTML genere les images dedans + renderer.setDocument(document, "file://" + System.getProperty("java.io.tmpdir") + "/"); renderer.layout(); renderer.createPDF(os); @@ -556,6 +584,7 @@ Writer out = null; try { exportHtmlFile = File.createTempFile("log-", ".html"); + exportHtmlFile.deleteOnExit(); if (log.isInfoEnabled()) { log.info("Generating HTML report to " + exportHtmlFile.getAbsolutePath()); } Modified: trunk/coser-business/src/test/java/fr/ifremer/coser/services/ProjectServiceTest.java =================================================================== --- trunk/coser-business/src/test/java/fr/ifremer/coser/services/ProjectServiceTest.java 2012-08-20 16:37:59 UTC (rev 1060) +++ trunk/coser-business/src/test/java/fr/ifremer/coser/services/ProjectServiceTest.java 2012-08-20 16:38:27 UTC (rev 1061) @@ -162,7 +162,7 @@ @Test public void testValidControl() throws CoserBusinessException { Project project = createTestProject(projectService, false); - projectService.validControl(project); + projectService.validControl(project, Collections.EMPTY_LIST); Assert.assertTrue(project.getControl().isValidated()); Assert.assertTrue(getFile(config.getProjectsDirectory(),
participants (1)
-
echatellier@users.forge.codelutin.com