teichmann@5829: package org.dive4elements.river.importer.parsers; ingo@2811: ingo@2811: import java.io.File; ingo@2811: ingo@2811: import java.math.BigDecimal; ingo@2811: ingo@2811: import java.text.NumberFormat; ingo@2811: import java.text.ParseException; ingo@2811: ingo@2811: import java.util.ArrayList; ingo@2811: import java.util.Calendar; ingo@2811: import java.util.Date; ingo@2811: import java.util.List; ingo@2811: import java.util.Locale; ingo@2811: ingo@2811: import java.util.regex.Matcher; ingo@2811: import java.util.regex.Pattern; ingo@2811: ingo@2811: import java.io.IOException; ingo@2811: import java.io.LineNumberReader; ingo@2811: import java.io.FileInputStream; ingo@2811: import java.io.InputStreamReader; ingo@2811: ingo@2811: import org.apache.log4j.Logger; ingo@2811: teichmann@5829: import org.dive4elements.river.importer.ImportBedHeight; teichmann@5829: import org.dive4elements.river.importer.ImportBedHeightType; teichmann@5829: import org.dive4elements.river.importer.ImportElevationModel; teichmann@5829: import org.dive4elements.river.importer.ImportLocationSystem; teichmann@5829: import org.dive4elements.river.importer.ImportRange; teichmann@5829: import org.dive4elements.river.importer.ImportTimeInterval; teichmann@5829: import org.dive4elements.river.importer.ImportUnit; teichmann@5829: import org.dive4elements.river.model.BedHeightType; teichmann@5829: import org.dive4elements.river.importer.ImporterSession; ingo@2811: ingo@2811: public abstract class BedHeightParser { ingo@2811: ingo@2811: private static final Logger log = ingo@2811: Logger.getLogger(BedHeightParser.class); ingo@2811: ingo@2811: public static final String ENCODING = "ISO-8859-1"; ingo@2811: ingo@2811: public static final Locale DEFAULT_LOCALE = Locale.GERMAN; ingo@2811: ingo@2811: public static final String START_META_CHAR = "#"; ingo@2811: public static final String SEPERATOR_CHAR = ";"; ingo@2811: ingo@2811: public static final Pattern META_YEAR = felix@3960: Pattern.compile("^Jahr: [^0-9]*(\\d*).*"); ingo@2811: ingo@2811: public static final Pattern META_TIMEINTERVAL = ingo@2811: Pattern.compile("^Zeitraum: Epoche (\\d*)-(\\d*).*"); ingo@2811: ingo@2811: public static final Pattern META_TYPE = ingo@2811: Pattern.compile("^Aufnahmeart: (.*).*"); ingo@2811: ingo@2811: public static final Pattern META_LOCATION_SYSTEM = ingo@2811: Pattern.compile("^Lagesystem: (.*).*"); ingo@2811: ingo@2811: public static final Pattern META_CUR_ELEVATION_SYSTEM = ingo@2811: Pattern.compile("^H.hensystem:\\s(\\w++) (.* )??\\[(.*)\\].*"); ingo@2811: ingo@2811: public static final Pattern META_OLD_ELEVATION_SYSTEM = ingo@2811: Pattern.compile("^urspr.ngliches H.hensystem:\\s(\\w++) (.* )??\\[(.*)\\].*"); ingo@2811: ingo@2811: public static final Pattern META_SOUNDING_WIDTH = ingo@2811: Pattern.compile("^ausgewertete Peilbreite: (\\d*).*"); ingo@2811: ingo@2811: public static final Pattern META_RANGE = tom@5484: Pattern.compile("^Strecke:\\D*(\\d++.?\\d*) ?- ?(\\d++.?\\d*).*"); ingo@2811: ingo@2811: public static final Pattern META_EVALUATION_BY = ingo@2811: Pattern.compile("^Auswerter: (.*).*"); ingo@2811: ingo@2811: public static final Pattern META_COMMENTS = ingo@2811: Pattern.compile("^Weitere Bemerkungen: (.*).*"); ingo@2811: ingo@2811: ingo@2811: protected static NumberFormat nf = NumberFormat.getInstance(DEFAULT_LOCALE); ingo@2811: ingo@2811: ingo@2811: protected List bedHeights; ingo@2811: ingo@2811: ingo@2811: protected abstract ImportBedHeight newImportBedHeight(String description); ingo@2811: felix@3954: /** Handle a line of file that contains data (in contrast to comments, meta). */ ingo@2811: protected abstract void handleDataLine( ingo@2811: ImportBedHeight importBedHeight, ingo@2811: String line ingo@2811: ); ingo@2811: ingo@2811: ingo@2811: ingo@2811: public BedHeightParser() { ingo@2811: this.bedHeights = new ArrayList(); ingo@2811: } ingo@2811: ingo@2811: ingo@2811: public List getBedHeights() { ingo@2811: return bedHeights; ingo@2811: } ingo@2811: ingo@2811: ingo@2811: public void parse(File file) throws IOException { ingo@2811: log.info("Parsing bed height single file '" + file + "'"); ingo@2811: ingo@2811: ImportBedHeight obj = newImportBedHeight(file.getName()); ingo@2811: ingo@2811: LineNumberReader in = null; ingo@2811: try { ingo@2811: in = ingo@2811: new LineNumberReader( ingo@2811: new InputStreamReader( ingo@2811: new FileInputStream(file), ENCODING)); ingo@2811: ingo@2811: String line = null; ingo@2811: while ((line = in.readLine()) != null) { ingo@2811: if ((line = line.trim()).length() == 0) { ingo@2811: continue; ingo@2811: } ingo@2811: ingo@2811: if (line.startsWith(START_META_CHAR)) { ingo@2811: handleMetaLine(obj, line); ingo@2811: } ingo@2811: else { ingo@2811: handleDataLine(obj, line); ingo@2811: } ingo@2811: } ingo@2811: ingo@2811: log.info("File contained " + obj.getValueCount() + " values."); ingo@2811: bedHeights.add(obj); ingo@2811: } ingo@2811: finally { ingo@2811: if (in != null) { ingo@2811: in.close(); ingo@2811: } ingo@2811: } ingo@2811: } ingo@2811: ingo@2811: ingo@2811: protected static String stripMetaLine(String line) { ingo@2811: String tmp = line.substring(1, line.length()); ingo@2811: ingo@2811: if (tmp.startsWith(" ")) { ingo@2811: return tmp.substring(1, tmp.length()); ingo@2811: } ingo@2811: else { ingo@2811: return tmp; ingo@2811: } ingo@2811: } ingo@2811: ingo@2811: ingo@2811: public static Date getDateFromYear(int year) { ingo@2811: Calendar cal = Calendar.getInstance(); ingo@2811: cal.set(year, 0, 1); ingo@2811: ingo@2811: return cal.getTime(); ingo@2811: } ingo@2811: ingo@2811: ingo@2811: protected void handleMetaLine(ImportBedHeight obj, String line) { ingo@2811: String meta = stripMetaLine(line); ingo@2811: ingo@2811: if (handleMetaYear(obj, meta)) { ingo@2811: return; ingo@2811: } ingo@2811: else if (handleMetaTimeInterval(obj, meta)) { ingo@2811: return; ingo@2811: } ingo@2811: else if (handleMetaSoundingWidth(obj, meta)) { ingo@2811: return; ingo@2811: } ingo@2811: else if (handleMetaComment(obj, meta)) { ingo@2811: return; ingo@2811: } ingo@2811: else if (handleMetaEvaluationBy(obj, meta)) { ingo@2811: return; ingo@2811: } ingo@2811: else if (handleMetaRange(obj, meta)) { ingo@2811: return; ingo@2811: } ingo@2811: else if (handleMetaType(obj, meta)) { ingo@2811: return; ingo@2811: } ingo@2811: else if (handleMetaLocationSystem(obj, meta)) { ingo@2811: return; ingo@2811: } ingo@2811: else if (handleMetaCurElevationModel(obj, meta)) { ingo@2811: return; ingo@2811: } ingo@2811: else if (handleMetaOldElevationModel(obj, meta)) { ingo@2811: return; ingo@2811: } ingo@2811: else { sascha@3662: log.warn("BHP: Meta line did not match any known type: " + line); ingo@2811: } ingo@2811: } ingo@2811: ingo@2811: ingo@2811: protected boolean handleMetaYear(ImportBedHeight obj, String line) { ingo@2811: Matcher m = META_YEAR.matcher(line); ingo@2811: ingo@2811: if (m.matches()) { ingo@2811: String tmp = m.group(1); teichmann@5327: if (tmp.length() > 0) { teichmann@5327: obj.setYear(Integer.parseInt(tmp)); ingo@2811: } teichmann@5327: else { teichmann@5327: log.warn("BHP: No year given."); ingo@2811: } teichmann@5327: return true; ingo@2811: } ingo@2811: ingo@2811: return false; ingo@2811: } ingo@2811: ingo@2811: ingo@2811: protected boolean handleMetaTimeInterval(ImportBedHeight obj, String line) { ingo@2811: Matcher m = META_TIMEINTERVAL.matcher(line); ingo@2811: ingo@2811: if (m.matches()) { ingo@2811: String lo = m.group(1); ingo@2811: String up = m.group(2); ingo@2811: ingo@2811: log.debug("Found time interval: " + lo + " - " + up); ingo@2811: ingo@2811: try { ingo@2811: int lower = Integer.valueOf(lo); ingo@2811: int upper = Integer.valueOf(up); ingo@2811: ingo@2811: Date fromYear = getDateFromYear(lower); ingo@2811: Date toYear = getDateFromYear(upper); ingo@2811: ingo@2811: obj.setTimeInterval(new ImportTimeInterval(fromYear, toYear)); ingo@2811: } ingo@2811: catch (NumberFormatException e) { tom@5489: log.warn("BHP: could not parse timeinterval", e); ingo@2811: } ingo@2811: ingo@2811: return true; ingo@2811: } ingo@2811: ingo@2811: return false; ingo@2811: } ingo@2811: ingo@2811: ingo@2811: protected boolean handleMetaSoundingWidth(ImportBedHeight obj, String line) { ingo@2811: Matcher m = META_SOUNDING_WIDTH.matcher(line); ingo@2811: ingo@2811: if (m.matches()) { ingo@2811: String tmp = m.group(1); ingo@2811: ingo@2811: try { ingo@2811: obj.setSoundingWidth(Integer.valueOf(tmp)); ingo@2811: return true; ingo@2811: } ingo@2811: catch (NumberFormatException e) { tom@5489: log.warn("BHP: Could not parse sounding width: " + line, e); ingo@3940: log.warn("-> Set default value '0'"); ingo@2811: } ingo@3940: obj.setSoundingWidth(0); ingo@2811: } ingo@2811: ingo@2811: return false; ingo@2811: } ingo@2811: ingo@2811: ingo@2811: protected boolean handleMetaComment(ImportBedHeight obj, String line) { ingo@2811: Matcher m = META_COMMENTS.matcher(line); ingo@2811: ingo@2811: if (m.matches()) { ingo@2811: String tmp = m.group(1); ingo@2811: ingo@2811: obj.setDescription(tmp); ingo@2811: ingo@2811: return true; ingo@2811: } ingo@2811: ingo@2811: return false; ingo@2811: } ingo@2811: ingo@2811: ingo@2811: protected boolean handleMetaEvaluationBy( ingo@2811: ImportBedHeight obj, ingo@2811: String line ingo@2811: ) { ingo@2811: Matcher m = META_EVALUATION_BY.matcher(line); ingo@2811: ingo@2811: if (m.matches()) { ingo@2811: String tmp = m.group(1); ingo@2811: tmp = tmp.replace(";", ""); ingo@2811: ingo@2811: obj.setEvaluationBy(tmp); ingo@2811: ingo@2811: return true; ingo@2811: } ingo@2811: ingo@2811: return false; ingo@2811: } ingo@2811: ingo@2811: ingo@2811: protected boolean handleMetaRange(ImportBedHeight obj, String line) { ingo@2811: Matcher m = META_RANGE.matcher(line); ingo@2811: ingo@2811: if (m.matches() && m.groupCount() >= 2) { ingo@2811: String a = m.group(1).replace(";", ""); ingo@2811: String b = m.group(2).replace(";", ""); ingo@2811: ingo@2811: try { ingo@2811: BigDecimal lower = new BigDecimal(nf.parse(a).doubleValue()); ingo@2811: BigDecimal upper = new BigDecimal(nf.parse(b).doubleValue()); ingo@2811: ingo@2811: obj.setRange(new ImportRange(lower, upper)); ingo@2811: ingo@2811: return true; ingo@2811: } ingo@2811: catch (ParseException e) { tom@5489: log.warn("BHP: could not parse range", e); ingo@2811: } ingo@2811: } ingo@2811: ingo@2811: return false; ingo@2811: } ingo@2811: ingo@2811: ingo@2811: protected boolean handleMetaType(ImportBedHeight obj, String line) { ingo@2811: Matcher m = META_TYPE.matcher(line); ingo@2811: ingo@2811: if (m.matches()) { ingo@2811: String tmp = m.group(1).replace(";", ""); ingo@2811: tom@5278: BedHeightType bht = BedHeightType.fetchBedHeightTypeForType( tom@5278: tmp, ImporterSession.getInstance().getDatabaseSession()); ingo@2811: teichmann@5273: if (bht != null) { teichmann@5273: obj.setType(new ImportBedHeightType(bht)); sascha@3798: return true; sascha@3798: } teichmann@5273: teichmann@5273: log.warn("Unknown bed height type: '" + tmp + "'"); ingo@2811: } ingo@2811: ingo@2811: return false; ingo@2811: } ingo@2811: ingo@2811: ingo@2811: protected boolean handleMetaLocationSystem( ingo@2811: ImportBedHeight obj, ingo@2811: String line ingo@2811: ) { ingo@2811: Matcher m = META_LOCATION_SYSTEM.matcher(line); ingo@2811: ingo@2811: if (m.matches()) { ingo@2811: String tmp = m.group(1).replace(";", ""); ingo@2811: ingo@2811: obj.setLocationSystem(new ImportLocationSystem(tmp, tmp)); ingo@2811: ingo@2811: return true; ingo@2811: } ingo@2811: ingo@2811: return false; ingo@2811: } ingo@2811: ingo@2811: ingo@2811: protected boolean handleMetaCurElevationModel( ingo@2811: ImportBedHeight obj, ingo@2811: String line ingo@2811: ) { ingo@2811: Matcher m = META_CUR_ELEVATION_SYSTEM.matcher(line); ingo@2811: ingo@2811: if (m.matches()) { ingo@2811: String name = m.group(1); ingo@2811: String num = m.group(2); ingo@2811: String unit = m.group(3); ingo@2811: ingo@2811: obj.setCurElevationModel(new ImportElevationModel( ingo@2811: name + " " + num, ingo@2811: new ImportUnit(unit) ingo@2811: )); ingo@2811: ingo@2811: return true; ingo@2811: } ingo@2811: ingo@2811: return false; ingo@2811: } ingo@2811: ingo@2811: ingo@2811: protected boolean handleMetaOldElevationModel( ingo@2811: ImportBedHeight obj, ingo@2811: String line ingo@2811: ) { ingo@2811: Matcher m = META_OLD_ELEVATION_SYSTEM.matcher(line); ingo@2811: ingo@2811: if (m.matches()) { ingo@2811: String name = m.group(1); ingo@2811: String num = m.group(2); ingo@2811: String unit = m.group(3); ingo@2811: ingo@2811: obj.setOldElevationModel(new ImportElevationModel( ingo@2811: name + " " + num, ingo@2811: new ImportUnit(unit) ingo@2811: )); ingo@2811: ingo@2811: return true; ingo@2811: } ingo@2811: ingo@2811: return false; ingo@2811: } ingo@2811: } ingo@2811: // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :