comparison flys-backend/src/main/java/de/intevation/flys/importer/parsers/WaterlevelParser.java @ 2845:a65b5b0ade6f

Completed the MINFO waterlevel import. flys-backend/trunk@4288 c6561f87-3c4e-4783-a992-168aeb5c3f6f
author Ingo Weinzierl <ingo.weinzierl@intevation.de>
date Tue, 24 Apr 2012 12:46:26 +0000
parents c4db0f75a94a
children f63b39799d2d
comparison
equal deleted inserted replaced
2844:c4db0f75a94a 2845:a65b5b0ade6f
1 package de.intevation.flys.importer.parsers; 1 package de.intevation.flys.importer.parsers;
2 2
3 import java.io.File;
4 import java.io.IOException;
5 import java.text.NumberFormat;
6 import java.text.ParseException;
7 import java.util.ArrayList;
3 import java.util.List; 8 import java.util.List;
9 import java.util.regex.Matcher;
10 import java.util.regex.Pattern;
4 11
12 import org.apache.log4j.Logger;
13
14 import de.intevation.flys.importer.ImportUnit;
5 import de.intevation.flys.importer.ImportWaterlevel; 15 import de.intevation.flys.importer.ImportWaterlevel;
16 import de.intevation.flys.importer.ImportWaterlevelQRange;
17 import de.intevation.flys.importer.ImportWaterlevelValue;
6 18
7 19
8 public class WaterlevelParser extends LineParser { 20 public class WaterlevelParser extends LineParser {
9 21
22 private static final Logger log = Logger.getLogger(WaterlevelParser.class);
23
24 private static final NumberFormat nf =
25 NumberFormat.getInstance(DEFAULT_LOCALE);
26
27 private static final Pattern META_Q_RANGE =
28 Pattern.compile("Abfluss\\s\\[(.*)\\];(.*)");
29
30 public static final Pattern META_UNIT =
31 Pattern.compile("^Einheit: \\[(.*)\\].*");
32
33
10 private List<ImportWaterlevel> waterlevels; 34 private List<ImportWaterlevel> waterlevels;
11 35
36 private ImportWaterlevel current;
37
38 private ImportWaterlevelQRange currentQ;
39
40 private String currentDescription;
41
42
12 public WaterlevelParser() { 43 public WaterlevelParser() {
44 waterlevels = new ArrayList<ImportWaterlevel>();
13 } 45 }
14 46
15 47
16 public List<ImportWaterlevel> getWaterlevels() { 48 public List<ImportWaterlevel> getWaterlevels() {
17 return waterlevels; 49 return waterlevels;
18 } 50 }
19 51
20 52
21 @Override 53 @Override
54 public void parse(File file) throws IOException {
55 currentDescription = file.getName();
56
57 super.parse(file);
58 }
59
60
61 @Override
22 protected void reset() { 62 protected void reset() {
23 63 currentQ = null;
64 current = new ImportWaterlevel(currentDescription);
24 } 65 }
25 66
26 67
27 @Override 68 @Override
28 protected void finish() { 69 protected void finish() {
70 if (current != null) {
71 if (currentQ != null) {
72 current.addValue(currentQ);
73 }
29 74
75 waterlevels.add(current);
76 }
30 } 77 }
31 78
32 @Override 79 @Override
33 protected void handleLine(String line) { 80 protected void handleLine(String line) {
81 if (line.startsWith(START_META_CHAR)) {
82 handleMetaLine(stripMetaLine(line));
83 return;
84 }
85 else if (handleQRange(line)) {
86 return;
87 }
88 else {
89 handleDataLine(line);
90 return;
91 }
92 }
34 93
94
95 private void handleMetaLine(String meta) {
96 Matcher m = META_UNIT.matcher(meta);
97
98 if (m.matches()) {
99 String unit = m.group(1);
100 log.debug("Found unit: '" + unit + "'");
101
102 current.setUnit(new ImportUnit(unit));
103 }
104 }
105
106
107 private boolean handleQRange(String line) {
108 Matcher m = META_Q_RANGE.matcher(line);
109
110 if (m.matches()) {
111 String unitStr = m.group(1);
112 String valueStr = m.group(2);
113
114 if (currentQ != null) {
115 if (current != null) {
116 current.addValue(currentQ);
117 }
118 else {
119 // this should never happen
120 log.warn("Try to add Q range without waterlevel!");
121 }
122 }
123
124 try {
125 log.debug("Found new Q range: Q=" + valueStr);
126
127 currentQ = new ImportWaterlevelQRange(
128 nf.parse(valueStr).doubleValue());
129
130 return true;
131 }
132 catch (ParseException pe) {
133 log.warn("Error while parsing Q range: '" + line + "'");
134 }
135 }
136
137 return false;
138 }
139
140
141 private void handleDataLine(String line) {
142 String[] cols = line.split(SEPERATOR_CHAR);
143
144 if (cols == null || cols.length < 2) {
145 log.warn("skip invalid waterlevel line: '" + line + "'");
146 return;
147 }
148
149 try {
150 Double station = nf.parse(cols[0]).doubleValue();
151 Double value = nf.parse(cols[1]).doubleValue();
152
153 currentQ.addValue(new ImportWaterlevelValue(station, value));
154 }
155 catch (ParseException pe) {
156 log.warn("Error while parsing number values: '" + line + "'");
157 }
35 } 158 }
36 } 159 }
37 // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : 160 // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :

http://dive4elements.wald.intevation.org