view backend/src/main/java/org/dive4elements/river/importer/parsers/MeasurementStationsParser.java @ 8989:2693bfaf503d

Fixed several BigDecimal(double) creations by BigDecimal(String) parsing to avoid unnecessary decimal digits
author mschaefer
date Mon, 09 Apr 2018 09:07:00 +0200
parents 8fbc0649da13
children c43d8c1a4455
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.text.ParseException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import org.apache.log4j.Logger;
import org.dive4elements.river.importer.ImportMeasurementStation;
import org.dive4elements.river.importer.ImportRange;
import org.dive4elements.river.importer.ImportTimeInterval;
import org.dive4elements.river.importer.common.AbstractParser;
import org.dive4elements.river.model.MeasurementStation;


public class MeasurementStationsParser extends LineParser {

    public static class MeasurementStationParserException extends Exception {

        private static final long serialVersionUID = 1L;

        public MeasurementStationParserException(final String msg) {
            super(msg);
        }
    }

    public static final int MIN_COLUMNS = 9;

    public static final int MAX_COMMENT_LENGTH = 512;

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

    private List<ImportMeasurementStation> measurementStations;
    private ImportMeasurementStation current;

    @Override
    protected void reset() {
        this.measurementStations = new ArrayList<>();
    }

    @Override
    protected void finish() {
    }

    @Override
    protected void handleLine(final int lineNum, final String line) {
        if (line == null || line.startsWith(START_META_CHAR)) {
            log.info("skip meta information at line " + lineNum);
            return;
        }

        try {
            this.current = new ImportMeasurementStation();
            handleDataLine(lineNum, line);
            this.measurementStations.add(this.current);
        }
        catch (final MeasurementStationParserException e) {
            log.warn("Problem in line " + lineNum + ": " + e.getMessage());
        }
    }

    public List<ImportMeasurementStation> getMeasurementStations() {
        return this.measurementStations;
    }

    protected void handleDataLine(final int lineNum, final String line)
            throws MeasurementStationParserException {
        final String[] cols = line.split(SEPERATOR_CHAR);

        if (cols == null || cols.length < MIN_COLUMNS) {
            final int num = cols != null ? cols.length : 0;
            throw new MeasurementStationParserException("Not enough columns: "
                    + num);
        }

        this.current.name = getName(cols, lineNum);
        this.current.range = getRange(cols, lineNum);
        this.current.measurementType = getMeasurementType(cols, lineNum);
        this.current.riverside = getRiverside(cols, lineNum);
        this.current.gauge = getGauge(cols, lineNum);
        this.current.observationTimerange = getObservationTimerange(cols, lineNum);
        this.current.operator = getOperator(cols, lineNum);
        this.current.comment = getComment(cols, lineNum);
    }

    protected String getName(final String[] cols, final int lineNum)
            throws MeasurementStationParserException {
        if (cols[0] == null || cols[0].length() == 0) {
            throw new MeasurementStationParserException("invalid name in line "
                    + lineNum);
        }

        return cols[0];
    }

    protected ImportRange getRange(final String[] cols, final int lineNum) {
        final String from = cols[1];
        final String to   = cols[4];
        if (from == null || from.length() == 0) {
            log.error("No station found in line" + lineNum);
            return null;
        }

        try {
            if (to == null || to.length() == 0) {
                log.warn("No end km found in line " + lineNum);
                return new ImportRange(AbstractParser.parseDecimal(from));
            }

            try {
                return new ImportRange(AbstractParser.parseDecimal(from), AbstractParser.parseDecimal(to));
            }
            catch (final NumberFormatException e) {
                log.warn("Unparseable end km in line " + lineNum +
                        ". Error: " + e.getMessage());
                return new ImportRange(AbstractParser.parseDecimal(from));
            }

        }
        catch (final NumberFormatException e) {
            log.error("Unparseable station in line " + lineNum +
                    ". Error: " + e.getMessage());
            return null;
        }
    }

    protected String getMeasurementType(final String[] cols, final int lineNum)
            throws MeasurementStationParserException {
        final String mtype = cols[2].trim();
        if (!(MeasurementStation.MEASUREMENT_TYPE_BEDLOAD.equals(mtype) ||
                MeasurementStation.MEASUREMENT_TYPE_SUSP.equals(mtype))) {
            throw new MeasurementStationParserException(
                    "invalid measurement type in line " + lineNum);
        }

        return mtype;
    }

    protected String getRiverside(final String[] cols, final int lineNum) {
        final String col = cols[3];
        if (col == null || col.length() == 0) {
            log.warn("No river side given in line " + lineNum);
        }
        return col;
    }

    protected String getGauge(final String[] cols, final int lineNum) {
        final String col = cols[5];
        if (col == null || col.length() == 0) {
            log.warn("Invalid gauge found in line " + lineNum);
        }
        return col;
    }

    protected ImportTimeInterval getObservationTimerange(
            final String[] cols,
            final int lineNum
            ) {
        final String col = cols[7];
        if (col == null || col.length() == 0) {
            log.warn("Observation time invalid in line " + lineNum);
            return null;
        }

        try {
            final Date date = getDate(col);

            if (date != null) {
                return new ImportTimeInterval(date);
            }
            log.warn("Observation time invalid in line " + lineNum);
        }
        catch (final ParseException pe) {
            log.warn("Unparseable observation time '" + col +
                    "' in line " + lineNum);
        }
        return null;
    }

    protected String getOperator(final String[] cols, final int lineNum) {
        final String col = cols[8];
        if (col == null || col.length() == 0) {
            log.warn("No operator given in line " + lineNum);
        }
        return col;
    }

    protected String getComment(final String[] cols, final int lineNum) {
        if (cols.length > MIN_COLUMNS) {
            final String col = cols[9];
            if (col.length() > MAX_COMMENT_LENGTH) {
                log.warn("Comment in line " + lineNum +
                        " longer than allowed " + MAX_COMMENT_LENGTH +
                        " characters. Truncated.");
                return col.substring(0, MAX_COMMENT_LENGTH);
            }
            return col;
        }
        return null;
    }
}

http://dive4elements.wald.intevation.org