Mercurial > dive4elements > river
diff flys-backend/src/main/java/org/dive4elements/river/importer/parsers/SedimentDensityParser.java @ 5828:dfb26b03b179
Moved directories to org.dive4elements.river
author | Sascha L. Teichmann <teichmann@intevation.de> |
---|---|
date | Thu, 25 Apr 2013 11:53:11 +0200 |
parents | flys-backend/src/main/java/de/intevation/flys/importer/parsers/SedimentDensityParser.java@a44a3f997ec8 |
children | 18619c1e7c2a |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/flys-backend/src/main/java/org/dive4elements/river/importer/parsers/SedimentDensityParser.java Thu Apr 25 11:53:11 2013 +0200 @@ -0,0 +1,162 @@ +package de.intevation.flys.importer.parsers; + +import de.intevation.flys.importer.ImportDepth; +import de.intevation.flys.importer.ImportSedimentDensity; +import de.intevation.flys.importer.ImportSedimentDensityValue; + +import java.io.File; +import java.io.IOException; + +import java.math.BigDecimal; + +import java.text.NumberFormat; +import java.text.ParseException; + +import java.util.ArrayList; +import java.util.List; + +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import org.apache.log4j.Logger; + +public class SedimentDensityParser extends LineParser { + + private static final Logger log = + Logger.getLogger(SedimentDensityParser.class); + + public static final NumberFormat nf = + NumberFormat.getInstance(DEFAULT_LOCALE); + + public static final Pattern META_DEPTH = + Pattern.compile("^Tiefe: (\\w++)-(\\w++)( (\\w++))?.*"); + + protected List<ImportSedimentDensity> sedimentDensities; + + protected ImportSedimentDensity current; + + protected String currentDescription; + + + public SedimentDensityParser() { + sedimentDensities = new ArrayList<ImportSedimentDensity>(); + } + + + @Override + public void parse(File file) throws IOException { + currentDescription = file.getName(); + + super.parse(file); + } + + + @Override + protected void reset() { + current = new ImportSedimentDensity(currentDescription); + } + + + @Override + protected void finish() { + if (current != null) { + sedimentDensities.add(current); + } + } + + + @Override + protected void handleLine(int lineNum, String line) { + if (line.startsWith(START_META_CHAR)) { + handleMetaLine(stripMetaLine(line)); + } + else { + handleDataLine(line); + } + } + + + protected void handleMetaLine(String line) { + if (handleMetaDepth(line)) { + return; + } + else { + log.warn("Unknown meta line: '" + line + "'"); + } + } + + + protected boolean handleMetaDepth(String line) { + Matcher m = META_DEPTH.matcher(line); + + if (m.matches()) { + String lo = m.group(1); + String up = m.group(2); + + log.info("Found sediment density depth: " + lo + " - " + up + " cm"); + + try { + ImportDepth depth = new ImportDepth( + new BigDecimal(nf.parse(lo).doubleValue()), + new BigDecimal(nf.parse(up).doubleValue()) + ); + + current.setDepth(depth); + + return true; + } + catch (ParseException pe) { + log.warn("Unparseable numbers in: '" + line + "'"); + } + } + else { + log.debug("Meta line doesn't contain depth information: " + line); + } + + return false; + } + + + protected void handleDataLine(String line) { + String[] vals = line.split(SEPERATOR_CHAR); + + if (vals == null || vals.length < 3) { + log.warn("skip invalid data line: '" + line + "'"); + return; + } + + BigDecimal km = null; + BigDecimal shoreOffset = null; + BigDecimal density = null; + try { + km = new BigDecimal(nf.parse(vals[0]).doubleValue()); + density = new BigDecimal(nf.parse(vals[2]).doubleValue()); + if (!vals[1].isEmpty()) { + shoreOffset = new BigDecimal(nf.parse(vals[1]).doubleValue()); + } + } + catch (ParseException pe) { + log.warn("Unparseable numbers in '" + line + "'"); + } + + if (km == null || density == null) { + log.warn("SDP: No km nor density given. Skip line"); + return; + } + + BigDecimal year = null; + + current.addValue(new ImportSedimentDensityValue( + km, + shoreOffset, + density, + year, + currentDescription)); + } + + + public List<ImportSedimentDensity> getSedimentDensities() { + return sedimentDensities; + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :