Mercurial > dive4elements > river
comparison flys-backend/src/main/java/de/intevation/flys/importer/parsers/WaterlevelDifferencesParser.java @ 2850:a1402c16152f
Added a parser and importer classes used to import waterlevel differences.
flys-backend/trunk@4304 c6561f87-3c4e-4783-a992-168aeb5c3f6f
author | Ingo Weinzierl <ingo.weinzierl@intevation.de> |
---|---|
date | Thu, 26 Apr 2012 09:46:32 +0000 |
parents | |
children | aed7aba93718 |
comparison
equal
deleted
inserted
replaced
2849:c36106f15ac9 | 2850:a1402c16152f |
---|---|
1 package de.intevation.flys.importer.parsers; | |
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; | |
8 import java.util.List; | |
9 import java.util.regex.Matcher; | |
10 import java.util.regex.Pattern; | |
11 | |
12 import org.apache.log4j.Logger; | |
13 | |
14 import de.intevation.flys.importer.ImportUnit; | |
15 import de.intevation.flys.importer.ImportWaterlevelDifference; | |
16 import de.intevation.flys.importer.ImportWaterlevelDifferenceColumn; | |
17 import de.intevation.flys.importer.ImportWaterlevelDifferenceValue; | |
18 | |
19 | |
20 public class WaterlevelDifferencesParser extends LineParser { | |
21 | |
22 private static final Logger log = | |
23 Logger.getLogger(WaterlevelDifferencesParser.class); | |
24 | |
25 private static final NumberFormat nf = | |
26 NumberFormat.getInstance(DEFAULT_LOCALE); | |
27 | |
28 public static final Pattern META_UNIT = | |
29 Pattern.compile("^Einheit: \\[(.*)\\].*"); | |
30 | |
31 | |
32 private List<ImportWaterlevelDifference> differences; | |
33 | |
34 private ImportWaterlevelDifferenceColumn[] columns; | |
35 | |
36 private ImportWaterlevelDifference current; | |
37 | |
38 | |
39 public WaterlevelDifferencesParser() { | |
40 differences = new ArrayList<ImportWaterlevelDifference>(); | |
41 } | |
42 | |
43 | |
44 public List<ImportWaterlevelDifference> getDifferences() { | |
45 return differences; | |
46 } | |
47 | |
48 | |
49 @Override | |
50 public void parse(File file) throws IOException { | |
51 current = new ImportWaterlevelDifference(file.getName()); | |
52 | |
53 super.parse(file); | |
54 } | |
55 | |
56 | |
57 @Override | |
58 protected void reset() { | |
59 } | |
60 | |
61 | |
62 @Override | |
63 protected void finish() { | |
64 if (columns != null && current != null) { | |
65 for (ImportWaterlevelDifferenceColumn col: columns) { | |
66 current.addValue(col); | |
67 } | |
68 | |
69 differences.add(current); | |
70 } | |
71 | |
72 current = null; | |
73 columns = null; | |
74 } | |
75 | |
76 @Override | |
77 protected void handleLine(String line) { | |
78 if (line.startsWith(START_META_CHAR)) { | |
79 handleMetaLine(stripMetaLine(line)); | |
80 } | |
81 else { | |
82 handleDataLine(line); | |
83 } | |
84 } | |
85 | |
86 | |
87 private void handleMetaLine(String meta) { | |
88 if (handleMetaUnit(meta)) { | |
89 return; | |
90 } | |
91 else { | |
92 handleMetaColumnNames(meta); | |
93 } | |
94 } | |
95 | |
96 | |
97 private boolean handleMetaUnit(String meta) { | |
98 Matcher m = META_UNIT.matcher(meta); | |
99 | |
100 if (m.matches()) { | |
101 String unit = m.group(1); | |
102 log.debug("Found unit: '" + unit + "'"); | |
103 | |
104 current.setUnit(new ImportUnit(unit)); | |
105 | |
106 return true; | |
107 } | |
108 | |
109 return false; | |
110 } | |
111 | |
112 | |
113 private boolean handleMetaColumnNames(String meta) { | |
114 Pattern META_COLUMN_NAMES = Pattern.compile("Fluss-km;(.*)"); | |
115 Matcher m = META_COLUMN_NAMES.matcher(meta); | |
116 | |
117 if (m.matches()) { | |
118 String colStr = m.group(1); | |
119 String[] cols = colStr.split(SEPERATOR_CHAR); | |
120 | |
121 log.debug("Found " + cols.length + " columns."); | |
122 | |
123 initColumns(cols); | |
124 | |
125 return true; | |
126 } | |
127 | |
128 return false; | |
129 } | |
130 | |
131 | |
132 private void initColumns(String[] cols) { | |
133 columns = new ImportWaterlevelDifferenceColumn[cols.length]; | |
134 | |
135 for (int i = 0; i < cols.length; i++) { | |
136 String name = cols[i].replace("\"", ""); | |
137 | |
138 log.debug("Create new column '" + name + "'"); | |
139 columns[i] = new ImportWaterlevelDifferenceColumn(name); | |
140 } | |
141 } | |
142 | |
143 | |
144 private void handleDataLine(String line) { | |
145 String[] cols = line.split(SEPERATOR_CHAR); | |
146 | |
147 if (cols == null || cols.length < 2) { | |
148 log.warn("skip invalid waterlevel line: '" + line + "'"); | |
149 return; | |
150 } | |
151 | |
152 try { | |
153 Double station = nf.parse(cols[0]).doubleValue(); | |
154 | |
155 for (int i = 0; i < columns.length; i++) { | |
156 String value = cols[i+1]; | |
157 | |
158 try { | |
159 columns[i].addValue(new ImportWaterlevelDifferenceValue( | |
160 station, | |
161 nf.parse(value).doubleValue() | |
162 )); | |
163 } | |
164 catch (ParseException pe) { | |
165 log.warn("Error while parsing value: '" + value + "'"); | |
166 } | |
167 } | |
168 } | |
169 catch (ParseException pe) { | |
170 log.warn("Error while parsing station: '" + line + "'"); | |
171 } | |
172 } | |
173 } | |
174 // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : |