comparison flys-backend/src/main/java/de/intevation/flys/importer/parsers/WaterlevelParser.java @ 5240:9c024718bffb

WaterlevelParser: Use Wst-structures directly (instead of Waterlevel*).
author Felix Wolfsteller <felix.wolfsteller@intevation.de>
date Tue, 12 Mar 2013 10:55:14 +0100
parents fb5771196c82
children 31b464f17392
comparison
equal deleted inserted replaced
5239:ea4129a696da 5240:9c024718bffb
18 import de.intevation.flys.importer.ImportWaterlevelValue; 18 import de.intevation.flys.importer.ImportWaterlevelValue;
19 19
20 import de.intevation.flys.importer.ImportRange; 20 import de.intevation.flys.importer.ImportRange;
21 import de.intevation.flys.importer.ImportWst; 21 import de.intevation.flys.importer.ImportWst;
22 import de.intevation.flys.importer.ImportWstColumn; 22 import de.intevation.flys.importer.ImportWstColumn;
23 import de.intevation.flys.importer.ImportWstColumnValue;
23 import de.intevation.flys.importer.ImportWstQRange; 24 import de.intevation.flys.importer.ImportWstQRange;
24 25
25 26
26 /** 27 /**
27 * Parse CSV Waterlevel files. 28 * Parse CSV Waterlevel files.
41 Pattern.compile("Abfluss\\s\\[(.*)\\];(.*)"); 42 Pattern.compile("Abfluss\\s\\[(.*)\\];(.*)");
42 43
43 public static final Pattern META_UNIT = 44 public static final Pattern META_UNIT =
44 Pattern.compile("^Einheit: \\[(.*)\\].*"); 45 Pattern.compile("^Einheit: \\[(.*)\\].*");
45 46
46 private List<ImportWaterlevel> waterlevels; 47 private List<ImportWst> waterlevels;
47 48
48 private ImportWaterlevel current; 49 private ImportWst current;
50
51 /** The Waterlevel-Wst s will always have but one column. */
52 private ImportWstColumn column;
49 53
50 private ImportWaterlevelQRange currentQ; 54 private ImportWaterlevelQRange currentQ;
51 55
56 /** The current (incomplete) Q Range. */
57 private ImportWstQRange currentQRange;
58
59 /** The current (incomplete) km range for Q Range. */
60 private ImportRange currentRange;
61
52 private String currentDescription; 62 private String currentDescription;
53 63
54 64
55 public WaterlevelParser() { 65 public WaterlevelParser() {
56 waterlevels = new ArrayList<ImportWaterlevel>(); 66 waterlevels = new ArrayList<ImportWst>();
57 } 67 }
58 68
59 69
60 /** 70 /**
61 * Create ImportWst objects from ImportWaterlevel 71 * Create ImportWst objects from ImportWaterlevel
62 * objects. 72 * objects.
73 * TODO deprecate
63 */ 74 */
64 public List<ImportWst> exportWsts() { 75 public List<ImportWst> exportWsts() {
65 List<ImportWst> wsts = new ArrayList<ImportWst>(); 76 return waterlevels;
66 for(ImportWaterlevel waterlevel: getWaterlevels()) { 77 }
67 String description = waterlevel.getDescription(); 78
68 ImportWst wst = new ImportWst(); 79
69 wsts.add(wst); 80 public List<ImportWst> getWaterlevels() {
70 wst.setDescription(description);
71 // Fixation kind.
72 wst.setKind(6);
73 wst.setUnit(waterlevel.getUnit());
74
75 // Fake WST has but 1 column.
76 wst.setNumberColumns(1);
77 ImportWstColumn column = wst.getColumn(0);
78 column.setDescription(description);
79 column.setName(description);
80 column.setPosition(0);
81
82 // Build Q Range.
83 List<ImportWaterlevelQRange> qRanges = waterlevel.getQRanges();
84 for(ImportWaterlevelQRange range: qRanges) {
85 List<ImportWaterlevelValue> values = range.getValues();
86 if (values.size() < 2) {
87 log.warn ("Not enough values to build valid QRange");
88 continue;
89 }
90 ImportRange iRange = new ImportRange(
91 BigDecimal.valueOf(values.get(0).getStation()),
92 BigDecimal.valueOf(values.get(values.size() -1).getStation()));
93 column.addColumnQRange(
94 new ImportWstQRange(iRange, BigDecimal.valueOf(range.getQ())));
95 }
96
97 // The other W/KM values.
98 for(ImportWaterlevelQRange range: qRanges) {
99 for(ImportWaterlevelValue value: range.getValues()) {
100 column.addColumnValue(BigDecimal.valueOf(value.getStation()),
101 BigDecimal.valueOf(value.getW()));
102 }
103 }
104 // TODO Maybe set a timeinterval.
105 }
106 return wsts;
107 }
108
109
110 public List<ImportWaterlevel> getWaterlevels() {
111 return waterlevels; 81 return waterlevels;
112 } 82 }
113 83
114 84
115 @Override 85 @Override
120 } 90 }
121 91
122 92
123 @Override 93 @Override
124 protected void reset() { 94 protected void reset() {
125 currentQ = null; 95 currentQRange = null;
126 current = new ImportWaterlevel(currentDescription); 96 current = new ImportWst(currentDescription);
97 column = new ImportWstColumn(current,
98 currentDescription,
99 currentDescription,
100 0);
101 current.setKind(6);
127 } 102 }
128 103
129 104
130 @Override 105 @Override
131 protected void finish() { 106 protected void finish() {
132 if (current != null) { 107 if (current != null) {
133 if (currentQ != null) { 108 if (currentQRange != null) {
134 current.addValue(currentQ); 109 List<ImportWstColumnValue> cValues = column.getColumnValues();
110 // Set end of range to last station.
111 currentRange.setB(cValues.get(cValues.size() -1).getPosition());
112 currentQRange.setRange(currentRange);
113 column.addColumnQRange(currentQRange);
135 } 114 }
136 115
137 waterlevels.add(current); 116 waterlevels.add(current);
138 } 117 }
139 } 118 }
170 Matcher m = META_Q_RANGE.matcher(line); 149 Matcher m = META_Q_RANGE.matcher(line);
171 150
172 if (m.matches()) { 151 if (m.matches()) {
173 String unitStr = m.group(1); 152 String unitStr = m.group(1);
174 String valueStr = m.group(2); 153 String valueStr = m.group(2);
175 154 try {
176 if (currentQ != null) { 155 if (currentQRange != null) {
177 if (current != null) { 156 // Finish off the last one.
178 current.addValue(currentQ); 157 List<ImportWstColumnValue> cValues = column.getColumnValues();
158 // Set end of range to last station.
159 currentRange.setB(cValues.get(cValues.size() -1).getPosition());
160 currentQRange.setRange(currentRange);
161 column.addColumnQRange(currentQRange);
162
179 } 163 }
180 else { 164 currentQRange = new ImportWstQRange(null,
181 // this should never happen 165 new BigDecimal(nf.parse(valueStr).doubleValue()));
182 log.warn("Try to add Q range without waterlevel!"); 166 currentRange = new ImportRange();
183 } 167
184 }
185
186 try {
187 log.debug("Found new Q range: Q=" + valueStr); 168 log.debug("Found new Q range: Q=" + valueStr);
188
189 currentQ = new ImportWaterlevelQRange(
190 nf.parse(valueStr).doubleValue());
191 169
192 return true; 170 return true;
193 } 171 }
194 catch (ParseException pe) { 172 catch (ParseException pe) {
195 log.warn("Error while parsing Q range: '" + line + "'"); 173 log.warn("Error while parsing Q range: '" + line + "'");
207 log.warn("skip invalid waterlevel line: '" + line + "'"); 185 log.warn("skip invalid waterlevel line: '" + line + "'");
208 return; 186 return;
209 } 187 }
210 188
211 try { 189 try {
190 // Store the value and remember the position for QRange, if needed.
212 Double station = nf.parse(cols[0]).doubleValue(); 191 Double station = nf.parse(cols[0]).doubleValue();
213 Double value = nf.parse(cols[1]).doubleValue(); 192 Double value = nf.parse(cols[1]).doubleValue();
214 193
215 currentQ.addValue(new ImportWaterlevelValue(station, value)); 194 BigDecimal stationBD = new BigDecimal(station);
195
196 column.addColumnValue(stationBD, new BigDecimal(value));
197
198 if (currentRange.getA() == null) {
199 currentRange.setA(stationBD);
200 }
216 } 201 }
217 catch (ParseException pe) { 202 catch (ParseException pe) {
218 log.warn("Error while parsing number values: '" + line + "'"); 203 log.warn("Error while parsing number values: '" + line + "'");
219 } 204 }
220 } 205 }

http://dive4elements.wald.intevation.org