comparison backend/src/main/java/org/dive4elements/river/importer/sinfo/parsers/ChannelParser.java @ 8971:50416a0df385

Importer for the Schifffahrt (S-INFO) and Oekologie (U-INFO) files
author mschaefer
date Tue, 03 Apr 2018 10:18:30 +0200
parents
children ae76f618d990
comparison
equal deleted inserted replaced
8970:da5dc7446652 8971:50416a0df385
1 /* Copyright (C) 2017 by Bundesanstalt für Gewässerkunde
2 * Software engineering by
3 * Björnsen Beratende Ingenieure GmbH
4 * Dr. Schumacher Ingenieurbüro für Wasser und Umwelt
5 *
6 * This file is Free Software under the GNU AGPL (>=v3)
7 * and comes with ABSOLUTELY NO WARRANTY! Check out the
8 * documentation coming with Dive4Elements River for details.
9 */
10
11 package org.dive4elements.river.importer.sinfo.parsers;
12
13 import java.io.File;
14 import java.util.ArrayList;
15 import java.util.List;
16 import java.util.regex.Matcher;
17 import java.util.regex.Pattern;
18
19 import org.apache.log4j.Logger;
20 import org.dive4elements.river.importer.Config;
21 import org.dive4elements.river.importer.ImportRiver;
22 import org.dive4elements.river.importer.common.AbstractParser;
23 import org.dive4elements.river.importer.common.ParsingState;
24 import org.dive4elements.river.importer.sinfo.importitem.ChannelKmLineImport;
25 import org.dive4elements.river.importer.sinfo.importitem.ChannelSeriesImport;
26 import org.dive4elements.river.model.sinfo.Channel;
27 import org.dive4elements.river.model.sinfo.ChannelValue;
28
29 /**
30 * Reads and parses a channel size file
31 *
32 * @author Matthias Schäfer
33 *
34 */
35 public class ChannelParser extends AbstractParser<Channel, ChannelValue, ChannelKmLineImport, ChannelSeriesImport> {
36
37 /***** FIELDS *****/
38
39 private static final Logger log = Logger.getLogger(ChannelParser.class);
40
41 private static final String IMPORT_FILENAME = "Fahrrinne.csv";
42
43 protected static final Pattern META_YEARS = Pattern.compile("^#\\sZeitraum:\\s*([12]\\d\\d\\d)*\\s*-\\s*([12]\\d\\d\\d)*.*", Pattern.CASE_INSENSITIVE);
44
45 private static final Pattern WIDTH_COLUMNTITLE = Pattern.compile("Sollbreite\\s*\\[(.*)\\].*", Pattern.CASE_INSENSITIVE);
46
47 private static final Pattern DEPTH_COLUMNTITLE = Pattern.compile("Solltiefe\\s*\\[(.*)\\].*", Pattern.CASE_INSENSITIVE);
48
49 private int widthColIndex;
50
51 private int depthColIndex;
52
53
54 /***** CONSTRUCTORS *****/
55
56 public ChannelParser(final File importPath, final File rootRelativePath, final ImportRiver river) {
57 super(importPath, rootRelativePath, river);
58 this.widthColIndex = -1;
59 this.depthColIndex = -1;
60 }
61
62
63 /***** METHODS *****/
64
65 @Override
66 protected Logger getLog() {
67 return log;
68 }
69
70 /**
71 * Whether this import type shall be skipped
72 */
73 public static boolean shallSkip() {
74 return Config.INSTANCE.skipSInfoChannel();
75 }
76
77 /**
78 * Creates a list of parsers for all channel import files in a directory
79 */
80 public static List<ChannelParser> createParsers(final File importDir, final File relativeDir, final ImportRiver river) {
81 final List<ChannelParser> parsers = new ArrayList<>();
82 parsers.add(new ChannelParser(new File(importDir, IMPORT_FILENAME), new File(relativeDir, IMPORT_FILENAME), river));
83 return parsers;
84 }
85
86 @Override
87 protected boolean handleMetaOther() {
88 if (handleMetaYears())
89 return true;
90 else
91 return false;
92 }
93
94 private boolean handleMetaYears() {
95 final Matcher m = META_YEARS.matcher(this.currentLine);
96 if (m.matches()) {
97 this.metaPatternsMatched.add(META_YEARS);
98 if (m.group(1) != null)
99 this.seriesHeader.setYear_from(Integer.valueOf(m.group(1)));
100 else
101 this.seriesHeader.setYear_from(null);
102 if (m.group(2) != null)
103 this.seriesHeader.setYear_to(Integer.valueOf(m.group(2)));
104 else
105 this.seriesHeader.setYear_to(null);
106 return true;
107 }
108 return false;
109 }
110
111 @Override
112 protected boolean handleMetaColumnTitles() {
113 if (super.handleMetaColumnTitles()) {
114 for (int i = 1; i <= this.columnTitles.size() - 1; i++) {
115 if (DEPTH_COLUMNTITLE.matcher(this.columnTitles.get(i)).matches())
116 this.depthColIndex = i;
117 else if (WIDTH_COLUMNTITLE.matcher(this.columnTitles.get(i)).matches())
118 this.widthColIndex = i;
119 }
120 if ((this.widthColIndex < 0) || (this.depthColIndex < 0)) {
121 logError("Columns of width and/or depth values could not be identified, missing column title 'Sollbreite...'/'Sollhöhe...'");
122 this.headerParsingState = ParsingState.STOP;
123 return false;
124 }
125 return true;
126 }
127 else
128 return false;
129 }
130
131 @Override
132 protected ChannelSeriesImport createSeriesImport(final String filename) {
133 return new ChannelSeriesImport(filename);
134 }
135
136 @Override
137 protected ChannelKmLineImport createKmLineImport(final Double km, final String[] values) {
138 if (parseDoubleWithNull(values[this.widthColIndex]) == null) {
139 logError("Invalid width value in line " + this.in.getLineNumber());
140 return null;
141 }
142 if (parseDoubleWithNull(values[this.depthColIndex]) == null) {
143 logError("Invalid depth value in line " + this.in.getLineNumber());
144 return null;
145 }
146 return new ChannelKmLineImport(km, parseDoubleWithNull(values[this.widthColIndex]).doubleValue(),
147 parseDoubleWithNull(values[this.depthColIndex]).doubleValue());
148 }
149 }

http://dive4elements.wald.intevation.org