view backend/src/main/java/org/dive4elements/river/importer/parsers/BedHeightSingleParser.java @ 6328:53d08f33d094

Backend: Moved guessing of main values and there time intervals out of the STA parser. Same come will be useful to extend the WST parser to better handle official lines.
author Sascha L. Teichmann <teichmann@intevation.de>
date Thu, 13 Jun 2013 17:15:34 +0200
parents dc166b225775
children a3fb76cf79b6
line wrap: on
line source
/* Copyright (C) 2011, 2012, 2013 by Bundesanstalt für Gewässerkunde
 * Software engineering by Intevation GmbH
 *
 * This file is Free Software under the GNU AGPL (>=v3)
 * and comes with ABSOLUTELY NO WARRANTY! Check out the
 * documentation coming with Dive4Elements River for details.
 */

package org.dive4elements.river.importer.parsers;

import java.math.BigDecimal;

import java.text.ParseException;

import org.apache.log4j.Logger;

import org.dive4elements.river.importer.ImportBedHeight;
import org.dive4elements.river.importer.ImportBedHeightSingle;
import org.dive4elements.river.importer.ImportBedHeightSingleValue;


public class BedHeightSingleParser extends BedHeightParser {

    private static final Logger log =
        Logger.getLogger(BedHeightSingleParser.class);



    @Override
    protected ImportBedHeight newImportBedHeight(String description) {
        return new ImportBedHeightSingle(description);
    }



    /**
     * Create ImportBedHeightSingleValue from a line of csv file, add
     * it to the ImportBedHeight.
     */
    @Override
    protected void handleDataLine(ImportBedHeight obj, String line) {
        String[] values = line.split(SEPERATOR_CHAR);

        if (values == null || (values.length != 1 && values.length < 6)) {
            //log.warn("BSP: Error while parsing data line: '" + line + "'");
            return;
        }

        BigDecimal km;

        try {
            km = new BigDecimal(nf.parse(values[0]).doubleValue());
        }
        catch (ParseException e) {
            // We expect a lot of ";;;;;;" lines.
            //log.warn("BSP: Error while parsing km of data row.", e);
            return;
        }

        // Handle gaps like "10,0;;;;;".
        if (values.length == 1) {
            // Do not import line without useful data
            return;
        }

        // Because we cannot enforce consistency of values with complete data
        // via null constraints in the database (as there are "gap" values),
        // do this checks manually.
        if (values[3].length() == 0 || values[4].length() == 0
            || values[5].length() == 0) {
            //log.warn("BSP: Error while parsing data row (manual null constraint violated).");
            return;
        }

        try {
            ImportBedHeightSingleValue value = new ImportBedHeightSingleValue(
                (ImportBedHeightSingle) obj,
                km,
                new BigDecimal(nf.parse(values[1]).doubleValue()),
                new BigDecimal(nf.parse(values[2]).doubleValue()),
                new BigDecimal(nf.parse(values[3]).doubleValue()),
                parseBigDecimal(values[4], line),
                new BigDecimal(nf.parse(values[5]).doubleValue())
            );

            obj.addValue(value);
        }
        catch (ParseException e) {
            log.warn("BSP: unparseable value in data row.", e);
        }
    }

    private BigDecimal parseBigDecimal(String value, String line) {
        BigDecimal result = null;
        try {
            Double dValue = Double.valueOf(value.replace(",", "."));
            result = new BigDecimal(dValue.doubleValue());
        }
        catch (NumberFormatException nfe) {
            log.warn(
                "Could not parse " +
                value +
                " in bed heigt single row: "
                + line);
        }
        return result;
    }
}
// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :

http://dive4elements.wald.intevation.org