view flys-backend/src/main/java/de/intevation/flys/importer/parsers/BedHeightSingleParser.java @ 2809:f283212966e8

Finished work on MINFO bed heights (single). flys-backend/trunk@4221 c6561f87-3c4e-4783-a992-168aeb5c3f6f
author Ingo Weinzierl <ingo.weinzierl@intevation.de>
date Thu, 12 Apr 2012 10:42:46 +0000
parents b57c95094b68
children 8926571e47fb
line wrap: on
line source
package de.intevation.flys.importer.parsers;

import java.io.File;

import java.math.BigDecimal;

import java.text.NumberFormat;
import java.text.ParseException;

import java.util.ArrayList;
import java.util.List;
import java.util.Locale;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

import java.io.IOException;
import java.io.LineNumberReader;
import java.io.FileInputStream;
import java.io.InputStreamReader;

import org.apache.log4j.Logger;

import de.intevation.flys.importer.ImportBedHeightSingle;
import de.intevation.flys.importer.ImportBedHeightSingleValue;
import de.intevation.flys.importer.ImportBedHeightType;
import de.intevation.flys.importer.ImportElevationModel;
import de.intevation.flys.importer.ImportLocationSystem;
import de.intevation.flys.importer.ImportRange;
import de.intevation.flys.importer.ImportUnit;
import de.intevation.flys.model.BedHeightType;


public class BedHeightSingleParser {

    public static final String ENCODING = "ISO-8859-1";

    public static final Locale DEFAULT_LOCALE = Locale.GERMAN;

    public static final String START_META_CHAR = "#";
    public static final String SEPERATOR_CHAR  = ";";

    public static final Pattern META_YEAR =
        Pattern.compile("^Jahr: (\\d*).*");

    public static final Pattern META_TYPE =
        Pattern.compile("^Aufnahmeart: (.*).*");

    public static final Pattern META_LOCATION_SYSTEM =
        Pattern.compile("^Lagesystem: (.*).*");

    public static final Pattern META_CUR_ELEVATION_SYSTEM =
        Pattern.compile("^H.hensystem:\\s(\\w++) (.* )??\\[(.*)\\].*");

    public static final Pattern META_OLD_ELEVATION_SYSTEM =
        Pattern.compile("^urspr.ngliches H.hensystem:\\s(\\w++) (.* )??\\[(.*)\\].*");

    public static final Pattern META_SOUNDING_WIDTH =
        Pattern.compile("^ausgewertete Peilbreite: (\\d*).*");

    public static final Pattern META_RANGE =
        Pattern.compile("^Strecke:\\D*(\\d++.\\d*)-(\\d++.\\d*).*");

    public static final Pattern META_EVALUATION_BY =
        Pattern.compile("^Auswerter: (.*).*");

    public static final Pattern META_COMMENTS =
        Pattern.compile("^Weitere Bemerkungen: (.*).*");

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


    protected static NumberFormat nf = NumberFormat.getInstance(DEFAULT_LOCALE);


    protected List<ImportBedHeightSingle> bedHeights;


    public BedHeightSingleParser() {
        bedHeights = new ArrayList<ImportBedHeightSingle>();
    }


    public List<ImportBedHeightSingle> getBedHeights() {
        return bedHeights;
    }


    public void parse(File file) throws IOException {
        log.info("Parsing bed height single file '" + file + "'");

        ImportBedHeightSingle obj = new ImportBedHeightSingle(file.getName());

        LineNumberReader in = null;
        try {
            in =
                new LineNumberReader(
                new InputStreamReader(
                new FileInputStream(file), ENCODING));

            String line = null;
            while ((line = in.readLine()) != null) {
                if ((line = line.trim()).length() == 0) {
                    continue;
                }

                if (line.startsWith(START_META_CHAR)) {
                    handleMetaLine(obj, line);
                }
                else {
                    handleDataLine(obj, line);
                }
            }

            log.info("File contained " + obj.getValues().size() + " values.");
            bedHeights.add(obj);
        }
        finally {
            if (in != null) {
                in.close();
            }
        }
    }


    protected void handleMetaLine(ImportBedHeightSingle obj, String line) {
        String meta = stripMetaLine(line);

        if (handleMetaYear(obj, meta)) {
            return;
        }
        else if (handleMetaSoundingWidth(obj, meta)) {
            return;
        }
        else if (handleMetaComment(obj, meta)) {
            return;
        }
        else if (handleMetaEvaluationBy(obj, meta)) {
            return;
        }
        else if (handleMetaRange(obj, meta)) {
            return;
        }
        else if (handleMetaType(obj, meta)) {
            return;
        }
        else if (handleMetaLocationSystem(obj, meta)) {
            return;
        }
        else if (handleMetaCurElevationModel(obj, meta)) {
            return;
        }
        else if (handleMetaOldElevationModel(obj, meta)) {
            return;
        }
        else {
            log.warn("Meta line did not match any known type: " + line);
        }
    }


    protected boolean handleMetaYear(ImportBedHeightSingle obj, String line) {
        Matcher m = META_YEAR.matcher(line);

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

            try {
                obj.setYear(Integer.valueOf(tmp));
                return true;
            }
            catch (NumberFormatException e) {
                log.warn("Error while parsing year!", e);
            }
        }

        return false;
    }


    protected boolean handleMetaSoundingWidth(ImportBedHeightSingle obj, String line) {
        Matcher m = META_SOUNDING_WIDTH.matcher(line);

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

            try {
                obj.setSoundingWidth(Integer.valueOf(tmp));
                return true;
            }
            catch (NumberFormatException e) {
                log.warn("Error while parsing sounding width!", e);
            }
        }

        return false;
    }


    protected boolean handleMetaComment(ImportBedHeightSingle obj, String line) {
        Matcher m = META_COMMENTS.matcher(line);

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

            obj.setDescription(tmp);

            return true;
        }

        return false;
    }


    protected boolean handleMetaEvaluationBy(
        ImportBedHeightSingle obj,
        String                line
    ) {
        Matcher m = META_EVALUATION_BY.matcher(line);

        if (m.matches()) {
            String tmp = m.group(1);
            tmp = tmp.replace(";", "");

            obj.setEvaluationBy(tmp);

            return true;
        }

        return false;
    }


    protected boolean handleMetaRange(ImportBedHeightSingle obj, String line) {
        Matcher m = META_RANGE.matcher(line);

        if (m.matches() && m.groupCount() >= 2) {
            String a = m.group(1).replace(";", "");
            String b = m.group(2).replace(";", "");

            try {
                BigDecimal lower = new BigDecimal(nf.parse(a).doubleValue());
                BigDecimal upper = new BigDecimal(nf.parse(b).doubleValue());

                obj.setRange(new ImportRange(lower, upper));

                return true;
            }
            catch (ParseException e) {
                log.warn("Error while parsing range!", e);
            }
        }

        return false;
    }


    protected boolean handleMetaType(ImportBedHeightSingle obj, String line) {
        Matcher m = META_TYPE.matcher(line);

        if (m.matches()) {
            String tmp = m.group(1).replace(";", "");

            obj.setType(new ImportBedHeightType(
                BedHeightType.getBedHeightName(tmp),
                tmp));

            return true;
        }

        return false;
    }


    protected boolean handleMetaLocationSystem(
        ImportBedHeightSingle obj,
        String                line
    ) {
        Matcher m = META_LOCATION_SYSTEM.matcher(line);

        if (m.matches()) {
            String tmp = m.group(1).replace(";", "");

            obj.setLocationSystem(new ImportLocationSystem(tmp, tmp));

            return true;
        }

        return false;
    }


    protected boolean handleMetaCurElevationModel(
        ImportBedHeightSingle obj,
        String                line
    ) {
        Matcher m = META_CUR_ELEVATION_SYSTEM.matcher(line);

        if (m.matches()) {
            String name = m.group(1);
            String num  = m.group(2);
            String unit = m.group(3);

            obj.setCurElevationModel(new ImportElevationModel(
                name + " " + num,
                new ImportUnit(unit)
            ));

            return true;
        }

        return false;
    }


    protected boolean handleMetaOldElevationModel(
        ImportBedHeightSingle obj,
        String                line
    ) {
        Matcher m = META_OLD_ELEVATION_SYSTEM.matcher(line);

        if (m.matches()) {
            String name = m.group(1);
            String num  = m.group(2);
            String unit = m.group(3);

            obj.setOldElevationModel(new ImportElevationModel(
                name + " " + num,
                new ImportUnit(unit)
            ));

            return true;
        }

        return false;
    }


    protected void handleDataLine(ImportBedHeightSingle obj, String line) {
        String[] values = line.split(SEPERATOR_CHAR);

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


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

            obj.addValue(value);
        }
        catch (ParseException e) {
            log.warn("Error while parsing data row.", e);
        }
    }


    protected static String stripMetaLine(String line) {
        String tmp = line.substring(1, line.length()-1);

        if (tmp.startsWith(" ")) {
            return tmp.substring(1, tmp.length()-1);
        }
        else {
            return tmp;
        }
    }
}
// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :

http://dive4elements.wald.intevation.org