teichmann@5844: /* Copyright (C) 2011, 2012, 2013 by Bundesanstalt für Gewässerkunde teichmann@5844: * Software engineering by Intevation GmbH teichmann@5844: * teichmann@5992: * This file is Free Software under the GNU AGPL (>=v3) teichmann@5844: * and comes with ABSOLUTELY NO WARRANTY! Check out the teichmann@5992: * documentation coming with Dive4Elements River for details. teichmann@5844: */ teichmann@5844: teichmann@5829: package org.dive4elements.river.importer.parsers; sascha@1211: sascha@1211: import java.io.File; sascha@1211: import java.io.IOException; sascha@1211: import java.io.LineNumberReader; sascha@1211: import java.io.FileInputStream; sascha@1211: import java.io.InputStreamReader; sascha@1211: sascha@1211: import java.math.BigDecimal; sascha@1211: sascha@1211: import java.util.regex.Pattern; sascha@1211: import java.util.regex.Matcher; sascha@1211: sascha@1211: import java.util.HashMap; sascha@1211: import java.util.ArrayList; sascha@1211: sascha@1211: import org.apache.log4j.Logger; sascha@1211: teichmann@5829: import org.dive4elements.river.importer.ImportMainValueType; teichmann@5829: import org.dive4elements.river.importer.ImportMainValue; teichmann@5829: import org.dive4elements.river.importer.ImportNamedMainValue; teichmann@5829: import org.dive4elements.river.importer.ImportGauge; sascha@1211: sascha@1211: public class StaFileParser sascha@1211: { sascha@1211: private static Logger log = Logger.getLogger(StaFileParser.class); sascha@1211: sascha@1211: public static final String ENCODING = "ISO-8859-1"; sascha@1211: sascha@1211: public static final String TYPES = sascha@1211: System.getProperty("flys.backend.main.value.types", "QWTD"); sascha@1211: sascha@1211: public static final Pattern QWTD_ = sascha@1211: Pattern.compile("\\s*([^\\s]+)\\s+([^\\s]+)\\s+([" + sascha@1211: Pattern.quote(TYPES) + "]).*"); sascha@1211: teichmann@5735: sascha@1211: public StaFileParser() { sascha@1211: } sascha@1211: sascha@1211: public boolean parse(ImportGauge gauge) throws IOException { sascha@1211: sascha@1211: File file = gauge.getStaFile(); sascha@1211: sascha@1211: log.info("parsing STA file: " + file); teichmann@6333: LineNumberReader in = teichmann@6333: new LineNumberReader( teichmann@6333: new InputStreamReader( teichmann@6333: new FileInputStream(file), ENCODING)); teichmann@6333: sascha@1211: try { sascha@1211: String line = in.readLine(); sascha@1211: sascha@1211: if (line == null) { sascha@1211: log.warn("STA file is empty."); sascha@1211: return false; sascha@1211: } sascha@1211: sascha@1211: if (line.length() < 37) { sascha@3660: log.warn("First line in STA file is too short."); sascha@1211: return false; sascha@1211: } sascha@2377: tom@5954: String gaugeName = line.substring(16, 35).trim(); sascha@1211: sascha@2371: Long gaugeNumber = null; sascha@2377: tom@6004: String gaugeNumberString = line.substring(8, 16).trim(); sascha@2377: tom@6004: try { tom@6004: gaugeNumber = Long.parseLong(gaugeNumberString); tom@6004: } tom@6004: catch (NumberFormatException nfe) { tom@6004: log.warn("STA: gauge number '" + gaugeNumberString + tom@6004: "' is not a valid long number."); sascha@2371: } sascha@2371: sascha@2371: gauge.setName(gaugeName); sascha@2371: gauge.setOfficialNumber(gaugeNumber); sascha@2371: sascha@2371: if (log.isDebugEnabled()) { sascha@2371: log.debug( sascha@2371: "name/number: '" + gaugeName + "' '" + gaugeNumber + "'"); sascha@2371: } sascha@1211: sascha@1211: String [] values = line.substring(38).trim().split("\\s+", 2); sascha@1211: sascha@1211: if (values.length < 2) { sascha@3660: log.warn("STA: Not enough columns for aeo and datum."); sascha@1211: } sascha@1211: try { sascha@1211: gauge.setAeo(new BigDecimal(values[0].replace(",", "."))); sascha@1211: gauge.setDatum(new BigDecimal(values[1].replace(",", "."))); sascha@1211: } sascha@1211: catch (NumberFormatException nfe) { sascha@3660: log.warn("STA: cannot parse aeo or datum."); sascha@1211: return false; sascha@1211: } sascha@1211: sascha@1211: line = in.readLine(); sascha@1211: sascha@1211: if (line == null) { sascha@1211: log.warn("STA file has not enough lines"); sascha@1211: return false; sascha@1211: } sascha@1211: sascha@1211: if (line.length() < 36) { sascha@3660: log.warn("STA: second line is too short"); sascha@1211: return false; sascha@1211: } sascha@1211: sascha@1211: try { sascha@1211: gauge.setStation( sascha@1211: new BigDecimal(line.substring(29, 36).trim())); sascha@1211: } sascha@1211: catch (NumberFormatException nfe) { sascha@3660: log.warn("STA: parsing of the datum of the gauge failed"); sascha@1211: return false; sascha@1211: } sascha@1211: sascha@1211: // overread the next six lines sascha@1211: for (int i = 0; i < 6; ++i) { sascha@1211: if ((line = in.readLine()) == null) { sascha@1211: log.warn("STA file is too short"); sascha@1211: return false; sascha@1211: } sascha@1211: } sascha@1211: sascha@1211: HashMap types = sascha@1211: new HashMap(); sascha@1211: sascha@1211: ArrayList namedMainValues = sascha@1211: new ArrayList(); sascha@1211: sascha@1211: ArrayList mainValues = sascha@1211: new ArrayList(); sascha@1211: sascha@1211: while ((line = in.readLine()) != null) { sascha@1211: Matcher m = QWTD_.matcher(line); sascha@1211: if (m.matches()) { sascha@1211: BigDecimal value; sascha@1211: try { sascha@1211: value = new BigDecimal(m.group(2).replace(",", ".")); sascha@1211: } sascha@1211: catch (NumberFormatException nfe) { sascha@3660: log.warn("STA: value not parseable in line " sascha@1211: + in.getLineNumber()); sascha@1211: continue; sascha@1211: } sascha@1211: String typeString = m.group(3); sascha@1211: log.debug("\t type: " + typeString); sascha@1211: ImportMainValueType type = types.get(typeString); sascha@1211: if (type == null) { sascha@1211: type = new ImportMainValueType(typeString); sascha@1211: types.put(typeString, type); sascha@1211: } sascha@1211: String name = m.group(1); teichmann@6328: NameAndTimeInterval nat = teichmann@6328: NameAndTimeInterval.parseName(name); sascha@1211: ImportNamedMainValue namedMainValue = teichmann@5735: new ImportNamedMainValue(type, nat.getName()); sascha@1211: namedMainValues.add(namedMainValue); sascha@1211: teichmann@5735: ImportMainValue mainValue = new ImportMainValue( teichmann@5735: gauge, teichmann@5735: namedMainValue, teichmann@5735: value, teichmann@5735: nat.getTimeInterval()); sascha@1211: sascha@1211: mainValues.add(mainValue); sascha@1211: } sascha@1211: else { sascha@1211: // TODO: treat as a comment sascha@1211: } sascha@1211: } sascha@1211: gauge.setMainValueTypes( sascha@1211: new ArrayList(types.values())); sascha@1211: gauge.setNamedMainValues(namedMainValues); sascha@1211: gauge.setMainValues(mainValues); sascha@1211: } sascha@1211: finally { teichmann@6333: in.close(); sascha@1211: } sascha@1211: log.info("finished parsing STA file: " + file); sascha@1211: return true; sascha@1211: } teichmann@5735: sascha@1211: } sascha@1211: // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :