Mercurial > dive4elements > river
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 :