annotate backend/src/main/java/org/dive4elements/river/importer/parsers/StaFileParser.java @ 5954:f944cc25484c

STA parser: Spaces after gauge name given in spec are sometimes used for gauge name, so parse them
author Tom Gottfried <tom.gottfried@intevation.de>
date Wed, 08 May 2013 18:21:27 +0200
parents 24f9c5146384
children b819209732a0
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 *
4dd33b86dc61 Added header to river backend.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5838
diff changeset
4 * This file is Free Software under the GNU AGPL (>=v3)
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
4dd33b86dc61 Added header to river backend.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5838
diff changeset
6 * documentation coming with Dive4Elements River for details.
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;
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
12 import java.io.IOException;
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
13 import java.io.LineNumberReader;
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
14 import java.io.FileInputStream;
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
15 import java.io.InputStreamReader;
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
16
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
17 import java.math.BigDecimal;
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
18
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
19 import java.util.regex.Pattern;
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
20 import java.util.regex.Matcher;
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
21
5735
c75be5205a69 Backend: Parse time intervals for main values.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5691
diff changeset
22 import java.util.Date;
1211
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
23 import java.util.HashMap;
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
24 import java.util.ArrayList;
5735
c75be5205a69 Backend: Parse time intervals for main values.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5691
diff changeset
25 import java.util.List;
1211
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
26
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
27 import org.apache.log4j.Logger;
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
28
5829
18619c1e7c2a Repaired internal references.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5828
diff changeset
29 import org.dive4elements.river.importer.ImportMainValueType;
18619c1e7c2a Repaired internal references.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5828
diff changeset
30 import org.dive4elements.river.importer.ImportMainValue;
18619c1e7c2a Repaired internal references.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5828
diff changeset
31 import org.dive4elements.river.importer.ImportNamedMainValue;
18619c1e7c2a Repaired internal references.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5828
diff changeset
32 import org.dive4elements.river.importer.ImportGauge;
18619c1e7c2a Repaired internal references.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5828
diff changeset
33 import org.dive4elements.river.importer.ImportTimeInterval;
18619c1e7c2a Repaired internal references.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5828
diff changeset
34 import org.dive4elements.river.utils.DateGuesser;
1211
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 public class StaFileParser
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 private static Logger log = Logger.getLogger(StaFileParser.class);
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
39
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
40 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
41
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
42 public static final String TYPES =
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
43 System.getProperty("flys.backend.main.value.types", "QWTD");
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
44
5176
6553c8e364db import gauge number by default (made by S. Teichmann)
Tom Gottfried <tom@intevation.de>
parents: 3660
diff changeset
45 public static final boolean NOT_PARSE_GAUGE_NUMBERS =
6553c8e364db import gauge number by default (made by S. Teichmann)
Tom Gottfried <tom@intevation.de>
parents: 3660
diff changeset
46 Boolean.getBoolean("flys.backend.sta.not.parse.gauge.numbers");
2377
d183ae164cfc Make parsing of official numbers out of STA files being enabled with new system property.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2371
diff changeset
47
1211
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
48 public static final Pattern QWTD_ =
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
49 Pattern.compile("\\s*([^\\s]+)\\s+([^\\s]+)\\s+([" +
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
50 Pattern.quote(TYPES) + "]).*");
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
51
5902
24f9c5146384 Backend: Fixed recognition of main values in STA parser.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5844
diff changeset
52 // TODO: To be extented.
24f9c5146384 Backend: Fixed recognition of main values in STA parser.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5844
diff changeset
53 private static final Pattern MAIN_VALUE = Pattern.compile(
24f9c5146384 Backend: Fixed recognition of main values in STA parser.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5844
diff changeset
54 "^(HQ|MHW|GLQ|NMQ|HQEXT)(\\d*)$");
24f9c5146384 Backend: Fixed recognition of main values in STA parser.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5844
diff changeset
55
24f9c5146384 Backend: Fixed recognition of main values in STA parser.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5844
diff changeset
56 private static boolean isMainValue(String s) {
24f9c5146384 Backend: Fixed recognition of main values in STA parser.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5844
diff changeset
57 s = s.replace(" ", "").toUpperCase();
24f9c5146384 Backend: Fixed recognition of main values in STA parser.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5844
diff changeset
58 return MAIN_VALUE.matcher(s).matches();
24f9c5146384 Backend: Fixed recognition of main values in STA parser.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5844
diff changeset
59 }
24f9c5146384 Backend: Fixed recognition of main values in STA parser.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5844
diff changeset
60
24f9c5146384 Backend: Fixed recognition of main values in STA parser.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5844
diff changeset
61
5735
c75be5205a69 Backend: Parse time intervals for main values.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5691
diff changeset
62 public static final class NameAndTimeInterval {
c75be5205a69 Backend: Parse time intervals for main values.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5691
diff changeset
63 private String name;
c75be5205a69 Backend: Parse time intervals for main values.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5691
diff changeset
64 private ImportTimeInterval timeInterval;
c75be5205a69 Backend: Parse time intervals for main values.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5691
diff changeset
65
c75be5205a69 Backend: Parse time intervals for main values.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5691
diff changeset
66 public NameAndTimeInterval(String name) {
c75be5205a69 Backend: Parse time intervals for main values.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5691
diff changeset
67 this(name, null);
c75be5205a69 Backend: Parse time intervals for main values.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5691
diff changeset
68 }
c75be5205a69 Backend: Parse time intervals for main values.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5691
diff changeset
69
c75be5205a69 Backend: Parse time intervals for main values.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5691
diff changeset
70 public NameAndTimeInterval(String name, ImportTimeInterval timeInterval) {
c75be5205a69 Backend: Parse time intervals for main values.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5691
diff changeset
71 this.name = name;
c75be5205a69 Backend: Parse time intervals for main values.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5691
diff changeset
72 this.timeInterval = timeInterval;
c75be5205a69 Backend: Parse time intervals for main values.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5691
diff changeset
73 }
c75be5205a69 Backend: Parse time intervals for main values.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5691
diff changeset
74
c75be5205a69 Backend: Parse time intervals for main values.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5691
diff changeset
75 public String getName() {
c75be5205a69 Backend: Parse time intervals for main values.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5691
diff changeset
76 return name;
c75be5205a69 Backend: Parse time intervals for main values.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5691
diff changeset
77 }
c75be5205a69 Backend: Parse time intervals for main values.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5691
diff changeset
78
c75be5205a69 Backend: Parse time intervals for main values.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5691
diff changeset
79 public ImportTimeInterval getTimeInterval() {
c75be5205a69 Backend: Parse time intervals for main values.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5691
diff changeset
80 return timeInterval;
c75be5205a69 Backend: Parse time intervals for main values.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5691
diff changeset
81 }
5902
24f9c5146384 Backend: Fixed recognition of main values in STA parser.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5844
diff changeset
82
24f9c5146384 Backend: Fixed recognition of main values in STA parser.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5844
diff changeset
83 @Override
24f9c5146384 Backend: Fixed recognition of main values in STA parser.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5844
diff changeset
84 public String toString() {
24f9c5146384 Backend: Fixed recognition of main values in STA parser.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5844
diff changeset
85 return "name: " + name + " time interval: " + timeInterval;
24f9c5146384 Backend: Fixed recognition of main values in STA parser.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5844
diff changeset
86 }
5735
c75be5205a69 Backend: Parse time intervals for main values.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5691
diff changeset
87 } // class NameAndTimeInterval
c75be5205a69 Backend: Parse time intervals for main values.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5691
diff changeset
88
1211
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
89 public StaFileParser() {
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
90 }
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
91
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
92 public boolean parse(ImportGauge gauge) throws IOException {
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
93
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
94 File file = gauge.getStaFile();
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
95
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
96 log.info("parsing STA file: " + file);
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
97 LineNumberReader in = null;
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
98 try {
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
99 in =
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
100 new LineNumberReader(
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
101 new InputStreamReader(
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
102 new FileInputStream(file), ENCODING));
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
103
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
104 String line = in.readLine();
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
105
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
106 if (line == null) {
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
107 log.warn("STA file is empty.");
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
108 return false;
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
109 }
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
110
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
111 if (line.length() < 37) {
3660
976ead36192d backend: Mention backend warnings in importer.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2377
diff changeset
112 log.warn("First line in STA file is too short.");
1211
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
113 return false;
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
114 }
2377
d183ae164cfc Make parsing of official numbers out of STA files being enabled with new system property.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2371
diff changeset
115
5954
f944cc25484c STA parser: Spaces after gauge name given in spec are sometimes used for gauge name, so parse them
Tom Gottfried <tom.gottfried@intevation.de>
parents: 5902
diff changeset
116 String gaugeName = line.substring(16, 35).trim();
1211
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
117
2371
fe89d6cf55fb Added support for official gauge numbers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1211
diff changeset
118 Long gaugeNumber = null;
2377
d183ae164cfc Make parsing of official numbers out of STA files being enabled with new system property.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2371
diff changeset
119
5176
6553c8e364db import gauge number by default (made by S. Teichmann)
Tom Gottfried <tom@intevation.de>
parents: 3660
diff changeset
120 if (!NOT_PARSE_GAUGE_NUMBERS) {
5632
33aa0d152f54 StaFileParser: take correct substring for gauge number
Tom Gottfried <tom.gottfried@intevation.de>
parents: 5176
diff changeset
121 String gaugeNumberString = line.substring(8, 16).trim();
2377
d183ae164cfc Make parsing of official numbers out of STA files being enabled with new system property.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2371
diff changeset
122
d183ae164cfc Make parsing of official numbers out of STA files being enabled with new system property.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2371
diff changeset
123 try {
d183ae164cfc Make parsing of official numbers out of STA files being enabled with new system property.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2371
diff changeset
124 gaugeNumber = Long.parseLong(gaugeNumberString);
d183ae164cfc Make parsing of official numbers out of STA files being enabled with new system property.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2371
diff changeset
125 }
d183ae164cfc Make parsing of official numbers out of STA files being enabled with new system property.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2371
diff changeset
126 catch (NumberFormatException nfe) {
3660
976ead36192d backend: Mention backend warnings in importer.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2377
diff changeset
127 log.warn("STA: '" + gaugeNumberString +
2377
d183ae164cfc Make parsing of official numbers out of STA files being enabled with new system property.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2371
diff changeset
128 "' is not a valid long number.");
d183ae164cfc Make parsing of official numbers out of STA files being enabled with new system property.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2371
diff changeset
129 }
2371
fe89d6cf55fb Added support for official gauge numbers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1211
diff changeset
130 }
fe89d6cf55fb Added support for official gauge numbers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1211
diff changeset
131
fe89d6cf55fb Added support for official gauge numbers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1211
diff changeset
132 gauge.setName(gaugeName);
fe89d6cf55fb Added support for official gauge numbers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1211
diff changeset
133 gauge.setOfficialNumber(gaugeNumber);
fe89d6cf55fb Added support for official gauge numbers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1211
diff changeset
134
fe89d6cf55fb Added support for official gauge numbers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1211
diff changeset
135 if (log.isDebugEnabled()) {
fe89d6cf55fb Added support for official gauge numbers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1211
diff changeset
136 log.debug(
fe89d6cf55fb Added support for official gauge numbers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1211
diff changeset
137 "name/number: '" + gaugeName + "' '" + gaugeNumber + "'");
fe89d6cf55fb Added support for official gauge numbers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1211
diff changeset
138 }
1211
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
139
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
140 String [] values = line.substring(38).trim().split("\\s+", 2);
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
141
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
142 if (values.length < 2) {
3660
976ead36192d backend: Mention backend warnings in importer.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2377
diff changeset
143 log.warn("STA: Not enough columns for aeo and datum.");
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 try {
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
146 gauge.setAeo(new BigDecimal(values[0].replace(",", ".")));
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
147 gauge.setDatum(new BigDecimal(values[1].replace(",", ".")));
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
148 }
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
149 catch (NumberFormatException nfe) {
3660
976ead36192d backend: Mention backend warnings in importer.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2377
diff changeset
150 log.warn("STA: cannot parse aeo or datum.");
1211
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
151 return false;
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
152 }
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
153
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
154 line = in.readLine();
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
155
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
156 if (line == null) {
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
157 log.warn("STA file has not enough lines");
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
158 return false;
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
159 }
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 if (line.length() < 36) {
3660
976ead36192d backend: Mention backend warnings in importer.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2377
diff changeset
162 log.warn("STA: second line is too short");
1211
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
163 return false;
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
164 }
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
165
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
166 try {
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
167 gauge.setStation(
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
168 new BigDecimal(line.substring(29, 36).trim()));
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
169 }
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
170 catch (NumberFormatException nfe) {
3660
976ead36192d backend: Mention backend warnings in importer.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2377
diff changeset
171 log.warn("STA: parsing of the datum of the gauge failed");
1211
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
172 return false;
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
173 }
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 // overread the next six lines
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
176 for (int i = 0; i < 6; ++i) {
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
177 if ((line = in.readLine()) == null) {
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
178 log.warn("STA file is too short");
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
179 return false;
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
180 }
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
181 }
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
182
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
183 HashMap<String, ImportMainValueType> types =
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
184 new HashMap<String, ImportMainValueType>();
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
185
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
186 ArrayList<ImportNamedMainValue> namedMainValues =
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
187 new ArrayList<ImportNamedMainValue>();
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
188
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
189 ArrayList<ImportMainValue> mainValues =
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
190 new ArrayList<ImportMainValue>();
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
191
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
192 while ((line = in.readLine()) != null) {
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
193 Matcher m = QWTD_.matcher(line);
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
194 if (m.matches()) {
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
195 BigDecimal value;
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
196 try {
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
197 value = new BigDecimal(m.group(2).replace(",", "."));
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
198 }
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
199 catch (NumberFormatException nfe) {
3660
976ead36192d backend: Mention backend warnings in importer.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2377
diff changeset
200 log.warn("STA: value not parseable in line "
1211
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
201 + in.getLineNumber());
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
202 continue;
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
203 }
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
204 String typeString = m.group(3);
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
205 log.debug("\t type: " + typeString);
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
206 ImportMainValueType type = types.get(typeString);
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
207 if (type == null) {
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
208 type = new ImportMainValueType(typeString);
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
209 types.put(typeString, type);
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
210 }
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
211 String name = m.group(1);
5735
c75be5205a69 Backend: Parse time intervals for main values.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5691
diff changeset
212 NameAndTimeInterval nat = parseName(name);
1211
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
213 ImportNamedMainValue namedMainValue =
5735
c75be5205a69 Backend: Parse time intervals for main values.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5691
diff changeset
214 new ImportNamedMainValue(type, nat.getName());
1211
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
215 namedMainValues.add(namedMainValue);
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
216
5735
c75be5205a69 Backend: Parse time intervals for main values.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5691
diff changeset
217 ImportMainValue mainValue = new ImportMainValue(
c75be5205a69 Backend: Parse time intervals for main values.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5691
diff changeset
218 gauge,
c75be5205a69 Backend: Parse time intervals for main values.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5691
diff changeset
219 namedMainValue,
c75be5205a69 Backend: Parse time intervals for main values.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5691
diff changeset
220 value,
c75be5205a69 Backend: Parse time intervals for main values.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5691
diff changeset
221 nat.getTimeInterval());
1211
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 mainValues.add(mainValue);
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
224 }
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
225 else {
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
226 // TODO: treat as a comment
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
227 }
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
228 }
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
229 gauge.setMainValueTypes(
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
230 new ArrayList<ImportMainValueType>(types.values()));
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
231 gauge.setNamedMainValues(namedMainValues);
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
232 gauge.setMainValues(mainValues);
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
233 }
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
234 finally {
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
235 if (in != null) {
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
236 in.close();
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
237 }
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 log.info("finished parsing STA file: " + file);
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
240 return true;
f08fe480092c Moved file parsers to separate package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
241 }
5735
c75be5205a69 Backend: Parse time intervals for main values.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5691
diff changeset
242
5902
24f9c5146384 Backend: Fixed recognition of main values in STA parser.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5844
diff changeset
243 protected static NameAndTimeInterval parseName(String name) {
5735
c75be5205a69 Backend: Parse time intervals for main values.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5691
diff changeset
244 List<String> result = new ArrayList<String>();
c75be5205a69 Backend: Parse time intervals for main values.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5691
diff changeset
245
c75be5205a69 Backend: Parse time intervals for main values.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5691
diff changeset
246 unbracket(name, 0, result);
c75be5205a69 Backend: Parse time intervals for main values.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5691
diff changeset
247
c75be5205a69 Backend: Parse time intervals for main values.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5691
diff changeset
248 int length = result.size();
c75be5205a69 Backend: Parse time intervals for main values.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5691
diff changeset
249
c75be5205a69 Backend: Parse time intervals for main values.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5691
diff changeset
250 if (length < 1) { // Should not happen.
c75be5205a69 Backend: Parse time intervals for main values.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5691
diff changeset
251 return new NameAndTimeInterval(name);
c75be5205a69 Backend: Parse time intervals for main values.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5691
diff changeset
252 }
c75be5205a69 Backend: Parse time intervals for main values.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5691
diff changeset
253
c75be5205a69 Backend: Parse time intervals for main values.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5691
diff changeset
254 if (length == 1) { // No date at all -> use first part.
c75be5205a69 Backend: Parse time intervals for main values.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5691
diff changeset
255 return new NameAndTimeInterval(result.get(0).trim());
c75be5205a69 Backend: Parse time intervals for main values.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5691
diff changeset
256 }
c75be5205a69 Backend: Parse time intervals for main values.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5691
diff changeset
257
5902
24f9c5146384 Backend: Fixed recognition of main values in STA parser.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5844
diff changeset
258 if (length == 2) { // e.g. HQ(1994) or HQ(1994 - 1999)
5735
c75be5205a69 Backend: Parse time intervals for main values.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5691
diff changeset
259
5902
24f9c5146384 Backend: Fixed recognition of main values in STA parser.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5844
diff changeset
260 String type = result.get(0).trim();
24f9c5146384 Backend: Fixed recognition of main values in STA parser.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5844
diff changeset
261 ImportTimeInterval timeInterval = null;
5735
c75be5205a69 Backend: Parse time intervals for main values.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5691
diff changeset
262
5902
24f9c5146384 Backend: Fixed recognition of main values in STA parser.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5844
diff changeset
263 String datePart = result.get(1).trim();
24f9c5146384 Backend: Fixed recognition of main values in STA parser.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5844
diff changeset
264 if (isMainValue(datePart)) { // e.g. W(HQ100)
24f9c5146384 Backend: Fixed recognition of main values in STA parser.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5844
diff changeset
265 type += "(" + datePart + ")";
24f9c5146384 Backend: Fixed recognition of main values in STA parser.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5844
diff changeset
266 timeInterval = null;
24f9c5146384 Backend: Fixed recognition of main values in STA parser.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5844
diff changeset
267 }
24f9c5146384 Backend: Fixed recognition of main values in STA parser.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5844
diff changeset
268 else {
24f9c5146384 Backend: Fixed recognition of main values in STA parser.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5844
diff changeset
269 timeInterval = getTimeInterval(result.get(1).trim());
24f9c5146384 Backend: Fixed recognition of main values in STA parser.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5844
diff changeset
270
24f9c5146384 Backend: Fixed recognition of main values in STA parser.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5844
diff changeset
271 if (timeInterval == null) { // No date at all.
24f9c5146384 Backend: Fixed recognition of main values in STA parser.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5844
diff changeset
272 type = name;
24f9c5146384 Backend: Fixed recognition of main values in STA parser.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5844
diff changeset
273 }
5735
c75be5205a69 Backend: Parse time intervals for main values.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5691
diff changeset
274 }
c75be5205a69 Backend: Parse time intervals for main values.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5691
diff changeset
275
c75be5205a69 Backend: Parse time intervals for main values.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5691
diff changeset
276 return new NameAndTimeInterval(type, timeInterval);
c75be5205a69 Backend: Parse time intervals for main values.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5691
diff changeset
277 }
c75be5205a69 Backend: Parse time intervals for main values.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5691
diff changeset
278
c75be5205a69 Backend: Parse time intervals for main values.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5691
diff changeset
279 if (length == 3) { // e.g W(Q(1994)) or W(Q(1994 - 1999))
c75be5205a69 Backend: Parse time intervals for main values.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5691
diff changeset
280
c75be5205a69 Backend: Parse time intervals for main values.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5691
diff changeset
281 String type =
5902
24f9c5146384 Backend: Fixed recognition of main values in STA parser.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5844
diff changeset
282 result.get(0).trim() + "(" +
5735
c75be5205a69 Backend: Parse time intervals for main values.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5691
diff changeset
283 result.get(1).trim() + ")";
c75be5205a69 Backend: Parse time intervals for main values.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5691
diff changeset
284
c75be5205a69 Backend: Parse time intervals for main values.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5691
diff changeset
285 ImportTimeInterval timeInterval = getTimeInterval(
c75be5205a69 Backend: Parse time intervals for main values.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5691
diff changeset
286 result.get(2).trim());
c75be5205a69 Backend: Parse time intervals for main values.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5691
diff changeset
287
c75be5205a69 Backend: Parse time intervals for main values.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5691
diff changeset
288 if (timeInterval == null) { // No date at all.
c75be5205a69 Backend: Parse time intervals for main values.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5691
diff changeset
289 type = name;
c75be5205a69 Backend: Parse time intervals for main values.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5691
diff changeset
290 }
c75be5205a69 Backend: Parse time intervals for main values.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5691
diff changeset
291
c75be5205a69 Backend: Parse time intervals for main values.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5691
diff changeset
292 return new NameAndTimeInterval(type, timeInterval);
c75be5205a69 Backend: Parse time intervals for main values.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5691
diff changeset
293 }
c75be5205a69 Backend: Parse time intervals for main values.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5691
diff changeset
294
5736
ab4419948655 Backend: Forgot to handle the unlikely case that there are more than 2 nested brackets in main values.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5735
diff changeset
295 // more than 3 elements return unmodified.
ab4419948655 Backend: Forgot to handle the unlikely case that there are more than 2 nested brackets in main values.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5735
diff changeset
296
ab4419948655 Backend: Forgot to handle the unlikely case that there are more than 2 nested brackets in main values.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5735
diff changeset
297 return new NameAndTimeInterval(name);
5735
c75be5205a69 Backend: Parse time intervals for main values.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5691
diff changeset
298 }
c75be5205a69 Backend: Parse time intervals for main values.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5691
diff changeset
299
c75be5205a69 Backend: Parse time intervals for main values.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5691
diff changeset
300 private static ImportTimeInterval getTimeInterval(String datePart) {
c75be5205a69 Backend: Parse time intervals for main values.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5691
diff changeset
301
c75be5205a69 Backend: Parse time intervals for main values.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5691
diff changeset
302 int minus = datePart.indexOf('-');
c75be5205a69 Backend: Parse time intervals for main values.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5691
diff changeset
303
c75be5205a69 Backend: Parse time intervals for main values.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5691
diff changeset
304 if (minus < 0) { // '-' not found
c75be5205a69 Backend: Parse time intervals for main values.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5691
diff changeset
305
c75be5205a69 Backend: Parse time intervals for main values.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5691
diff changeset
306 Date date = null;
c75be5205a69 Backend: Parse time intervals for main values.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5691
diff changeset
307 try {
c75be5205a69 Backend: Parse time intervals for main values.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5691
diff changeset
308 date = DateGuesser.guessDate(datePart);
c75be5205a69 Backend: Parse time intervals for main values.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5691
diff changeset
309 }
c75be5205a69 Backend: Parse time intervals for main values.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5691
diff changeset
310 catch (IllegalArgumentException iae) {
c75be5205a69 Backend: Parse time intervals for main values.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5691
diff changeset
311 log.warn("STA: Invalid date '" + datePart + "'");
c75be5205a69 Backend: Parse time intervals for main values.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5691
diff changeset
312 return null;
c75be5205a69 Backend: Parse time intervals for main values.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5691
diff changeset
313 }
c75be5205a69 Backend: Parse time intervals for main values.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5691
diff changeset
314
c75be5205a69 Backend: Parse time intervals for main values.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5691
diff changeset
315 return new ImportTimeInterval(date);
c75be5205a69 Backend: Parse time intervals for main values.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5691
diff changeset
316 }
c75be5205a69 Backend: Parse time intervals for main values.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5691
diff changeset
317
c75be5205a69 Backend: Parse time intervals for main values.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5691
diff changeset
318 // Found '-' so we have <from> - <to>
c75be5205a69 Backend: Parse time intervals for main values.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5691
diff changeset
319 String startPart = datePart.substring(0, minus).trim();
c75be5205a69 Backend: Parse time intervals for main values.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5691
diff changeset
320 String endPart = datePart.substring(minus).trim();
c75be5205a69 Backend: Parse time intervals for main values.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5691
diff changeset
321
c75be5205a69 Backend: Parse time intervals for main values.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5691
diff changeset
322 Date startDate = null;
c75be5205a69 Backend: Parse time intervals for main values.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5691
diff changeset
323 Date endDate = null;
c75be5205a69 Backend: Parse time intervals for main values.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5691
diff changeset
324
c75be5205a69 Backend: Parse time intervals for main values.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5691
diff changeset
325 try {
c75be5205a69 Backend: Parse time intervals for main values.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5691
diff changeset
326 startDate = DateGuesser.guessDate(startPart);
c75be5205a69 Backend: Parse time intervals for main values.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5691
diff changeset
327 }
c75be5205a69 Backend: Parse time intervals for main values.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5691
diff changeset
328 catch (IllegalArgumentException iae) {
c75be5205a69 Backend: Parse time intervals for main values.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5691
diff changeset
329 log.warn("STA: Invalid start date '" + startPart + "'");
c75be5205a69 Backend: Parse time intervals for main values.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5691
diff changeset
330 }
c75be5205a69 Backend: Parse time intervals for main values.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5691
diff changeset
331
c75be5205a69 Backend: Parse time intervals for main values.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5691
diff changeset
332 try {
c75be5205a69 Backend: Parse time intervals for main values.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5691
diff changeset
333 endDate = DateGuesser.guessDate(endPart);
c75be5205a69 Backend: Parse time intervals for main values.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5691
diff changeset
334 }
c75be5205a69 Backend: Parse time intervals for main values.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5691
diff changeset
335 catch (IllegalArgumentException iae) {
c75be5205a69 Backend: Parse time intervals for main values.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5691
diff changeset
336 log.warn("STA: Invalid end date '" + endPart + "'");
c75be5205a69 Backend: Parse time intervals for main values.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5691
diff changeset
337 }
c75be5205a69 Backend: Parse time intervals for main values.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5691
diff changeset
338
c75be5205a69 Backend: Parse time intervals for main values.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5691
diff changeset
339 if (startDate == null) {
c75be5205a69 Backend: Parse time intervals for main values.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5691
diff changeset
340 log.warn("STA: Need start date.");
c75be5205a69 Backend: Parse time intervals for main values.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5691
diff changeset
341 return null;
c75be5205a69 Backend: Parse time intervals for main values.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5691
diff changeset
342 }
c75be5205a69 Backend: Parse time intervals for main values.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5691
diff changeset
343
c75be5205a69 Backend: Parse time intervals for main values.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5691
diff changeset
344 return new ImportTimeInterval(startDate, endDate);
c75be5205a69 Backend: Parse time intervals for main values.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5691
diff changeset
345 }
c75be5205a69 Backend: Parse time intervals for main values.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5691
diff changeset
346
c75be5205a69 Backend: Parse time intervals for main values.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5691
diff changeset
347 private static int unbracket(String s, int index, List<String> result) {
c75be5205a69 Backend: Parse time intervals for main values.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5691
diff changeset
348 StringBuilder sb = new StringBuilder();
c75be5205a69 Backend: Parse time intervals for main values.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5691
diff changeset
349 int length = s.length();
c75be5205a69 Backend: Parse time intervals for main values.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5691
diff changeset
350 while (index < length) {
c75be5205a69 Backend: Parse time intervals for main values.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5691
diff changeset
351 char c = s.charAt(index);
c75be5205a69 Backend: Parse time intervals for main values.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5691
diff changeset
352 switch (c) {
c75be5205a69 Backend: Parse time intervals for main values.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5691
diff changeset
353 case '(':
5738
54077c9c9305 Backend: Fix Stack overflow.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5737
diff changeset
354 index = unbracket(s, index+1, result);
5735
c75be5205a69 Backend: Parse time intervals for main values.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5691
diff changeset
355 break;
c75be5205a69 Backend: Parse time intervals for main values.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5691
diff changeset
356 case ')':
c75be5205a69 Backend: Parse time intervals for main values.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5691
diff changeset
357 result.add(0, sb.toString());
c75be5205a69 Backend: Parse time intervals for main values.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5691
diff changeset
358 return index+1;
c75be5205a69 Backend: Parse time intervals for main values.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5691
diff changeset
359 default:
c75be5205a69 Backend: Parse time intervals for main values.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5691
diff changeset
360 sb.append(c);
5737
ce002608992d Backend: Forget to increment index.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5736
diff changeset
361 ++index;
5735
c75be5205a69 Backend: Parse time intervals for main values.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5691
diff changeset
362 }
c75be5205a69 Backend: Parse time intervals for main values.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5691
diff changeset
363 }
c75be5205a69 Backend: Parse time intervals for main values.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5691
diff changeset
364 result.add(0, sb.toString());
c75be5205a69 Backend: Parse time intervals for main values.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5691
diff changeset
365
c75be5205a69 Backend: Parse time intervals for main values.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5691
diff changeset
366 return index;
c75be5205a69 Backend: Parse time intervals for main values.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5691
diff changeset
367 }
5902
24f9c5146384 Backend: Fixed recognition of main values in STA parser.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5844
diff changeset
368
24f9c5146384 Backend: Fixed recognition of main values in STA parser.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5844
diff changeset
369 /*
24f9c5146384 Backend: Fixed recognition of main values in STA parser.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5844
diff changeset
370 public static void main(String [] args) {
24f9c5146384 Backend: Fixed recognition of main values in STA parser.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5844
diff changeset
371 for (String arg: args) {
24f9c5146384 Backend: Fixed recognition of main values in STA parser.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5844
diff changeset
372 NameAndTimeInterval nti = parseName(arg);
24f9c5146384 Backend: Fixed recognition of main values in STA parser.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5844
diff changeset
373 System.out.println(arg + " -> " + nti);
24f9c5146384 Backend: Fixed recognition of main values in STA parser.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5844
diff changeset
374 }
24f9c5146384 Backend: Fixed recognition of main values in STA parser.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5844
diff changeset
375 }
24f9c5146384 Backend: Fixed recognition of main values in STA parser.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5844
diff changeset
376 */
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 // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :

http://dive4elements.wald.intevation.org