ingo@2828: package de.intevation.flys.importer.parsers; ingo@2828: ingo@2828: import java.math.BigDecimal; ingo@2828: import java.text.NumberFormat; ingo@2828: import java.text.ParseException; ingo@2828: import java.util.ArrayList; ingo@2828: import java.util.List; ingo@2828: import java.util.regex.Matcher; ingo@2828: import java.util.regex.Pattern; ingo@2828: ingo@2828: import org.apache.log4j.Logger; ingo@2828: ingo@2833: import de.intevation.flys.importer.ImportDischargeZone; ingo@2828: import de.intevation.flys.importer.ImportFlowVelocityModel; ingo@2828: import de.intevation.flys.importer.ImportFlowVelocityModelValue; ingo@2828: ingo@2828: ingo@2828: public class FlowVelocityModelParser extends LineParser { ingo@2828: ingo@2828: private static final Logger log = ingo@2828: Logger.getLogger(FlowVelocityModelParser.class); ingo@2828: ingo@2828: private static final Pattern META_REGEX = ingo@2828: Pattern.compile(".*Rechnung (.*) \\(Pegel (.*)\\).*"); ingo@2828: ingo@2833: private static final Pattern META_GAUGE = ingo@2833: Pattern.compile("(.*) Q=(\\w*)m3/s"); ingo@2833: ingo@2833: private static final Pattern META_MAINVALUE_A = ingo@2833: Pattern.compile("([a-zA-Z]+)+(\\d+)*"); ingo@2833: ingo@2833: private static final Pattern META_MAINVALUE_B = ingo@2833: Pattern.compile("(([a-zA-Z]+)+(\\d+)*)\\s*-\\s*(([a-zA-Z]+)+(\\d+)*)"); ingo@2833: ingo@2833: private static final Pattern META_MAINVALUE_C = ingo@2833: Pattern.compile("([0-9]++)\\s?(\\w*)|([0-9]++,[0-9]++)\\s?(\\w*)"); ingo@2833: ingo@2833: private static final Pattern META_MAINVALUE_D = ingo@2833: Pattern.compile("(([0-9]*)\\s?(\\w*)|([0-9]++,[0-9]++)\\s?(\\w*)) bis (([0-9]*)\\s?(\\w*)|([0-9]++,[0-9]++)\\s?(\\w*))"); ingo@2833: ingo@2833: private static final Pattern META_MAINVALUE_E = ingo@2833: Pattern.compile("(([a-zA-Z]+)+(\\d+)*) bis (([a-zA-Z]+)+(\\d+)*)"); ingo@2833: ingo@2828: private static final NumberFormat nf = ingo@2828: NumberFormat.getInstance(DEFAULT_LOCALE); ingo@2828: ingo@2828: ingo@2828: private List models; ingo@2828: ingo@2828: private ImportFlowVelocityModel current; ingo@2828: ingo@2828: ingo@2828: public FlowVelocityModelParser() { ingo@2828: models = new ArrayList(); ingo@2828: } ingo@2828: ingo@2828: ingo@2828: public List getModels() { ingo@2828: return models; ingo@2828: } ingo@2828: ingo@2828: @Override ingo@2828: protected void reset() { ingo@2828: current = new ImportFlowVelocityModel(); ingo@2828: } ingo@2828: ingo@2828: ingo@2828: @Override ingo@2828: protected void finish() { ingo@2828: models.add(current); ingo@2828: } ingo@2828: ingo@2828: ingo@2828: @Override ingo@2828: protected void handleLine(String line) { ingo@2828: if (line.startsWith(START_META_CHAR)) { ingo@2828: handleMetaLine(stripMetaLine(line)); ingo@2828: } ingo@2828: else { ingo@2828: handleDataLine(line); ingo@2828: } ingo@2828: } ingo@2828: ingo@2828: ingo@2833: protected void handleMetaLine(String line) { ingo@2828: Matcher m = META_REGEX.matcher(line); ingo@2828: ingo@2828: if (m.matches()) { ingo@2833: String mainValueStr = m.group(1); ingo@2833: String gaugeStr = m.group(2); ingo@2828: ingo@2833: Object[] valueData = handleMainValueString(mainValueStr); ingo@2833: Object[] gaugeData = handleGaugeString(gaugeStr); ingo@2828: ingo@2833: if (valueData == null || valueData.length < 2) { ingo@2833: log.warn("skip invalid MainValue part: '" + line + "'"); ingo@2833: return; ingo@2833: } ingo@2833: ingo@2833: if (gaugeData == null || gaugeData.length < 2) { ingo@2833: log.warn("skip invalid gauge part: '" + line + "'"); ingo@2833: return; ingo@2833: } ingo@2833: ingo@2833: if (log.isDebugEnabled()) { ingo@2833: log.debug("Found meta information:"); ingo@2833: log.debug(" Gauge: " + gaugeData[0]); ingo@2833: log.debug(" Value: " + gaugeData[1]); ingo@2833: log.debug(" Lower: " + valueData[0]); ingo@2833: log.debug(" upper: " + valueData[1]); ingo@2833: } ingo@2833: ingo@2833: current.setDischargeZone(new ImportDischargeZone( ingo@2833: (String) gaugeData[0], ingo@2833: (BigDecimal) gaugeData[1], ingo@2833: (String) valueData[0], ingo@2833: (String) valueData[1] ingo@2833: )); ingo@2828: } ingo@2828: } ingo@2828: ingo@2828: ingo@2833: protected Object[] handleMainValueString(String mainValueStr) { ingo@2833: Matcher mA = META_MAINVALUE_A.matcher(mainValueStr); ingo@2833: if (mA.matches()) { ingo@2833: String name = mA.group(0); ingo@2833: ingo@2833: return new Object[] { name, name }; ingo@2833: } ingo@2833: ingo@2833: Matcher mB = META_MAINVALUE_B.matcher(mainValueStr); ingo@2833: if (mB.matches()) { ingo@2833: String lower = mB.group(1); ingo@2833: String upper = mB.group(4); ingo@2833: ingo@2833: return new Object[] { lower, upper }; ingo@2833: } ingo@2833: ingo@2833: Matcher mC = META_MAINVALUE_C.matcher(mainValueStr); ingo@2833: if (mC.matches()) { ingo@2833: String facA = mC.group(1); ingo@2833: String nameA = mC.group(2); ingo@2833: String facB = mC.group(3); ingo@2833: String nameB = mC.group(4); ingo@2833: ingo@2833: String fac = facA != null ? facA : facB; ingo@2833: String name = nameA != null ? nameA : nameB; ingo@2833: ingo@2833: String mainValue = fac + " " + name; ingo@2833: ingo@2833: return new Object[] { mainValue, mainValue }; ingo@2833: } ingo@2833: ingo@2833: Matcher mD = META_MAINVALUE_D.matcher(mainValueStr); ingo@2833: if (mD.matches()) { ingo@2833: String loFacA = mD.group(2); ingo@2833: String loNameA = mD.group(3); ingo@2833: String loFacB = mD.group(4); ingo@2833: String loNameB = mD.group(5); ingo@2833: ingo@2833: String upFacA = mD.group(7); ingo@2833: String upNameA = mD.group(8); ingo@2833: String upFacB = mD.group(9); ingo@2833: String upNameB = mD.group(10); ingo@2833: ingo@2833: String loFac = loFacA != null ? loFacA : loFacB; ingo@2833: String loName = loNameA != null ? loNameA : loNameB; ingo@2833: ingo@2833: String upFac = upFacA != null ? upFacA : upFacB; ingo@2833: String upName = upNameA != null ? upNameA : upNameB; ingo@2833: ingo@2833: String loMainValue = loFac + " " + loName; ingo@2833: String upMainValue = upFac + " " + upName; ingo@2833: ingo@2833: return new Object[] { loMainValue, upMainValue }; ingo@2833: } ingo@2833: ingo@2833: Matcher mE = META_MAINVALUE_E.matcher(mainValueStr); ingo@2833: if (mE.matches()) { ingo@2833: String lower = mE.group(1); ingo@2833: String upper = mE.group(4); ingo@2833: ingo@2833: return new Object[] { lower, upper }; ingo@2833: } ingo@2833: ingo@2833: return null; ingo@2833: } ingo@2833: ingo@2833: ingo@2833: protected Object[] handleGaugeString(String gaugeStr) { ingo@2833: Matcher m = META_GAUGE.matcher(gaugeStr); ingo@2833: ingo@2833: if (m.matches()) { ingo@2833: String name = m.group(1); ingo@2833: String qStr = m.group(2); ingo@2833: ingo@2833: try { ingo@2833: return new Object[] { ingo@2833: name, ingo@2833: new BigDecimal(nf.parse(qStr).doubleValue()) }; ingo@2833: } ingo@2833: catch (ParseException pe) { ingo@2833: log.warn("Error while parsing Q value: '" + qStr + "'"); ingo@2833: } ingo@2833: } ingo@2833: ingo@2833: return null; ingo@2833: } ingo@2833: ingo@2833: ingo@2833: protected void handleDataLine(String line) { ingo@2828: String[] cols = line.split(SEPERATOR_CHAR); ingo@2828: ingo@2828: if (cols.length < 5) { ingo@2828: log.warn("skip invalid data line: '" + line + "'"); ingo@2828: return; ingo@2828: } ingo@2828: ingo@2828: try { ingo@2828: double km = nf.parse(cols[0]).doubleValue(); ingo@2828: double q = nf.parse(cols[1]).doubleValue(); ingo@2828: double total = nf.parse(cols[2]).doubleValue(); ingo@2828: double main = nf.parse(cols[3]).doubleValue(); ingo@2828: double stress = nf.parse(cols[4]).doubleValue(); ingo@2828: ingo@2828: current.addValue(new ImportFlowVelocityModelValue( ingo@2828: new BigDecimal(km), ingo@2828: new BigDecimal(q), ingo@2828: new BigDecimal(total), ingo@2828: new BigDecimal(main), ingo@2828: new BigDecimal(stress) ingo@2828: )); ingo@2828: } ingo@2828: catch (ParseException pe) { ingo@2828: log.warn("Error while parsing flow velocity values.", pe); ingo@2828: } ingo@2828: } ingo@2828: } ingo@2828: // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :