package org.activityinfo.server.report.renderer.itext; /* * #%L * ActivityInfo Server * %% * Copyright (C) 2009 - 2013 UNICEF * %% * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU 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 General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * <http://www.gnu.org/licenses/gpl-3.0.html>. * #L% */ import com.google.common.collect.Lists; import net.lightoze.gwt.i18n.server.LocaleProxy; import org.activityinfo.legacy.shared.command.DimensionType; import org.activityinfo.legacy.shared.model.BaseMap; import org.activityinfo.legacy.shared.model.IndicatorDTO; import org.activityinfo.legacy.shared.model.TileBaseMap; import org.activityinfo.legacy.shared.reports.content.*; import org.activityinfo.legacy.shared.reports.content.PivotTableData.Axis; import org.activityinfo.legacy.shared.reports.model.*; import org.activityinfo.legacy.shared.reports.model.MapIcon.Icon; import org.activityinfo.legacy.shared.reports.model.PivotChartReportElement.Type; import org.activityinfo.legacy.shared.reports.model.layers.BubbleMapLayer; import org.activityinfo.legacy.shared.reports.model.layers.IconMapLayer; import org.activityinfo.legacy.shared.reports.model.layers.PiechartMapLayer; import org.activityinfo.legacy.shared.reports.util.mapping.Extents; import org.activityinfo.server.geo.TestGeometry; import org.activityinfo.server.report.DummyPivotTableData; import org.activityinfo.server.report.output.StorageProvider; import org.activityinfo.server.report.output.TempStorage; import org.activityinfo.server.report.renderer.Renderer; import org.activityinfo.server.report.renderer.excel.ExcelReportRenderer; import org.activityinfo.server.report.renderer.image.ImageMapRenderer; import org.activityinfo.server.report.renderer.ppt.PPTMapRenderer; import org.junit.Before; import org.junit.Test; import java.io.*; import java.util.Arrays; import java.util.Collections; import java.util.Comparator; import java.util.List; public class ItextReportRendererTest { private Comparator<PivotTableData.Axis> comparator = new Comparator<PivotTableData.Axis>() { @Override public int compare(Axis arg0, Axis arg1) { return arg0.getLabel().compareTo(arg1.getLabel()); } }; @Before public void setUpDirs() { new File("target/report-tests").mkdirs(); } @Before public void setupLocale() { LocaleProxy.initialize(); } @Test public void pageNumbers() throws IOException { ReportContent content = new ReportContent(); content.setFilterDescriptions(Collections.EMPTY_LIST); Report report = new Report(); report.setContent(content); for (int i = 0; i != 1000; ++i) { TextReportElement element = new TextReportElement(); element.setText("Quick brown fox, texte français"); element.setContent(new NullContent()); report.addElement(element); } renderToPdf(report, "pagenumbers.pdf"); } @Test public void htmlImages() throws IOException { DummyPivotTableData data = new DummyPivotTableData(); PivotChartContent chartContent = new PivotChartContent(); chartContent.setData(data.table); chartContent.setYMin(0); chartContent.setYStep(100); chartContent.setFilterDescriptions(Collections.EMPTY_LIST); PivotChartReportElement chart = new PivotChartReportElement(Type.Pie); chart.setTitle("My Pie Chart"); chart.setCategoryDimensions(data.colDims); chart.setSeriesDimensions(data.rowDims); chart.setContent(chartContent); PivotContent tableContent = new PivotContent(); tableContent.setFilterDescriptions(Collections.EMPTY_LIST); tableContent.setData(data.table); PivotTableReportElement table = new PivotTableReportElement(); table.setColumnDimensions(data.colDims); table.setRowDimensions(data.rowDims); table.setTitle("My Table"); table.setContent(tableContent); BubbleMapMarker marker1 = new BubbleMapMarker(); marker1.setLat(-2.45); marker1.setLng(28.8); marker1.setX(100); marker1.setY(100); marker1.setRadius(25); TileBaseMap baseMap = new TileBaseMap(); baseMap .setTileUrlPattern("http://mt{s}.aimaps.net/nordkivu.cd/v1/z{z}/{x}x{y}.png"); MapContent mapContent = new MapContent(); mapContent.setFilterDescriptions(Collections.EMPTY_LIST); mapContent.setBaseMap(baseMap); mapContent.setZoomLevel(8); mapContent.setCenter(new Extents(-2.2, -2.1, 28.85, 28.9).center()); mapContent.setMarkers(Arrays.asList((MapMarker) marker1)); MapReportElement map = new MapReportElement(); map.setTitle("My Map"); map.setContent(mapContent); ReportContent content = new ReportContent(); content.setFilterDescriptions(Collections.EMPTY_LIST); Report report = new Report(); report.setContent(content); report.addElement(chart); report.addElement(table); report.addElement(new TextReportElement("Testing 1..2.3.. français")); report.addElement(map); renderToPdf(report, "piechart.pdf"); renderToHtml(report, "piechart.html"); // renderToHtmlUsingWriter(report, "piechart2.html"); renderToRtf(report, "piechart.rtf"); } @Test public void chartTest() throws IOException { DummyPivotTableData data = new DummyPivotTableData(); PivotChartContent chartContent = new PivotChartContent(); chartContent.setData(data.table); chartContent.setYMin(0); chartContent.setYStep(100); chartContent.setFilterDescriptions(Collections.EMPTY_LIST); PivotChartReportElement chart = new PivotChartReportElement(Type.Pie); chart.setTitle("My Pie Chart"); chart.setCategoryDimensions(data.colDims); chart.setSeriesDimensions(data.rowDims); chart.setContent(chartContent); ReportContent content = new ReportContent(); content.setFilterDescriptions(Collections.EMPTY_LIST); Report report = new Report(); report.setContent(content); report.addElement(chart); renderToPdf(report, "chartTest.pdf"); renderToRtf(report, "chartTest.rtf"); } @Test public void googleMapsBaseMap() throws IOException { ReportContent content = new ReportContent(); content.setFilterDescriptions(Collections.EMPTY_LIST); Report report = new Report(); report.setContent(content); TileBaseMap referenceBaseMap = new TileBaseMap(); referenceBaseMap .setTileUrlPattern("http://www.activityinfo.org/resources/tile/admin.cd/{z}/{x}/{y}.png"); referenceBaseMap.setName("Administrative Map"); BaseMap[] baseMaps = new BaseMap[]{ referenceBaseMap, GoogleBaseMap.HYBRID, GoogleBaseMap.ROADMAP, GoogleBaseMap.SATELLITE, GoogleBaseMap.TERRAIN }; for (BaseMap baseMap : baseMaps) { BubbleMapMarker marker1 = new BubbleMapMarker(); marker1.setLat(-2.45); marker1.setLng(28.8); marker1.setX(100); marker1.setY(100); marker1.setRadius(25); MapContent mapContent = new MapContent(); mapContent.setFilterDescriptions(Collections.EMPTY_LIST); mapContent.setBaseMap(baseMap); mapContent.setZoomLevel(8); mapContent.setCenter(new Extents(-2.2, -2.1, 28.85, 28.9).center()); mapContent.setMarkers(Arrays.asList((MapMarker) marker1)); MapReportElement satelliteMap = new MapReportElement(); satelliteMap.setTitle(baseMap.toString()); satelliteMap.setContent(mapContent); report.addElement(satelliteMap); } // renderToPdf(report, "google map.pdf"); // renderToHtml(report, "google map.html"); renderToRtf(report, "google map.rtf"); } @Test public void iconTest() throws IOException { IconMapMarker marker1 = new IconMapMarker(); marker1.setIcon(MapIcon.fromEnum(Icon.Default)); marker1.setLat(-2.45); marker1.setLng(28.8); marker1.setX(100); marker1.setY(100); TileBaseMap baseMap = new TileBaseMap(); baseMap .setTileUrlPattern("//www.activityinfo.org/resources/tile/nordkivu.cd/{z}/{x}/{y}.png"); IconMapLayer layer3 = new IconMapLayer(); layer3.setIcon(MapIcon.Icon.Default.name()); layer3.getIndicatorIds().add(101); MapContent mapContent = new MapContent(); mapContent.setFilterDescriptions(Collections.EMPTY_LIST); mapContent.setBaseMap(baseMap); mapContent.setZoomLevel(8); mapContent.setCenter(new Extents(-2.2, -2.1, 28.85, 28.9).center()); mapContent.setMarkers(Arrays.asList((MapMarker) marker1)); MapReportElement map = new MapReportElement(); map.setTitle("My Map"); map.setContent(mapContent); map.addLayer(layer3); ReportContent content = new ReportContent(); content.setFilterDescriptions(Collections.EMPTY_LIST); Report report = new Report(); report.setContent(content); report.addElement(map); renderToPdf(report, "iconMarker.pdf"); renderToHtml(report, "iconMarker.html"); renderToRtf(report, "iconMarker.rtf"); renderToPpt(map, "iconMarker.ppt"); renderToImage(map, "iconMarker.png"); } @Test public void legendTest() throws IOException { BubbleMapMarker marker1 = new BubbleMapMarker(); marker1.setLat(-2.45); marker1.setLng(28.8); marker1.setX(100); marker1.setY(100); marker1.setRadius(25); marker1.setValue(300); TileBaseMap baseMap = new TileBaseMap(); baseMap .setTileUrlPattern("//www.activityinfo.org/resources/tile/nordkivu.cd/{z}/{x}/{y}.png"); BubbleMapLayer layer1 = new BubbleMapLayer(); layer1.addIndicatorId(101); layer1.setMinRadius(10); layer1.setMaxRadius(10); BubbleLayerLegend legend1 = new BubbleLayerLegend(); legend1.setDefinition(layer1); legend1.setMinValue(1000); legend1.setMaxValue(3000); BubbleMapLayer layer2 = new BubbleMapLayer(); layer2.addIndicatorId(102); layer2.addIndicatorId(103); layer2.setMinRadius(10); layer2.setMaxRadius(25); BubbleLayerLegend legend2 = new BubbleLayerLegend(); legend2.setDefinition(layer2); legend2.setMinValue(600); legend2.setMaxValue(999); IconMapLayer layer3 = new IconMapLayer(); layer3.setIcon(MapIcon.Icon.Default.name()); layer3.getIndicatorIds().add(101); IconLayerLegend legend3 = new IconLayerLegend(); legend3.setDefinition(layer3); List<PieChartLegend> pieChartLegends = Lists.newArrayList(); List<PiechartMapLayer> pieChartLayers = Lists.newArrayList(); int indicatorIds[] = new int[]{101, 102, 103}; for (int sliceCount = 1; sliceCount < 10; ++sliceCount) { PiechartMapLayer pieChartLayer = new PiechartMapLayer(); for (int i = 0; i != sliceCount; ++i) { pieChartLayer.addIndicatorId(indicatorIds[i % indicatorIds.length]); } pieChartLayer.setMinRadius(25); pieChartLayer.setMaxRadius(25); PieChartLegend pieChartLegend = new PieChartLegend(); pieChartLegend.setDefinition(pieChartLayer); pieChartLayers.add(pieChartLayer); pieChartLegends.add(pieChartLegend); } IndicatorDTO indicator101 = new IndicatorDTO(); indicator101.setId(101); indicator101 .setName("Nombre de salles de classe fonctionnelles (construites, rehabilitees, equipees) " + "pour l'education formelle et non formelle."); IndicatorDTO indicator102 = new IndicatorDTO(); indicator102.setId(102); indicator102 .setName("Nombre d'enfants ayant beneficie de kits scolaires, recreatifs et didactiques"); IndicatorDTO indicator103 = new IndicatorDTO(); indicator103.setId(103); indicator103 .setName("Pourcentage des ménages qui utilsent la moustiquaire rationnellement"); MapContent mapContent = new MapContent(); mapContent.setFilterDescriptions(Collections.EMPTY_LIST); mapContent.setBaseMap(baseMap); mapContent.setZoomLevel(8); mapContent.setCenter(new Extents(-2.2, -2.1, 28.85, 28.9).center()); mapContent.setMarkers(Arrays.asList((MapMarker) marker1)); mapContent.getIndicators().addAll(Arrays.asList( indicator101, indicator102, indicator103)); mapContent.addLegend(legend1); mapContent.addLegend(legend2); mapContent.addLegend(legend3); mapContent.getLegends().addAll(pieChartLegends); MapReportElement map = new MapReportElement(); map.setTitle("My Map"); map.setContent(mapContent); map.addLayer(layer1); map.addLayer(layer2); map.addLayer(layer3); map.getLayers().addAll(pieChartLayers); ReportContent content = new ReportContent(); content.setFilterDescriptions(Collections.EMPTY_LIST); Report report = new Report(); report.setContent(content); report.addElement(map); renderToPdf(report, "legend.pdf"); renderToHtml(report, "legend.html"); renderToRtf(report, "legend.rtf"); renderToPpt(map, "legend.ppt"); } @Test public void nestedColumns() throws IOException { Dimension province = new AdminDimension(1); Dimension partner = new Dimension(DimensionType.Partner); Dimension year = new DateDimension(DateUnit.YEAR); Dimension month = new DateDimension(DateUnit.MONTH); EntityCategory avsi = new EntityCategory(100, "AVSI RRMP"); PivotTableData data = new PivotTableData(); Axis sudKivu = data.getRootColumn().addChild(province, new EntityCategory(1, "Sud Kivu"), "Sud Kivu", comparator); Axis y2010 = sudKivu.addChild(year, new SimpleCategory("2010"), "2010", comparator); Axis y2011 = sudKivu.addChild(year, new SimpleCategory("2010"), "2010", comparator); Axis jan2010 = y2010.addChild(month, new SimpleCategory("Jan"), "Jan", comparator); Axis feb2010 = y2010.addChild(month, new SimpleCategory("Feb"), "Feb", comparator); Axis jan2011 = y2011.addChild(month, new SimpleCategory("Jan"), "Jan", comparator); Axis feb2011 = y2011.addChild(month, new SimpleCategory("Feb"), "Feb", comparator); Axis avsiRow = data.getRootRow().addChild(partner, avsi, avsi.getLabel(), comparator); avsiRow.setValue(jan2010, 1d); avsiRow.setValue(feb2010, 2d); avsiRow.setValue(jan2011, 3d); avsiRow.setValue(feb2011, 4d); PivotContent tableContent = new PivotContent(data, Lists.<FilterDescription>newArrayList()); PivotTableReportElement table = new PivotTableReportElement(); table.addRowDimension(partner); table.addColDimension(province); table.addColDimension(year); table.addColDimension(month); table.setContent(tableContent); ReportContent content = new ReportContent(); content.setFilterDescriptions(Collections.EMPTY_LIST); Report report = new Report(); report.setContent(content); report.addElement(table); renderToPdf(report, "nestedColumns.pdf"); renderToRtf(report, "nestedColumns.rtf"); renderToXls(report, "nestedColumns.xls"); } @Test public void manyColumns() throws IOException { PivotTableData data = new PivotTableData(); Dimension partner = new Dimension(DimensionType.Partner); Dimension year = new DateDimension(DateUnit.YEAR); EntityCategory avsi = new EntityCategory(100, "AVSI RRMP"); Axis avsiRow = data.getRootRow().addChild(partner, avsi, avsi.getLabel(), comparator); for (int y = 2011; y < 2030; ++y) { Axis col = data.getRootColumn().addChild(year, new SimpleCategory("" + y), "" + y, comparator); avsiRow.setValue(col, (double) y); } PivotContent tableContent = new PivotContent(data, Lists.<FilterDescription>newArrayList()); PivotTableReportElement table = new PivotTableReportElement(); table.addRowDimension(partner); table.addColDimension(year); table.setContent(tableContent); ReportContent content = new ReportContent(); content.setFilterDescriptions(Collections.EMPTY_LIST); Report report = new Report(); report.setContent(content); report.addElement(table); renderToPdf(report, "narrowColumns.pdf"); renderToRtf(report, "narrowColumns.rtf"); } private String mapIconPath() { return "src/main/webapp/mapicons"; } private void renderTo(Report report, Renderer reportRenderer, String name) throws FileNotFoundException, IOException { FileOutputStream fos = new FileOutputStream("target/report-tests/" + name); reportRenderer.render(report, fos); fos.close(); } private void renderToPdf(Report report, String name) throws IOException { PdfReportRenderer reportRenderer = new PdfReportRenderer( TestGeometry.get(), mapIconPath()); renderTo(report, reportRenderer, name); } private void renderToImage(MapReportElement map, String name) throws IOException { ImageMapRenderer mapRenderer = new ImageMapRenderer(TestGeometry.get(), mapIconPath()); mapRenderer.renderToFile(map, new File("target/report-tests/" + name)); } private void renderToXls(Report report, String name) throws IOException { ExcelReportRenderer reportRenderer = new ExcelReportRenderer(); renderTo(report, reportRenderer, name); } private void renderToHtml(Report report, String name) throws IOException { renderTo(report, new HtmlReportRenderer(TestGeometry.get(), mapIconPath(), new TestImageStorageProvider()), name); } private void renderToHtmlUsingWriter(Report report, String name) throws IOException { FileWriter writer = new FileWriter("target/report-tests/" + name); HtmlReportRenderer renderer = new HtmlReportRenderer( TestGeometry.get(), mapIconPath(), new TestImageStorageProvider()); renderer.render(report, writer); writer.close(); } private void renderToRtf(Report report, String name) throws IOException { renderTo(report, new RtfReportRenderer(TestGeometry.get(), mapIconPath()), name); } private void renderToPpt(MapReportElement map, String name) throws FileNotFoundException, IOException { PPTMapRenderer renderer = new PPTMapRenderer(TestGeometry.get(), mapIconPath()); renderer.render(map, new FileOutputStream("target/report-tests/" + name)); } private static class TestImageStorageProvider implements StorageProvider { private static int nextId = 1; @Override public TempStorage allocateTemporaryFile(String mimeType, String suffix) throws IOException { String fileName = (nextId++) + suffix; File file = new File("target/report-tests/" + fileName); return new TempStorage(file.toURI().toURL().toString(), new FileOutputStream(file)); } } }