teichmann@5844: /* Copyright (C) 2011, 2012, 2013 by Bundesanstalt für Gewässerkunde teichmann@5844: * Software engineering by Intevation GmbH teichmann@5844: * teichmann@5844: * This file is Free Software under the GNU AGPL (>=v3) teichmann@5844: * and comes with ABSOLUTELY NO WARRANTY! Check out the teichmann@5844: * documentation coming with Dive4Elements River for details. teichmann@5844: */ teichmann@5844: teichmann@5829: package org.dive4elements.river.importer.parsers; ingo@3328: ingo@3329: import java.io.File; ingo@3329: import java.io.IOException; ingo@3328: import java.text.NumberFormat; ingo@3328: import java.text.ParseException; ingo@3328: import java.util.ArrayList; ingo@3328: import java.util.List; ingo@3328: import java.util.regex.Matcher; ingo@3328: import java.util.regex.Pattern; ingo@3328: ingo@3328: import org.apache.log4j.Logger; ingo@3328: teichmann@5829: import org.dive4elements.river.importer.ImportSQRelation; teichmann@5829: import org.dive4elements.river.importer.ImportSQRelationValue; teichmann@5829: import org.dive4elements.river.importer.ImportTimeInterval; ingo@3328: ingo@3328: ingo@3328: public class SQRelationParser extends LineParser { ingo@3328: ingo@3328: private static final Logger log = ingo@3328: Logger.getLogger(SQRelationParser.class); ingo@3328: ingo@3328: private static final Pattern TIMERANGE_REGEX = ingo@3328: Pattern.compile(".*Zeitraum.*\\s(\\w*)-(\\w*).*"); ingo@3328: ingo@3328: private static final NumberFormat nf = ingo@3328: NumberFormat.getInstance(DEFAULT_LOCALE); ingo@3328: ingo@3328: ingo@3328: private List relations; ingo@3328: ingo@3328: private ImportSQRelation current; ingo@3328: ingo@3329: private String currentDescription; ingo@3329: ingo@3328: ingo@3328: public SQRelationParser() { ingo@3328: relations = new ArrayList(); ingo@3328: } ingo@3328: ingo@3328: ingo@3328: public List getSQRelations() { ingo@3328: return relations; ingo@3328: } ingo@3328: ingo@3328: @Override ingo@3329: public void parse(File file) throws IOException { ingo@3329: this.currentDescription = file.getName(); ingo@3329: super.parse(file); ingo@3329: } ingo@3329: ingo@3329: ingo@3329: @Override ingo@3328: protected void reset() { ingo@3328: current = new ImportSQRelation(); ingo@3328: } ingo@3328: ingo@3328: ingo@3328: @Override ingo@3328: protected void finish() { ingo@3329: if (current != null) { ingo@3329: current.setDescription(currentDescription); ingo@3329: relations.add(current); ingo@3329: } ingo@3328: } ingo@3328: ingo@3328: ingo@3328: @Override ingo@4193: protected void handleLine(int lineNum, String line) { ingo@3328: if (line.startsWith(START_META_CHAR)) { ingo@3328: handleMetaLine(stripMetaLine(line)); ingo@3328: } ingo@3328: else { ingo@3328: handleDataLine(line); ingo@3328: } ingo@3328: } ingo@3328: ingo@3328: ingo@3328: protected void handleMetaLine(String line) { ingo@3328: Matcher m = TIMERANGE_REGEX.matcher(line); ingo@3328: ingo@3328: if (m.matches()) { ingo@3328: String lo = m.group(1); ingo@3328: String hi = m.group(2); ingo@3328: ingo@3328: log.debug("Found timerange " + lo + " - " + hi); ingo@3328: ingo@3328: try { ingo@3328: int low = nf.parse(lo).intValue(); ingo@3328: int high = nf.parse(hi).intValue(); ingo@3328: ingo@3328: current.setTimeInterval(new ImportTimeInterval( ingo@3328: getDateFromYear(low), ingo@3328: getDateFromYear(high) ingo@3328: )); ingo@3328: } ingo@3328: catch (ParseException nfe) { ingo@3328: log.warn("Cannot parse time range.", nfe); ingo@3328: } ingo@3328: } ingo@3328: } ingo@3328: ingo@3328: ingo@3328: protected void handleDataLine(String line) { ingo@3328: String[] cols = line.split(SEPERATOR_CHAR); ingo@3328: rrenkert@5429: if (cols.length < 14) { ingo@3328: log.warn("skip invalid data line: '" + line + "'"); ingo@3328: return; ingo@3328: } ingo@3328: rrenkert@5429: Double km = parseDouble(cols[3], line); rrenkert@5429: Double a = parseDouble(cols[6], line); rrenkert@5429: Double b = parseDouble(cols[7], line); rrenkert@5429: Double qMax = parseDouble(cols[8], line); rrenkert@5429: Double rSq = parseDouble(cols[9], line); rrenkert@5429: Integer nTot = parseInteger(cols[10], line); rrenkert@5429: Integer nOutlier = parseInteger(cols[11], line); rrenkert@5429: Double cFer = parseDouble(cols[12], line); rrenkert@5429: Double cDuan = parseDouble(cols[13], line); tom@5498: if (km == null || a == null || b == null || tom@5498: qMax == null || cols[1].length() == 0) { tom@5498: if (km == null) { tom@5498: log.error("No km for measurement station: Can not reference measurement station: " tom@5498: + line); tom@5498: } tom@5498: if ( a == null || b == null || tom@5498: qMax == null || cols[1].length() == 0) { tom@5498: log.error("Incomplete SQ-relation row (missing a, b, Qmax or parameter): " tom@5498: + line); tom@5498: } tom@5498: return; rrenkert@5429: } rrenkert@5429: current.addValue(new ImportSQRelationValue( rrenkert@5429: cols[1], rrenkert@5429: km, rrenkert@5429: a, rrenkert@5429: b, rrenkert@5429: qMax, rrenkert@5429: rSq, rrenkert@5429: nTot, rrenkert@5429: nOutlier, rrenkert@5429: cFer, rrenkert@5429: cDuan)); rrenkert@5429: } rrenkert@5429: rrenkert@5429: private Double parseDouble(String value, String line) { rrenkert@5429: Double result = null; ingo@3328: try { rrenkert@5429: result = Double.valueOf(value.replace(",", ".")); ingo@3328: } rrenkert@5429: catch (NumberFormatException nfe) { tom@5498: log.warn("Unparseable " + value + " in sq relation row: " + line); ingo@3328: } rrenkert@5429: return result; rrenkert@5429: } rrenkert@5429: rrenkert@5429: private Integer parseInteger(String value, String line) { rrenkert@5429: Integer result = null; rrenkert@5429: try { rrenkert@5429: result = Integer.valueOf(value); rrenkert@5429: } rrenkert@5429: catch (NumberFormatException nfe) { tom@5498: log.warn("Unparseable " + value + " in sq relation row: " + line); rrenkert@5429: } rrenkert@5429: return result; ingo@3328: } ingo@3328: } ingo@3328: // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :