Mercurial > dive4elements > river
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 } |