view flys-backend/src/main/java/de/intevation/flys/importer/parsers/SedimentDensityParser.java @ 4198:1cdbd8a0c994

Added two new tables ClickableQDTable and ClickableWTable and made Ws and Qs clickable in historical discharge calculation. The new tables define listener interfaces (clicked lower or upper icon) to listen to user clicks. In addition to this, there is an enum ClickMode with NONE, SINGLE and RANGE options, which allows to specifiy, which icons are displayed in the tables. NONE means no icon for user clicks, SINGLE has 1 icon, RANGE 2 icons for lower and upper.
author Ingo Weinzierl <ingo.weinzierl@intevation.de>
date Mon, 22 Oct 2012 13:31:25 +0200
parents f63b39799d2d
children be9e28cff0c4
line wrap: on
line source
package de.intevation.flys.importer.parsers;

import java.io.File;
import java.io.IOException;

import java.math.BigDecimal;

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.ImportDepth;
import de.intevation.flys.importer.ImportSedimentDensity;
import de.intevation.flys.importer.ImportSedimentDensityValue;
import de.intevation.flys.importer.ImportUnit;


public class SedimentDensityParser extends LineParser {

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


    public static final NumberFormat nf = NumberFormat.getInstance(DEFAULT_LOCALE);


    public static final Pattern META_UNIT =
        Pattern.compile("^Einheit: \\[(.*)\\].*");

    public static final Pattern META_DEPTH =
        Pattern.compile("^Tiefe: (\\w++)-(\\w++)( (\\w++))?.*");


    protected List<ImportSedimentDensity> sedimentDensities;

    protected ImportSedimentDensity current;

    protected String currentDescription;


    public SedimentDensityParser() {
        sedimentDensities = new ArrayList<ImportSedimentDensity>();
    }


    @Override
    public void parse(File file) throws IOException {
        currentDescription = file.getName();

        super.parse(file);
    }


    @Override
    protected void reset() {
        current = new ImportSedimentDensity(currentDescription);
    }


    @Override
    protected void finish() {
        if (current != null) {
            sedimentDensities.add(current);
        }
    }


    @Override
    protected void handleLine(int lineNum, String line) {
        if (line.startsWith(START_META_CHAR)) {
            handleMetaLine(stripMetaLine(line));
        }
        else {
            handleDataLine(line);
        }
    }


    protected void handleMetaLine(String line) {
        if (handleMetaUnit(line)) {
            return;
        }
        else if (handleMetaDepth(line)) {
            return;
        }
        else {
            log.warn("Unknown meta line: '" + line + "'");
        }
    }


    protected boolean handleMetaUnit(String line) {
        Matcher m = META_UNIT.matcher(line);

        if (m.matches()) {
            String unit = m.group(1);

            current.setUnit(new ImportUnit(unit));

            return true;
        }

        return false;
    }


    protected boolean handleMetaDepth(String line) {
        Matcher m = META_DEPTH.matcher(line);

        if (m.matches()) {
            String lo   = m.group(1);
            String up   = m.group(2);
            String unit = m.group(4);

            log.info("Found sediment density depth: " + lo + " - " + up + " " + unit);

            try {
                ImportDepth depth = new ImportDepth(
                    new BigDecimal(nf.parse(lo).doubleValue()),
                    new BigDecimal(nf.parse(up).doubleValue()),
                    new ImportUnit(unit)
                );

                current.setDepth(depth);

                return true;
            }
            catch (ParseException pe) {
                log.warn("Error while parsing numbers in: '" + line + "'");
            }
        }
        else {
            log.debug("Meta line doesn't contain depth information: " + line);
        }

        return false;
    }


    protected void handleDataLine(String line) {
        String[] vals = line.split(SEPERATOR_CHAR);

        if (vals == null || vals.length < 3) {
            log.warn("skip invalid data line: '" + line + "'");
            return;
        }

        try {
            BigDecimal km      = new BigDecimal(nf.parse(vals[0]).doubleValue());
            BigDecimal density = new BigDecimal(nf.parse(vals[1]).doubleValue());

            current.addValue(new ImportSedimentDensityValue(
                km,
                density,
                vals[2])
            );
        }
        catch (ParseException pe) {
            log.warn("Error while parsing numbers in '" + line + "'");
        }
    }


    public List<ImportSedimentDensity> getSedimentDensities() {
        return sedimentDensities;
    }
}
// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :

http://dive4elements.wald.intevation.org