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: ingo@2816: import java.text.NumberFormat; ingo@2816: import java.text.ParseException; ingo@2816: ingo@2815: import java.util.ArrayList; 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; 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: 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@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@2815: protected void handleLine(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: } ingo@2816: else { ingo@2816: log.warn("Unknown meta line: '" + line + "'"); ingo@2816: } ingo@2816: } ingo@2816: ingo@2816: 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); ingo@3940: 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: ingo@2816: try { ingo@2816: BigDecimal km = new BigDecimal(nf.parse(vals[0]).doubleValue()); ingo@2816: BigDecimal density = new BigDecimal(nf.parse(vals[1]).doubleValue()); ingo@2816: ingo@2816: current.addValue(new ImportSedimentDensityValue( ingo@2816: km, ingo@2816: density, ingo@2816: vals[2]) ingo@2816: ); ingo@2816: } ingo@2816: catch (ParseException pe) { ingo@2816: log.warn("Error while parsing numbers in '" + line + "'"); ingo@2816: } 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 :