Mercurial > dive4elements > river
comparison artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/common/AbstractSInfoExporter.java @ 9000:50cc99579a46
Work on uinfo
author | gernotbelger |
---|---|
date | Thu, 12 Apr 2018 19:16:10 +0200 |
parents | 27851cfda84a |
children | 460fcc128794 |
comparison
equal
deleted
inserted
replaced
8999:e3b3ce32c825 | 9000:50cc99579a46 |
---|---|
7 * and comes with ABSOLUTELY NO WARRANTY! Check out the | 7 * and comes with ABSOLUTELY NO WARRANTY! Check out the |
8 * documentation coming with Dive4Elements River for details. | 8 * documentation coming with Dive4Elements River for details. |
9 */ | 9 */ |
10 package org.dive4elements.river.artifacts.sinfo.common; | 10 package org.dive4elements.river.artifacts.sinfo.common; |
11 | 11 |
12 import java.io.OutputStream; | |
13 import java.text.DateFormat; | 12 import java.text.DateFormat; |
14 import java.text.NumberFormat; | 13 import java.text.NumberFormat; |
15 import java.util.Collection; | |
16 import java.util.Date; | 14 import java.util.Date; |
17 import java.util.HashMap; | |
18 import java.util.Locale; | 15 import java.util.Locale; |
19 import java.util.Map; | |
20 | 16 |
21 import org.apache.commons.lang.math.DoubleRange; | 17 import org.apache.commons.lang.math.DoubleRange; |
22 import org.apache.log4j.Logger; | |
23 import org.dive4elements.artifacts.CallMeta; | |
24 import org.dive4elements.artifacts.common.utils.Config; | |
25 import org.dive4elements.river.FLYS; | 18 import org.dive4elements.river.FLYS; |
26 import org.dive4elements.river.artifacts.model.CalculationResult; | 19 import org.dive4elements.river.artifacts.common.AbstractCommonExporter; |
20 import org.dive4elements.river.artifacts.common.GeneralResultType; | |
21 import org.dive4elements.river.artifacts.common.I18NStrings; | |
27 import org.dive4elements.river.artifacts.resources.Resources; | 22 import org.dive4elements.river.artifacts.resources.Resources; |
28 import org.dive4elements.river.artifacts.sinfo.SInfoI18NStrings; | |
29 import org.dive4elements.river.artifacts.sinfo.util.BedHeightInfo; | 23 import org.dive4elements.river.artifacts.sinfo.util.BedHeightInfo; |
30 import org.dive4elements.river.artifacts.sinfo.util.MetaAndTableJRDataSource; | 24 import org.dive4elements.river.artifacts.sinfo.util.MetaAndTableJRDataSource; |
31 import org.dive4elements.river.artifacts.sinfo.util.RiverInfo; | 25 import org.dive4elements.river.artifacts.sinfo.util.RiverInfo; |
32 import org.dive4elements.river.artifacts.sinfo.util.WstInfo; | 26 import org.dive4elements.river.artifacts.sinfo.util.WstInfo; |
33 import org.dive4elements.river.exports.AbstractExporter; | |
34 | 27 |
35 import au.com.bytecode.opencsv.CSVWriter; | 28 import au.com.bytecode.opencsv.CSVWriter; |
36 import net.sf.jasperreports.engine.JRDataSource; | |
37 import net.sf.jasperreports.engine.JRException; | |
38 import net.sf.jasperreports.engine.JasperExportManager; | |
39 import net.sf.jasperreports.engine.JasperFillManager; | |
40 import net.sf.jasperreports.engine.JasperPrint; | |
41 | 29 |
42 /** | 30 /** |
43 * @author Gernot Belger | 31 * @author Gernot Belger |
44 */ | 32 */ |
45 public abstract class AbstractSInfoExporter<RESULT extends AbstractSInfoCalculationResult, RESULTS extends AbstractSInfoCalculationResults<RESULT>> extends AbstractExporter { | 33 public abstract class AbstractSInfoExporter<RESULT extends AbstractSInfoCalculationResult, RESULTS extends AbstractSInfoCalculationResults<RESULT>> extends AbstractCommonExporter<RESULT, RESULTS> { |
46 | 34 |
47 private static final String CSV_META_HEADER_SOUNDING = "sinfo.export.flow_depth.csv.meta.header.sounding"; | 35 private static final String CSV_META_HEADER_SOUNDING = "sinfo.export.flow_depth.csv.meta.header.sounding"; |
48 | 36 |
49 private static final String CSV_META_HEADER_SOUNDING_YEAR = "sinfo.export.flow_depth.csv.meta.header.sounding.year"; | 37 private static final String CSV_META_HEADER_SOUNDING_YEAR = "sinfo.export.flow_depth.csv.meta.header.sounding.year"; |
50 | 38 |
51 private static final String CSV_META_HEADER_SOUNDING_TYPE = "sinfo.export.flow_depth.csv.meta.header.sounding.type"; | 39 private static final String CSV_META_HEADER_SOUNDING_TYPE = "sinfo.export.flow_depth.csv.meta.header.sounding.type"; |
52 | 40 |
53 private static final String CSV_META_HEADER_SOUNDING_EVALUATOR = "sinfo.export.flow_depth.csv.meta.header.sounding.evaluator"; | |
54 | |
55 private static final String CSV_META_HEADER_SOUNDING_PRJ = "sinfo.export.flow_depth.csv.meta.header.sounding.prj"; | 41 private static final String CSV_META_HEADER_SOUNDING_PRJ = "sinfo.export.flow_depth.csv.meta.header.sounding.prj"; |
56 | 42 |
57 private static final String CSV_META_HEADER_SOUNDING_ELEVATIOIN_MODEL = "sinfo.export.flow_depth.csv.meta.header.sounding.elevationmodel"; | 43 private static final String CSV_META_HEADER_SOUNDING_ELEVATIOIN_MODEL = "sinfo.export.flow_depth.csv.meta.header.sounding.elevationmodel"; |
58 | 44 |
59 private static final String CSV_META_HEADER_SOUNDING_ELEVATIOIN_MODEL_ORIGINAL = "sinfo.export.flow_depth.csv.meta.header.sounding.elevationmodel.original"; | 45 private static final String CSV_META_HEADER_SOUNDING_ELEVATIOIN_MODEL_ORIGINAL = "sinfo.export.flow_depth.csv.meta.header.sounding.elevationmodel.original"; |
60 | |
61 /** The storage that contains the current calculation result. */ | |
62 private RESULTS data = null; | |
63 | |
64 protected abstract Logger getLog(); | |
65 | |
66 public RESULTS getData() { | |
67 return this.data; | |
68 } | |
69 | |
70 @Override | |
71 protected final void addData(final Object d) { | |
72 /* reset */ | |
73 this.data = null; | |
74 | |
75 if (d instanceof CalculationResult) { | |
76 | |
77 final Object dat = ((CalculationResult) d).getData(); | |
78 if (dat != null) { | |
79 @SuppressWarnings("unchecked") | |
80 final RESULTS result = (RESULTS) dat; | |
81 this.data = result; | |
82 } | |
83 } | |
84 } | |
85 | |
86 /** | |
87 * Formats header with unit and label: msg [unit] (label) | |
88 */ | |
89 protected final String msgUnitLabel(final String key, final String unit, final String label) { | |
90 final String msg = msg(key); | |
91 return String.format("%s [%s] (%s)", msg, unit, label); | |
92 } | |
93 | |
94 @Override | |
95 protected final void writeCSVData(final CSVWriter writer) { | |
96 getLog().info("writeCSVData"); | |
97 | |
98 /* fetch calculation results */ | |
99 final RESULTS results = this.data; | |
100 | |
101 final RiverInfo river = results.getRiver(); | |
102 | |
103 /* write as csv */ | |
104 writeCSVGlobalMetadata(writer, results); | |
105 writeCSVHeader(writer, results, river); | |
106 | |
107 for (final RESULT result : results.getResults()) { | |
108 writeCSVResult(writer, results, result); | |
109 } | |
110 } | |
111 | |
112 protected abstract void writeCSVHeader(final CSVWriter writer, final RESULTS results, final RiverInfo river); | |
113 | |
114 /** | |
115 * Add metadata that is once written to the top of the file. | |
116 */ | |
117 protected abstract void writeCSVGlobalMetadata(final CSVWriter writer, final RESULTS results); | |
118 | |
119 protected final void writeCSVMetaEntry(final CSVWriter writer, final String message, final Object... messageArgs) { | |
120 | |
121 final CallMeta meta = this.context.getMeta(); | |
122 | |
123 writer.writeNext(new String[] { Resources.getMsg(meta, message, message, messageArgs) }); | |
124 } | |
125 | |
126 protected final void writeCSVResult(final CSVWriter writer, final RESULTS results, final RESULT result) { | |
127 | |
128 writeCSVResultMetadata(writer, results, result); | |
129 | |
130 /* nwo the value rows */ | |
131 final Collection<SInfoResultRow> rows = result.getRows(); | |
132 for (final SInfoResultRow row : rows) { | |
133 writeCSVRow(writer, results, result, row); | |
134 } | |
135 } | |
136 | |
137 /** | |
138 * Add metadata that is written once per result set. | |
139 */ | |
140 protected abstract void writeCSVResultMetadata(CSVWriter writer, RESULTS results, RESULT result); | |
141 | |
142 protected final void writeCSVRow(final CSVWriter writer, final RESULTS results, final RESULT result, final SInfoResultRow row) { | |
143 getLog().debug("writeCSVFlowDepthRow"); | |
144 | |
145 final String[] formattedRow = formatCSVRow(results, result, row); | |
146 writer.writeNext(formattedRow); | |
147 } | |
148 | |
149 protected abstract String[] formatCSVRow(RESULTS results, RESULT result, final SInfoResultRow row); | |
150 | |
151 @Override | |
152 protected final void writePDF(final OutputStream outStream) { | |
153 getLog().debug("write PDF"); | |
154 | |
155 final JRDataSource source = createJRData(); | |
156 | |
157 final String confPath = Config.getConfigDirectory().toString(); | |
158 | |
159 // FIXME: distinguish between with and without tkh: we need two jasper reports! | |
160 | |
161 final Map<String, Object> parameters = new HashMap<>(); | |
162 parameters.put("ReportTitle", "Exported Data"); | |
163 | |
164 try { | |
165 final String jasperPath = confPath + getJasperFile(); | |
166 | |
167 final JasperPrint print = JasperFillManager.fillReport(jasperPath, parameters, source); | |
168 JasperExportManager.exportReportToPdfStream(print, outStream); | |
169 } | |
170 catch (final JRException je) { | |
171 getLog().warn("Error generating PDF Report!", je); | |
172 } | |
173 } | |
174 | |
175 protected abstract String getJasperFile(); | |
176 | |
177 private JRDataSource createJRData() { | |
178 | |
179 /* fetch calculation results */ | |
180 final RESULTS results = this.data; | |
181 | |
182 final MetaAndTableJRDataSource source = new MetaAndTableJRDataSource(); | |
183 | |
184 addJRMetaData(source, results); | |
185 | |
186 for (final RESULT result : results.getResults()) { | |
187 addJRTableData(source, results, result); | |
188 } | |
189 | |
190 return source; | |
191 } | |
192 | |
193 protected abstract void addJRMetaData(final MetaAndTableJRDataSource source, final RESULTS results); | |
194 | |
195 protected final void addJRTableData(final MetaAndTableJRDataSource source, final RESULTS results, final RESULT result) { | |
196 | |
197 final Collection<SInfoResultRow> rows = result.getRows(); | |
198 | |
199 for (final SInfoResultRow row : rows) { | |
200 | |
201 final String[] formattedRow = formatPDFRow(results, row); | |
202 source.addData(formattedRow); | |
203 } | |
204 } | |
205 | |
206 protected abstract String[] formatPDFRow(RESULTS results, final SInfoResultRow row); | |
207 | |
208 protected final void writeCSVGlobalMetadataDefaults(final CSVWriter writer, final AbstractSInfoCalculationResults<?> results) { | |
209 | |
210 final String calcModeLabel = results.getCalcModeLabel(); | |
211 final RiverInfo river = results.getRiver(); | |
212 final DoubleRange calcRange = results.getCalcRange(); | |
213 | |
214 writeCSVMetaEntry(writer, SInfoI18NStrings.CSV_META_HEADER_RESULT, msg(SInfoI18NStrings.CSV_META_HEADER_RESULT_LABEL), river.getName(), calcModeLabel); | |
215 | |
216 // "# FLYS-Version: " | |
217 writeCSVMetaEntry(writer, SInfoI18NStrings.CSV_META_VERSION, msg(SInfoI18NStrings.CSV_META_VERSION_LABEL), FLYS.VERSION); | |
218 | |
219 // "# Bearbeiter: " | |
220 writeCSVMetaEntry(writer, SInfoI18NStrings.CSV_META_USER, msg(SInfoI18NStrings.CSV_META_USER_LABEL), results.getUser()); | |
221 | |
222 // "# Datum der Erstellung: " | |
223 final Locale locale = Resources.getLocale(this.context.getMeta()); | |
224 final DateFormat df = DateFormat.getDateInstance(DateFormat.SHORT, locale); | |
225 writeCSVMetaEntry(writer, SInfoI18NStrings.CSV_META_CREATION, msg(SInfoI18NStrings.CSV_META_CREATION_LABEL), df.format(new Date())); | |
226 | |
227 // "# Gewässer: " | |
228 writeCSVMetaEntry(writer, SInfoI18NStrings.CSV_META_RIVER, msg(SInfoI18NStrings.CSV_META_RIVER_LABEL), river.getName()); | |
229 | |
230 // "# Höhensystem des Flusses: " | |
231 writeCSVMetaEntry(writer, SInfoI18NStrings.CSV_META_HEIGHT_UNIT_RIVER, river.getWstUnit()); | |
232 | |
233 // "# Ort/Bereich (km): " | |
234 writeCSVMetaEntry(writer, SInfoI18NStrings.CSV_META_RANGE, msg(SInfoI18NStrings.CSV_META_RANGE_LABEL), | |
235 getKmFormatter().format(calcRange.getMinimumDouble()), getKmFormatter().format(calcRange.getMaximumDouble())); | |
236 } | |
237 | 46 |
238 protected final void writeCSVSoundingMetadata(final CSVWriter writer, final BedHeightInfo sounding) { | 47 protected final void writeCSVSoundingMetadata(final CSVWriter writer, final BedHeightInfo sounding) { |
239 writeCSVSoundingMetadata(writer, sounding, CSV_META_HEADER_SOUNDING); | 48 writeCSVSoundingMetadata(writer, sounding, CSV_META_HEADER_SOUNDING); |
240 } | 49 } |
241 | 50 |
246 // "# Jahr der Peilung: " | 55 // "# Jahr der Peilung: " |
247 writeCSVMetaEntry(writer, CSV_META_HEADER_SOUNDING_YEAR, Integer.toString(sounding.getYear())); | 56 writeCSVMetaEntry(writer, CSV_META_HEADER_SOUNDING_YEAR, Integer.toString(sounding.getYear())); |
248 // "# Aufnahmeart: " | 57 // "# Aufnahmeart: " |
249 writeCSVMetaEntry(writer, CSV_META_HEADER_SOUNDING_TYPE, sounding.getType()); | 58 writeCSVMetaEntry(writer, CSV_META_HEADER_SOUNDING_TYPE, sounding.getType()); |
250 // "# Auswerter: " | 59 // "# Auswerter: " |
251 writeCSVMetaEntry(writer, CSV_META_HEADER_SOUNDING_EVALUATOR, sounding.getEvaluationBy()); | 60 writeCSVMetaEntry(writer, SInfoI18NStrings.CSV_META_HEADER_EVALUATOR, sounding.getEvaluationBy()); |
252 // "# Lagesystem: " | 61 // "# Lagesystem: " |
253 writeCSVMetaEntry(writer, CSV_META_HEADER_SOUNDING_PRJ, sounding.getLocationSystem()); | 62 writeCSVMetaEntry(writer, CSV_META_HEADER_SOUNDING_PRJ, sounding.getLocationSystem()); |
254 // "# Höhensystem: " | 63 // "# Höhensystem: " |
255 writeCSVMetaEntry(writer, CSV_META_HEADER_SOUNDING_ELEVATIOIN_MODEL, sounding.getCurElevationModelUnit()); | 64 writeCSVMetaEntry(writer, CSV_META_HEADER_SOUNDING_ELEVATIOIN_MODEL, sounding.getCurElevationModelUnit()); |
256 // "# ursprüngliches Höhensystem: " | 65 // "# ursprüngliches Höhensystem: " |
275 final int year = wst.getYear(); | 84 final int year = wst.getYear(); |
276 if (year > 0) | 85 if (year > 0) |
277 writeCSVMetaEntry(writer, SInfoI18NStrings.CSV_META_HEADER_WATERLEVEL_YEAR, Integer.toString(year)); | 86 writeCSVMetaEntry(writer, SInfoI18NStrings.CSV_META_HEADER_WATERLEVEL_YEAR, Integer.toString(year)); |
278 } | 87 } |
279 | 88 |
280 protected final void addJRMetaDataDefaults(final MetaAndTableJRDataSource source, final AbstractSInfoCalculationResults<?> results) { | 89 @Override |
90 protected void writeCSVGlobalMetadataDefaults(final CSVWriter writer, final RESULTS results) { | |
91 | |
92 final String calcModeLabel = results.getCalcModeLabel(); | |
93 final RiverInfo river = results.getRiver(); | |
94 final DoubleRange calcRange = results.getCalcRange(); | |
95 | |
96 writeCSVMetaEntry(writer, I18NStrings.CSV_META_HEADER_RESULT, msg(I18NStrings.CSV_META_HEADER_RESULT_LABEL), river.getName(), calcModeLabel); | |
97 | |
98 // "# FLYS-Version: " | |
99 writeCSVMetaEntry(writer, I18NStrings.CSV_META_VERSION, msg(I18NStrings.CSV_META_VERSION_LABEL), FLYS.VERSION); | |
100 | |
101 // "# Bearbeiter: " | |
102 writeCSVMetaEntry(writer, I18NStrings.CSV_META_USER, msg(I18NStrings.CSV_META_USER_LABEL), results.getUser()); | |
103 | |
104 // "# Datum der Erstellung: " | |
105 final Locale locale = Resources.getLocale(this.context.getMeta()); | |
106 final DateFormat df = DateFormat.getDateInstance(DateFormat.SHORT, locale); | |
107 writeCSVMetaEntry(writer, I18NStrings.CSV_META_CREATION, msg(I18NStrings.CSV_META_CREATION_LABEL), df.format(new Date())); | |
108 | |
109 // "# Gewässer: " | |
110 writeCSVMetaEntry(writer, I18NStrings.CSV_META_RIVER, msg(I18NStrings.CSV_META_RIVER_LABEL), river.getName()); | |
111 | |
112 // "# Höhensystem des Flusses: " | |
113 writeCSVMetaEntry(writer, I18NStrings.CSV_META_HEIGHT_UNIT_RIVER, river.getWstUnit()); | |
114 | |
115 if (calcRange != null) { | |
116 // "# Ort/Bereich (km): " | |
117 writeCSVMetaEntry(writer, I18NStrings.CSV_META_RANGE, msg(I18NStrings.CSV_META_RANGE_LABEL), getKmFormatter().format(calcRange.getMinimumDouble()), | |
118 getKmFormatter().format(calcRange.getMaximumDouble())); | |
119 } | |
120 } | |
121 | |
122 @Override | |
123 protected void addJRMetaData(final MetaAndTableJRDataSource source, final RESULTS results) { | |
124 | |
125 /* general metadata */ | |
126 this.addJRMetaDataDefaults(source, results); | |
281 | 127 |
282 final RiverInfo river = results.getRiver(); | 128 final RiverInfo river = results.getRiver(); |
283 final String wstUnitName = river.getWstUnit(); | 129 final String wstUnitName = river.getWstUnit(); |
284 | 130 |
285 source.addMetaData("header", msg(SInfoI18NStrings.CSV_META_HEADER_RESULT_LABEL)); | 131 source.addMetaData("river_label", msg(I18NStrings.CSV_META_RIVER_LABEL)); |
286 source.addMetaData("calcMode", results.getCalcModeLabel()); | |
287 | |
288 source.addMetaData("version_label", msg(SInfoI18NStrings.CSV_META_VERSION_LABEL)); | |
289 source.addMetaData("version", FLYS.VERSION); | |
290 | |
291 source.addMetaData("user_label", msg(SInfoI18NStrings.CSV_META_USER_LABEL)); | |
292 source.addMetaData("user", results.getUser()); | |
293 | |
294 final Locale locale = Resources.getLocale(this.context.getMeta()); | |
295 final DateFormat df = DateFormat.getDateInstance(DateFormat.SHORT, locale); | |
296 source.addMetaData("date_label", msg(SInfoI18NStrings.CSV_META_CREATION_LABEL)); | |
297 source.addMetaData("date", df.format(new Date())); | |
298 | |
299 source.addMetaData("river_label", msg(SInfoI18NStrings.CSV_META_RIVER_LABEL)); | |
300 source.addMetaData("river", river.getName()); | 132 source.addMetaData("river", river.getName()); |
301 source.addMetaData("river_unit", wstUnitName); | 133 source.addMetaData("river_unit", wstUnitName); |
302 | 134 |
303 final DoubleRange calcRange = results.getCalcRange(); | 135 final DoubleRange calcRange = results.getCalcRange(); |
304 final NumberFormat kmFormatter = getKmFormatter(); | 136 final NumberFormat kmFormatter = getKmFormatter(); |
305 final String rangeValue = String.format("%s - %s", kmFormatter.format(calcRange.getMinimumDouble()), kmFormatter.format(calcRange.getMaximumDouble())); | 137 final String rangeValue = String.format("%s - %s", kmFormatter.format(calcRange.getMinimumDouble()), kmFormatter.format(calcRange.getMaximumDouble())); |
306 source.addMetaData("range_label", msg(SInfoI18NStrings.CSV_META_RANGE_LABEL)); | 138 source.addMetaData("range_label", msg(I18NStrings.CSV_META_RANGE_LABEL)); |
307 source.addMetaData("range", rangeValue); | 139 source.addMetaData("range", rangeValue); |
140 | |
141 /* column headings */ | |
142 // source.addMetaData("station_header", GeneralResultType.station.getPdfHeader(this.context.getMeta())); // moved to | |
143 // super | |
144 | |
145 // TODO: move to subs | |
146 /* column headings */ | |
147 source.addMetaData("flowdepth_header", SInfoResultType.flowdepth.getPdfHeader(this.context.getMeta())); | |
148 source.addMetaData("flowdepth_tkh_header", SInfoResultType.flowdepthtkh.getPdfHeader(this.context.getMeta())); | |
149 source.addMetaData("tkh_header", SInfoResultType.tkh.getPdfHeader(this.context.getMeta())); | |
150 source.addMetaData("waterlevel_header", SInfoResultType.waterlevel.getPdfHeader(this.context.getMeta())); | |
151 source.addMetaData("discharge_header", SInfoResultType.discharge.getPdfHeader(this.context.getMeta())); | |
152 source.addMetaData("waterlevel_name_header", SInfoResultType.waterlevelLabel.getPdfHeader(this.context.getMeta())); | |
153 source.addMetaData("gauge_header", SInfoResultType.gaugeLabel.getPdfHeader(this.context.getMeta())); | |
154 source.addMetaData("bedheight_header", SInfoResultType.meanBedHeight.getPdfHeader(this.context.getMeta())); | |
155 source.addMetaData("sounding_name_header", SInfoResultType.soundingLabel.getPdfHeader(this.context.getMeta())); | |
156 source.addMetaData("location_header", SInfoResultType.location.getPdfHeader(this.context.getMeta())); | |
308 } | 157 } |
158 | |
159 @Override | |
160 protected void addJRMetaDataDefaults(final MetaAndTableJRDataSource source, final RESULTS results) { | |
161 | |
162 source.addMetaData("header", msg(I18NStrings.CSV_META_HEADER_RESULT_LABEL)); | |
163 source.addMetaData("calcMode", results.getCalcModeLabel()); | |
164 | |
165 source.addMetaData("version_label", msg(I18NStrings.CSV_META_VERSION_LABEL)); | |
166 source.addMetaData("version", FLYS.VERSION); | |
167 | |
168 source.addMetaData("user_label", msg(I18NStrings.CSV_META_USER_LABEL)); | |
169 source.addMetaData("user", results.getUser()); | |
170 | |
171 final Locale locale = Resources.getLocale(this.context.getMeta()); | |
172 final DateFormat df = DateFormat.getDateInstance(DateFormat.SHORT, locale); | |
173 source.addMetaData("date_label", msg(I18NStrings.CSV_META_CREATION_LABEL)); | |
174 source.addMetaData("date", df.format(new Date())); | |
175 | |
176 /* column headings */ | |
177 source.addMetaData("station_header", GeneralResultType.station.getPdfHeader(this.context.getMeta())); | |
178 } | |
179 | |
309 } | 180 } |