comparison artifacts/src/main/java/org/dive4elements/river/exports/minfo/BedQualityExporter.java @ 5838:5aa05a7a34b7

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

http://dive4elements.wald.intevation.org