ingo@3328: package de.intevation.flys.importer.parsers; ingo@3328: ingo@3329: import java.io.File; ingo@3329: import java.io.IOException; ingo@3328: import java.text.NumberFormat; ingo@3328: import java.text.ParseException; ingo@3328: import java.util.ArrayList; ingo@3328: import java.util.List; ingo@3328: import java.util.regex.Matcher; ingo@3328: import java.util.regex.Pattern; ingo@3328: ingo@3328: import org.apache.log4j.Logger; ingo@3328: ingo@3328: import de.intevation.flys.importer.ImportSQRelation; ingo@3328: import de.intevation.flys.importer.ImportSQRelationValue; ingo@3328: import de.intevation.flys.importer.ImportTimeInterval; ingo@3328: ingo@3328: ingo@3328: public class SQRelationParser extends LineParser { ingo@3328: ingo@3328: private static final Logger log = ingo@3328: Logger.getLogger(SQRelationParser.class); ingo@3328: ingo@3328: private static final Pattern TIMERANGE_REGEX = ingo@3328: Pattern.compile(".*Zeitraum.*\\s(\\w*)-(\\w*).*"); ingo@3328: ingo@3328: private static final NumberFormat nf = ingo@3328: NumberFormat.getInstance(DEFAULT_LOCALE); ingo@3328: ingo@3328: ingo@3328: private List relations; ingo@3328: ingo@3328: private ImportSQRelation current; ingo@3328: ingo@3329: private String currentDescription; ingo@3329: ingo@3328: ingo@3328: public SQRelationParser() { ingo@3328: relations = new ArrayList(); ingo@3328: } ingo@3328: ingo@3328: ingo@3328: public List getSQRelations() { ingo@3328: return relations; ingo@3328: } ingo@3328: ingo@3328: @Override ingo@3329: public void parse(File file) throws IOException { ingo@3329: this.currentDescription = file.getName(); ingo@3329: super.parse(file); ingo@3329: } ingo@3329: ingo@3329: ingo@3329: @Override ingo@3328: protected void reset() { ingo@3328: current = new ImportSQRelation(); ingo@3328: } ingo@3328: ingo@3328: ingo@3328: @Override ingo@3328: protected void finish() { ingo@3329: if (current != null) { ingo@3329: current.setDescription(currentDescription); ingo@3329: relations.add(current); ingo@3329: } ingo@3328: } ingo@3328: ingo@3328: ingo@3328: @Override ingo@4193: protected void handleLine(int lineNum, String line) { ingo@3328: if (line.startsWith(START_META_CHAR)) { ingo@3328: handleMetaLine(stripMetaLine(line)); ingo@3328: } ingo@3328: else { ingo@3328: handleDataLine(line); ingo@3328: } ingo@3328: } ingo@3328: ingo@3328: ingo@3328: protected void handleMetaLine(String line) { ingo@3328: Matcher m = TIMERANGE_REGEX.matcher(line); ingo@3328: ingo@3328: if (m.matches()) { ingo@3328: String lo = m.group(1); ingo@3328: String hi = m.group(2); ingo@3328: ingo@3328: log.debug("Found timerange " + lo + " - " + hi); ingo@3328: ingo@3328: try { ingo@3328: int low = nf.parse(lo).intValue(); ingo@3328: int high = nf.parse(hi).intValue(); ingo@3328: ingo@3328: current.setTimeInterval(new ImportTimeInterval( ingo@3328: getDateFromYear(low), ingo@3328: getDateFromYear(high) ingo@3328: )); ingo@3328: } ingo@3328: catch (ParseException nfe) { ingo@3328: log.warn("Cannot parse time range.", nfe); ingo@3328: } ingo@3328: } ingo@3328: } ingo@3328: ingo@3328: ingo@3328: protected void handleDataLine(String line) { ingo@3328: String[] cols = line.split(SEPERATOR_CHAR); ingo@3328: ingo@3328: if (cols.length < 8) { ingo@3328: log.warn("skip invalid data line: '" + line + "'"); ingo@3328: return; ingo@3328: } ingo@3328: ingo@3328: try { ingo@3328: current.addValue(new ImportSQRelationValue( ingo@3328: cols[1], ingo@3328: cols[2], ingo@3328: cols[4], ingo@3328: nf.parse(cols[3]).doubleValue(), ingo@3328: nf.parse(cols[6]).doubleValue(), ingo@3328: nf.parse(cols[7]).doubleValue() ingo@3328: )); ingo@3328: } ingo@3328: catch (ParseException pe) { ingo@3328: log.warn("Error while parsing sq relation row: '" + line + "'", pe); ingo@3328: } ingo@3328: } ingo@3328: } ingo@3328: // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :