[PATCH] Divide SedimentLoadLSParser into AbstractSedimentLoadParser and SedimentLoadLSParser to be able to reuse code for a new SedimentLoadParser for data at measurement stations
Wald Commits
scm-commit at wald.intevation.org
Wed Jul 16 19:11:34 CEST 2014
# HG changeset patch
# User Tom Gottfried <tom at intevation.de>
# Date 1405530691 -7200
# Node ID bd0dea643440d49c06969ed6457f8d9d78e1aad7
# Parent 9342d7fe0ee716fc67128a98211f88de85e028d3
Divide SedimentLoadLSParser into AbstractSedimentLoadParser and SedimentLoadLSParser to be able to reuse code for a new SedimentLoadParser for data at measurement stations.
diff -r 9342d7fe0ee7 -r bd0dea643440 backend/src/main/java/org/dive4elements/river/importer/parsers/AbstractSedimentLoadParser.java
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/backend/src/main/java/org/dive4elements/river/importer/parsers/AbstractSedimentLoadParser.java Wed Jul 16 19:11:31 2014 +0200
@@ -0,0 +1,250 @@
+/* Copyright (C) 2011, 2012, 2013 by Bundesanstalt für Gewässerkunde
+ * Software engineering by Intevation GmbH
+ *
+ * This file is Free Software under the GNU AGPL (>=v3)
+ * and comes with ABSOLUTELY NO WARRANTY! Check out the
+ * documentation coming with Dive4Elements River for details.
+ */
+
+package org.dive4elements.river.importer.parsers;
+
+import java.io.File;
+import java.io.IOException;
+
+import java.text.NumberFormat;
+import java.text.ParseException;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import org.apache.log4j.Logger;
+
+import org.dive4elements.river.importer.ImporterSession;
+import org.dive4elements.river.importer.ImportGrainFraction;
+import org.dive4elements.river.importer.ImportTimeInterval;
+import org.dive4elements.river.importer.ImportUnit;
+
+import org.dive4elements.river.model.GrainFraction;
+
+import org.dive4elements.river.utils.DateUtil;
+import org.dive4elements.river.utils.EpsilonComparator;
+
+/** Parses sediment load files. */
+public abstract class AbstractSedimentLoadParser extends LineParser {
+
+ private static final Logger log =
+ Logger.getLogger(AbstractSedimentLoadParser.class);
+
+
+ public static final NumberFormat nf = NumberFormat.getInstance(DEFAULT_LOCALE);
+
+
+ public static final Pattern TIMEINTERVAL_SINGLE =
+ Pattern.compile("\\D*([0-9]+?)\\D*");
+
+ public static final Pattern TIMEINTERVAL_EPOCH =
+ Pattern.compile("\\D*([0-9]+?)\\s*-\\s*([0-9]+?)\\D*");
+
+ public static final Pattern META_FRACTION =
+ Pattern.compile("^Fraktion: (.*)");
+
+ public static final Pattern META_FRACTION_NAME =
+ Pattern.compile("^Fraktionsname: (.*)");
+
+ public static final Pattern META_UNIT =
+ Pattern.compile("^Einheit: \\[(.*)\\].*");
+
+ public static final Pattern META_COLUMN_NAMES =
+ Pattern.compile("^Fluss-km.*");
+
+ public static final Pattern META_GRAIN_SIZE =
+ Pattern.compile("([0-9]*,*[0-9]+)-([0-9]*,*[0-9]+) *mm");
+
+
+ protected abstract void handleDataLine(String line);
+
+ /** Initialize SedimentLoadLSs from columns, set the kind
+ * with respect to file location (offical epoch or not?) */
+ protected abstract void initializeSedimentLoads();
+
+
+ protected ImportGrainFraction grainFraction;
+
+ protected ImportUnit unit;
+
+ protected String description;
+
+ protected String[] columnNames;
+
+ private String upper;
+
+ private String lower;
+
+
+ @Override
+ public void parse(File file) throws IOException {
+ description = file.getName();
+
+ super.parse(file);
+ }
+
+
+ @Override
+ protected void handleLine(int lineNum, String line) throws LineParserException {
+ if (line.startsWith(START_META_CHAR)) {
+ handleMetaLine(stripMetaLine(line));
+ }
+ else {
+ handleDataLine(line);
+ }
+ }
+
+
+ protected void handleMetaLine(String line) throws LineParserException {
+ if (handleMetaUnit(line)) {
+ return;
+ }
+ if (handleMetaFraction(line)) {
+ return;
+ }
+ if (handleMetaFractionName(line)) {
+ return;
+ }
+ if (handleColumnNames(line)) {
+ return;
+ }
+ log.warn("ASLP: Unknown meta line: '" + line + "'");
+ }
+
+
+ protected boolean handleMetaUnit(String line) {
+ Matcher m = META_UNIT.matcher(line);
+
+ if (m.matches()) {
+ unit = new ImportUnit(m.group(1));
+ return true;
+ }
+
+ return false;
+ }
+
+
+ public boolean handleMetaFraction(String line) {
+ Matcher m = META_FRACTION.matcher(line);
+
+ if (m.matches()) {
+ String interval = m.group(1);
+
+ Matcher sizes = META_GRAIN_SIZE.matcher(interval);
+ if (sizes.matches()) {
+ lower = sizes.group(1);
+ upper = sizes.group(2);
+
+ return true;
+ }
+
+ log.warn("ASLP: Unrecognized grain-size interval. Ignored.");
+ return true;
+
+ }
+
+ return false;
+ }
+
+
+ public boolean handleMetaFractionName(String line) throws LineParserException {
+ Matcher m = META_FRACTION_NAME.matcher(line);
+
+ if (m.matches()) {
+ String name = m.group(1);
+
+
+ GrainFraction gf = ImporterSession.getInstance().getGrainFraction(name);
+
+ if (gf != null) {
+
+ if (lower != null && upper != null) {
+ // Validate grain size interval
+ try {
+ Double lowval = nf.parse(lower).doubleValue();
+ Double upval = nf.parse(upper).doubleValue();
+
+ if (EpsilonComparator.CMP.compare(lowval,
+ gf.getLower()) != 0 ||
+ EpsilonComparator.CMP.compare(upval,
+ gf.getUpper()) != 0) {
+ log.warn("ASLP: Invalid grain size for grain fraction '" +
+ name + "'. Ignored.");
+ }
+ }
+ catch (ParseException pe) {
+ log.warn("ASLP: Could not parse grain-size interval. Ignored.");
+ }
+ }
+
+ grainFraction = new ImportGrainFraction(gf);
+ return true;
+ }
+
+ throw new LineParserException("ASLP: Unknown grain fraction: '" +
+ name + "'");
+ }
+
+ return false;
+ }
+
+
+ public boolean handleColumnNames(String line) throws LineParserException {
+ Matcher m = META_COLUMN_NAMES.matcher(line);
+
+ if (m.matches()) {
+ columnNames = line.split(SEPERATOR_CHAR);
+
+ // 'Fluss-km', 'Hinweise' and at least one data column required
+ if (columnNames.length < 3) {
+ throw new LineParserException("ASLP: missing columns in '" +
+ line + "'");
+ }
+
+ initializeSedimentLoads();
+
+ return true;
+ }
+
+ return false;
+ }
+
+
+ protected ImportTimeInterval getTimeInterval(String column) {
+ try {
+ Matcher a = TIMEINTERVAL_EPOCH.matcher(column);
+ if (a.matches()) {
+ int yearA = nf.parse(a.group(1)).intValue();
+ int yearB = nf.parse(a.group(2)).intValue();
+
+ return new ImportTimeInterval(
+ DateUtil.getStartDateFromYear(yearA),
+ DateUtil.getEndDateFromYear(yearB)
+ );
+ }
+
+ Matcher b = TIMEINTERVAL_SINGLE.matcher(column);
+ if (b.matches()) {
+ int year = nf.parse(b.group(1)).intValue();
+
+ return new ImportTimeInterval(DateUtil.getStartDateFromYear(year));
+ }
+
+ log.warn("ASLP: Unknown time interval string: '" + column + "'");
+ }
+ catch (ParseException pe) {
+ log.warn("ASLP: Could not parse years: " + column, pe);
+ }
+
+ return null;
+ }
+
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r 9342d7fe0ee7 -r bd0dea643440 backend/src/main/java/org/dive4elements/river/importer/parsers/SedimentLoadLSParser.java
--- a/backend/src/main/java/org/dive4elements/river/importer/parsers/SedimentLoadLSParser.java Wed Jul 16 18:33:28 2014 +0200
+++ b/backend/src/main/java/org/dive4elements/river/importer/parsers/SedimentLoadLSParser.java Wed Jul 16 19:11:31 2014 +0200
@@ -16,12 +16,9 @@
import java.util.ArrayList;
import java.util.List;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
import org.apache.log4j.Logger;
-import org.dive4elements.river.importer.ImporterSession;
import org.dive4elements.river.importer.ImportGrainFraction;
import org.dive4elements.river.importer.ImportSedimentLoadLS;
import org.dive4elements.river.importer.ImportSedimentLoadLSValue;
@@ -30,57 +27,17 @@
import org.dive4elements.river.model.GrainFraction;
-import org.dive4elements.river.utils.DateUtil;
-import org.dive4elements.river.utils.EpsilonComparator;
-
/** Parses sediment load longitudinal section files. */
-public class SedimentLoadLSParser extends LineParser {
+public class SedimentLoadLSParser extends AbstractSedimentLoadParser {
private static final Logger log =
Logger.getLogger(SedimentLoadLSParser.class);
- public static final NumberFormat nf = NumberFormat.getInstance(DEFAULT_LOCALE);
-
-
- public static final Pattern TIMEINTERVAL_SINGLE =
- Pattern.compile("\\D*([0-9]+?)\\D*");
-
- public static final Pattern TIMEINTERVAL_EPOCH =
- Pattern.compile("\\D*([0-9]+?)\\s*-\\s*([0-9]+?)\\D*");
-
- public static final Pattern META_FRACTION =
- Pattern.compile("^Fraktion: (.*)");
-
- public static final Pattern META_FRACTION_NAME =
- Pattern.compile("^Fraktionsname: (.*)");
-
- public static final Pattern META_UNIT =
- Pattern.compile("^Einheit: \\[(.*)\\].*");
-
- public static final Pattern META_COLUMN_NAMES =
- Pattern.compile("^Fluss-km.*");
-
- public static final Pattern META_GRAIN_SIZE =
- Pattern.compile("([0-9]*,*[0-9]+)-([0-9]*,*[0-9]+) *mm");
-
-
protected List<ImportSedimentLoadLS> sedimentLoadLSs;
protected ImportSedimentLoadLS[] current;
- protected ImportGrainFraction grainFraction;
-
- protected ImportUnit unit;
-
- protected String description;
-
- protected String[] columnNames;
-
- private String upper;
-
- private String lower;
-
public SedimentLoadLSParser() {
sedimentLoadLSs = new ArrayList<ImportSedimentLoadLS>();
@@ -88,14 +45,6 @@
@Override
- public void parse(File file) throws IOException {
- description = file.getName();
-
- super.parse(file);
- }
-
-
- @Override
protected void reset() {
current = null;
grainFraction = null;
@@ -116,129 +65,6 @@
@Override
- protected void handleLine(int lineNum, String line) throws LineParserException {
- if (line.startsWith(START_META_CHAR)) {
- handleMetaLine(stripMetaLine(line));
- }
- else {
- handleDataLine(line);
- }
- }
-
-
- protected void handleMetaLine(String line) throws LineParserException {
- if (handleMetaUnit(line)) {
- return;
- }
- if (handleMetaFraction(line)) {
- return;
- }
- if (handleMetaFractionName(line)) {
- return;
- }
- if (handleColumnNames(line)) {
- return;
- }
- log.warn("SLLSP: Unknown meta line: '" + line + "'");
- }
-
-
- protected boolean handleMetaUnit(String line) {
- Matcher m = META_UNIT.matcher(line);
-
- if (m.matches()) {
- unit = new ImportUnit(m.group(1));
- return true;
- }
-
- return false;
- }
-
-
- public boolean handleMetaFraction(String line) {
- Matcher m = META_FRACTION.matcher(line);
-
- if (m.matches()) {
- String interval = m.group(1);
-
- Matcher sizes = META_GRAIN_SIZE.matcher(interval);
- if (sizes.matches()) {
- lower = sizes.group(1);
- upper = sizes.group(2);
-
- return true;
- }
-
- log.warn("SLLSP: Unrecognized grain-size interval. Ignored.");
- return true;
-
- }
-
- return false;
- }
-
-
- public boolean handleMetaFractionName(String line) {
- Matcher m = META_FRACTION_NAME.matcher(line);
-
- if (m.matches()) {
- String name = m.group(1);
-
-
- GrainFraction gf = ImporterSession.getInstance().getGrainFraction(name);
-
- if (gf != null) {
-
- if (lower != null && upper != null) {
- // Validate grain size interval
- try {
- Double lowval = nf.parse(lower).doubleValue();
- Double upval = nf.parse(upper).doubleValue();
-
- if (EpsilonComparator.CMP.compare(lowval,
- gf.getLower()) != 0 ||
- EpsilonComparator.CMP.compare(upval,
- gf.getUpper()) != 0) {
- log.warn("SLLSP: Invalid grain size for grain fraction '" +
- name + "'. Ignored.");
- }
- }
- catch (ParseException pe) {
- log.warn("SLLSP: Could not parse grain-size interval. Ignored.");
- }
- }
-
- grainFraction = new ImportGrainFraction(gf);
- return true;
- }
-
- log.error("SLLSP: Unknown grain fraction: '" + name + "'");
- }
-
- return false;
- }
-
-
- public boolean handleColumnNames(String line) throws LineParserException {
- Matcher m = META_COLUMN_NAMES.matcher(line);
-
- if (m.matches()) {
- columnNames = line.split(SEPERATOR_CHAR);
-
- // 'Fluss-km', 'Hinweise' and at least one data column required
- if (columnNames.length < 3) {
- throw new LineParserException("SLLSP: missing columns.");
- }
-
- initializeSedimentLoadLSs();
-
- return true;
- }
-
- return false;
- }
-
-
protected void handleDataLine(String line) {
String[] vals = line.split(SEPERATOR_CHAR);
@@ -266,9 +92,8 @@
}
- /** Initialize SedimentLoadLSs from columns, set the kind
- * with respect to file location (offical epoch or not?) */
- private void initializeSedimentLoadLSs() {
+ @Override
+ protected void initializeSedimentLoads() {
// skip first column (Fluss-km) and last column (Hinweise)
current = new ImportSedimentLoadLS[columnNames.length-2];
@@ -291,36 +116,6 @@
}
- private ImportTimeInterval getTimeInterval(String column) {
- try {
- Matcher a = TIMEINTERVAL_EPOCH.matcher(column);
- if (a.matches()) {
- int yearA = nf.parse(a.group(1)).intValue();
- int yearB = nf.parse(a.group(2)).intValue();
-
- return new ImportTimeInterval(
- DateUtil.getStartDateFromYear(yearA),
- DateUtil.getEndDateFromYear(yearB)
- );
- }
-
- Matcher b = TIMEINTERVAL_SINGLE.matcher(column);
- if (b.matches()) {
- int year = nf.parse(b.group(1)).intValue();
-
- return new ImportTimeInterval(DateUtil.getStartDateFromYear(year));
- }
-
- log.warn("SLLSP: Unknown time interval string: '" + column + "'");
- }
- catch (ParseException pe) {
- log.warn("SLLSP: Could not parse years: " + column, pe);
- }
-
- return null;
- }
-
-
public List<ImportSedimentLoadLS> getSedimentLoadLSs() {
return sedimentLoadLSs;
}
More information about the Dive4Elements-commits
mailing list