sascha@1211: package de.intevation.flys.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: sascha@1211: import de.intevation.flys.importer.ImportMainValueType; sascha@1211: import de.intevation.flys.importer.ImportMainValue; sascha@1211: import de.intevation.flys.importer.ImportNamedMainValue; sascha@1211: import de.intevation.flys.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: 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); sascha@1211: LineNumberReader in = null; sascha@1211: try { sascha@1211: in = sascha@1211: new LineNumberReader( sascha@1211: new InputStreamReader( sascha@1211: new FileInputStream(file), ENCODING)); sascha@1211: 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@1211: log.warn("first line in STA file is too short."); sascha@1211: return false; sascha@1211: } sascha@1211: sascha@1211: gauge.setName(line.substring(16, 37).trim()); sascha@1211: sascha@1211: String [] values = line.substring(38).trim().split("\\s+", 2); sascha@1211: sascha@1211: if (values.length < 2) { sascha@1211: log.warn("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@1211: log.warn("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@1211: log.warn("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@1211: log.warn("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@1211: log.warn("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); sascha@1211: ImportNamedMainValue namedMainValue = sascha@1211: new ImportNamedMainValue(type, name); sascha@1211: namedMainValues.add(namedMainValue); sascha@1211: sascha@1211: ImportMainValue mainValue = sascha@1211: new ImportMainValue(gauge, namedMainValue, value); 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 { sascha@1211: if (in != null) { sascha@1211: in.close(); sascha@1211: } sascha@1211: } sascha@1211: log.info("finished parsing STA file: " + file); sascha@1211: return true; sascha@1211: } sascha@1211: } sascha@1211: // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :