Mercurial > dive4elements > river
comparison backend/src/main/java/org/dive4elements/river/importer/sinfo/parsers/CollisionParser.java @ 9663:7c1da1b3f6b8
Importer (s/u-info) extensions: further year/date checks for collision files
author | mschaefer |
---|---|
date | Fri, 03 Apr 2020 11:56:45 +0200 |
parents | 8a2a777a8372 |
children |
comparison
equal
deleted
inserted
replaced
9662:f7738e64fce6 | 9663:7c1da1b3f6b8 |
---|---|
12 | 12 |
13 import java.io.File; | 13 import java.io.File; |
14 import java.text.DateFormat; | 14 import java.text.DateFormat; |
15 import java.text.SimpleDateFormat; | 15 import java.text.SimpleDateFormat; |
16 import java.util.ArrayList; | 16 import java.util.ArrayList; |
17 import java.util.Calendar; | |
17 import java.util.Date; | 18 import java.util.Date; |
18 import java.util.EnumMap; | 19 import java.util.EnumMap; |
19 import java.util.HashMap; | 20 import java.util.HashMap; |
20 import java.util.List; | 21 import java.util.List; |
21 import java.util.regex.Matcher; | 22 import java.util.regex.Matcher; |
45 | 46 |
46 /***** FIELDS *****/ | 47 /***** FIELDS *****/ |
47 | 48 |
48 private static final Logger log = Logger.getLogger(CollisionParser.class); | 49 private static final Logger log = Logger.getLogger(CollisionParser.class); |
49 | 50 |
50 private static final Pattern META_YEAR = Pattern.compile("^#\\sJahr:\\s*([12]\\d\\d\\d).*", Pattern.CASE_INSENSITIVE); | 51 private static final Pattern IMPORT_FILENAME = Pattern.compile("Grundberuehrungen_([12]\\d{3})\\.csv", Pattern.CASE_INSENSITIVE); |
52 | |
53 private static final Pattern META_YEAR = Pattern.compile("^#\\sJahr:\\s*([12]\\d{3}).*", Pattern.CASE_INSENSITIVE); | |
51 | 54 |
52 private enum ColTitlePattern { | 55 private enum ColTitlePattern { |
53 DATE("Datum.*"), // | 56 DATE("Datum.*"), // |
54 GAUGE_W("Pegelstand\\s*\\[cm\\].*"), // | 57 GAUGE_W("Pegelstand\\s*\\[cm\\].*"), // |
55 GAUGE_NAME("Bezugspegel.*"), // | 58 GAUGE_NAME("Bezugspegel.*"), // |
70 | 73 |
71 private final EnumMap<ColTitlePattern, Integer> cols = new EnumMap<>(ColTitlePattern.class); | 74 private final EnumMap<ColTitlePattern, Integer> cols = new EnumMap<>(ColTitlePattern.class); |
72 | 75 |
73 private final HashMap<String, CollisionTypeImport> types; | 76 private final HashMap<String, CollisionTypeImport> types; |
74 | 77 |
78 private final int filenameyear; | |
79 | |
75 | 80 |
76 /***** CONSTRUCTORS *****/ | 81 /***** CONSTRUCTORS *****/ |
77 | 82 |
78 public CollisionParser(final File importPath, final File rootRelativePath, final ImportRiver river) { | 83 public CollisionParser(final File importPath, final File rootRelativePath, final ImportRiver river, final int filenameyear) { |
79 super(importPath, rootRelativePath, river); | 84 super(importPath, rootRelativePath, river); |
80 logDebug("CollisionParser.new: calling ImporterSession.getInstance"); | 85 logDebug("CollisionParser.new: calling ImporterSession.getInstance"); |
81 final Session session = ImporterSession.getInstance().getDatabaseSession(); | 86 final Session session = ImporterSession.getInstance().getDatabaseSession(); |
82 this.types = new HashMap<>(); | 87 this.types = new HashMap<>(); |
83 for (final CollisionType type : CollisionType.getTypes(session)) | 88 for (final CollisionType type : CollisionType.getTypes(session)) |
84 this.types.put(type.getName().trim().toLowerCase(), new CollisionTypeImport(type.getName())); | 89 this.types.put(type.getName().trim().toLowerCase(), new CollisionTypeImport(type.getName())); |
90 this.filenameyear = filenameyear; | |
85 } | 91 } |
86 | 92 |
87 | 93 |
88 /***** METHODS *****/ | 94 /***** METHODS *****/ |
89 | 95 |
103 * Creates a list of parsers for all collision import files in a directory | 109 * Creates a list of parsers for all collision import files in a directory |
104 */ | 110 */ |
105 public static List<CollisionParser> createParsers(final File importDir, final File relativeDir, final ImportRiver river) { | 111 public static List<CollisionParser> createParsers(final File importDir, final File relativeDir, final ImportRiver river) { |
106 final List<CollisionParser> parsers = new ArrayList<>(); | 112 final List<CollisionParser> parsers = new ArrayList<>(); |
107 if (importDir.exists()) { | 113 if (importDir.exists()) { |
108 for (final File file : listFiles(importDir, ".csv")) | 114 for (final File file : listFiles(importDir, IMPORT_FILENAME)) { |
109 parsers.add(new CollisionParser(file, new File(relativeDir, file.getName()), river)); | 115 final Matcher m = IMPORT_FILENAME.matcher(file.getName()); |
116 m.matches(); | |
117 final String fnyear = m.group(1); | |
118 parsers.add(new CollisionParser(file, new File(relativeDir, file.getName()), river, Integer.valueOf(fnyear))); | |
119 } | |
110 } | 120 } |
111 return parsers; | 121 return parsers; |
112 } | 122 } |
113 | 123 |
114 @Override | 124 @Override |
131 | 141 |
132 private boolean handleMetaYear() { | 142 private boolean handleMetaYear() { |
133 final Matcher m = META_YEAR.matcher(this.currentLine); | 143 final Matcher m = META_YEAR.matcher(this.currentLine); |
134 if (m.matches()) { | 144 if (m.matches()) { |
135 this.metaPatternsMatched.add(META_YEAR); | 145 this.metaPatternsMatched.add(META_YEAR); |
136 this.seriesHeader.setYear(Integer.parseInt(m.group(1))); | 146 final int year = Integer.parseInt(m.group(1)); |
147 this.seriesHeader.setYear(year); | |
148 if (year != this.filenameyear) | |
149 logLineWarning("Year in file name differs from meta data year"); | |
137 return true; | 150 return true; |
138 } | 151 } |
139 return false; | 152 return false; |
140 } | 153 } |
141 | 154 |
189 } | 202 } |
190 catch (final Exception e) { | 203 catch (final Exception e) { |
191 logLineWarning("Invalid or missing date"); | 204 logLineWarning("Invalid or missing date"); |
192 return null; | 205 return null; |
193 } | 206 } |
207 final Calendar cal = Calendar.getInstance(); | |
208 cal.setTime(eventDate); | |
209 if (cal.get(Calendar.YEAR) != this.seriesHeader.getYear()) { | |
210 logLineWarning("Invalid or missing date"); | |
211 return null; | |
212 } | |
194 final String typeName = values[this.cols.get(ColTitlePattern.TYPE)].trim(); | 213 final String typeName = values[this.cols.get(ColTitlePattern.TYPE)].trim(); |
195 final String typeKey = typeName.toLowerCase(); | 214 final String typeKey = typeName.toLowerCase(); |
196 CollisionTypeImport type = null; | 215 CollisionTypeImport type = null; |
197 if (this.types.containsKey(typeKey)) | 216 if (this.types.containsKey(typeKey)) |
198 type = this.types.get(typeKey); | 217 type = this.types.get(typeKey); |