rrenkert@7840: /* Copyright (C) 2011, 2012, 2013 by Bundesanstalt für Gewässerkunde rrenkert@7840: * Software engineering by Intevation GmbH rrenkert@7840: * rrenkert@7840: * This file is Free Software under the GNU AGPL (>=v3) rrenkert@7840: * and comes with ABSOLUTELY NO WARRANTY! Check out the rrenkert@7840: * documentation coming with Dive4Elements River for details. rrenkert@7840: */ rrenkert@7840: rrenkert@7840: package org.dive4elements.river.importer.parsers; rrenkert@7840: rrenkert@7840: import org.dive4elements.river.importer.ImportDepth; rrenkert@7840: import org.dive4elements.river.importer.ImportPorosity; rrenkert@7840: import org.dive4elements.river.importer.ImportPorosityValue; rrenkert@7840: import org.dive4elements.river.importer.ImportTimeInterval; tom@7927: import org.dive4elements.river.utils.DateUtil; rrenkert@7840: rrenkert@7840: import java.io.File; rrenkert@7840: import java.io.IOException; rrenkert@7840: rrenkert@7840: import java.math.BigDecimal; rrenkert@7840: rrenkert@7840: import java.text.NumberFormat; rrenkert@7840: rrenkert@7840: import java.util.ArrayList; rrenkert@7840: import java.util.Date; rrenkert@7840: import java.util.List; rrenkert@7840: rrenkert@7840: import java.util.regex.Matcher; rrenkert@7840: import java.util.regex.Pattern; rrenkert@7840: rrenkert@7840: import org.apache.log4j.Logger; rrenkert@7840: rrenkert@7840: public class PorosityParser extends LineParser { rrenkert@7840: rrenkert@7840: private static final Logger log = rrenkert@7840: Logger.getLogger(PorosityParser.class); rrenkert@7840: rrenkert@7840: public static final NumberFormat nf = rrenkert@7840: NumberFormat.getInstance(DEFAULT_LOCALE); rrenkert@7840: rrenkert@7840: public static final Pattern META_DEPTH = tom@7886: Pattern.compile("^Tiefe: (\\d++)-(\\d++).*"); rrenkert@7840: rrenkert@7840: public static final Pattern META_TIMEINTERVAL = rrenkert@7840: Pattern.compile("^Zeitraum: (\\d{4})-(\\d{4}).*"); rrenkert@7840: rrenkert@7840: protected List porosities; rrenkert@7840: rrenkert@7840: protected ImportPorosity current; rrenkert@7840: rrenkert@7840: protected String currentDescription; rrenkert@7840: rrenkert@7840: public PorosityParser() { rrenkert@7840: porosities = new ArrayList(); rrenkert@7840: } rrenkert@7840: rrenkert@7840: rrenkert@7840: @Override rrenkert@7840: public void parse(File file) throws IOException { tom@7880: currentDescription = file.getName().replaceAll("\\.csv", ""); rrenkert@7840: rrenkert@7840: super.parse(file); rrenkert@7840: } rrenkert@7840: rrenkert@7840: rrenkert@7840: @Override rrenkert@7840: protected void reset() { rrenkert@7840: current = new ImportPorosity(currentDescription); rrenkert@7840: } rrenkert@7840: rrenkert@7840: rrenkert@7840: @Override rrenkert@7840: protected void finish() { rrenkert@7840: if (current != null) { rrenkert@7840: porosities.add(current); rrenkert@7840: } rrenkert@7840: } rrenkert@7840: rrenkert@7840: rrenkert@7840: @Override rrenkert@7840: protected void handleLine(int lineNum, String line) { rrenkert@7840: if (line.startsWith(START_META_CHAR)) { rrenkert@7840: handleMetaLine(stripMetaLine(line)); rrenkert@7840: } rrenkert@7840: else { rrenkert@7840: handleDataLine(line); rrenkert@7840: } rrenkert@7840: } rrenkert@7840: rrenkert@7840: rrenkert@7840: protected void handleMetaLine(String line) { rrenkert@7840: if (handleMetaDepth(line)) { rrenkert@7840: return; rrenkert@7840: } rrenkert@7840: if (handleMetaTimeInterval(line)) { rrenkert@7840: return; rrenkert@7840: } rrenkert@7840: log.warn("Unknown meta line: '" + line + "'"); rrenkert@7840: } rrenkert@7840: rrenkert@7840: protected boolean handleMetaTimeInterval(String line) { rrenkert@7840: Matcher m = META_TIMEINTERVAL.matcher(line); rrenkert@7840: rrenkert@7840: if (m.matches()) { rrenkert@7840: String lo = m.group(1); rrenkert@7840: String up = m.group(2); rrenkert@7840: rrenkert@7840: log.debug("Found time interval: " + lo + " - " + up); rrenkert@7840: rrenkert@7840: try { rrenkert@7840: int lower = Integer.valueOf(lo); rrenkert@7840: int upper = Integer.valueOf(up); rrenkert@7840: tom@7927: Date fromYear = DateUtil.getStartDateFromYear(lower); tom@7927: Date toYear = DateUtil.getEndDateFromYear(upper); rrenkert@7840: rrenkert@7840: current.setTimeInterval(new ImportTimeInterval(fromYear, toYear)); rrenkert@7840: } rrenkert@7840: catch (NumberFormatException e) { rrenkert@7840: log.warn("PP: could not parse timeinterval", e); rrenkert@7840: } rrenkert@7840: rrenkert@7840: return true; rrenkert@7840: } rrenkert@7840: rrenkert@7840: return false; rrenkert@7840: } rrenkert@7840: rrenkert@7840: protected boolean handleMetaDepth(String line) { rrenkert@7840: Matcher m = META_DEPTH.matcher(line); rrenkert@7840: rrenkert@7840: if (m.matches()) { rrenkert@7840: String lo = m.group(1); rrenkert@7840: String up = m.group(2); rrenkert@7840: rrenkert@7840: log.info("Found porosity depth: " + lo + " - " + up + " cm"); rrenkert@7840: rrenkert@7862: ImportDepth depth = null; rrenkert@7840: try { rrenkert@7862: depth = new ImportDepth( rrenkert@7862: new BigDecimal(lo), rrenkert@7862: new BigDecimal(up) rrenkert@7840: ); rrenkert@7862: } rrenkert@7862: catch (NumberFormatException nfe) { rrenkert@7862: log.warn("Unparsable number for depth: " + line, nfe); rrenkert@7862: } rrenkert@7840: rrenkert@7862: if (depth != null) { rrenkert@7840: current.setDepth(depth); rrenkert@7840: return true; rrenkert@7840: } rrenkert@7862: return false; rrenkert@7840: } rrenkert@7840: else { rrenkert@7840: log.debug("Meta line doesn't contain depth information: " + line); rrenkert@7840: } rrenkert@7840: rrenkert@7840: return false; rrenkert@7840: } rrenkert@7840: rrenkert@7840: protected void handleDataLine(String line) { rrenkert@7840: String[] vals = line.split(SEPERATOR_CHAR); rrenkert@7840: log.debug("handle line: " + line); rrenkert@7840: rrenkert@7840: if (vals == null || vals.length < 3) { rrenkert@7840: log.warn("skip invalid data line: '" + line + "'"); rrenkert@7840: return; rrenkert@7840: } rrenkert@7840: rrenkert@7840: BigDecimal km = null; rrenkert@7840: BigDecimal shoreOffset = null; rrenkert@7840: BigDecimal porosity = null; rrenkert@7862: vals[0] = vals[0].replace(",", "."); rrenkert@7862: vals[2] = vals[2].replace(",", "."); rrenkert@7840: try { rrenkert@7862: km = new BigDecimal(vals[0]); rrenkert@7862: porosity = new BigDecimal(vals[2]); rrenkert@7840: if (!vals[1].isEmpty()) { rrenkert@7862: vals[1] = vals[1].replace(",", "."); rrenkert@7862: shoreOffset = new BigDecimal(vals[1]); rrenkert@7840: } rrenkert@7840: } rrenkert@7862: catch(NumberFormatException nfe) { rrenkert@7862: log.warn("Unparsable number in line: " + line, nfe); rrenkert@7840: } rrenkert@7840: rrenkert@7840: if (km == null || porosity == null) { rrenkert@7840: log.warn("PP: No km nor porosity given. Skip line"); rrenkert@7840: return; rrenkert@7840: } rrenkert@7840: log.debug("add new value."); rrenkert@7840: current.addValue(new ImportPorosityValue( rrenkert@7840: km, rrenkert@7840: shoreOffset, rrenkert@7840: porosity, rrenkert@7840: currentDescription)); rrenkert@7840: } rrenkert@7840: rrenkert@7840: rrenkert@7840: public List getPorosities() { rrenkert@7840: return porosities; rrenkert@7840: } rrenkert@7840: } rrenkert@7840: // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :