ingo@4193: package de.intevation.flys.importer.parsers; ingo@4193: ingo@4193: import java.math.BigDecimal; ingo@4193: import java.text.ParseException; ingo@4193: import java.util.ArrayList; ingo@4193: import java.util.Date; ingo@4193: import java.util.List; ingo@4193: ingo@4193: import org.apache.log4j.Logger; ingo@4193: ingo@4193: import de.intevation.flys.importer.ImportMeasurementStation; ingo@4193: import de.intevation.flys.importer.ImportRange; ingo@4193: import de.intevation.flys.importer.ImportTimeInterval; ingo@4193: ingo@4193: ingo@4193: public class MeasurementStationsParser extends LineParser { ingo@4193: ingo@4193: public static class MeasurementStationParserException extends Exception { ingo@4193: ingo@4193: private static final long serialVersionUID = 1L; ingo@4193: ingo@4193: public MeasurementStationParserException(String msg) { ingo@4193: super(msg); ingo@4193: } ingo@4193: } ingo@4193: ingo@4193: public static final int MIN_COLUMNS = 10; ingo@4193: ingo@4193: private static final Logger log = Logger ingo@4193: .getLogger(MeasurementStationsParser.class); ingo@4193: ingo@4193: private List measurementStations; ingo@4193: private ImportMeasurementStation current; ingo@4193: ingo@4193: @Override ingo@4193: protected void reset() { ingo@4193: this.measurementStations = new ArrayList(); ingo@4193: } ingo@4193: ingo@4193: @Override ingo@4193: protected void finish() { ingo@4193: } ingo@4193: ingo@4193: @Override ingo@4193: protected void handleLine(int lineNum, String line) { ingo@4193: if (line == null || line.startsWith(START_META_CHAR)) { ingo@4193: log.info("skip meta information at line " + lineNum); ingo@4193: return; ingo@4193: } ingo@4193: ingo@4193: try { ingo@4193: current = new ImportMeasurementStation(); ingo@4193: handleDataLine(line); ingo@4193: measurementStations.add(current); ingo@4193: } ingo@4193: catch (MeasurementStationParserException e) { ingo@4193: log.warn("Problem in line " + lineNum + ": " + e.getMessage()); ingo@4193: } ingo@4193: } ingo@4193: ingo@4193: public List getMeasurementStations() { ingo@4193: return measurementStations; ingo@4193: } ingo@4193: ingo@4193: protected void handleDataLine(String line) ingo@4193: throws MeasurementStationParserException { ingo@4193: String[] cols = line.split(SEPERATOR_CHAR); ingo@4193: ingo@4193: if (cols == null || cols.length < MIN_COLUMNS) { ingo@4193: int num = cols != null ? cols.length : 0; ingo@4193: throw new MeasurementStationParserException("Not enough columns: " ingo@4193: + num); ingo@4193: } ingo@4193: ingo@4193: current.name = getName(cols); ingo@4193: current.station = getStation(cols); ingo@4193: current.range = getRange(cols); ingo@4193: current.measurementType = getMeasurementType(cols); ingo@4193: current.riverside = getRiverside(cols); ingo@4193: current.gauge = getGauge(cols); ingo@4193: current.observationTimerange = getObservationTimerange(cols); ingo@4193: current.operator = getOperator(cols); rrenkert@5471: current.description = getDescription(cols); ingo@4193: ingo@4193: log.debug("Found new measurement station '" + current.name + "' at km " ingo@4193: + current.station); ingo@4193: } ingo@4193: ingo@4193: protected String getName(String[] cols) ingo@4193: throws MeasurementStationParserException { ingo@4193: if (cols[0] == null || cols[0].length() == 0) { ingo@4193: throw new MeasurementStationParserException("invalid name '" ingo@4193: + cols[0] + "'"); ingo@4193: } ingo@4193: ingo@4193: return cols[0]; ingo@4193: } ingo@4193: ingo@4193: protected double getStation(String[] cols) ingo@4193: throws MeasurementStationParserException { ingo@4193: if (cols[1] == null || cols[1].length() == 0) { ingo@4193: throw new MeasurementStationParserException("invalid station '" ingo@4193: + cols[1] + "'"); ingo@4193: } ingo@4193: ingo@4193: try { ingo@4193: return getDouble(cols[1]); ingo@4193: } ingo@4193: catch (ParseException e) { ingo@4193: throw new MeasurementStationParserException( ingo@4193: "unable to parse station: " + e.getMessage()); ingo@4193: } ingo@4193: } ingo@4193: rrenkert@5451: protected ImportRange getRange(String[] cols) { ingo@4193: if (cols[4] == null || cols[4].length() == 0) { rrenkert@5451: log.warn("No upper value for range found in '" + cols[4] + "'"); rrenkert@5451: return null; ingo@4193: } ingo@4193: ingo@4193: if (cols[5] == null || cols[5].length() == 0) { rrenkert@5451: log.warn("No upper value for range found in '" + cols[5] + "'"); rrenkert@5451: return null; ingo@4193: } ingo@4193: ingo@4193: try { ingo@4193: double lower = getDouble(cols[4]); ingo@4193: double upper = getDouble(cols[5]); ingo@4193: ingo@4193: return new ImportRange(new BigDecimal(lower), new BigDecimal(upper)); ingo@4193: } ingo@4193: catch (ParseException e) { rrenkert@5451: log.warn("unable to parse range: " + e.getMessage()); rrenkert@5451: return null; ingo@4193: } ingo@4193: } ingo@4193: ingo@4193: protected String getMeasurementType(String[] cols) ingo@4193: throws MeasurementStationParserException { ingo@4193: if (cols[2] == null || cols[2].length() == 0) { ingo@4193: throw new MeasurementStationParserException( ingo@4193: "invalid measurement type '" + cols[2] + "'"); ingo@4193: } ingo@4193: ingo@4193: return cols[2]; ingo@4193: } ingo@4193: ingo@4193: protected String getRiverside(String[] cols) { ingo@4193: return cols[3]; ingo@4193: } ingo@4193: rrenkert@5451: protected String getGauge(String[] cols) { ingo@4193: if (cols[6] == null || cols[6].length() == 0) { rrenkert@5451: log.warn("invalid gauge found: '" + cols[6] + "'"); ingo@4193: } ingo@4193: ingo@4193: return cols[6]; ingo@4193: } ingo@4193: rrenkert@5451: protected ImportTimeInterval getObservationTimerange(String[] cols) { ingo@4193: if (cols[8] == null || cols[8].length() == 0) { rrenkert@5451: log.warn("Found invalid observation time '" + cols[8] + "'"); ingo@4193: } ingo@4193: ingo@4193: try { ingo@4193: Date date = getDate(cols[8]); ingo@4193: ingo@4193: if (date != null) { ingo@4193: return new ImportTimeInterval(date); ingo@4193: } rrenkert@5451: log.warn("Observation time date invalid: '" + cols[8] + "'"); ingo@4193: } ingo@4193: catch (ParseException pe) { rrenkert@5451: log.warn("Observation time date not parseable: '" + cols[8] + "'"); rrenkert@5451: return null; ingo@4193: } rrenkert@5451: return null; ingo@4193: } ingo@4193: ingo@4193: protected String getOperator(String[] cols) { ingo@4193: return cols[9]; ingo@4193: } ingo@4193: rrenkert@5471: protected String getDescription(String[] cols) { ingo@4193: return cols.length > 10 ? cols[10] : null; ingo@4193: } ingo@4193: }