Mercurial > dive4elements > river
diff 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 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/flys-backend/src/main/java/de/intevation/flys/importer/parsers/WaterlevelDifferencesParser.java Thu Apr 26 09:46:32 2012 +0000 @@ -0,0 +1,174 @@ +package de.intevation.flys.importer.parsers; + +import java.io.File; +import java.io.IOException; +import java.text.NumberFormat; +import java.text.ParseException; +import java.util.ArrayList; +import java.util.List; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import org.apache.log4j.Logger; + +import de.intevation.flys.importer.ImportUnit; +import de.intevation.flys.importer.ImportWaterlevelDifference; +import de.intevation.flys.importer.ImportWaterlevelDifferenceColumn; +import de.intevation.flys.importer.ImportWaterlevelDifferenceValue; + + +public class WaterlevelDifferencesParser extends LineParser { + + private static final Logger log = + Logger.getLogger(WaterlevelDifferencesParser.class); + + private static final NumberFormat nf = + NumberFormat.getInstance(DEFAULT_LOCALE); + + public static final Pattern META_UNIT = + Pattern.compile("^Einheit: \\[(.*)\\].*"); + + + private List<ImportWaterlevelDifference> differences; + + private ImportWaterlevelDifferenceColumn[] columns; + + private ImportWaterlevelDifference current; + + + public WaterlevelDifferencesParser() { + differences = new ArrayList<ImportWaterlevelDifference>(); + } + + + public List<ImportWaterlevelDifference> getDifferences() { + return differences; + } + + + @Override + public void parse(File file) throws IOException { + current = new ImportWaterlevelDifference(file.getName()); + + super.parse(file); + } + + + @Override + protected void reset() { + } + + + @Override + protected void finish() { + if (columns != null && current != null) { + for (ImportWaterlevelDifferenceColumn col: columns) { + current.addValue(col); + } + + differences.add(current); + } + + current = null; + columns = null; + } + + @Override + protected void handleLine(String line) { + if (line.startsWith(START_META_CHAR)) { + handleMetaLine(stripMetaLine(line)); + } + else { + handleDataLine(line); + } + } + + + private void handleMetaLine(String meta) { + if (handleMetaUnit(meta)) { + return; + } + else { + handleMetaColumnNames(meta); + } + } + + + private boolean handleMetaUnit(String meta) { + Matcher m = META_UNIT.matcher(meta); + + if (m.matches()) { + String unit = m.group(1); + log.debug("Found unit: '" + unit + "'"); + + current.setUnit(new ImportUnit(unit)); + + return true; + } + + return false; + } + + + private boolean handleMetaColumnNames(String meta) { + Pattern META_COLUMN_NAMES = Pattern.compile("Fluss-km;(.*)"); + Matcher m = META_COLUMN_NAMES.matcher(meta); + + if (m.matches()) { + String colStr = m.group(1); + String[] cols = colStr.split(SEPERATOR_CHAR); + + log.debug("Found " + cols.length + " columns."); + + initColumns(cols); + + return true; + } + + return false; + } + + + private void initColumns(String[] cols) { + columns = new ImportWaterlevelDifferenceColumn[cols.length]; + + for (int i = 0; i < cols.length; i++) { + String name = cols[i].replace("\"", ""); + + log.debug("Create new column '" + name + "'"); + columns[i] = new ImportWaterlevelDifferenceColumn(name); + } + } + + + private void handleDataLine(String line) { + String[] cols = line.split(SEPERATOR_CHAR); + + if (cols == null || cols.length < 2) { + log.warn("skip invalid waterlevel line: '" + line + "'"); + return; + } + + try { + Double station = nf.parse(cols[0]).doubleValue(); + + for (int i = 0; i < columns.length; i++) { + String value = cols[i+1]; + + try { + columns[i].addValue(new ImportWaterlevelDifferenceValue( + station, + nf.parse(value).doubleValue() + )); + } + catch (ParseException pe) { + log.warn("Error while parsing value: '" + value + "'"); + } + } + } + catch (ParseException pe) { + log.warn("Error while parsing station: '" + line + "'"); + } + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :