comparison artifacts/src/main/java/org/dive4elements/river/exports/fixings/DeltaWtExporter.java @ 9415:9744ce3c3853

Rework of fixanalysis computation and dWt and WQ facets. Got rid of strange remapping and bitshifting code by explicitely saving the column information and using it in the facets. The facets also put the valid station range into their xml-metadata
author gernotbelger
date Thu, 16 Aug 2018 16:27:53 +0200
parents ddcd52d239cd
children
comparison
equal deleted inserted replaced
9414:096f151a0a9f 9415:9744ce3c3853
12 import java.io.OutputStream; 12 import java.io.OutputStream;
13 import java.text.DateFormat; 13 import java.text.DateFormat;
14 import java.text.MessageFormat; 14 import java.text.MessageFormat;
15 import java.text.NumberFormat; 15 import java.text.NumberFormat;
16 import java.util.ArrayList; 16 import java.util.ArrayList;
17 import java.util.Collection;
18 import java.util.Date;
17 import java.util.List; 19 import java.util.List;
18 import java.util.TreeMap; 20 import java.util.TreeMap;
19 21
20 import org.apache.log4j.Logger; 22 import org.apache.log4j.Logger;
21 import org.dive4elements.artifacts.CallMeta; 23 import org.dive4elements.artifacts.CallMeta;
26 import org.dive4elements.river.artifacts.common.ExportContextPDF; 28 import org.dive4elements.river.artifacts.common.ExportContextPDF;
27 import org.dive4elements.river.artifacts.common.GeneralResultType; 29 import org.dive4elements.river.artifacts.common.GeneralResultType;
28 import org.dive4elements.river.artifacts.common.JasperReporter; 30 import org.dive4elements.river.artifacts.common.JasperReporter;
29 import org.dive4elements.river.artifacts.common.MetaAndTableJRDataSource; 31 import org.dive4elements.river.artifacts.common.MetaAndTableJRDataSource;
30 import org.dive4elements.river.artifacts.model.CalculationResult; 32 import org.dive4elements.river.artifacts.model.CalculationResult;
31 import org.dive4elements.river.artifacts.model.fixings.AnalysisPeriod; 33 import org.dive4elements.river.artifacts.model.fixings.AnalysisPeriodEventResults;
32 import org.dive4elements.river.artifacts.model.fixings.FixAnalysisResult; 34 import org.dive4elements.river.artifacts.model.fixings.FixAnalysisResult;
35 import org.dive4elements.river.artifacts.model.fixings.FixResultColumn;
36 import org.dive4elements.river.artifacts.model.fixings.FixResultColumns;
33 import org.dive4elements.river.artifacts.model.fixings.QWD; 37 import org.dive4elements.river.artifacts.model.fixings.QWD;
34 import org.dive4elements.river.artifacts.resources.Resources; 38 import org.dive4elements.river.artifacts.resources.Resources;
35 import org.dive4elements.river.artifacts.sinfo.util.CalculationUtils; 39 import org.dive4elements.river.artifacts.sinfo.util.CalculationUtils;
36 import org.dive4elements.river.artifacts.sinfo.util.RiverInfo; 40 import org.dive4elements.river.artifacts.sinfo.util.RiverInfo;
37 import org.dive4elements.river.exports.AbstractExporter; 41 import org.dive4elements.river.exports.AbstractExporter;
38 import org.dive4elements.river.utils.Formatter; 42 import org.dive4elements.river.utils.Formatter;
39 import org.dive4elements.river.utils.KMIndex; 43 import org.dive4elements.river.utils.KMIndex;
44 import org.dive4elements.river.utils.KMIndex.Entry;
40 45
41 import au.com.bytecode.opencsv.CSVWriter; 46 import au.com.bytecode.opencsv.CSVWriter;
42 import net.sf.jasperreports.engine.JRException; 47 import net.sf.jasperreports.engine.JRException;
43 48
44 /** Exports fixation analysis deltaw(t) computation results to csv. */ 49 /** Exports fixation analysis deltaw(t) computation results to csv. */
46 /** Private log. */ 51 /** Private log. */
47 private static Logger log = Logger.getLogger(DeltaWtExporter.class); 52 private static Logger log = Logger.getLogger(DeltaWtExporter.class);
48 53
49 private static final String JASPER_FILE = "/jasper/templates/fixanalysis.delta_wt.jrxml"; 54 private static final String JASPER_FILE = "/jasper/templates/fixanalysis.delta_wt.jrxml";
50 55
51 public static final String CSV_KM_HEADER = "export.fixings.deltawt.csv.header.km"; 56 private static final String CSV_KM_HEADER = "export.fixings.deltawt.csv.header.km";
52 57
53 public static final String CSV_DELTA_W_HEADER = "export.fixings.deltawt.csv.header.deltaw"; 58 private static final String CSV_DELTA_W_HEADER = "export.fixings.deltawt.csv.header.deltaw";
54 59
55 public static final String CSV_Q_HEADER = "export.fixings.deltawt.csv.header.q"; 60 private static final String CSV_Q_HEADER = "export.fixings.deltawt.csv.header.q";
56 61
57 public static final String CSV_W_HEADER = "export.fixings.deltawt.csv.header.w"; 62 private static final String CSV_W_HEADER = "export.fixings.deltawt.csv.header.w";
58 63
59 public static final String CSV_TRANGE_HEADER = "export.fixings.deltawt.csv.header.time.range"; 64 private static final String CSV_TRANGE_HEADER = "export.fixings.deltawt.csv.header.time.range";
60 65
61 public static final String CSV_T_HEADER = "export.fixings.deltawt.csv.header.t"; 66 private static final String CSV_T_HEADER = "export.fixings.deltawt.csv.header.t";
62 67
63 public static final String CSV_T_FORMAT = "export.fixings.deltawt.csv.t.format"; 68 private static final String CSV_T_FORMAT = "export.fixings.deltawt.csv.t.format";
64 69
65 public static final String DEFAULT_CSV_KM_HEADER = "km"; 70 private static final String DEFAULT_CSV_KM_HEADER = "km";
66 71
67 public static final String DEFAULT_CSV_DELTA_W_HEADER = "\u0394 W [cm]"; 72 private static final String DEFAULT_CSV_DELTA_W_HEADER = "\u0394 W [cm]";
68 73
69 public static final String DEFAULT_CSV_W_HEADER = "Wasserstand [m]"; 74 private static final String DEFAULT_CSV_W_HEADER = "Wasserstand [m]";
70 75
71 public static final String DEFAULT_CSV_Q_HEADER = "Abfluss [m\u00b3/s]"; 76 private static final String DEFAULT_CSV_Q_HEADER = "Abfluss [m\u00b3/s]";
72 77
73 public static final String DEFAULT_CSV_T_HEADER = "Datum"; 78 private static final String DEFAULT_CSV_T_HEADER = "Datum";
74 79
75 public static final String DEFAULT_CSV_TRANGE_DESC_HEADER = "Status"; 80 private static final String DEFAULT_CSV_TRANGE_DESC_HEADER = "Status";
76 81
77 public static final String CSV_REFERENCE = "export.fixings.deltawt.csv.reference"; 82 private static final String CSV_REFERENCE = "export.fixings.deltawt.csv.reference";
78 83
79 public static final String CSV_ANALYSIS = "export.fixings.deltawt.csv.analysis"; 84 private static final String CSV_ANALYSIS = "export.fixings.deltawt.csv.analysis";
80 85
81 public static final String DEFAULT_CSV_REFERENCE = "B"; 86 private static final String DEFAULT_CSV_REFERENCE = "B";
82 87
83 public static final String DEFAULT_CSV_ANALYSIS = "A{0,number,integer}"; 88 private static final String DEFAULT_CSV_ANALYSIS = "A{0,number,integer}";
84 89
85 public static final String DEFAULT_CSV_T_FORMAT = "dd.MM.yyyy"; 90 private static final String DEFAULT_CSV_T_FORMAT = "dd.MM.yyyy";
86 91
87 protected List<KMIndex<AnalysisPeriod[]>> analysisPeriods; 92 private final List<AnalysisPeriodEventResults> analysisEvents = new ArrayList<>();
88 93
89 protected List<KMIndex<QWD[]>> referenceEvents; 94 private final List<FixResultColumns> referenceEvents = new ArrayList<>();
90
91 public DeltaWtExporter() {
92 this.analysisPeriods = new ArrayList<>();
93 this.referenceEvents = new ArrayList<>();
94 }
95 95
96 @Override 96 @Override
97 protected void addData(final Object d) { 97 protected void addData(final Object d) {
98 log.debug("DeltaWtExporter.addData"); 98 log.debug("DeltaWtExporter.addData");
99 if (!(d instanceof CalculationResult)) { 99 if (!(d instanceof CalculationResult)) {
102 } 102 }
103 103
104 final Object data = ((CalculationResult) d).getData(); 104 final Object data = ((CalculationResult) d).getData();
105 if (!(data instanceof FixAnalysisResult)) { 105 if (!(data instanceof FixAnalysisResult)) {
106 log.warn("Invalid data stored in result."); 106 log.warn("Invalid data stored in result.");
107 } 107 return;
108 }
109
108 final FixAnalysisResult result = (FixAnalysisResult) data; 110 final FixAnalysisResult result = (FixAnalysisResult) data;
109 this.analysisPeriods.add(result.getAnalysisPeriods()); 111 this.analysisEvents.add(result.getAnalysisEventResults());
110 this.referenceEvents.add(result.getFixings()); 112 this.referenceEvents.add(result.getFixResultColumns());
111 } 113 }
112 114
113 @Override 115 @Override
114 protected void writeCSVData(final CSVWriter writer) throws IOException { 116 protected void writeCSVData(final CSVWriter writer) throws IOException {
115 117
116 writeCSVHeader(writer); 118 writeCSVHeader(writer);
117 119
118 final TreeMap<Double, ArrayList<String[]>> sorted = getRows(); 120 final TreeMap<Double, List<String[]>> sorted = getRows();
119 for (final ArrayList<String[]> list : sorted.values()) { 121 for (final List<String[]> list : sorted.values()) {
120 for (final String[] row : list) { 122 for (final String[] row : list)
121 writer.writeNext(row); 123 writer.writeNext(row);
122 }
123 } 124 }
124 125
125 writer.flush(); 126 writer.flush();
126 } 127 }
127 128
128 private TreeMap<Double, ArrayList<String[]>> getRows() { 129 private TreeMap<Double, List<String[]>> getRows() {
129 final NumberFormat kmF = getKMFormatter(); 130 final NumberFormat kmF = getKMFormatter();
130 final NumberFormat dwF = getDeltaWFormatter(); 131 final NumberFormat dwF = getDeltaWFormatter();
131 final NumberFormat qF = getQFormatter(); 132 final NumberFormat qF = getQFormatter();
132 final NumberFormat wF = getWFormatter(); 133 final NumberFormat wF = getWFormatter();
133 134
134 final DateFormat dF = getDateFormatter(); 135 final DateFormat dF = getDateFormatter();
135 136
136 final TreeMap<Double, ArrayList<String[]>> sorted = new TreeMap<>(); 137 final TreeMap<Double, List<String[]>> sorted = new TreeMap<>();
137 138
138 final String referenceS = getReference(); 139 final String referenceS = getReference();
139 140
140 for (final KMIndex<QWD[]> reference : this.referenceEvents) { 141 for (final FixResultColumns referenceColumns : this.referenceEvents) {
141 142
142 for (final KMIndex.Entry<QWD[]> kmEntry : reference) { 143 appendRows(sorted, referenceColumns, referenceS, kmF, dwF, qF, wF, dF);
143 144 }
144 final Double km = kmEntry.getKm(); 145
145 146 final String analysisTemplate = getAnalysisTemplate();
146 ArrayList<String[]> list = sorted.get(km); 147
147 148 int analysisCount = 1;
149 for (final AnalysisPeriodEventResults analysisPeriodEventResults : this.analysisEvents) {
150
151 final Collection<FixResultColumns> analysisResults = analysisPeriodEventResults.getEventResults();
152 for (final FixResultColumns analysisColumns : analysisResults) {
153
154 final String analyisS = MessageFormat.format(analysisTemplate, analysisCount);
155 appendRows(sorted, analysisColumns, analyisS, kmF, dwF, qF, wF, dF);
156 }
157
158 analysisCount++;
159 }
160
161 return sorted;
162 }
163
164 private void appendRows(final TreeMap<Double, List<String[]>> sorted, final FixResultColumns resultColumns, final String referenceS, final NumberFormat kmF,
165 final NumberFormat dwF, final NumberFormat qF, final NumberFormat wF, final DateFormat dF) {
166
167 final Collection<FixResultColumn> cols = resultColumns.getSortedColumns();
168 for (final FixResultColumn column : cols) {
169
170 final Date date = column.getDate();
171
172 final KMIndex<QWD> qwds = column.getQWDs();
173 for (final Entry<QWD> qwdEntry : qwds) {
174
175 final double km = qwdEntry.getKm();
176 final QWD qwd = qwdEntry.getValue();
177
178 List<String[]> list = sorted.get(km);
148 if (list == null) { 179 if (list == null) {
149 list = new ArrayList<>(); 180 list = new ArrayList<>();
150 sorted.put(km, list); 181 sorted.put(km, list);
151 } 182 }
152 183
153 final String kmS = kmF.format(kmEntry.getKm()); 184 if (!qwd.isOutlier()) {
154 for (final QWD qwd : kmEntry.getValue()) { 185 final String kmS = kmF.format(km);
155 if( !qwd.isOutlier() ) { 186 final String deltaWS = dwF.format(qwd.getDeltaW());
156 final String deltaWS = dwF.format(qwd.getDeltaW()); 187 final String qS = qF.format(qwd.getQ());
157 final String qS = qF.format(qwd.getQ()); 188 final String wS = wF.format(qwd.getW());
158 final String wS = wF.format(qwd.getW()); 189 final String dateS = dF.format(date);
159 final String dateS = dF.format(qwd.getDate()); 190
160 191 list.add(new String[] { kmS, dateS, qS, wS, referenceS, deltaWS });
161 list.add(new String[] { kmS, dateS, qS, wS, referenceS, deltaWS });
162 }
163 } 192 }
164 } 193 }
165 } 194 }
166
167 final String analysisTemplate = getAnalysisTemplate();
168
169 for (final KMIndex<AnalysisPeriod[]> periods : this.analysisPeriods) {
170
171 for (final KMIndex.Entry<AnalysisPeriod[]> kmEntry : periods) {
172
173 final Double km = kmEntry.getKm();
174
175 ArrayList<String[]> list = sorted.get(km);
176
177 if (list == null) {
178 list = new ArrayList<>();
179 sorted.put(km, list);
180 }
181
182 final String kmS = kmF.format(kmEntry.getKm());
183 int analysisCount = 1;
184
185 for (final AnalysisPeriod period : kmEntry.getValue()) {
186 // Typically resulting in A1,A2...
187 final String analyisS = MessageFormat.format(analysisTemplate, analysisCount);
188 final QWD[] qwds = period.getQWDs();
189
190 if (qwds != null) {
191 for (final QWD qwd : qwds) {
192 final String deltaWS = dwF.format(qwd.getDeltaW());
193 final String qS = qF.format(qwd.getQ());
194 final String wS = wF.format(qwd.getW());
195 final String dateS = dF.format(qwd.getDate());
196
197 list.add(new String[] { kmS, dateS, qS, wS, analyisS, deltaWS });
198 }
199 }
200 ++analysisCount;
201 }
202 }
203 }
204 return sorted;
205
206 } 195 }
207 196
208 /** Template to create "State" strings like A1,A2... */ 197 /** Template to create "State" strings like A1,A2... */
209 protected String getAnalysisTemplate() { 198 protected String getAnalysisTemplate() {
210 return Resources.getMsg(this.context.getMeta(), CSV_ANALYSIS, DEFAULT_CSV_ANALYSIS); 199 return Resources.getMsg(this.context.getMeta(), CSV_ANALYSIS, DEFAULT_CSV_ANALYSIS);
273 contextPdf.addJRMetadata(source, "fix_delta_w", msg(CSV_DELTA_W_HEADER)); 262 contextPdf.addJRMetadata(source, "fix_delta_w", msg(CSV_DELTA_W_HEADER));
274 } 263 }
275 264
276 @Override 265 @Override
277 protected void writePDF(final OutputStream out) { 266 protected void writePDF(final OutputStream out) {
267
278 final MetaAndTableJRDataSource source = new MetaAndTableJRDataSource(); 268 final MetaAndTableJRDataSource source = new MetaAndTableJRDataSource();
279 final String jasperFile = Resources.getMsg(this.context.getMeta(), JASPER_FILE); 269 final String jasperFile = Resources.getMsg(this.context.getMeta(), JASPER_FILE);
270
280 addMetaData(source); 271 addMetaData(source);
281 try { 272 try {
282 final TreeMap<Double, ArrayList<String[]>> sorted = getRows(); // Custom Result could be nice, too... 273 final TreeMap<Double, List<String[]>> sorted = getRows(); // Custom Result could be nice, too...
283 for (final ArrayList<String[]> list : sorted.values()) { 274 for (final List<String[]> list : sorted.values()) {
284 for (final String[] row : list) { 275 for (final String[] row : list)
285 source.addData(row); 276 source.addData(row);
286 }
287 } 277 }
278
288 final JasperReporter reporter = new JasperReporter(); 279 final JasperReporter reporter = new JasperReporter();
289 reporter.addReport(jasperFile, source); 280 reporter.addReport(jasperFile, source);
290 reporter.exportPDF(out); 281 reporter.exportPDF(out);
291 } 282 }
292 catch (final JRException je) { 283 catch (final JRException je) {

http://dive4elements.wald.intevation.org