comparison flys-artifacts/src/main/java/de/intevation/flys/exports/WaterlevelExporter.java @ 2035:3ebbe497d7f7

#252 Set titles in waterlevel exports to named main values if those are existing for given Q values. flys-artifacts/trunk@3504 c6561f87-3c4e-4783-a992-168aeb5c3f6f
author Ingo Weinzierl <ingo.weinzierl@intevation.de>
date Wed, 21 Dec 2011 09:17:23 +0000
parents 72bcbc308501
children f73036b991e2
comparison
equal deleted inserted replaced
2034:7bc9293de4e6 2035:3ebbe497d7f7
3 import java.io.IOException; 3 import java.io.IOException;
4 import java.io.OutputStream; 4 import java.io.OutputStream;
5 import java.text.NumberFormat; 5 import java.text.NumberFormat;
6 import java.util.ArrayList; 6 import java.util.ArrayList;
7 import java.util.List; 7 import java.util.List;
8 import java.util.regex.Matcher;
9 import java.util.regex.Pattern;
8 10
9 import org.w3c.dom.Document; 11 import org.w3c.dom.Document;
10 12
11 import org.apache.log4j.Logger; 13 import org.apache.log4j.Logger;
12 14
13 import au.com.bytecode.opencsv.CSVWriter; 15 import au.com.bytecode.opencsv.CSVWriter;
14 16
17 import de.intevation.artifacts.Artifact;
15 import de.intevation.artifacts.CallContext; 18 import de.intevation.artifacts.CallContext;
16 19
20 import de.intevation.artifactdatabase.state.ArtifactAndFacet;
21
22 import de.intevation.flys.artifacts.WINFOArtifact;
17 import de.intevation.flys.artifacts.model.CalculationResult; 23 import de.intevation.flys.artifacts.model.CalculationResult;
18 import de.intevation.flys.artifacts.model.WQCKms; 24 import de.intevation.flys.artifacts.model.WQCKms;
19 import de.intevation.flys.artifacts.model.WQKms; 25 import de.intevation.flys.artifacts.model.WQKms;
20 26
27 import de.intevation.flys.utils.FLYSUtils;
21 import de.intevation.flys.utils.Formatter; 28 import de.intevation.flys.utils.Formatter;
22 29
23 30
24 /** 31 /**
25 * @author <a href="mailto:ingo.weinzierl@intevation.de">Ingo Weinzierl</a> 32 * @author <a href="mailto:ingo.weinzierl@intevation.de">Ingo Weinzierl</a>
39 public static final String CSV_W_HEADER = 46 public static final String CSV_W_HEADER =
40 "export.waterlevel.csv.header.w"; 47 "export.waterlevel.csv.header.w";
41 48
42 public static final String CSV_Q_HEADER = 49 public static final String CSV_Q_HEADER =
43 "export.waterlevel.csv.header.q"; 50 "export.waterlevel.csv.header.q";
51
52 public static final Pattern NUMBERS_PATTERN =
53 Pattern.compile("\\D*(\\d++.\\d*)\\D*");
44 54
45 public static final String DEFAULT_CSV_KM_HEADER = "Fluss-Km"; 55 public static final String DEFAULT_CSV_KM_HEADER = "Fluss-Km";
46 public static final String DEFAULT_CSV_W_HEADER = "W [NN + m]"; 56 public static final String DEFAULT_CSV_W_HEADER = "W [NN + m]";
47 public static final String DEFAULT_CSV_Q_HEADER = "Q [m\u00b3/s]"; 57 public static final String DEFAULT_CSV_Q_HEADER = "Q [m\u00b3/s]";
48 58
87 } 97 }
88 } 98 }
89 } 99 }
90 100
91 101
102 /**
103 * This method is used to determine, if the name of the WQKms object
104 * <i>data</i> matches a named value. In such cases, the name of <i>data</i>
105 * is reset to this named value.
106 *
107 * @param aaf The wrapper for the Artifact and Facet.
108 * @param data Needs to be a CalculationResult that contains a WQKms[]
109 * objects, otherwise nothing is done.
110 */
111 @Override
112 protected void prepareData(ArtifactAndFacet aaf, Object data) {
113 logger.debug("WaterlevelExporter.prepareData");
114
115 Artifact artifact = aaf.getArtifact();
116
117 if (!(artifact instanceof WINFOArtifact)) {
118 logger.debug("Artifact is no WINFOArtifact. Cannot prepare data.");
119 return;
120 }
121
122 if (data instanceof CalculationResult) {
123 data = ((CalculationResult) data).getData();
124
125 if (data instanceof WQKms[]) {
126 WQKms[] wqkms = (WQKms[]) data;
127
128 for (WQKms item: wqkms) {
129 prepareNamedValue((WINFOArtifact) artifact, item);
130 }
131 }
132 }
133 }
134
135
136 /**
137 * This method is used to prepare the column titles of waterlevel exports.
138 * Titles in this export include the Q value. If a Q value matches a named
139 * main value (as HQ100 or MNQ) this named main value should be used as
140 * title. This method resets the name of the <i>wqkms</i> object if such
141 * named main value fits to the chosen Q.
142 *
143 * @param winfo A WINFO Artifact.
144 * @param wqkms A WQKms object that should be prepared.
145 */
146 protected void prepareNamedValue(WINFOArtifact winfo, WQKms wqkms) {
147 logger.debug("WaterlevelExporter.prepareNamedValue");
148
149 String name = wqkms.getName();
150
151 logger.debug("Name of WQKms = '" + name + "'");
152
153 Matcher m = NUMBERS_PATTERN.matcher(name);
154
155 if (m.matches()) {
156 String raw = m.group(1);
157
158 try {
159 double v = Double.valueOf(raw);
160
161 String nmv = FLYSUtils.getNamedMainValue(winfo.getGauge(), v);
162
163 if (nmv != null && nmv.length() > 0) {
164 nmv = FLYSUtils.stripNamedMainValue(nmv);
165 logger.debug("Set named main value '" + nmv + "'");
166
167 wqkms.setName(nmv);
168 }
169 }
170 catch (NumberFormatException nfe) {
171 // do nothing here
172 }
173 }
174 }
175
176
92 @Override 177 @Override
93 protected void writeCSVData(CSVWriter writer) { 178 protected void writeCSVData(CSVWriter writer) {
94 logger.info("WaterlevelExporter.writeData"); 179 logger.info("WaterlevelExporter.writeData");
95 180
96 writeCSVHeader(writer); 181 writeCSVHeader(writer);

http://dive4elements.wald.intevation.org