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);

http://dive4elements.wald.intevation.org