comparison artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/flowdepth/FlowDepthExporter.java @ 9150:23945061daec

gigantic refactoring: exporter, result, results to support multiple jaspers -> collisions
author gernotbelger
date Thu, 14 Jun 2018 16:56:31 +0200
parents 7134a4c7d1b6
children a4121ec450d6
comparison
equal deleted inserted replaced
9149:5be112fba832 9150:23945061daec
7 */ 7 */
8 8
9 package org.dive4elements.river.artifacts.sinfo.flowdepth; 9 package org.dive4elements.river.artifacts.sinfo.flowdepth;
10 10
11 import java.io.OutputStream; 11 import java.io.OutputStream;
12 import java.util.ArrayList;
13 import java.util.Collection;
14 12
15 import org.apache.log4j.Logger; 13 import org.dive4elements.river.artifacts.common.AbstractCalculationExportableResult;
16 import org.dive4elements.river.artifacts.common.GeneralResultType; 14 import org.dive4elements.river.artifacts.common.AbstractCommonExporter;
15 import org.dive4elements.river.artifacts.common.ExportContextCSV;
17 import org.dive4elements.river.artifacts.common.JasperDesigner; 16 import org.dive4elements.river.artifacts.common.JasperDesigner;
18 import org.dive4elements.river.artifacts.common.JasperReporter; 17 import org.dive4elements.river.artifacts.common.JasperReporter;
19 import org.dive4elements.river.artifacts.common.MetaAndTableJRDataSource; 18 import org.dive4elements.river.artifacts.common.MetaAndTableJRDataSource;
20 import org.dive4elements.river.artifacts.common.ResultRow;
21 import org.dive4elements.river.artifacts.sinfo.common.AbstractSInfoExporter;
22 import org.dive4elements.river.artifacts.sinfo.common.SInfoResultType;
23 import org.dive4elements.river.artifacts.sinfo.util.BedHeightInfo;
24 import org.dive4elements.river.artifacts.sinfo.util.RiverInfo; 19 import org.dive4elements.river.artifacts.sinfo.util.RiverInfo;
25 import org.dive4elements.river.artifacts.sinfo.util.WstInfo;
26 20
27 import au.com.bytecode.opencsv.CSVWriter; 21 import au.com.bytecode.opencsv.CSVWriter;
28 import net.sf.jasperreports.engine.JRException; 22 import net.sf.jasperreports.engine.JRException;
29 23
30 /** 24 /**
32 * 26 *
33 * @author <a href="mailto:ingo.weinzierl@intevation.de">Ingo Weinzierl</a> 27 * @author <a href="mailto:ingo.weinzierl@intevation.de">Ingo Weinzierl</a>
34 * @author Gernot Belger 28 * @author Gernot Belger
35 */ 29 */
36 // REMARK: must be public because its registered in generators.xml 30 // REMARK: must be public because its registered in generators.xml
37 public class FlowDepthExporter extends AbstractSInfoExporter<FlowDepthCalculationResult, FlowDepthCalculationResults> { 31 public class FlowDepthExporter extends AbstractCommonExporter<FlowDepthCalculationResults> {
38
39 /** The log used in this exporter. */
40 private static Logger log = Logger.getLogger(FlowDepthExporter.class);
41
42 private static final String JASPER_FILE = "/jasper/templates/sinfo.flowdepth.jrxml"; // TODO use jrxml-path all over the project
43 32
44 @Override 33 @Override
45 protected Logger getLog() { 34 protected void doWriteCSVData(final CSVWriter writer, final FlowDepthCalculationResults results) {
46 return log; 35 // TODO: Diesen Ablauf in super?
36
37 // TODO: move results into context?
38 final ExportContextCSV exportContextCSV = new ExportContextCSV(this.context, writer);
39
40 getLog().info("writeCSVData");
41
42 /* write as csv */
43 exportContextCSV.writeCSVGlobalMetadataDefaults(results); // ggf auslagern innerhalb dieser Klasse
44
45 // writer.writeNext(new String[] { "" }); // break line HERE to avoid redundance
46
47 final RiverInfo river = results.getRiver();
48
49 final Class<?> lastResultType = null;
50
51 for (final AbstractCalculationExportableResult<FlowDepthCalculationResults> result : results.getResults()) {
52
53 final Class<?> resultType = result.getClass();
54 if (lastResultType == null || lastResultType != resultType) {
55 exportContextCSV.writeBlankLine();
56 result.writeCSVHeader(exportContextCSV, results, river);
57 exportContextCSV.writeBlankLine();
58 } else
59 exportContextCSV.writeCSVLine(new String[] { "#" });
60
61 result.writeCsv(exportContextCSV, results);
62 }
47 } 63 }
48 64
49 @Override 65 @Override
50 protected void writeCSVGlobalMetadata(final CSVWriter writer, final FlowDepthCalculationResults results) { 66 protected void doWritePdf(final OutputStream out, final FlowDepthCalculationResults results) {
51 log.info("FlowDepthExporter.writeCSVMeta");
52 super.writeCSVGlobalMetadataDefaults(writer, results);
53 }
54 67
55 @Override 68 // TODO: Move to super? Maybe not, hier gibt es unterschiede -> design remove columns
56 protected void writeCSVResultMetadata(final CSVWriter writer, final FlowDepthCalculationResults results, final FlowDepthCalculationResult result) { 69 try {
70 final ExportContextCSV exportContextCSV = new ExportContextCSV(this.context, null);
57 71
58 final BedHeightInfo sounding = result.getSounding(); 72 final JasperReporter reporter = new JasperReporter();
59 super.writeCSVSoundingMetadata(writer, sounding);
60 73
61 writer.writeNext(new String[] { "" }); // break line 74 for (final AbstractCalculationExportableResult<FlowDepthCalculationResults> result : results.getResults()) {
75 final MetaAndTableJRDataSource source = new MetaAndTableJRDataSource();
76 getHelper().addJRMetaDataUSINFO(source, results);
62 77
63 final WstInfo wst = result.getWst(); 78 final JasperDesigner design = result.addReport(exportContextCSV, results, reporter, source);
64 super.writeCSVWaterlevelMetadata(writer, wst); 79 if (result instanceof FlowDepthCalculationResult) {
65 80 if (!((FlowDepthCalculationResult) result).hasTkh()) {
66 writer.writeNext(new String[] { "" }); // break line 81 design.removeColumn("tkh");
67 82 design.removeColumn("flowdepthtkh");
68 } 83 }
69 84 }
70 /** 85 reporter.exportPDF(out);
71 * Write the header, with different headings depending on whether at a
72 * gauge or at a location.
73 *
74 * @param river
75 * @param useTkh
76 */
77 @Override
78 protected void writeCSVHeader(final CSVWriter writer, final FlowDepthCalculationResults results, final RiverInfo river) {
79 log.info("FlowDepthExporter.writeCSVHeader");
80
81 final Collection<String> header = new ArrayList<>(11);
82
83 header.add(msg(GeneralResultType.station.getCsvHeader()));
84 header.add(msgUnit(SInfoResultType.flowdepth.getCsvHeader(), SInfoResultType.flowdepth.getUnit()));
85
86 if (results.isUseTkh()) {
87 header.add(msgUnit(SInfoResultType.flowdepthtkh.getCsvHeader(), SInfoResultType.flowdepthtkh.getUnit()));
88 header.add(msgUnit(SInfoResultType.tkh.getCsvHeader(), SInfoResultType.tkh.getUnit()));
89 }
90
91 header.add(msgUnit(SInfoResultType.waterlevel.getCsvHeader(), river.getWstUnit()));
92 header.add(msgUnit(SInfoResultType.discharge.getCsvHeader(), SInfoResultType.discharge.getUnit()));
93 header.add(msg(SInfoResultType.waterlevelLabel.getCsvHeader()));
94 header.add(msg(SInfoResultType.gaugeLabel.getCsvHeader()));
95 header.add(msgUnit(SInfoResultType.meanBedHeight.getCsvHeader(), river.getWstUnit()));
96 header.add(msg(SInfoResultType.soundingLabel.getCsvHeader()));
97 header.add(msg(SInfoResultType.location.getCsvHeader()));
98
99 writer.writeNext(header.toArray(new String[header.size()]));
100 }
101
102 /**
103 * Format a row of a flow depth result into an array of string, both used by csv and pdf
104 *
105 * @param pdf
106 *
107 * @param useTkh
108 */
109 @Override
110 protected String[] formatRow(final FlowDepthCalculationResults results, final ResultRow row, final ExportMode mode) {
111
112 final Collection<String> lines = new ArrayList<>(11);
113
114 lines.add(row.exportValue(this.context, GeneralResultType.station));
115 lines.add(row.exportValue(this.context, SInfoResultType.flowdepth));
116
117 if (mode == ExportMode.pdf || getData().isUseTkh()) {
118 lines.add(row.exportValue(this.context, SInfoResultType.flowdepthtkh));
119 lines.add(row.exportValue(this.context, SInfoResultType.tkh));
120 }
121
122 lines.add(row.exportValue(this.context, SInfoResultType.waterlevel));
123 lines.add(row.exportValue(this.context, SInfoResultType.discharge));
124 lines.add(row.exportValue(this.context, SInfoResultType.waterlevelLabel));
125 lines.add(row.exportValue(this.context, SInfoResultType.gaugeLabel));
126 lines.add(row.exportValue(this.context, SInfoResultType.meanBedHeight));
127 lines.add(row.exportValue(this.context, SInfoResultType.soundingLabel));
128 lines.add(row.exportValue(this.context, SInfoResultType.location));
129
130 return lines.toArray(new String[lines.size()]);
131 }
132
133 @Override
134 protected void writePDF(final OutputStream out) {
135
136 try {
137 final MetaAndTableJRDataSource source = createJRData(this.data);
138 final JasperReporter reporter = new JasperReporter();
139 final JasperDesigner design = reporter.addReport(JASPER_FILE, source);
140
141 if (!getData().isUseTkh()) {
142 design.removeColumn("tkh");
143 design.removeColumn("flowdepthtkh");
144 } 86 }
145 reporter.exportPDF(out);
146 } 87 }
147 catch (final JRException je) { 88 catch (final JRException je) {
148 getLog().warn("Error generating PDF Report!", je); 89 getLog().warn("Error generating PDF Report!", je);
149 } 90 }
150 }
151 91
152 @Override
153 protected final void addJRMetaData(final MetaAndTableJRDataSource source, final FlowDepthCalculationResults results) {
154
155 /* general metadata */
156 super.addJRMetaData(source, results);
157
158 /* column headings */
159 source.addMetaData("station_header", GeneralResultType.station.getPdfHeader(this.context.getMeta()));
160 source.addMetaData("flowdepth_header", SInfoResultType.flowdepth.getPdfHeader(this.context.getMeta()));
161 source.addMetaData("flowdepth_tkh_header", SInfoResultType.flowdepthtkh.getPdfHeader(this.context.getMeta()));
162 source.addMetaData("tkh_header", SInfoResultType.tkh.getPdfHeader(this.context.getMeta()));
163 source.addMetaData("waterlevel_header", SInfoResultType.waterlevel.getPdfHeader(this.context.getMeta()));
164 source.addMetaData("discharge_header", SInfoResultType.discharge.getPdfHeader(this.context.getMeta()));
165 source.addMetaData("waterlevel_name_header", SInfoResultType.waterlevelLabel.getPdfHeader(this.context.getMeta()));
166 source.addMetaData("gauge_header", SInfoResultType.gaugeLabel.getPdfHeader(this.context.getMeta()));
167 source.addMetaData("bedheight_header", SInfoResultType.meanBedHeight.getPdfHeader(this.context.getMeta()));
168 source.addMetaData("sounding_name_header", SInfoResultType.soundingLabel.getPdfHeader(this.context.getMeta()));
169 source.addMetaData("location_header", SInfoResultType.location.getPdfHeader(this.context.getMeta()));
170 } 92 }
171 93
172 } 94 }

http://dive4elements.wald.intevation.org