ingo@2806: package de.intevation.flys.importer.parsers; ingo@2806: ingo@2806: import java.io.File; ingo@2806: ingo@2808: import java.math.BigDecimal; ingo@2808: ingo@2808: import java.text.NumberFormat; ingo@2808: import java.text.ParseException; ingo@2808: ingo@2808: import java.util.ArrayList; ingo@2806: import java.util.List; ingo@2808: import java.util.Locale; ingo@2808: ingo@2808: import java.util.regex.Matcher; ingo@2808: import java.util.regex.Pattern; ingo@2806: ingo@2806: import java.io.IOException; ingo@2806: import java.io.LineNumberReader; ingo@2806: import java.io.FileInputStream; ingo@2806: import java.io.InputStreamReader; ingo@2806: ingo@2806: import org.apache.log4j.Logger; ingo@2806: ingo@2806: import de.intevation.flys.importer.ImportBedHeightSingle; ingo@2808: import de.intevation.flys.importer.ImportBedHeightSingleValue; ingo@2808: import de.intevation.flys.importer.ImportBedHeightType; ingo@2808: import de.intevation.flys.importer.ImportElevationModel; ingo@2808: import de.intevation.flys.importer.ImportLocationSystem; ingo@2808: import de.intevation.flys.importer.ImportRange; ingo@2808: import de.intevation.flys.importer.ImportUnit; ingo@2806: ingo@2806: ingo@2806: public class BedHeightSingleParser { ingo@2806: ingo@2806: public static final String ENCODING = "ISO-8859-1"; ingo@2806: ingo@2808: public static final Locale DEFAULT_LOCALE = Locale.GERMAN; ingo@2808: ingo@2808: public static final String START_META_CHAR = "#"; ingo@2808: public static final String SEPERATOR_CHAR = ";"; ingo@2808: ingo@2808: public static final Pattern META_YEAR = ingo@2808: Pattern.compile("^Jahr: (\\d*).*"); ingo@2808: ingo@2808: public static final Pattern META_TYPE = ingo@2808: Pattern.compile("^Aufnahmeart: (.*).*"); ingo@2808: ingo@2808: public static final Pattern META_LOCATION_SYSTEM = ingo@2808: Pattern.compile("^Lagesystem: (.*).*"); ingo@2808: ingo@2808: public static final Pattern META_CUR_ELEVATION_SYSTEM = ingo@2808: Pattern.compile("^H.hensystem:\\s(\\w++) (.* )??\\[(.*)\\].*"); ingo@2808: ingo@2808: public static final Pattern META_OLD_ELEVATION_SYSTEM = ingo@2808: Pattern.compile("^urspr.ngliches H.hensystem:\\s(\\w++) (.* )??\\[(.*)\\].*"); ingo@2808: ingo@2808: public static final Pattern META_SOUNDING_WIDTH = ingo@2808: Pattern.compile("^ausgewertete Peilbreite: (\\d*).*"); ingo@2808: ingo@2808: public static final Pattern META_RANGE = ingo@2808: Pattern.compile("^Strecke:\\D*(\\d++.\\d*)-(\\d++.\\d*).*"); ingo@2808: ingo@2808: public static final Pattern META_EVALUATION_BY = ingo@2808: Pattern.compile("^Auswerter: (.*).*"); ingo@2808: ingo@2808: public static final Pattern META_COMMENTS = ingo@2808: Pattern.compile("^Weitere Bemerkungen: (.*).*"); ingo@2806: ingo@2806: private static final Logger log = ingo@2806: Logger.getLogger(BedHeightSingleParser.class); ingo@2806: ingo@2806: ingo@2808: protected static NumberFormat nf = NumberFormat.getInstance(DEFAULT_LOCALE); ingo@2808: ingo@2808: ingo@2806: protected List bedHeights; ingo@2806: ingo@2806: ingo@2806: public BedHeightSingleParser() { ingo@2806: bedHeights = new ArrayList(); ingo@2806: } ingo@2806: ingo@2806: ingo@2806: public List getBedHeights() { ingo@2806: return bedHeights; ingo@2806: } ingo@2806: ingo@2806: ingo@2806: public void parse(File file) throws IOException { ingo@2806: log.info("Parsing bed height single file '" + file + "'"); ingo@2806: ingo@2808: ImportBedHeightSingle obj = new ImportBedHeightSingle(file.getName()); ingo@2808: ingo@2806: LineNumberReader in = null; ingo@2806: try { ingo@2806: in = ingo@2806: new LineNumberReader( ingo@2806: new InputStreamReader( ingo@2806: new FileInputStream(file), ENCODING)); ingo@2806: ingo@2806: String line = null; ingo@2806: while ((line = in.readLine()) != null) { ingo@2806: if ((line = line.trim()).length() == 0) { ingo@2806: continue; ingo@2806: } ingo@2808: ingo@2808: if (line.startsWith(START_META_CHAR)) { ingo@2808: handleMetaLine(obj, line); ingo@2808: } ingo@2808: else { ingo@2808: handleDataLine(obj, line); ingo@2808: } ingo@2806: } ingo@2806: } ingo@2806: finally { ingo@2806: if (in != null) { ingo@2806: in.close(); ingo@2806: } ingo@2806: } ingo@2806: } ingo@2808: ingo@2808: ingo@2808: protected void handleMetaLine(ImportBedHeightSingle obj, String line) { ingo@2808: String meta = stripMetaLine(line); ingo@2808: ingo@2808: if (handleMetaYear(obj, meta)) { ingo@2808: return; ingo@2808: } ingo@2808: else if (handleMetaSoundingWidth(obj, meta)) { ingo@2808: return; ingo@2808: } ingo@2808: else if (handleMetaComment(obj, meta)) { ingo@2808: return; ingo@2808: } ingo@2808: else if (handleMetaEvaluationBy(obj, meta)) { ingo@2808: return; ingo@2808: } ingo@2808: else if (handleMetaRange(obj, meta)) { ingo@2808: return; ingo@2808: } ingo@2808: else if (handleMetaType(obj, meta)) { ingo@2808: return; ingo@2808: } ingo@2808: else if (handleMetaLocationSystem(obj, meta)) { ingo@2808: return; ingo@2808: } ingo@2808: else if (handleMetaCurElevationModel(obj, meta)) { ingo@2808: return; ingo@2808: } ingo@2808: else if (handleMetaOldElevationModel(obj, meta)) { ingo@2808: return; ingo@2808: } ingo@2808: else { ingo@2808: log.warn("Meta line did not match any known type: " + line); ingo@2808: } ingo@2808: } ingo@2808: ingo@2808: ingo@2808: protected boolean handleMetaYear(ImportBedHeightSingle obj, String line) { ingo@2808: Matcher m = META_YEAR.matcher(line); ingo@2808: ingo@2808: if (m.matches()) { ingo@2808: String tmp = m.group(1); ingo@2808: ingo@2808: try { ingo@2808: obj.setYear(Integer.valueOf(tmp)); ingo@2808: return true; ingo@2808: } ingo@2808: catch (NumberFormatException e) { ingo@2808: log.warn("Error while parsing year!", e); ingo@2808: } ingo@2808: } ingo@2808: ingo@2808: return false; ingo@2808: } ingo@2808: ingo@2808: ingo@2808: protected boolean handleMetaSoundingWidth(ImportBedHeightSingle obj, String line) { ingo@2808: Matcher m = META_SOUNDING_WIDTH.matcher(line); ingo@2808: ingo@2808: if (m.matches()) { ingo@2808: String tmp = m.group(1); ingo@2808: ingo@2808: try { ingo@2808: obj.setSoundingWidth(Integer.valueOf(tmp)); ingo@2808: return true; ingo@2808: } ingo@2808: catch (NumberFormatException e) { ingo@2808: log.warn("Error while parsing sounding width!", e); ingo@2808: } ingo@2808: } ingo@2808: ingo@2808: return false; ingo@2808: } ingo@2808: ingo@2808: ingo@2808: protected boolean handleMetaComment(ImportBedHeightSingle obj, String line) { ingo@2808: Matcher m = META_COMMENTS.matcher(line); ingo@2808: ingo@2808: if (m.matches()) { ingo@2808: String tmp = m.group(1); ingo@2808: ingo@2808: obj.setDescription(tmp); ingo@2808: ingo@2808: return true; ingo@2808: } ingo@2808: ingo@2808: return false; ingo@2808: } ingo@2808: ingo@2808: ingo@2808: protected boolean handleMetaEvaluationBy( ingo@2808: ImportBedHeightSingle obj, ingo@2808: String line ingo@2808: ) { ingo@2808: Matcher m = META_EVALUATION_BY.matcher(line); ingo@2808: ingo@2808: if (m.matches()) { ingo@2808: String tmp = m.group(1); ingo@2808: tmp = tmp.replace(";", ""); ingo@2808: ingo@2808: obj.setEvaluationBy(tmp); ingo@2808: ingo@2808: return true; ingo@2808: } ingo@2808: ingo@2808: return false; ingo@2808: } ingo@2808: ingo@2808: ingo@2808: protected boolean handleMetaRange(ImportBedHeightSingle obj, String line) { ingo@2808: Matcher m = META_RANGE.matcher(line); ingo@2808: ingo@2808: if (m.matches() && m.groupCount() >= 2) { ingo@2808: String a = m.group(1).replace(";", ""); ingo@2808: String b = m.group(2).replace(";", ""); ingo@2808: ingo@2808: try { ingo@2808: BigDecimal lower = new BigDecimal(nf.parse(a).doubleValue()); ingo@2808: BigDecimal upper = new BigDecimal(nf.parse(b).doubleValue()); ingo@2808: ingo@2808: obj.setRange(new ImportRange(lower, upper)); ingo@2808: ingo@2808: return true; ingo@2808: } ingo@2808: catch (ParseException e) { ingo@2808: log.warn("Error while parsing range!", e); ingo@2808: } ingo@2808: } ingo@2808: ingo@2808: return false; ingo@2808: } ingo@2808: ingo@2808: ingo@2808: protected boolean handleMetaType(ImportBedHeightSingle obj, String line) { ingo@2808: Matcher m = META_TYPE.matcher(line); ingo@2808: ingo@2808: if (m.matches()) { ingo@2808: String tmp = m.group(1).replace(";", ""); ingo@2808: ingo@2808: obj.setType(new ImportBedHeightType( ingo@2808: ImportBedHeightType.getBedHeightName(tmp), ingo@2808: tmp)); ingo@2808: ingo@2808: return true; ingo@2808: } ingo@2808: ingo@2808: return false; ingo@2808: } ingo@2808: ingo@2808: ingo@2808: protected boolean handleMetaLocationSystem( ingo@2808: ImportBedHeightSingle obj, ingo@2808: String line ingo@2808: ) { ingo@2808: Matcher m = META_LOCATION_SYSTEM.matcher(line); ingo@2808: ingo@2808: if (m.matches()) { ingo@2808: String tmp = m.group(1).replace(";", ""); ingo@2808: ingo@2808: obj.setLocationSystem(new ImportLocationSystem(tmp, tmp)); ingo@2808: ingo@2808: return true; ingo@2808: } ingo@2808: ingo@2808: return false; ingo@2808: } ingo@2808: ingo@2808: ingo@2808: protected boolean handleMetaCurElevationModel( ingo@2808: ImportBedHeightSingle obj, ingo@2808: String line ingo@2808: ) { ingo@2808: Matcher m = META_CUR_ELEVATION_SYSTEM.matcher(line); ingo@2808: ingo@2808: if (m.matches()) { ingo@2808: String name = m.group(1); ingo@2808: String num = m.group(2); ingo@2808: String unit = m.group(3); ingo@2808: ingo@2808: obj.setCurElevationModel(new ImportElevationModel( ingo@2808: name + " " + num, ingo@2808: new ImportUnit(unit) ingo@2808: )); ingo@2808: ingo@2808: return true; ingo@2808: } ingo@2808: ingo@2808: return false; ingo@2808: } ingo@2808: ingo@2808: ingo@2808: protected boolean handleMetaOldElevationModel( ingo@2808: ImportBedHeightSingle obj, ingo@2808: String line ingo@2808: ) { ingo@2808: Matcher m = META_OLD_ELEVATION_SYSTEM.matcher(line); ingo@2808: ingo@2808: if (m.matches()) { ingo@2808: String name = m.group(1); ingo@2808: String num = m.group(2); ingo@2808: String unit = m.group(3); ingo@2808: ingo@2808: obj.setOldElevationModel(new ImportElevationModel( ingo@2808: name + " " + num, ingo@2808: new ImportUnit(unit) ingo@2808: )); ingo@2808: ingo@2808: return true; ingo@2808: } ingo@2808: ingo@2808: return false; ingo@2808: } ingo@2808: ingo@2808: ingo@2808: protected void handleDataLine(ImportBedHeightSingle obj, String line) { ingo@2808: log.debug("Handle data line: '" + line + "'"); ingo@2808: ingo@2808: String[] values = line.split(SEPERATOR_CHAR); ingo@2808: ingo@2808: if (values == null || values.length < 6) { ingo@2808: log.warn("Error while parsing data line: '" + line + "'"); ingo@2808: return; ingo@2808: } ingo@2808: ingo@2808: ingo@2808: try { ingo@2808: ImportBedHeightSingleValue value = new ImportBedHeightSingleValue( ingo@2808: obj, ingo@2808: new BigDecimal(nf.parse(values[0]).doubleValue()), ingo@2808: new BigDecimal(nf.parse(values[1]).doubleValue()), ingo@2808: new BigDecimal(nf.parse(values[2]).doubleValue()), ingo@2808: new BigDecimal(nf.parse(values[3]).doubleValue()), ingo@2808: new BigDecimal(nf.parse(values[4]).doubleValue()), ingo@2808: new BigDecimal(nf.parse(values[5]).doubleValue()) ingo@2808: ); ingo@2808: ingo@2808: obj.addValue(value); ingo@2808: } ingo@2808: catch (ParseException e) { ingo@2808: log.warn("Error while parsing data row.", e); ingo@2808: } ingo@2808: } ingo@2808: ingo@2808: ingo@2808: protected static String stripMetaLine(String line) { ingo@2808: String tmp = line.substring(1, line.length()-1); ingo@2808: ingo@2808: if (tmp.startsWith(" ")) { ingo@2808: return tmp.substring(1, tmp.length()-1); ingo@2808: } ingo@2808: else { ingo@2808: return tmp; ingo@2808: } ingo@2808: } ingo@2806: } ingo@2806: // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :