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 :

http://dive4elements.wald.intevation.org