ingo@2815: package de.intevation.flys.importer.parsers; ingo@2815: ingo@2817: import java.io.File; ingo@2817: import java.io.IOException; ingo@2817: ingo@2816: import java.math.BigDecimal; ingo@2816: rrenkert@4524: import java.text.DateFormat; ingo@2816: import java.text.NumberFormat; ingo@2816: import java.text.ParseException; ingo@2816: ingo@2815: import java.util.ArrayList; rrenkert@4524: import java.util.Calendar; rrenkert@4524: import java.util.Date; ingo@2815: import java.util.List; ingo@2816: import java.util.regex.Matcher; ingo@2816: import java.util.regex.Pattern; ingo@2815: ingo@2815: import org.apache.log4j.Logger; ingo@2815: ingo@2816: import de.intevation.flys.importer.ImportDepth; ingo@2815: import de.intevation.flys.importer.ImportSedimentDensity; ingo@2816: import de.intevation.flys.importer.ImportSedimentDensityValue; ingo@2816: import de.intevation.flys.importer.ImportUnit; rrenkert@4524: import de.intevation.flys.utils.DateGuesser; ingo@2815: ingo@2815: ingo@2815: public class SedimentDensityParser extends LineParser { ingo@2815: ingo@2815: private static final Logger log = ingo@2815: Logger.getLogger(SedimentDensityParser.class); ingo@2815: rrenkert@4524: private int densitsyColumn = 1; ingo@2815: ingo@2816: public static final NumberFormat nf = NumberFormat.getInstance(DEFAULT_LOCALE); ingo@2816: ingo@2816: ingo@2816: public static final Pattern META_UNIT = ingo@2816: Pattern.compile("^Einheit: \\[(.*)\\].*"); ingo@2816: ingo@2816: public static final Pattern META_DEPTH = ingo@2816: Pattern.compile("^Tiefe: (\\w++)-(\\w++)( (\\w++))?.*"); ingo@2816: ingo@2815: protected List sedimentDensities; ingo@2815: ingo@2815: protected ImportSedimentDensity current; ingo@2815: ingo@2817: protected String currentDescription; ingo@2817: ingo@2815: ingo@2815: public SedimentDensityParser() { ingo@2815: sedimentDensities = new ArrayList(); ingo@2815: } ingo@2815: ingo@2815: ingo@2815: @Override ingo@2817: public void parse(File file) throws IOException { ingo@2817: currentDescription = file.getName(); ingo@2817: ingo@2817: super.parse(file); ingo@2817: } ingo@2817: ingo@2817: ingo@2817: @Override ingo@2815: protected void reset() { ingo@2817: current = new ImportSedimentDensity(currentDescription); ingo@2815: } ingo@2815: ingo@2815: ingo@2815: @Override ingo@2815: protected void finish() { ingo@2815: if (current != null) { ingo@2815: sedimentDensities.add(current); ingo@2815: } ingo@2815: } ingo@2815: ingo@2815: ingo@2815: @Override ingo@4193: protected void handleLine(int lineNum, String line) { ingo@2816: if (line.startsWith(START_META_CHAR)) { ingo@2816: handleMetaLine(stripMetaLine(line)); ingo@2816: } ingo@2816: else { ingo@2816: handleDataLine(line); ingo@2816: } ingo@2816: } ingo@2816: ingo@2816: ingo@2816: protected void handleMetaLine(String line) { ingo@2816: if (handleMetaUnit(line)) { ingo@2816: return; ingo@2816: } ingo@2816: else if (handleMetaDepth(line)) { ingo@2816: return; ingo@2816: } rrenkert@4524: else if (handleMetaColumns(line)) { rrenkert@4524: return; rrenkert@4524: } ingo@2816: else { ingo@2816: log.warn("Unknown meta line: '" + line + "'"); ingo@2816: } ingo@2816: } ingo@2816: ingo@2816: rrenkert@4524: private boolean handleMetaColumns(String line) { rrenkert@4524: String[] columns = line.split(";"); rrenkert@4524: for (int i = 0; i < columns.length; i++) { rrenkert@4524: if (columns[i].contains("Sedimentdichte")) { rrenkert@4524: this.densitsyColumn = i; rrenkert@4524: return true; rrenkert@4524: } rrenkert@4524: } rrenkert@4524: return false; rrenkert@4524: } rrenkert@4524: rrenkert@4524: ingo@2816: protected boolean handleMetaUnit(String line) { ingo@2816: Matcher m = META_UNIT.matcher(line); ingo@2816: ingo@2816: if (m.matches()) { ingo@2816: String unit = m.group(1); ingo@2816: ingo@2816: current.setUnit(new ImportUnit(unit)); ingo@2816: ingo@2816: return true; ingo@2816: } ingo@2816: ingo@2816: return false; ingo@2816: } ingo@2816: ingo@2816: ingo@2816: protected boolean handleMetaDepth(String line) { ingo@2816: Matcher m = META_DEPTH.matcher(line); ingo@2816: ingo@2816: if (m.matches()) { ingo@2816: String lo = m.group(1); ingo@2816: String up = m.group(2); ingo@2816: String unit = m.group(4); sascha@3942: ingo@3940: log.info("Found sediment density depth: " + lo + " - " + up + " " + unit); ingo@2816: ingo@2816: try { ingo@2816: ImportDepth depth = new ImportDepth( ingo@2816: new BigDecimal(nf.parse(lo).doubleValue()), ingo@2816: new BigDecimal(nf.parse(up).doubleValue()), ingo@2816: new ImportUnit(unit) ingo@2816: ); ingo@2816: ingo@2816: current.setDepth(depth); ingo@2816: ingo@2816: return true; ingo@2816: } ingo@2816: catch (ParseException pe) { ingo@2816: log.warn("Error while parsing numbers in: '" + line + "'"); ingo@2816: } ingo@2816: } ingo@3940: else { ingo@3940: log.debug("Meta line doesn't contain depth information: " + line); ingo@3940: } ingo@2816: ingo@2816: return false; ingo@2816: } ingo@2816: ingo@2816: ingo@2816: protected void handleDataLine(String line) { ingo@2816: String[] vals = line.split(SEPERATOR_CHAR); ingo@2816: ingo@2816: if (vals == null || vals.length < 3) { ingo@2816: log.warn("skip invalid data line: '" + line + "'"); ingo@2816: return; ingo@2816: } ingo@2816: rrenkert@4524: BigDecimal km; rrenkert@4524: BigDecimal density; ingo@2816: try { rrenkert@4524: km = new BigDecimal(nf.parse(vals[0]).doubleValue()); rrenkert@4524: density = new BigDecimal(nf.parse(vals[this.densitsyColumn]).doubleValue()); ingo@2816: ingo@2816: } ingo@2816: catch (ParseException pe) { ingo@2816: log.warn("Error while parsing numbers in '" + line + "'"); rrenkert@4524: return; ingo@2816: } rrenkert@4524: rrenkert@4524: BigDecimal year = null; rrenkert@4524: try { rrenkert@4524: year = rrenkert@4524: new BigDecimal(nf.parse(vals[vals.length - 1]).doubleValue()); rrenkert@4524: } rrenkert@4524: catch(ParseException pe) { rrenkert@4524: try { rrenkert@4524: Date d = DateGuesser.guessDate(vals[vals.length - 1]); rrenkert@4524: Calendar c = Calendar.getInstance(); rrenkert@4524: c.setTime(d); rrenkert@4524: year = new BigDecimal(c.get(Calendar.YEAR)); rrenkert@4524: } rrenkert@4524: catch (IllegalArgumentException iae) { rrenkert@4524: log.warn("Error while parsing date in '" + line + "'"); rrenkert@4524: return; rrenkert@4524: } rrenkert@4524: } rrenkert@4524: rrenkert@4524: current.addValue(new ImportSedimentDensityValue( rrenkert@4524: km, rrenkert@4524: density, rrenkert@4524: year, rrenkert@4524: vals[vals.length - 1]) rrenkert@4524: ); ingo@2815: } ingo@2815: ingo@2815: ingo@2815: public List getSedimentDensities() { ingo@2815: return sedimentDensities; ingo@2815: } ingo@2815: } ingo@2815: // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :