8999
|
1 /** Copyright (C) 2017 by Bundesanstalt für Gewässerkunde |
|
2 * Software engineering by |
|
3 * Björnsen Beratende Ingenieure GmbH |
|
4 * Dr. Schumacher Ingenieurbüro für Wasser und Umwelt |
|
5 * |
|
6 * This file is Free Software under the GNU AGPL (>=v3) |
|
7 * and comes with ABSOLUTELY NO WARRANTY! Check out the |
|
8 * documentation coming with Dive4Elements River for details. |
|
9 */ |
|
10 package org.dive4elements.river.artifacts.common; |
|
11 |
|
12 import java.io.OutputStream; |
|
13 import java.util.Collection; |
|
14 import java.util.HashMap; |
|
15 import java.util.List; |
|
16 import java.util.Map; |
|
17 |
|
18 import org.apache.log4j.Logger; |
|
19 import org.dive4elements.artifacts.CallMeta; |
|
20 import org.dive4elements.artifacts.common.utils.Config; |
|
21 import org.dive4elements.river.artifacts.model.CalculationResult; |
|
22 import org.dive4elements.river.artifacts.resources.Resources; |
|
23 import org.dive4elements.river.artifacts.sinfo.util.MetaAndTableJRDataSource; |
|
24 import org.dive4elements.river.artifacts.sinfo.util.RiverInfo; |
|
25 import org.dive4elements.river.exports.AbstractExporter; |
|
26 |
|
27 import au.com.bytecode.opencsv.CSVWriter; |
|
28 import net.sf.jasperreports.engine.JRDataSource; |
|
29 import net.sf.jasperreports.engine.JRElement; |
|
30 import net.sf.jasperreports.engine.JRException; |
|
31 import net.sf.jasperreports.engine.JRPrintPage; |
|
32 import net.sf.jasperreports.engine.JasperCompileManager; |
|
33 import net.sf.jasperreports.engine.JasperExportManager; |
|
34 import net.sf.jasperreports.engine.JasperFillManager; |
|
35 import net.sf.jasperreports.engine.JasperPrint; |
|
36 import net.sf.jasperreports.engine.JasperReport; |
|
37 import net.sf.jasperreports.engine.design.JasperDesign; |
|
38 import net.sf.jasperreports.engine.util.JRProperties; |
|
39 import net.sf.jasperreports.engine.xml.JRSaxParserFactory; |
|
40 import net.sf.jasperreports.engine.xml.JRXmlLoader; |
|
41 |
|
42 /** |
|
43 * @author Gernot Belger |
|
44 */ |
|
45 public abstract class AbstractCommonExporter<RESULT extends AbstractCalculationResult, RESULTS extends AbstractCalculationResults<RESULT>> extends AbstractExporter { |
|
46 |
|
47 /** The storage that contains the current calculation result. */ |
|
48 protected static enum ExportMode { |
|
49 pdf, csv |
|
50 } |
|
51 |
|
52 /** The log used in this exporter. */ |
|
53 protected abstract Logger getLog(); |
|
54 |
|
55 protected RESULTS data = null; |
|
56 |
|
57 public RESULTS getData() { |
|
58 return this.data; |
|
59 } |
|
60 |
|
61 @Override |
|
62 protected void addData(final Object d) { |
|
63 /* reset */ |
|
64 this.data = null; |
|
65 |
|
66 if (d instanceof CalculationResult) { |
|
67 |
|
68 final Object dat = ((CalculationResult) d).getData(); |
|
69 if (dat != null) { |
|
70 @SuppressWarnings("unchecked") |
|
71 final RESULTS result = (RESULTS) dat; |
|
72 this.data = result; |
|
73 } |
|
74 } |
|
75 } |
|
76 |
|
77 /** |
|
78 * Formats header with unit and label: msg [unit] (label) |
|
79 */ |
|
80 protected String msgUnitLabel(final String key, final String unit, final String label) { |
|
81 final String msg = msg(key); |
|
82 return String.format("%s [%s] (%s)", msg, unit, label); |
|
83 } |
|
84 |
|
85 @Override |
|
86 protected void writeCSVData(final CSVWriter writer) { |
|
87 getLog().info("writeCSVData"); |
|
88 |
|
89 /* fetch calculation results */ |
|
90 final RESULTS results = this.data; |
|
91 |
|
92 /* write as csv */ |
|
93 writeCSVGlobalMetadata(writer, results); |
|
94 writer.writeNext(new String[] { "" }); // break line HERE to avoid redundance |
|
95 final RiverInfo river = results.getRiver(); |
|
96 // FIXME :with comment if not first result |
|
97 writeCSVHeader(writer, results, river); |
|
98 writer.writeNext(new String[] { "" }); // break line HERE to avoid redundance |
|
99 |
|
100 for (final RESULT result : results.getResults()) { |
|
101 writeCSVResult(writer, results, result); |
|
102 writer.writeNext(new String[] { "" }); // break line HERE after each resultset |
|
103 } |
|
104 |
|
105 } |
|
106 |
|
107 protected abstract void writeCSVHeader(final CSVWriter writer, final RESULTS results, final RiverInfo river); |
|
108 |
|
109 /** |
|
110 * Add metadata that is once written to the top of the file. |
|
111 */ |
|
112 protected abstract void writeCSVGlobalMetadata(final CSVWriter writer, final RESULTS results); |
|
113 |
|
114 protected void writeCSVMetaEntry(final CSVWriter writer, final String message, final Object... messageArgs) { |
|
115 |
|
116 final CallMeta meta = this.context.getMeta(); |
|
117 |
|
118 writer.writeNext(new String[] { Resources.getMsg(meta, message, message, messageArgs) }); |
|
119 } |
|
120 |
|
121 private void writeCSVResult(final CSVWriter writer, final RESULTS results, final RESULT result) { |
|
122 |
|
123 writeCSVResultMetadata(writer, results, result); |
|
124 writer.writeNext(new String[] { "" }); // break line HERE to avoid redundance |
|
125 |
|
126 // final RiverInfo river = results.getRiver(); |
|
127 // |
|
128 // writeCSVHeader(writer, results, river); |
|
129 /* now the value rows */ |
|
130 final Collection<ResultRow> rows = result.getRows(); // war mal SInfoResultRow |
|
131 for (final ResultRow row : rows) { |
|
132 writeCSVRow(writer, results, result, row); |
|
133 } |
|
134 } |
|
135 |
|
136 /** |
|
137 * Add metadata that is written once per result set. |
|
138 */ |
|
139 protected abstract void writeCSVResultMetadata(CSVWriter writer, RESULTS results, RESULT result); |
|
140 |
|
141 protected void writeCSVRow(final CSVWriter writer, final RESULTS results, final RESULT result, final ResultRow row) { |
|
142 getLog().debug("writeCSVFlowDepthRow"); |
|
143 |
|
144 final String[] formattedRow = formatCSVRow(results, row); |
|
145 writer.writeNext(formattedRow); |
|
146 } |
|
147 |
|
148 protected final String[] formatCSVRow(final RESULTS results, final ResultRow row) { |
|
149 return formatRow(results, row, ExportMode.csv); |
|
150 } |
|
151 |
|
152 // protected abstract void tweakDesign() |
|
153 |
|
154 @Override |
|
155 protected void writePDF(final OutputStream outStream) { |
|
156 getLog().debug("write PDF"); |
|
157 |
|
158 final JRDataSource source = createJRData(); |
|
159 final JRDataSource source2 = createJRData(); |
|
160 |
|
161 final String confPath = Config.getConfigDirectory().toString(); |
|
162 |
|
163 // FIXME: distinguish between with and without tkh: we need two jasper reports! |
|
164 |
|
165 final Map<String, Object> parameters = new HashMap<>(); |
|
166 parameters.put("ReportTitle", "Exported Data"); |
|
167 |
|
168 try { |
|
169 |
|
170 // JRProperties.setProperty(JRProperties.COMPILER_XML_VALIDATION, false); |
|
171 JRProperties.setProperty(JRSaxParserFactory.PROPERTY_REPORT_PARSER_FACTORY, JRReportSaxParserFactory.class.getName()); |
|
172 |
|
173 final String jasperPath = confPath + getJasperFile(); |
|
174 final JasperDesign test = JRXmlLoader.load(jasperPath); |
|
175 |
|
176 final JRElement element = test.getColumnHeader().getElementByKey("TEST"); |
|
177 // element.setWidth(200); |
|
178 |
|
179 final JasperReport compiled = JasperCompileManager.compileReport(test); |
|
180 |
|
181 final JasperPrint print = JasperFillManager.fillReport(compiled, parameters, source); |
|
182 // JasperExportManager.exportReportToPdfStream(print, outStream); |
|
183 |
|
184 final JasperPrint print2 = JasperFillManager.fillReport(compiled, parameters, source2); |
|
185 |
|
186 final List<JRPrintPage> pages = print2.getPages(); |
|
187 for (final JRPrintPage page : pages) |
|
188 print.addPage(page); |
|
189 |
|
190 JasperExportManager.exportReportToPdfStream(print, outStream); |
|
191 } |
|
192 catch (final JRException je) { |
|
193 getLog().warn("Error generating PDF Report!", je); |
|
194 } |
|
195 } |
|
196 |
|
197 protected abstract String getJasperFile(); |
|
198 |
|
199 private JRDataSource createJRData() { |
|
200 |
|
201 /* fetch calculation results */ |
|
202 final RESULTS results = this.data; |
|
203 |
|
204 final MetaAndTableJRDataSource source = new MetaAndTableJRDataSource(); |
|
205 |
|
206 addJRMetaData(source, results); |
|
207 |
|
208 for (final RESULT result : results.getResults()) { |
|
209 addJRTableData(source, results, result); |
|
210 } |
|
211 |
|
212 return source; |
|
213 } |
|
214 |
|
215 protected abstract void addJRMetaData(final MetaAndTableJRDataSource source, final RESULTS results); |
|
216 |
|
217 protected void addJRTableData(final MetaAndTableJRDataSource source, final RESULTS results, final RESULT result) { |
|
218 |
|
219 final Collection<ResultRow> rows = result.getRows(); |
|
220 |
|
221 for (final ResultRow row : rows) { |
|
222 |
|
223 final String[] formattedRow = formatPDFRow(results, row); |
|
224 source.addData(formattedRow); |
|
225 } |
|
226 } |
|
227 |
|
228 protected abstract String[] formatRow(RESULTS results, ResultRow row, ExportMode mode); |
|
229 |
|
230 protected final String[] formatPDFRow(final RESULTS results, final ResultRow row) { |
|
231 // @Override |
|
232 // protected String[] formatPDFRow(final FlowDepthDevelopmentCalculationResults results, final ResultRow row) { |
|
233 return formatRow(results, row, ExportMode.pdf); |
|
234 // } |
|
235 } |
|
236 |
|
237 protected abstract void writeCSVGlobalMetadataDefaults(final CSVWriter writer, final RESULTS results); |
|
238 |
|
239 protected abstract void addJRMetaDataDefaults(final MetaAndTableJRDataSource source, final RESULTS results); |
|
240 } |