annotate backend/src/main/java/org/dive4elements/river/importer/parsers/WstParser.java @ 8976:e541938dd3ab

Range data handled consistently as BigDecimal to minimize the fractional part of a and b
author mschaefer
date Tue, 03 Apr 2018 10:43:53 +0200
parents 5e38e2924c07
children 5ff8ce9a2e06
rev   line source
5844
4dd33b86dc61 Added header to river backend.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5838
diff changeset
1 /* Copyright (C) 2011, 2012, 2013 by Bundesanstalt für Gewässerkunde
4dd33b86dc61 Added header to river backend.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5838
diff changeset
2 * Software engineering by Intevation GmbH
4dd33b86dc61 Added header to river backend.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5838
diff changeset
3 *
5992
4c3ccf2b0304 Removed trailing whitespace.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5844
diff changeset
4 * This file is Free Software under the GNU AGPL (>=v3)
5844
4dd33b86dc61 Added header to river backend.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5838
diff changeset
5 * and comes with ABSOLUTELY NO WARRANTY! Check out the
5992
4c3ccf2b0304 Removed trailing whitespace.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5844
diff changeset
6 * documentation coming with Dive4Elements River for details.
5844
4dd33b86dc61 Added header to river backend.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5838
diff changeset
7 */
4dd33b86dc61 Added header to river backend.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5838
diff changeset
8
5829
18619c1e7c2a Repaired internal references.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5828
diff changeset
9 package org.dive4elements.river.importer.parsers;
1211
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
10
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
11 import java.io.File;
8976
e541938dd3ab Range data handled consistently as BigDecimal to minimize the fractional part of a and b
mschaefer
parents: 8856
diff changeset
12 import java.io.FileInputStream;
1211
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
13 import java.io.IOException;
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
14 import java.io.InputStreamReader;
8976
e541938dd3ab Range data handled consistently as BigDecimal to minimize the fractional part of a and b
mschaefer
parents: 8856
diff changeset
15 import java.io.LineNumberReader;
e541938dd3ab Range data handled consistently as BigDecimal to minimize the fractional part of a and b
mschaefer
parents: 8856
diff changeset
16 import java.math.BigDecimal;
1211
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
17 import java.text.NumberFormat;
8976
e541938dd3ab Range data handled consistently as BigDecimal to minimize the fractional part of a and b
mschaefer
parents: 8856
diff changeset
18 import java.util.ArrayList;
e541938dd3ab Range data handled consistently as BigDecimal to minimize the fractional part of a and b
mschaefer
parents: 8856
diff changeset
19 import java.util.Arrays;
e541938dd3ab Range data handled consistently as BigDecimal to minimize the fractional part of a and b
mschaefer
parents: 8856
diff changeset
20 import java.util.HashSet;
e541938dd3ab Range data handled consistently as BigDecimal to minimize the fractional part of a and b
mschaefer
parents: 8856
diff changeset
21 import java.util.regex.Matcher;
e541938dd3ab Range data handled consistently as BigDecimal to minimize the fractional part of a and b
mschaefer
parents: 8856
diff changeset
22 import java.util.regex.Pattern;
1211
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
23
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
24 import org.apache.log4j.Logger;
8187
3bb1c62ad732 Moved package org.dive4elements.river.utils to org.dive4elements.river.backend.utils.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 7883
diff changeset
25 import org.dive4elements.river.backend.utils.DateGuesser;
8976
e541938dd3ab Range data handled consistently as BigDecimal to minimize the fractional part of a and b
mschaefer
parents: 8856
diff changeset
26 import org.dive4elements.river.backend.utils.StringUtil;
e541938dd3ab Range data handled consistently as BigDecimal to minimize the fractional part of a and b
mschaefer
parents: 8856
diff changeset
27 import org.dive4elements.river.importer.ImportRange;
5829
18619c1e7c2a Repaired internal references.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5828
diff changeset
28 import org.dive4elements.river.importer.ImportTimeInterval;
18619c1e7c2a Repaired internal references.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5828
diff changeset
29 import org.dive4elements.river.importer.ImportUnit;
18619c1e7c2a Repaired internal references.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5828
diff changeset
30 import org.dive4elements.river.importer.ImportWst;
8976
e541938dd3ab Range data handled consistently as BigDecimal to minimize the fractional part of a and b
mschaefer
parents: 8856
diff changeset
31 import org.dive4elements.river.importer.ImportWstColumn;
e541938dd3ab Range data handled consistently as BigDecimal to minimize the fractional part of a and b
mschaefer
parents: 8856
diff changeset
32 import org.dive4elements.river.importer.ImportWstQRange;
1211
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
33
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
34 public class WstParser
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
35 {
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
36 private static Logger log = Logger.getLogger(WstParser.class);
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
37
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
38 public static final String COLUMN_BEZ_TEXT = "column-bez-text";
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
39 public static final String COLUMN_BEZ_BREITE = "column-bez-breite";
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
40 public static final String COLUMN_QUELLE = "column-quelle";
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
41 public static final String COLUMN_DATUM = "column-datum";
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
42
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
43 public static final BigDecimal UNDEFINED_ZERO =
8976
e541938dd3ab Range data handled consistently as BigDecimal to minimize the fractional part of a and b
mschaefer
parents: 8856
diff changeset
44 new BigDecimal(0.0);
1211
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
45 public static final BigDecimal MIN_RANGE =
8976
e541938dd3ab Range data handled consistently as BigDecimal to minimize the fractional part of a and b
mschaefer
parents: 8856
diff changeset
46 new BigDecimal(-Double.MAX_VALUE);
1211
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
47 public static final BigDecimal MAX_RANGE =
8976
e541938dd3ab Range data handled consistently as BigDecimal to minimize the fractional part of a and b
mschaefer
parents: 8856
diff changeset
48 new BigDecimal(Double.MAX_VALUE);
1211
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
49
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
50 public static final String ENCODING = "ISO-8859-1";
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
51
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
52 public static final Pattern UNIT_COMMENT =
8976
e541938dd3ab Range data handled consistently as BigDecimal to minimize the fractional part of a and b
mschaefer
parents: 8856
diff changeset
53 Pattern.compile("\\*\\s*[kK][mM]\\s+(.+)");
1211
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
54
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
55 public static final Pattern UNIT =
8976
e541938dd3ab Range data handled consistently as BigDecimal to minimize the fractional part of a and b
mschaefer
parents: 8856
diff changeset
56 Pattern.compile("[^\\[]*\\[([^]]+)\\].*");
1211
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
57
6508
b2eab164a441 Backend: WST parser. Detect ranges of years in column-datum
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6506
diff changeset
58 public static final Pattern YEAR_INTERVAL =
8976
e541938dd3ab Range data handled consistently as BigDecimal to minimize the fractional part of a and b
mschaefer
parents: 8856
diff changeset
59 Pattern.compile("(\\d{4})\\s*[-/]\\s*(\\d{4})");
6508
b2eab164a441 Backend: WST parser. Detect ranges of years in column-datum
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6506
diff changeset
60
8976
e541938dd3ab Range data handled consistently as BigDecimal to minimize the fractional part of a and b
mschaefer
parents: 8856
diff changeset
61 public static final BigDecimal INTERVAL_GAP = new BigDecimal("0.00001");
1211
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
62
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
63 protected ImportWst wst;
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
64
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
65 protected ImportRange lastRange;
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
66
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
67 public WstParser() {
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
68 }
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
69
8976
e541938dd3ab Range data handled consistently as BigDecimal to minimize the fractional part of a and b
mschaefer
parents: 8856
diff changeset
70 public WstParser(final ImportWst wst) {
6337
224d7c4b5291 Backend: Create ImportWsts for official lines expicitly. They are going to be somewhat special. Removed some cruft from the WstParser.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6328
diff changeset
71 this.wst = wst;
224d7c4b5291 Backend: Create ImportWsts for official lines expicitly. They are going to be somewhat special. Removed some cruft from the WstParser.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6328
diff changeset
72 }
224d7c4b5291 Backend: Create ImportWsts for official lines expicitly. They are going to be somewhat special. Removed some cruft from the WstParser.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6328
diff changeset
73
1211
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
74 public ImportWst getWst() {
8976
e541938dd3ab Range data handled consistently as BigDecimal to minimize the fractional part of a and b
mschaefer
parents: 8856
diff changeset
75 return this.wst;
1211
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
76 }
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
77
8976
e541938dd3ab Range data handled consistently as BigDecimal to minimize the fractional part of a and b
mschaefer
parents: 8856
diff changeset
78 public void setWst(final ImportWst wst) {
1211
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
79 this.wst = wst;
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
80 }
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
81
7339
40e5ad76103c WST Import: Added parse error exception to WST parser.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 7252
diff changeset
82 public static final class ParseException extends Exception {
40e5ad76103c WST Import: Added parse error exception to WST parser.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 7252
diff changeset
83 public ParseException() {
40e5ad76103c WST Import: Added parse error exception to WST parser.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 7252
diff changeset
84 }
40e5ad76103c WST Import: Added parse error exception to WST parser.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 7252
diff changeset
85
8976
e541938dd3ab Range data handled consistently as BigDecimal to minimize the fractional part of a and b
mschaefer
parents: 8856
diff changeset
86 public ParseException(final String msg) {
7339
40e5ad76103c WST Import: Added parse error exception to WST parser.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 7252
diff changeset
87 super(msg);
40e5ad76103c WST Import: Added parse error exception to WST parser.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 7252
diff changeset
88 }
40e5ad76103c WST Import: Added parse error exception to WST parser.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 7252
diff changeset
89 } // class ParseException
40e5ad76103c WST Import: Added parse error exception to WST parser.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 7252
diff changeset
90
6727
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 6508
diff changeset
91 /** Returns a new ImportTimeInterval with a date guessed from string. */
8976
e541938dd3ab Range data handled consistently as BigDecimal to minimize the fractional part of a and b
mschaefer
parents: 8856
diff changeset
92 public static ImportTimeInterval guessDate(final String string) {
2357
2e18e12fac11 Added date guesser for WST columns.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2346
diff changeset
93 try {
8976
e541938dd3ab Range data handled consistently as BigDecimal to minimize the fractional part of a and b
mschaefer
parents: 8856
diff changeset
94 final Matcher m = YEAR_INTERVAL.matcher(string);
6508
b2eab164a441 Backend: WST parser. Detect ranges of years in column-datum
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6506
diff changeset
95 if (m.matches()) {
b2eab164a441 Backend: WST parser. Detect ranges of years in column-datum
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6506
diff changeset
96 return new ImportTimeInterval(
8976
e541938dd3ab Range data handled consistently as BigDecimal to minimize the fractional part of a and b
mschaefer
parents: 8856
diff changeset
97 DateGuesser.guessDate(m.group(1)),
e541938dd3ab Range data handled consistently as BigDecimal to minimize the fractional part of a and b
mschaefer
parents: 8856
diff changeset
98 DateGuesser.guessDate(m.group(2)));
6508
b2eab164a441 Backend: WST parser. Detect ranges of years in column-datum
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6506
diff changeset
99 }
b2eab164a441 Backend: WST parser. Detect ranges of years in column-datum
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6506
diff changeset
100
2357
2e18e12fac11 Added date guesser for WST columns.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2346
diff changeset
101 return new ImportTimeInterval(
8976
e541938dd3ab Range data handled consistently as BigDecimal to minimize the fractional part of a and b
mschaefer
parents: 8856
diff changeset
102 DateGuesser.guessDate(string));
2357
2e18e12fac11 Added date guesser for WST columns.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2346
diff changeset
103 }
8976
e541938dd3ab Range data handled consistently as BigDecimal to minimize the fractional part of a and b
mschaefer
parents: 8856
diff changeset
104 catch (final IllegalArgumentException iae) {
6028
25d927cb4b25 WstParser: warn if timestamp can not be set, cosmetics.
Tom Gottfried <tom.gottfried@intevation.de>
parents: 5992
diff changeset
105 log.warn("WST: String '" + string +
8976
e541938dd3ab Range data handled consistently as BigDecimal to minimize the fractional part of a and b
mschaefer
parents: 8856
diff changeset
106 "' could not be interpreted as valid timestamp");
2357
2e18e12fac11 Added date guesser for WST columns.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2346
diff changeset
107 }
2e18e12fac11 Added date guesser for WST columns.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2346
diff changeset
108 return null;
2e18e12fac11 Added date guesser for WST columns.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2346
diff changeset
109 }
2e18e12fac11 Added date guesser for WST columns.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2346
diff changeset
110
8976
e541938dd3ab Range data handled consistently as BigDecimal to minimize the fractional part of a and b
mschaefer
parents: 8856
diff changeset
111 public void parse(final File file) throws IOException, ParseException {
1211
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
112
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
113 log.info("Parsing WST file '" + file + "'");
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
114
8976
e541938dd3ab Range data handled consistently as BigDecimal to minimize the fractional part of a and b
mschaefer
parents: 8856
diff changeset
115 if (this.wst == null) {
e541938dd3ab Range data handled consistently as BigDecimal to minimize the fractional part of a and b
mschaefer
parents: 8856
diff changeset
116 this.wst = new ImportWst(file.getName());
7375
450582bcad75 Replaced tabs with 4 spaces.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 7374
diff changeset
117 }
450582bcad75 Replaced tabs with 4 spaces.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 7374
diff changeset
118 else {
8976
e541938dd3ab Range data handled consistently as BigDecimal to minimize the fractional part of a and b
mschaefer
parents: 8856
diff changeset
119 this.wst.setDescription(file.getName());
7375
450582bcad75 Replaced tabs with 4 spaces.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 7374
diff changeset
120 }
1211
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
121
8976
e541938dd3ab Range data handled consistently as BigDecimal to minimize the fractional part of a and b
mschaefer
parents: 8856
diff changeset
122 final LineNumberReader in =
e541938dd3ab Range data handled consistently as BigDecimal to minimize the fractional part of a and b
mschaefer
parents: 8856
diff changeset
123 new LineNumberReader(
e541938dd3ab Range data handled consistently as BigDecimal to minimize the fractional part of a and b
mschaefer
parents: 8856
diff changeset
124 new InputStreamReader(
e541938dd3ab Range data handled consistently as BigDecimal to minimize the fractional part of a and b
mschaefer
parents: 8856
diff changeset
125 new FileInputStream(file), ENCODING));
1211
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
126 try {
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
127 String input;
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
128 boolean first = true;
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
129 int columnCount = 0;
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
130
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
131 String [] lsBezeichner = null;
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
132 String [] langBezeichner = null;
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
133 int [] colNaWidths = null;
6504
7664ab97b4c7 Backend: Store source of a wst column if available.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6337
diff changeset
134 String [] quellen = null;
1211
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
135 String [] daten = null;
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
136
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
137 BigDecimal [] aktAbfluesse = null;
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
138 BigDecimal [] firstAbfluesse = null;
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
139
5544
12f4d088f088 WST importer: Cosmetics.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5543
diff changeset
140 BigDecimal minKm = MAX_RANGE;
12f4d088f088 WST importer: Cosmetics.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5543
diff changeset
141 BigDecimal maxKm = MIN_RANGE;
12f4d088f088 WST importer: Cosmetics.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5543
diff changeset
142 BigDecimal kmHist1 = null;
12f4d088f088 WST importer: Cosmetics.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5543
diff changeset
143 BigDecimal kmHist2 = null;
1211
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
144
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
145 boolean columnHeaderChecked = false;
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
146
7883
fc8d5b5f2c99 Removed trailing whitespace.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 7488
diff changeset
147 /* Default string for altitude reference
6819
1d60614c1059 WstParser: warn only once if no unit comment is found
Tom Gottfried <tom.gottfried@intevation.de>
parents: 6809
diff changeset
148 * if none is found in WST-file.
1d60614c1059 WstParser: warn only once if no unit comment is found
Tom Gottfried <tom.gottfried@intevation.de>
parents: 6809
diff changeset
149 * Use in case no unit comment is found in file */
6809
4ff177f48952 WstParser and Importer doc: More sensible default unit and warn if it is used.
Tom Gottfried <tom.gottfried@intevation.de>
parents: 6730
diff changeset
150 String einheit = "m ü. unbekannte Referenz";
6819
1d60614c1059 WstParser: warn only once if no unit comment is found
Tom Gottfried <tom.gottfried@intevation.de>
parents: 6809
diff changeset
151 boolean unitFound = false;
1211
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
152
8976
e541938dd3ab Range data handled consistently as BigDecimal to minimize the fractional part of a and b
mschaefer
parents: 8856
diff changeset
153 final HashSet<BigDecimal> kms = new HashSet<>();
1211
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
154
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
155 while ((input = in.readLine()) != null) {
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
156 String line = input;
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
157 if (first) { // fetch number of columns
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
158 if ((line = line.trim()).length() == 0) {
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
159 continue;
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
160 }
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
161 try {
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
162 columnCount = Integer.parseInt(line);
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
163 if (columnCount <= 0) {
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
164 throw new NumberFormatException(
8976
e541938dd3ab Range data handled consistently as BigDecimal to minimize the fractional part of a and b
mschaefer
parents: 8856
diff changeset
165 "number of columns <= 0");
1211
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
166 }
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
167 log.debug("Number of columns: " + columnCount);
8976
e541938dd3ab Range data handled consistently as BigDecimal to minimize the fractional part of a and b
mschaefer
parents: 8856
diff changeset
168 this.wst.setNumberColumns(columnCount);
1211
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
169 lsBezeichner = new String[columnCount];
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
170 }
8976
e541938dd3ab Range data handled consistently as BigDecimal to minimize the fractional part of a and b
mschaefer
parents: 8856
diff changeset
171 catch (final NumberFormatException nfe) {
3662
0d27d02b1208 backend: Completed the error messages of the importer.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2357
diff changeset
172 log.warn("WST: invalid number.", nfe);
1211
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
173 continue;
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
174 }
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
175 first = false;
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
176 continue;
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
177 }
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
178
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
179 line = line.replace(',', '.');
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
180
7374
82191d111130 WstParser: Do not add Q-range for trailing Q-line.
Tom Gottfried <tom@intevation.de>
parents: 7342
diff changeset
181 // handle Q-lines
1211
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
182 if (line.startsWith("*\u001f")) {
8976
e541938dd3ab Range data handled consistently as BigDecimal to minimize the fractional part of a and b
mschaefer
parents: 8856
diff changeset
183 final BigDecimal [] data = parseLineAsDouble(
e541938dd3ab Range data handled consistently as BigDecimal to minimize the fractional part of a and b
mschaefer
parents: 8856
diff changeset
184 line, columnCount, false, true);
1211
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
185
8856
5e38e2924c07 Fix code style.
Tom Gottfried <tom@intevation.de>
parents: 8187
diff changeset
186 if (aktAbfluesse != null) {
5e38e2924c07 Fix code style.
Tom Gottfried <tom@intevation.de>
parents: 8187
diff changeset
187 // add Q-ranges obtained from previous lines
5544
12f4d088f088 WST importer: Cosmetics.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5543
diff changeset
188 if (kmHist1 != null && kmHist2 != null
8976
e541938dd3ab Range data handled consistently as BigDecimal to minimize the fractional part of a and b
mschaefer
parents: 8856
diff changeset
189 && kmHist1.compareTo(kmHist2) < 0) {
8856
5e38e2924c07 Fix code style.
Tom Gottfried <tom@intevation.de>
parents: 8187
diff changeset
190 // stations descending in file
8976
e541938dd3ab Range data handled consistently as BigDecimal to minimize the fractional part of a and b
mschaefer
parents: 8856
diff changeset
191 final BigDecimal t = minKm; minKm = maxKm; maxKm = t;
5544
12f4d088f088 WST importer: Cosmetics.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5543
diff changeset
192 }
1211
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
193 addInterval(minKm, maxKm, aktAbfluesse);
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
194 minKm = MAX_RANGE;
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
195 maxKm = MIN_RANGE;
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
196 }
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
197
7374
82191d111130 WstParser: Do not add Q-range for trailing Q-line.
Tom Gottfried <tom@intevation.de>
parents: 7342
diff changeset
198 // obtain Q-values from current line
7488
1890bd524d27 WST-Parser: revert the assumption of only complete columns.
Tom Gottfried <tom@intevation.de>
parents: 7487
diff changeset
199 aktAbfluesse = new BigDecimal[data.length];
1211
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
200 log.debug("new q range: " + columnCount);
7488
1890bd524d27 WST-Parser: revert the assumption of only complete columns.
Tom Gottfried <tom@intevation.de>
parents: 7487
diff changeset
201 for (int i = 0; i < data.length; ++i) {
1211
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
202 if (data[i] != null) {
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
203 log.debug(" column: " + data[i]);
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
204 aktAbfluesse[i] = data[i];
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
205 }
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
206 }
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
207
8856
5e38e2924c07 Fix code style.
Tom Gottfried <tom@intevation.de>
parents: 8187
diff changeset
208 // remember Q-values from first Q-line
5e38e2924c07 Fix code style.
Tom Gottfried <tom@intevation.de>
parents: 8187
diff changeset
209 // for header generation
1211
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
210 if (firstAbfluesse == null) {
8976
e541938dd3ab Range data handled consistently as BigDecimal to minimize the fractional part of a and b
mschaefer
parents: 8856
diff changeset
211 firstAbfluesse = aktAbfluesse.clone();
1211
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
212 }
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
213 continue;
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
214 }
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
215
7374
82191d111130 WstParser: Do not add Q-range for trailing Q-line.
Tom Gottfried <tom@intevation.de>
parents: 7342
diff changeset
216 // handle special column identifiers
1211
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
217 if (line.startsWith("*!")) {
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
218 String spezial = line.substring(2).trim();
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
219
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
220 if (spezial.length() == 0) {
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
221 continue;
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
222 }
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
223
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
224 if (spezial.startsWith(COLUMN_BEZ_TEXT)) {
8856
5e38e2924c07 Fix code style.
Tom Gottfried <tom@intevation.de>
parents: 8187
diff changeset
225 spezial = spezial.substring(
8976
e541938dd3ab Range data handled consistently as BigDecimal to minimize the fractional part of a and b
mschaefer
parents: 8856
diff changeset
226 COLUMN_BEZ_TEXT.length()).trim();
1211
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
227 if (spezial.length() == 0) {
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
228 continue;
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
229 }
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
230 langBezeichner = StringUtil.splitQuoted(spezial, '"');
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
231 }
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
232 else if (spezial.startsWith(COLUMN_BEZ_BREITE)) {
8856
5e38e2924c07 Fix code style.
Tom Gottfried <tom@intevation.de>
parents: 8187
diff changeset
233 spezial = spezial.substring(
8976
e541938dd3ab Range data handled consistently as BigDecimal to minimize the fractional part of a and b
mschaefer
parents: 8856
diff changeset
234 COLUMN_BEZ_BREITE.length()).trim();
1211
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
235
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
236 if (spezial.length() == 0) {
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
237 continue;
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
238 }
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
239
8976
e541938dd3ab Range data handled consistently as BigDecimal to minimize the fractional part of a and b
mschaefer
parents: 8856
diff changeset
240 final String[] split = spezial.split("\\s+");
1211
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
241
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
242 colNaWidths = new int[split.length];
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
243 for (int i=0; i < split.length; i++) {
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
244 colNaWidths[i] = Integer.parseInt(split[i]);
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
245 }
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
246 }
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
247 else if (spezial.startsWith(COLUMN_QUELLE)) {
8856
5e38e2924c07 Fix code style.
Tom Gottfried <tom@intevation.de>
parents: 8187
diff changeset
248 spezial = spezial.substring(
8976
e541938dd3ab Range data handled consistently as BigDecimal to minimize the fractional part of a and b
mschaefer
parents: 8856
diff changeset
249 COLUMN_QUELLE.length()).trim();
1211
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
250 if (spezial.length() == 0) {
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
251 continue;
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
252 }
6504
7664ab97b4c7 Backend: Store source of a wst column if available.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6337
diff changeset
253 quellen = StringUtil.splitQuoted(spezial, '"');
7252
c894b7b45c4c Replaced some tabs by spaces. Guys, please configure your editors not to insert tabs!
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6727
diff changeset
254 log.debug("sources: " + Arrays.toString(quellen));
1211
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
255 }
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
256 else if (spezial.startsWith(COLUMN_DATUM)) {
8856
5e38e2924c07 Fix code style.
Tom Gottfried <tom@intevation.de>
parents: 8187
diff changeset
257 spezial = spezial.substring(
8976
e541938dd3ab Range data handled consistently as BigDecimal to minimize the fractional part of a and b
mschaefer
parents: 8856
diff changeset
258 COLUMN_DATUM.length()).trim();
1211
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
259 if (spezial.length() == 0) {
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
260 continue;
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
261 }
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
262 daten = StringUtil.splitQuoted(spezial, '"');
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
263 }
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
264 continue;
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
265 }
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
266
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
267 if (line.length() < 11) {
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
268 continue;
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
269 }
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
270
7374
82191d111130 WstParser: Do not add Q-range for trailing Q-line.
Tom Gottfried <tom@intevation.de>
parents: 7342
diff changeset
271 // handle comment lines to fetch unit
1211
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
272 if (line.startsWith("*")) {
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
273 Matcher m = UNIT_COMMENT.matcher(line);
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
274 if (m.matches()) {
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
275 log.debug("unit comment found");
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
276 // XXX: This hack is needed because desktop
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
277 // FLYS is broken figuring out the unit
8976
e541938dd3ab Range data handled consistently as BigDecimal to minimize the fractional part of a and b
mschaefer
parents: 8856
diff changeset
278 final String [] units = m.group(1).split("\\s{2,}");
1211
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
279 m = UNIT.matcher(units[0]);
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
280 einheit = m.matches() ? m.group(1) : units[0];
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
281 log.debug("unit: " + einheit);
6819
1d60614c1059 WstParser: warn only once if no unit comment is found
Tom Gottfried <tom.gottfried@intevation.de>
parents: 6809
diff changeset
282 unitFound = true;
1211
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
283 }
6819
1d60614c1059 WstParser: warn only once if no unit comment is found
Tom Gottfried <tom.gottfried@intevation.de>
parents: 6809
diff changeset
284
1211
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
285 continue;
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
286 }
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
287
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
288 if (firstAbfluesse != null) {
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
289 if (!columnHeaderChecked) {
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
290 int unknownCount = 0;
8976
e541938dd3ab Range data handled consistently as BigDecimal to minimize the fractional part of a and b
mschaefer
parents: 8856
diff changeset
291 final HashSet<String> uniqueColumnNames =
e541938dd3ab Range data handled consistently as BigDecimal to minimize the fractional part of a and b
mschaefer
parents: 8856
diff changeset
292 new HashSet<>();
6029
f9c5e1a8032d WstParser: set column names from specified line also if unspecified line does not exist
Tom Gottfried <tom.gottfried@intevation.de>
parents: 6028
diff changeset
293 if (langBezeichner != null) {
f9c5e1a8032d WstParser: set column names from specified line also if unspecified line does not exist
Tom Gottfried <tom.gottfried@intevation.de>
parents: 6028
diff changeset
294 // use column name from '*!column-bez-text'-line
f9c5e1a8032d WstParser: set column names from specified line also if unspecified line does not exist
Tom Gottfried <tom.gottfried@intevation.de>
parents: 6028
diff changeset
295 lsBezeichner = StringUtil.fitArray(
8976
e541938dd3ab Range data handled consistently as BigDecimal to minimize the fractional part of a and b
mschaefer
parents: 8856
diff changeset
296 langBezeichner, lsBezeichner);
6029
f9c5e1a8032d WstParser: set column names from specified line also if unspecified line does not exist
Tom Gottfried <tom.gottfried@intevation.de>
parents: 6028
diff changeset
297 }
1211
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
298 for (int i = 0; i < lsBezeichner.length; ++i) {
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
299 if (lsBezeichner[i] == null
8976
e541938dd3ab Range data handled consistently as BigDecimal to minimize the fractional part of a and b
mschaefer
parents: 8856
diff changeset
300 || lsBezeichner[i].length() == 0) {
6029
f9c5e1a8032d WstParser: set column names from specified line also if unspecified line does not exist
Tom Gottfried <tom.gottfried@intevation.de>
parents: 6028
diff changeset
301 // generate alternative column names
8976
e541938dd3ab Range data handled consistently as BigDecimal to minimize the fractional part of a and b
mschaefer
parents: 8856
diff changeset
302 final double q = firstAbfluesse.length > i ?
e541938dd3ab Range data handled consistently as BigDecimal to minimize the fractional part of a and b
mschaefer
parents: 8856
diff changeset
303 firstAbfluesse[i].doubleValue() : 0d;
e541938dd3ab Range data handled consistently as BigDecimal to minimize the fractional part of a and b
mschaefer
parents: 8856
diff changeset
304 if (q < 0.001) {
e541938dd3ab Range data handled consistently as BigDecimal to minimize the fractional part of a and b
mschaefer
parents: 8856
diff changeset
305 lsBezeichner[i] =
e541938dd3ab Range data handled consistently as BigDecimal to minimize the fractional part of a and b
mschaefer
parents: 8856
diff changeset
306 "<unbekannt #" + unknownCount + ">";
e541938dd3ab Range data handled consistently as BigDecimal to minimize the fractional part of a and b
mschaefer
parents: 8856
diff changeset
307 ++unknownCount;
e541938dd3ab Range data handled consistently as BigDecimal to minimize the fractional part of a and b
mschaefer
parents: 8856
diff changeset
308 }
e541938dd3ab Range data handled consistently as BigDecimal to minimize the fractional part of a and b
mschaefer
parents: 8856
diff changeset
309 else {
e541938dd3ab Range data handled consistently as BigDecimal to minimize the fractional part of a and b
mschaefer
parents: 8856
diff changeset
310 lsBezeichner[i] = "Q="+format(q);
e541938dd3ab Range data handled consistently as BigDecimal to minimize the fractional part of a and b
mschaefer
parents: 8856
diff changeset
311 }
1211
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
312 }
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
313 String candidate = lsBezeichner[i];
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
314 int collision = 1;
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
315 while (!uniqueColumnNames.add(candidate)) {
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
316 candidate = lsBezeichner[i] +
8976
e541938dd3ab Range data handled consistently as BigDecimal to minimize the fractional part of a and b
mschaefer
parents: 8856
diff changeset
317 " (" + collision + ")";
1211
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
318 ++collision;
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
319 }
8976
e541938dd3ab Range data handled consistently as BigDecimal to minimize the fractional part of a and b
mschaefer
parents: 8856
diff changeset
320 final ImportWstColumn iwc = this.wst.getColumn(i);
2357
2e18e12fac11 Added date guesser for WST columns.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2346
diff changeset
321 iwc.setName(candidate);
6504
7664ab97b4c7 Backend: Store source of a wst column if available.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6337
diff changeset
322 if (quellen != null && i < quellen.length) {
7664ab97b4c7 Backend: Store source of a wst column if available.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6337
diff changeset
323 iwc.setSource(quellen[i]);
7664ab97b4c7 Backend: Store source of a wst column if available.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6337
diff changeset
324 }
8976
e541938dd3ab Range data handled consistently as BigDecimal to minimize the fractional part of a and b
mschaefer
parents: 8856
diff changeset
325 final String potentialDate =
e541938dd3ab Range data handled consistently as BigDecimal to minimize the fractional part of a and b
mschaefer
parents: 8856
diff changeset
326 daten != null && i < daten.length
e541938dd3ab Range data handled consistently as BigDecimal to minimize the fractional part of a and b
mschaefer
parents: 8856
diff changeset
327 ? daten[i]
e541938dd3ab Range data handled consistently as BigDecimal to minimize the fractional part of a and b
mschaefer
parents: 8856
diff changeset
328 : candidate;
e541938dd3ab Range data handled consistently as BigDecimal to minimize the fractional part of a and b
mschaefer
parents: 8856
diff changeset
329 iwc.setTimeInterval(guessDate(potentialDate));
1211
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
330 }
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
331 columnHeaderChecked = true;
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
332 }
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
333
8976
e541938dd3ab Range data handled consistently as BigDecimal to minimize the fractional part of a and b
mschaefer
parents: 8856
diff changeset
334 final BigDecimal [] data = parseLineAsDouble(
e541938dd3ab Range data handled consistently as BigDecimal to minimize the fractional part of a and b
mschaefer
parents: 8856
diff changeset
335 line, columnCount, true, false);
1211
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
336
8976
e541938dd3ab Range data handled consistently as BigDecimal to minimize the fractional part of a and b
mschaefer
parents: 8856
diff changeset
337 final BigDecimal kaem = data[0];
1211
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
338
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
339 if (!kms.add(kaem)) {
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
340 log.warn(
8976
e541938dd3ab Range data handled consistently as BigDecimal to minimize the fractional part of a and b
mschaefer
parents: 8856
diff changeset
341 "WST: km " + kaem +
e541938dd3ab Range data handled consistently as BigDecimal to minimize the fractional part of a and b
mschaefer
parents: 8856
diff changeset
342 " (line " + in.getLineNumber() +
e541938dd3ab Range data handled consistently as BigDecimal to minimize the fractional part of a and b
mschaefer
parents: 8856
diff changeset
343 ") found more than once. -> ignored");
1211
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
344 continue;
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
345 }
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
346
7342
c9b9176b0530 WST-Parser: check consistence of station ordering in file.
Tom Gottfried <tom@intevation.de>
parents: 7341
diff changeset
347 // check consistence of station ordering in file
7883
fc8d5b5f2c99 Removed trailing whitespace.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 7488
diff changeset
348 if (kmHist2 != null &&
8976
e541938dd3ab Range data handled consistently as BigDecimal to minimize the fractional part of a and b
mschaefer
parents: 8856
diff changeset
349 kmHist2.compareTo(kmHist1) != kmHist1.compareTo(kaem)
e541938dd3ab Range data handled consistently as BigDecimal to minimize the fractional part of a and b
mschaefer
parents: 8856
diff changeset
350 ) {
7883
fc8d5b5f2c99 Removed trailing whitespace.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 7488
diff changeset
351 throw new ParseException("WST: Stations in " + file +
8976
e541938dd3ab Range data handled consistently as BigDecimal to minimize the fractional part of a and b
mschaefer
parents: 8856
diff changeset
352 " near line " + in.getLineNumber() +
e541938dd3ab Range data handled consistently as BigDecimal to minimize the fractional part of a and b
mschaefer
parents: 8856
diff changeset
353 " not ordered. File rejected.");
7375
450582bcad75 Replaced tabs with 4 spaces.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 7374
diff changeset
354 }
7342
c9b9176b0530 WST-Parser: check consistence of station ordering in file.
Tom Gottfried <tom@intevation.de>
parents: 7341
diff changeset
355
c9b9176b0530 WST-Parser: check consistence of station ordering in file.
Tom Gottfried <tom@intevation.de>
parents: 7341
diff changeset
356 // remember stations in two previous lines
5544
12f4d088f088 WST importer: Cosmetics.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5543
diff changeset
357 kmHist2 = kmHist1;
12f4d088f088 WST importer: Cosmetics.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5543
diff changeset
358 kmHist1 = kaem;
5543
732a8bd44650 Wst Parser: Yet another attempt to fix the order of the Q ranges (made by S. Teichmann)
Tom Gottfried <tom.gottfried@intevation.de>
parents: 5542
diff changeset
359
7341
588b02a4078a Comments.
Tom Gottfried <tom@intevation.de>
parents: 7340
diff changeset
360 // iteratively determine actual km-range
1211
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
361 if (kaem.compareTo(minKm) < 0) {
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
362 minKm = kaem;
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
363 }
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
364 if (kaem.compareTo(maxKm) > 0) {
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
365 maxKm = kaem;
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
366 }
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
367
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
368 // extract values
7488
1890bd524d27 WST-Parser: revert the assumption of only complete columns.
Tom Gottfried <tom@intevation.de>
parents: 7487
diff changeset
369 for (int i = 0; i < data.length - 1; ++i) {
1211
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
370 addValue(kaem, data[i+1], i);
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
371 }
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
372
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
373 }
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
374 else { // firstAbfluesse == null
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
375 if (langBezeichner != null) {
6029
f9c5e1a8032d WstParser: set column names from specified line also if unspecified line does not exist
Tom Gottfried <tom.gottfried@intevation.de>
parents: 6028
diff changeset
376 // nothing to do
1211
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
377 }
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
378 else if (colNaWidths != null) {
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
379 for (int j = 0, i = 0, N = input.length();
8976
e541938dd3ab Range data handled consistently as BigDecimal to minimize the fractional part of a and b
mschaefer
parents: 8856
diff changeset
380 j < colNaWidths.length && i < N;
e541938dd3ab Range data handled consistently as BigDecimal to minimize the fractional part of a and b
mschaefer
parents: 8856
diff changeset
381 i += colNaWidths[j++]
e541938dd3ab Range data handled consistently as BigDecimal to minimize the fractional part of a and b
mschaefer
parents: 8856
diff changeset
382 ) {
1211
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
383 lsBezeichner[j] = input.substring(
8976
e541938dd3ab Range data handled consistently as BigDecimal to minimize the fractional part of a and b
mschaefer
parents: 8856
diff changeset
384 i, i+colNaWidths[j]).trim();
1211
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
385 }
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
386 }
7883
fc8d5b5f2c99 Removed trailing whitespace.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 7488
diff changeset
387 else { // fetch column names from non-comment header line
8976
e541938dd3ab Range data handled consistently as BigDecimal to minimize the fractional part of a and b
mschaefer
parents: 8856
diff changeset
388 // (above first Qs)
1211
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
389 // first column begins at position 8 in line
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
390 for (int i = 8, col = 0; i < input.length(); i += 9) {
7480
2a2e89c01588 WST-Parser: Improve handling of line-endings.
Tom Gottfried <tom@intevation.de>
parents: 7375
diff changeset
391 // one column header is 9 chars wide
2a2e89c01588 WST-Parser: Improve handling of line-endings.
Tom Gottfried <tom@intevation.de>
parents: 7375
diff changeset
392 // but the last one may be shorter
2a2e89c01588 WST-Parser: Improve handling of line-endings.
Tom Gottfried <tom@intevation.de>
parents: 7375
diff changeset
393 if (col < lsBezeichner.length) {
2a2e89c01588 WST-Parser: Improve handling of line-endings.
Tom Gottfried <tom@intevation.de>
parents: 7375
diff changeset
394 lsBezeichner[col++] =
8976
e541938dd3ab Range data handled consistently as BigDecimal to minimize the fractional part of a and b
mschaefer
parents: 8856
diff changeset
395 input.substring(
e541938dd3ab Range data handled consistently as BigDecimal to minimize the fractional part of a and b
mschaefer
parents: 8856
diff changeset
396 i,
e541938dd3ab Range data handled consistently as BigDecimal to minimize the fractional part of a and b
mschaefer
parents: 8856
diff changeset
397 Math.min(i + 9, input.length())
e541938dd3ab Range data handled consistently as BigDecimal to minimize the fractional part of a and b
mschaefer
parents: 8856
diff changeset
398 ).trim();
1211
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
399 }
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
400 if (col == lsBezeichner.length) {
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
401 break;
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
402 }
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
403 }
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
404 }
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
405 }
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
406
5542
f3b270e5462e Wst Parser: Another attempt to fix the order of the Q ranges.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5541
diff changeset
407 } // for all lines in WST file
2346
f834b411ca57 Added db table, model class and importer stuff for units.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 1211
diff changeset
408
6819
1d60614c1059 WstParser: warn only once if no unit comment is found
Tom Gottfried <tom.gottfried@intevation.de>
parents: 6809
diff changeset
409 if (!unitFound) {
1d60614c1059 WstParser: warn only once if no unit comment is found
Tom Gottfried <tom.gottfried@intevation.de>
parents: 6809
diff changeset
410 log.warn("no unit and height reference found. Using default.");
1d60614c1059 WstParser: warn only once if no unit comment is found
Tom Gottfried <tom.gottfried@intevation.de>
parents: 6809
diff changeset
411 }
8976
e541938dd3ab Range data handled consistently as BigDecimal to minimize the fractional part of a and b
mschaefer
parents: 8856
diff changeset
412 this.wst.setUnit(new ImportUnit(einheit));
5544
12f4d088f088 WST importer: Cosmetics.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5543
diff changeset
413
7883
fc8d5b5f2c99 Removed trailing whitespace.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 7488
diff changeset
414 // add Q-ranges obtained from previous lines
7374
82191d111130 WstParser: Do not add Q-range for trailing Q-line.
Tom Gottfried <tom@intevation.de>
parents: 7342
diff changeset
415 // in case there was no further Q-line
82191d111130 WstParser: Do not add Q-range for trailing Q-line.
Tom Gottfried <tom@intevation.de>
parents: 7342
diff changeset
416 // but only if there were values following the last Q-line
82191d111130 WstParser: Do not add Q-range for trailing Q-line.
Tom Gottfried <tom@intevation.de>
parents: 7342
diff changeset
417 if (minKm != MAX_RANGE && maxKm != MIN_RANGE) {
7375
450582bcad75 Replaced tabs with 4 spaces.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 7374
diff changeset
418 if (kmHist1 != null && kmHist2 != null
8976
e541938dd3ab Range data handled consistently as BigDecimal to minimize the fractional part of a and b
mschaefer
parents: 8856
diff changeset
419 && kmHist1.compareTo(kmHist2) < 0) {
8856
5e38e2924c07 Fix code style.
Tom Gottfried <tom@intevation.de>
parents: 8187
diff changeset
420 // stations descending in file
8976
e541938dd3ab Range data handled consistently as BigDecimal to minimize the fractional part of a and b
mschaefer
parents: 8856
diff changeset
421 final BigDecimal t = minKm; minKm = maxKm; maxKm = t;
7375
450582bcad75 Replaced tabs with 4 spaces.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 7374
diff changeset
422 }
450582bcad75 Replaced tabs with 4 spaces.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 7374
diff changeset
423 addInterval(minKm, maxKm, aktAbfluesse);
450582bcad75 Replaced tabs with 4 spaces.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 7374
diff changeset
424 }
1211
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
425 }
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
426 finally {
6337
224d7c4b5291 Backend: Create ImportWsts for official lines expicitly. They are going to be somewhat special. Removed some cruft from the WstParser.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6328
diff changeset
427 in.close();
1211
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
428 }
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
429 }
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
430
8976
e541938dd3ab Range data handled consistently as BigDecimal to minimize the fractional part of a and b
mschaefer
parents: 8856
diff changeset
431 protected void addValue(final BigDecimal km, final BigDecimal w, final int index) {
1211
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
432 if (w != null) {
8976
e541938dd3ab Range data handled consistently as BigDecimal to minimize the fractional part of a and b
mschaefer
parents: 8856
diff changeset
433 final ImportWstColumn column = this.wst.getColumn(index);
1211
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
434 column.addColumnValue(km, w);
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
435 }
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
436 }
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
437
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
438 private static final NumberFormat NF = getNumberFormat();
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
439
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
440 private static final NumberFormat getNumberFormat() {
8976
e541938dd3ab Range data handled consistently as BigDecimal to minimize the fractional part of a and b
mschaefer
parents: 8856
diff changeset
441 final NumberFormat nf = NumberFormat.getInstance();
1211
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
442 nf.setMinimumFractionDigits(2);
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
443 nf.setMaximumFractionDigits(2);
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
444 return nf;
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
445 }
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
446
8976
e541938dd3ab Range data handled consistently as BigDecimal to minimize the fractional part of a and b
mschaefer
parents: 8856
diff changeset
447 protected static String format(final double value) {
1211
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
448 return NF.format(value);
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
449 }
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
450
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
451 protected void addInterval(
8976
e541938dd3ab Range data handled consistently as BigDecimal to minimize the fractional part of a and b
mschaefer
parents: 8856
diff changeset
452 final BigDecimal from,
e541938dd3ab Range data handled consistently as BigDecimal to minimize the fractional part of a and b
mschaefer
parents: 8856
diff changeset
453 final BigDecimal to,
e541938dd3ab Range data handled consistently as BigDecimal to minimize the fractional part of a and b
mschaefer
parents: 8856
diff changeset
454 final BigDecimal[] values
e541938dd3ab Range data handled consistently as BigDecimal to minimize the fractional part of a and b
mschaefer
parents: 8856
diff changeset
455 ) {
1211
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
456 log.debug("addInterval: " + from + " " + to);
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
457
5795
202a73ce6704 WST-Parser: Avoid trying to set MIN_RANGE when actually no stations are given
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 5558
diff changeset
458 if (values == null || from == MAX_RANGE || from == MIN_RANGE) {
1211
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
459 return;
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
460 }
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
461
7375
450582bcad75 Replaced tabs with 4 spaces.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 7374
diff changeset
462 // expand single-line i.e. 0-lenght Q-range to minimal length
8976
e541938dd3ab Range data handled consistently as BigDecimal to minimize the fractional part of a and b
mschaefer
parents: 8856
diff changeset
463 final ImportRange range = new ImportRange(from, to);
7375
450582bcad75 Replaced tabs with 4 spaces.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 7374
diff changeset
464 if (from == to) {
8976
e541938dd3ab Range data handled consistently as BigDecimal to minimize the fractional part of a and b
mschaefer
parents: 8856
diff changeset
465 if ((this.lastRange != null) && (this.lastRange.difference() < 0.0))
e541938dd3ab Range data handled consistently as BigDecimal to minimize the fractional part of a and b
mschaefer
parents: 8856
diff changeset
466 range.setB(from.subtract(INTERVAL_GAP));
e541938dd3ab Range data handled consistently as BigDecimal to minimize the fractional part of a and b
mschaefer
parents: 8856
diff changeset
467 else
e541938dd3ab Range data handled consistently as BigDecimal to minimize the fractional part of a and b
mschaefer
parents: 8856
diff changeset
468 range.setB(from.add(INTERVAL_GAP));
7375
450582bcad75 Replaced tabs with 4 spaces.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 7374
diff changeset
469 }
7002
0850a4983fcd Issue1333: expand single-line i.e. 0-lenght Q-range to minimal length.
Tom Gottfried <tom.gottfried@intevation.de>
parents: 6819
diff changeset
470
1211
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
471 // little workaround to make the q ranges tightly fit.
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
472 // Leave a very small gap to ensure that the range queries
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
473 // still work.
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
474
8976
e541938dd3ab Range data handled consistently as BigDecimal to minimize the fractional part of a and b
mschaefer
parents: 8856
diff changeset
475 if (this.lastRange != null) {
e541938dd3ab Range data handled consistently as BigDecimal to minimize the fractional part of a and b
mschaefer
parents: 8856
diff changeset
476 if (this.lastRange.difference() > 0.0)
e541938dd3ab Range data handled consistently as BigDecimal to minimize the fractional part of a and b
mschaefer
parents: 8856
diff changeset
477 this.lastRange.setB(range.getA().subtract(INTERVAL_GAP));
e541938dd3ab Range data handled consistently as BigDecimal to minimize the fractional part of a and b
mschaefer
parents: 8856
diff changeset
478 else // lastA >= lastB
e541938dd3ab Range data handled consistently as BigDecimal to minimize the fractional part of a and b
mschaefer
parents: 8856
diff changeset
479 this.lastRange.setA(range.getB().add(INTERVAL_GAP));
1211
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
480 }
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
481
8976
e541938dd3ab Range data handled consistently as BigDecimal to minimize the fractional part of a and b
mschaefer
parents: 8856
diff changeset
482 for (int i = 0; i < values.length; ++i)
e541938dd3ab Range data handled consistently as BigDecimal to minimize the fractional part of a and b
mschaefer
parents: 8856
diff changeset
483 this.wst.getColumn(i).addColumnQRange(new ImportWstQRange(range, values[i]));
1211
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
484
8976
e541938dd3ab Range data handled consistently as BigDecimal to minimize the fractional part of a and b
mschaefer
parents: 8856
diff changeset
485 this.lastRange = range;
1211
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
486 }
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
487
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
488 private static final BigDecimal [] parseLineAsDouble(
8976
e541938dd3ab Range data handled consistently as BigDecimal to minimize the fractional part of a and b
mschaefer
parents: 8856
diff changeset
489 final String line,
e541938dd3ab Range data handled consistently as BigDecimal to minimize the fractional part of a and b
mschaefer
parents: 8856
diff changeset
490 final int count,
e541938dd3ab Range data handled consistently as BigDecimal to minimize the fractional part of a and b
mschaefer
parents: 8856
diff changeset
491 final boolean bStation,
e541938dd3ab Range data handled consistently as BigDecimal to minimize the fractional part of a and b
mschaefer
parents: 8856
diff changeset
492 final boolean bParseEmptyAsZero
e541938dd3ab Range data handled consistently as BigDecimal to minimize the fractional part of a and b
mschaefer
parents: 8856
diff changeset
493 ) throws ParseException {
e541938dd3ab Range data handled consistently as BigDecimal to minimize the fractional part of a and b
mschaefer
parents: 8856
diff changeset
494 final String [] tokens = parseLine(line, count, bStation);
1211
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
495
8976
e541938dd3ab Range data handled consistently as BigDecimal to minimize the fractional part of a and b
mschaefer
parents: 8856
diff changeset
496 final BigDecimal [] doubles = new BigDecimal[tokens.length];
1211
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
497
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
498 for (int i = 0; i < doubles.length; ++i) {
8976
e541938dd3ab Range data handled consistently as BigDecimal to minimize the fractional part of a and b
mschaefer
parents: 8856
diff changeset
499 final String token = tokens[i].trim();
1211
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
500 if (token.length() != 0) {
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
501 doubles[i] = new BigDecimal(token);
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
502 }
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
503 else if (bParseEmptyAsZero) {
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
504 doubles[i] = UNDEFINED_ZERO;
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
505 }
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
506 }
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
507
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
508 return doubles;
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
509 }
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
510
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
511 private static String [] parseLine(
8976
e541938dd3ab Range data handled consistently as BigDecimal to minimize the fractional part of a and b
mschaefer
parents: 8856
diff changeset
512 final String line,
e541938dd3ab Range data handled consistently as BigDecimal to minimize the fractional part of a and b
mschaefer
parents: 8856
diff changeset
513 final int tokenCount,
e541938dd3ab Range data handled consistently as BigDecimal to minimize the fractional part of a and b
mschaefer
parents: 8856
diff changeset
514 final boolean bParseStation
e541938dd3ab Range data handled consistently as BigDecimal to minimize the fractional part of a and b
mschaefer
parents: 8856
diff changeset
515 ) throws ParseException {
e541938dd3ab Range data handled consistently as BigDecimal to minimize the fractional part of a and b
mschaefer
parents: 8856
diff changeset
516 final ArrayList<String> strings = new ArrayList<>();
1211
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
517
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
518 if (bParseStation) {
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
519 if (line.length() < 8) {
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
520 throw new IllegalArgumentException("station too short");
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
521 }
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
522 strings.add(line.substring(0, 8));
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
523 }
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
524
7481
bdb12632c5f5 WST-Parser and doc: reject files with wrong number of columns.
Tom Gottfried <tom@intevation.de>
parents: 7480
diff changeset
525 int pos = 0;
1211
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
526 for (int i = 0; i < tokenCount; ++i) {
7481
bdb12632c5f5 WST-Parser and doc: reject files with wrong number of columns.
Tom Gottfried <tom@intevation.de>
parents: 7480
diff changeset
527 pos += 9;
bdb12632c5f5 WST-Parser and doc: reject files with wrong number of columns.
Tom Gottfried <tom@intevation.de>
parents: 7480
diff changeset
528 if (pos >= line.length()) {
7488
1890bd524d27 WST-Parser: revert the assumption of only complete columns.
Tom Gottfried <tom@intevation.de>
parents: 7487
diff changeset
529 break;
7481
bdb12632c5f5 WST-Parser and doc: reject files with wrong number of columns.
Tom Gottfried <tom@intevation.de>
parents: 7480
diff changeset
530 }
7883
fc8d5b5f2c99 Removed trailing whitespace.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 7488
diff changeset
531 strings.add(line.substring(pos,
8976
e541938dd3ab Range data handled consistently as BigDecimal to minimize the fractional part of a and b
mschaefer
parents: 8856
diff changeset
532 Math.min(pos + 8, line.length())));
1211
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
533 }
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
534
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
535 return strings.toArray(new String[strings.size()]);
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
536 }
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
537 }
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
538 // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :

http://dive4elements.wald.intevation.org