teichmann@6328: /* Copyright (C) 2011, 2012, 2013 by Bundesanstalt für Gewässerkunde teichmann@6328: * Software engineering by Intevation GmbH teichmann@6328: * teichmann@6328: * This file is Free Software under the GNU AGPL (>=v3) teichmann@6328: * and comes with ABSOLUTELY NO WARRANTY! Check out the teichmann@6328: * documentation coming with Dive4Elements River for details. teichmann@6328: */ teichmann@6328: package org.dive4elements.river.importer.parsers; teichmann@6328: teichmann@6328: import java.util.ArrayList; teichmann@6328: import java.util.Date; teichmann@6328: import java.util.List; teichmann@6328: import java.util.regex.Pattern; teichmann@6328: teichmann@6328: import org.apache.log4j.Logger; teichmann@6328: import org.dive4elements.river.importer.ImportTimeInterval; teichmann@6328: import org.dive4elements.river.utils.DateGuesser; teichmann@6328: teichmann@6328: public class NameAndTimeInterval { teichmann@6328: teichmann@6328: private static Logger log = Logger.getLogger(NameAndTimeInterval.class); teichmann@6328: teichmann@6328: // TODO: To be extented. teichmann@6328: private static final Pattern MAIN_VALUE = Pattern.compile( teichmann@6328: "^(HQ|MHW|GLQ|NMQ|HQEXT)(\\d*)$"); teichmann@6328: teichmann@6328: private String name; teichmann@6328: private ImportTimeInterval timeInterval; teichmann@6328: teichmann@6328: public NameAndTimeInterval() { teichmann@6328: } teichmann@6328: teichmann@6328: public NameAndTimeInterval(String name) { teichmann@6328: this(name, null); teichmann@6328: } teichmann@6328: teichmann@6328: public NameAndTimeInterval(String name, ImportTimeInterval timeInterval) { teichmann@6328: this.name = name; teichmann@6328: this.timeInterval = timeInterval; teichmann@6328: } teichmann@6328: teichmann@6328: public String getName() { teichmann@6328: return name; teichmann@6328: } teichmann@6328: teichmann@6328: public ImportTimeInterval getTimeInterval() { teichmann@6328: return timeInterval; teichmann@6328: } teichmann@6328: teichmann@6328: @Override teichmann@6328: public String toString() { teichmann@6328: return "name: " + name + " time interval: " + timeInterval; teichmann@6328: } teichmann@6328: teichmann@6328: public static boolean isMainValue(String s) { teichmann@6328: s = s.replace(" ", "").toUpperCase(); teichmann@6328: return MAIN_VALUE.matcher(s).matches(); teichmann@6328: } teichmann@6328: teichmann@6328: public static NameAndTimeInterval parseName(String name) { teichmann@6328: List result = new ArrayList(); teichmann@6328: teichmann@6328: unbracket(name, 0, result); teichmann@6328: teichmann@6328: int length = result.size(); teichmann@6328: teichmann@6328: if (length < 1) { // Should not happen. teichmann@6328: return new NameAndTimeInterval(name); teichmann@6328: } teichmann@6328: teichmann@6328: if (length == 1) { // No date at all -> use first part. teichmann@6328: return new NameAndTimeInterval(result.get(0).trim()); teichmann@6328: } teichmann@6328: teichmann@6328: if (length == 2) { // e.g. HQ(1994) or HQ(1994 - 1999) teichmann@6328: teichmann@6328: String type = result.get(0).trim(); teichmann@6328: ImportTimeInterval timeInterval = null; teichmann@6328: teichmann@6328: String datePart = result.get(1).trim(); teichmann@6328: if (isMainValue(datePart)) { // e.g. W(HQ100) teichmann@6328: type += "(" + datePart + ")"; teichmann@6328: timeInterval = null; teichmann@6328: } teichmann@6328: else { teichmann@6328: timeInterval = getTimeInterval(result.get(1).trim()); teichmann@6328: teichmann@6328: if (timeInterval == null) { // No date at all. teichmann@6328: type = name; teichmann@6328: } teichmann@6328: } teichmann@6328: teichmann@6328: return new NameAndTimeInterval(type, timeInterval); teichmann@6328: } teichmann@6328: teichmann@6328: if (length == 3) { // e.g W(Q(1994)) or W(Q(1994 - 1999)) teichmann@6328: teichmann@6328: String type = teichmann@6328: result.get(0).trim() + "(" + teichmann@6328: result.get(1).trim() + ")"; teichmann@6328: teichmann@6328: ImportTimeInterval timeInterval = getTimeInterval( teichmann@6328: result.get(2).trim()); teichmann@6328: teichmann@6328: if (timeInterval == null) { // No date at all. teichmann@6328: type = name; teichmann@6328: } teichmann@6328: teichmann@6328: return new NameAndTimeInterval(type, timeInterval); teichmann@6328: } teichmann@6328: teichmann@6328: // more than 3 elements return unmodified. teichmann@6328: teichmann@6328: return new NameAndTimeInterval(name); teichmann@6328: } teichmann@6328: teichmann@6328: private static ImportTimeInterval getTimeInterval(String datePart) { teichmann@6328: teichmann@6328: int minus = datePart.indexOf('-'); teichmann@6328: teichmann@6328: if (minus < 0) { // '-' not found teichmann@6328: teichmann@6328: Date date = null; teichmann@6328: try { teichmann@6328: date = DateGuesser.guessDate(datePart); teichmann@6328: } teichmann@6328: catch (IllegalArgumentException iae) { teichmann@6328: log.warn("STA: Invalid date '" + datePart + "'"); teichmann@6328: return null; teichmann@6328: } teichmann@6328: teichmann@6328: return new ImportTimeInterval(date); teichmann@6328: } teichmann@6328: teichmann@6328: // Found '-' so we have - teichmann@6328: String startPart = datePart.substring(0, minus).trim(); teichmann@6328: String endPart = datePart.substring(minus).trim(); teichmann@6328: teichmann@6328: Date startDate = null; teichmann@6328: Date endDate = null; teichmann@6328: teichmann@6328: try { teichmann@6328: startDate = DateGuesser.guessDate(startPart); teichmann@6328: } teichmann@6328: catch (IllegalArgumentException iae) { teichmann@6328: log.warn("STA: Invalid start date '" + startPart + "'"); teichmann@6328: } teichmann@6328: teichmann@6328: try { teichmann@6328: endDate = DateGuesser.guessDate(endPart); teichmann@6328: } teichmann@6328: catch (IllegalArgumentException iae) { teichmann@6328: log.warn("STA: Invalid end date '" + endPart + "'"); teichmann@6328: } teichmann@6328: teichmann@6328: if (startDate == null) { teichmann@6328: log.warn("STA: Need start date."); teichmann@6328: return null; teichmann@6328: } teichmann@6328: teichmann@6328: return new ImportTimeInterval(startDate, endDate); teichmann@6328: } teichmann@6328: teichmann@6328: private static int unbracket(String s, int index, List result) { teichmann@6328: StringBuilder sb = new StringBuilder(); teichmann@6328: int length = s.length(); teichmann@6328: while (index < length) { teichmann@6328: char c = s.charAt(index); teichmann@6328: switch (c) { teichmann@6328: case '(': teichmann@6328: index = unbracket(s, index+1, result); teichmann@6328: break; teichmann@6328: case ')': teichmann@6328: result.add(0, sb.toString()); teichmann@6328: return index+1; teichmann@6328: default: teichmann@6328: sb.append(c); teichmann@6328: ++index; teichmann@6328: } teichmann@6328: } teichmann@6328: result.add(0, sb.toString()); teichmann@6328: teichmann@6328: return index; teichmann@6328: } teichmann@6328: teichmann@6328: /* teichmann@6328: public static void main(String [] args) { teichmann@6328: for (String arg: args) { teichmann@6328: NameAndTimeInterval nti = parseName(arg); teichmann@6328: System.out.println(arg + " -> " + nti); teichmann@6328: } teichmann@6328: } teichmann@6328: */ teichmann@6328: } teichmann@6328: // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : teichmann@6328: