Mercurial > dive4elements > river
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 : |