comparison flys-artifacts/src/main/java/de/intevation/flys/exports/minfo/BedQualityExporter.java @ 3880:e7f99e30997c

Added CSV export to bed quality calculation. flys-artifacts/trunk@5517 c6561f87-3c4e-4783-a992-168aeb5c3f6f
author Raimund Renkert <raimund.renkert@intevation.de>
date Wed, 19 Sep 2012 08:50:23 +0000
parents
children 8e806d51ebe4
comparison
equal deleted inserted replaced
3879:ac49675f9335 3880:e7f99e30997c
1 package de.intevation.flys.exports.minfo;
2
3 import gnu.trove.TDoubleArrayList;
4
5 import java.io.IOException;
6 import java.io.OutputStream;
7 import java.text.DateFormat;
8 import java.text.NumberFormat;
9 import java.util.Arrays;
10 import java.util.HashMap;
11 import java.util.LinkedList;
12 import java.util.List;
13 import java.util.Map;
14
15 import org.apache.log4j.Logger;
16 import org.w3c.dom.Document;
17
18 import au.com.bytecode.opencsv.CSVWriter;
19 import de.intevation.artifacts.CallContext;
20 import de.intevation.flys.artifacts.model.CalculationResult;
21 import de.intevation.flys.artifacts.model.minfo.BedDiameterResult;
22 import de.intevation.flys.artifacts.model.minfo.BedParametersResult;
23 import de.intevation.flys.artifacts.model.minfo.BedQualityResult;
24 import de.intevation.flys.artifacts.model.minfo.BedloadDiameterResult;
25 import de.intevation.flys.artifacts.model.minfo.QualityMeasurement;
26 import de.intevation.flys.artifacts.model.minfo.QualityMeasurements;
27 import de.intevation.flys.exports.AbstractExporter;
28 import de.intevation.flys.utils.Formatter;
29
30
31 public class BedQualityExporter
32 extends AbstractExporter
33 {
34 /** Private logger. */
35 private static Logger logger = Logger.getLogger(BedQualityExporter.class);
36
37 private static final String CSV_HEADER_KM = "export.minfo.bedquality.km";
38 private static final String CSV_HEADER_DENSITY_CAP =
39 "export.minfo.bedquality.density_cap";
40 private static final String CSV_HEADER_DENSITY_SUB =
41 "export.minfo.bedquality.density_sub";
42 private static final String CSV_HEADER_POROSITY_CAP =
43 "export.minfo.bedquality.porosity_cap";
44 private static final String CSV_HEADER_POROSITY_SUB =
45 "export.minfo.bedquality.porosity_sub";
46 private static final String CSV_HEADER_BEDLOAD =
47 "export.minfo.bedquality.bedload";
48 private static final String CSV_HEADER_BED_CAP =
49 "export.minfo.bedquality.bed_cap";
50 private static final String CSV_HEADER_BED_SUB =
51 "export.minfo.bedquality.bed_sub";
52
53 private BedQualityResult[] results;
54
55 @Override
56 public void init(Document request, OutputStream out, CallContext context) {
57 logger.debug("BedQualityExporter.init");
58 super.init(request, out, context);
59 results = new BedQualityResult[0];
60 }
61
62 @Override
63 protected void writeCSVData(CSVWriter writer) throws IOException {
64 // TODO Auto-generated method stub
65 writeCSVHeader(writer);
66
67 NumberFormat kmf = Formatter.getCalculationKm(context.getMeta());
68
69 TDoubleArrayList kms = new TDoubleArrayList();
70 int cols = 1;
71 for (int i = 0; i < results.length; i++) {
72 BedDiameterResult[] beds = results[i].getBedResults();
73 for (int j = 0; j < beds.length; j++) {
74 TDoubleArrayList bkms = beds[j].getKms();
75 for (int k = 0; k < bkms.size(); k++) {
76 if (!kms.contains(bkms.get(k))) {
77 kms.add(bkms.get(k));
78 }
79 }
80 }
81 BedloadDiameterResult[] loads = results[i].getBedloadResults();
82 for (int j = 0; j < loads.length; j++) {
83 TDoubleArrayList lkms = loads[i].getKms();
84 for (int k = 0; k < lkms.size(); k++) {
85 if (!kms.contains(lkms.get(k))) {
86 kms.add(lkms.get(k));
87 }
88 }
89 }
90 cols += beds.length * 2;
91 cols += loads.length;
92 if (beds.length > 0) {
93 cols += 4;
94 }
95 }
96
97 kms.sort();
98 List<double[]> rows = new LinkedList<double[]>();
99 for (int i = 0; i < kms.size(); i++) {
100 double[] row = new double[cols];
101 double km = kms.get(i);
102 row[0] = km;
103 for (int j = 0; j < results.length; j++) {
104 BedloadDiameterResult[] loads = results[j].getBedloadResults();
105
106 for(int k = 0; k < loads.length; k++) {
107 // k + 1: shift km column.
108 // j* loads.length: shift periods.
109 row[(k + 1) + (j * loads.length)] =
110 loads[k].getDiameter(km);
111 }
112 BedDiameterResult[] beds = results[j].getBedResults();
113 for (int k = 0; k < beds.length; k++) {
114 // k + 1: shift km column.
115 // j * beds.length: shift periods.
116 // loads.length * results.length: shift bed load columns.
117 int ndx = (k + 1) + (j * beds.length) + (loads.length * results.length);
118 row[ndx] = beds[k].getDiameterCap(km);
119 row[ndx + 1] = beds[k].getDiameterSub(km);
120 }
121 BedParametersResult[] params = results[j].getParameters();
122 for(int k = 0; k < params.length; k++) {
123 // loads.length + (beds.lenght * 2) * (j + 1): shift bed and bedload columns.
124 int ndx = 1 + (loads.length + (beds.length * 2) * (j + 1));
125 row[ndx] = params[k].getLoadDensityCap(km);
126 row[ndx + 1] = params[k].getLoadDensitySub(km);
127 row[ndx + 2] = params[k].getPorosityCap(km);
128 row[ndx + 3] = params[k].getPorositySub(km);
129 }
130 }
131 rows.add(row);
132 }
133 for (double[] d : rows) {
134 logger.debug(Arrays.toString(d));
135 List<String> cells = new LinkedList<String>();
136 for (int i = 0; i < d.length; i++) {
137 if (!Double.isNaN(d[i])) {
138 NumberFormat nf = Formatter.getFormatter(context, 1, 3);
139 cells.add(nf.format(d[i]));
140 }
141 else {
142 cells.add("");
143 }
144 }
145 writer.writeNext(cells.toArray(new String[cells.size()]));
146 }
147 }
148
149 @Override
150 protected void writePDF(OutputStream out) {
151 // TODO Auto-generated method stub
152
153 }
154
155 @Override
156 protected void addData(Object data) {
157 // TODO Auto-generated method stub
158 logger.debug("addData()");
159 if (!(data instanceof CalculationResult)) {
160 logger.warn("Invalid data type.");
161 return;
162 }
163 Object[] d = (Object[])((CalculationResult)data).getData();
164
165 if (!(d instanceof BedQualityResult[])) {
166 logger.warn("Invalid result object.");
167 return;
168 }
169 results = (BedQualityResult[])d;
170 }
171
172 protected void writeCSVHeader(CSVWriter writer) {
173 logger.debug("writeCSVHeader()");
174
175 List<String> header = new LinkedList<String>();
176 if (results != null) {
177 header.add(msg(CSV_HEADER_KM, "km"));
178 for (int i = 0; i < results.length; i++) {
179 DateFormat df = Formatter.getDateFormatter(context.getMeta(), "dd.MM.yyyy");
180 String d1 = df.format(results[i].getDateRange().getFrom());
181 String d2 = df.format(results[i].getDateRange().getTo());
182 BedloadDiameterResult[] loads = results[i].getBedloadResults();
183 BedDiameterResult[] beds = results[i].getBedResults();
184 BedParametersResult[] params = results[i].getParameters();
185 for (int j = 0; j < loads.length; j++) {
186 header.add(msg(CSV_HEADER_BEDLOAD, CSV_HEADER_BEDLOAD) +
187 " - " +
188 msg(loads[j].getType().toString(),
189 loads[j].getType().toString()) + " - " +
190 d1 + "-" + d2);
191 }
192 for (int j = 0; j < beds.length; j++) {
193 header.add(msg(CSV_HEADER_BED_CAP, CSV_HEADER_BED_CAP) + " - " +
194 msg(beds[j].getType().toString(),
195 beds[j].getType().toString()) + " - " +
196 d1 + "-" + d2);
197 header.add(msg(CSV_HEADER_BED_SUB, CSV_HEADER_BED_SUB) + " - " +
198 msg(beds[j].getType().toString(),
199 beds[j].getType().toString()) + " - " +
200 d1 + "-" + d2);
201 }
202 if (params.length > 0) {
203 header.add(
204 msg(CSV_HEADER_DENSITY_CAP, CSV_HEADER_DENSITY_CAP));// +
205 //" - " + d1 + "-" + d2);
206 header.add(
207 msg(CSV_HEADER_DENSITY_SUB, CSV_HEADER_DENSITY_SUB)); //+
208 //" - " + d1 + "-" + d2);
209 header.add(
210 msg(CSV_HEADER_POROSITY_CAP, CSV_HEADER_POROSITY_CAP)); //+
211 //" - " + d1 + "-" + d2);
212 header.add(
213 msg(CSV_HEADER_POROSITY_SUB, CSV_HEADER_POROSITY_SUB));// +
214 //" - " + d1 + "-" + d2);
215 }
216 }
217 }
218 writer.writeNext(header.toArray(new String[header.size()]));
219 }
220 }

http://dive4elements.wald.intevation.org