comparison backend/src/main/java/org/dive4elements/river/importer/parsers/WaterlevelParser.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-backend/src/main/java/org/dive4elements/river/importer/parsers/WaterlevelParser.java@18619c1e7c2a
children 4dd33b86dc61
comparison
equal deleted inserted replaced
5837:d9901a08d0a6 5838:5aa05a7a34b7
1 package org.dive4elements.river.importer.parsers;
2
3 import java.io.File;
4 import java.io.IOException;
5 import java.math.BigDecimal;
6 import java.text.NumberFormat;
7 import java.text.ParseException;
8 import java.util.ArrayList;
9 import java.util.List;
10 import java.util.regex.Matcher;
11 import java.util.regex.Pattern;
12
13 import org.apache.log4j.Logger;
14
15 import org.dive4elements.river.importer.ImportUnit;
16
17 import org.dive4elements.river.importer.ImportRange;
18 import org.dive4elements.river.importer.ImportWst;
19 import org.dive4elements.river.importer.ImportWstColumn;
20 import org.dive4elements.river.importer.ImportWstColumnValue;
21 import org.dive4elements.river.importer.ImportWstQRange;
22
23
24 /**
25 * Parse CSV Waterlevel files.
26 * As these waterlevels are probably used in fixation analysis
27 * only, functionality to export them to "fixation"-wsts
28 * has been added (the ImportWaterlevel*- stuff is actually
29 * not needed to do so.)
30 */
31 public class WaterlevelParser extends LineParser {
32
33 private static final Logger log = Logger.getLogger(WaterlevelParser.class);
34
35 private static final NumberFormat nf =
36 NumberFormat.getInstance(DEFAULT_LOCALE);
37
38 private static final Pattern META_Q_RANGE =
39 Pattern.compile("Abfluss\\s\\[(.*)\\];(.*)");
40
41 public static final Pattern META_UNIT =
42 Pattern.compile("^Einheit: \\[(.*)\\].*");
43
44 private List<ImportWst> waterlevels;
45
46 private ImportWst current;
47
48 /** The Waterlevel-Wst s will always have but one column. */
49 private ImportWstColumn column;
50
51 /** The current (incomplete) Q Range. */
52 private ImportWstQRange currentQRange;
53
54 /** The current (incomplete) km range for Q Range. */
55 private ImportRange currentRange;
56
57 private String currentDescription;
58
59
60 public WaterlevelParser() {
61 waterlevels = new ArrayList<ImportWst>();
62 }
63
64
65 public List<ImportWst> getWaterlevels() {
66 return waterlevels;
67 }
68
69
70 @Override
71 public void parse(File file) throws IOException {
72 currentDescription = file.getName();
73
74 super.parse(file);
75 }
76
77
78 @Override
79 protected void reset() {
80 currentQRange = null;
81 current = new ImportWst(currentDescription);
82 current.setNumberColumns(1);
83 column = current.getColumn(0);
84 column.setName(currentDescription);
85 column.setDescription(currentDescription);
86 current.setKind(6);
87 }
88
89
90 @Override
91 protected void finish() {
92 if (current != null) {
93 if (currentQRange != null) {
94 List<ImportWstColumnValue> cValues = column.getColumnValues();
95 // Set end of range to last station.
96 currentRange.setB(cValues.get(cValues.size() -1).getPosition());
97 currentQRange.setRange(currentRange);
98 column.addColumnQRange(currentQRange);
99 }
100
101 waterlevels.add(current);
102 }
103 }
104
105 @Override
106 protected void handleLine(int lineNum, String line) {
107 if (line.startsWith(START_META_CHAR)) {
108 handleMetaLine(stripMetaLine(line));
109 return;
110 }
111 else if (handleQRange(line)) {
112 return;
113 }
114 else {
115 handleDataLine(line);
116 return;
117 }
118 }
119
120
121 private void handleMetaLine(String meta) {
122 Matcher m = META_UNIT.matcher(meta);
123
124 if (m.matches()) {
125 String unit = m.group(1);
126 log.debug("Found unit: '" + unit + "'");
127
128 current.setUnit(new ImportUnit(unit));
129 }
130 }
131
132
133 private boolean handleQRange(String line) {
134 Matcher m = META_Q_RANGE.matcher(line);
135
136 if (m.matches()) {
137 String unitStr = m.group(1);
138 String valueStr = m.group(2);
139 try {
140 if (currentQRange != null) {
141 // Finish off the last one.
142 List<ImportWstColumnValue> cValues = column.getColumnValues();
143 // Set end of range to last station.
144 currentRange.setB(cValues.get(cValues.size() -1).getPosition());
145 currentQRange.setRange(currentRange);
146 column.addColumnQRange(currentQRange);
147 }
148 currentQRange = new ImportWstQRange(null,
149 new BigDecimal(nf.parse(valueStr).doubleValue()));
150 currentRange = new ImportRange();
151
152 log.debug("Found new Q range: Q=" + valueStr);
153
154 return true;
155 }
156 catch (ParseException pe) {
157 log.warn("Unparseable Q range: '" + line + "'");
158 }
159 }
160
161 return false;
162 }
163
164
165 private void handleDataLine(String line) {
166 String[] cols = line.split(SEPERATOR_CHAR);
167
168 if (cols == null || cols.length < 2) {
169 log.warn("skip invalid waterlevel line: '" + line + "'");
170 return;
171 }
172
173 try {
174 // Store the value and remember the position for QRange, if needed.
175 Double station = nf.parse(cols[0]).doubleValue();
176 Double value = nf.parse(cols[1]).doubleValue();
177
178 BigDecimal stationBD = new BigDecimal(station);
179
180 column.addColumnValue(stationBD, new BigDecimal(value));
181
182 if (currentRange.getA() == null) {
183 currentRange.setA(stationBD);
184 }
185 }
186 catch (ParseException pe) {
187 log.warn("Unparseable number in data row: " + line);
188 }
189 }
190 }
191 // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :

http://dive4elements.wald.intevation.org