teichmann@5844: /* Copyright (C) 2011, 2012, 2013 by Bundesanstalt für Gewässerkunde teichmann@5844: * Software engineering by Intevation GmbH teichmann@5844: * teichmann@5992: * This file is Free Software under the GNU AGPL (>=v3) teichmann@5844: * and comes with ABSOLUTELY NO WARRANTY! Check out the teichmann@5992: * documentation coming with Dive4Elements River for details. teichmann@5844: */ teichmann@5844: teichmann@5829: package org.dive4elements.river.importer.parsers; ingo@2815: ingo@2815: import java.io.File; ingo@2815: ingo@4193: import java.text.DateFormat; ingo@4193: import java.text.NumberFormat; ingo@4193: import java.text.ParseException; ingo@4193: import java.text.SimpleDateFormat; ingo@2815: import java.util.Calendar; ingo@2815: import java.util.Date; ingo@2815: import java.util.Locale; ingo@2815: ingo@2815: import java.io.IOException; ingo@2815: import java.io.LineNumberReader; ingo@2815: import java.io.FileInputStream; ingo@2815: import java.io.InputStreamReader; ingo@2815: ingo@2815: import org.apache.log4j.Logger; ingo@2815: ingo@2815: felix@4679: /** felix@6288: * Base-Class for parsers for line-based file formats. felix@4679: * Calls reset(), then read line by line, calling handleLine() for each, felix@4679: * then calls finish(). felix@4679: */ ingo@2815: public abstract class LineParser { ingo@2815: felix@4679: /** Private logger. */ ingo@2815: private static final Logger log = Logger.getLogger(LineParser.class); ingo@2815: ingo@2815: public static final String ENCODING = "ISO-8859-1"; ingo@2815: ingo@2815: public static final Locale DEFAULT_LOCALE = Locale.GERMAN; ingo@2815: ingo@2815: public static final String START_META_CHAR = "#"; ingo@2815: public static final String SEPERATOR_CHAR = ";"; ingo@2815: ingo@2815: ingo@4193: protected abstract void handleLine(int lineNum, String line); ingo@2815: ingo@2815: protected abstract void reset(); ingo@2815: ingo@2815: protected abstract void finish(); ingo@2815: felix@4721: /** Name of file parsed. */ felix@4721: protected String fileName; felix@4721: felix@5809: protected File inputFile; felix@5809: ingo@2815: ingo@2815: /** ingo@2815: * This method reads each line of file. At the beginning, felix@4679: * reset() is called; afterwards for each line handleLine() is ingo@2815: * called; at the end finish is called. ingo@2815: * ingo@2815: * @param file The file which should be parsed. ingo@2815: */ ingo@2815: public void parse(File file) throws IOException { ingo@2815: log.info("Parsing file '" + file + "'"); ingo@2815: felix@5809: inputFile = file; felix@5809: felix@4721: fileName = file.getName(); felix@4721: ingo@2815: reset(); ingo@2815: ingo@2815: LineNumberReader in = null; ingo@2815: try { ingo@2815: in = ingo@2815: new LineNumberReader( ingo@2815: new InputStreamReader( ingo@2815: new FileInputStream(file), ENCODING)); ingo@2815: ingo@4193: String line = null; ingo@4193: int lineNum = 1; ingo@2815: while ((line = in.readLine()) != null) { ingo@2815: if ((line = line.trim()).length() == 0) { ingo@4193: lineNum++; ingo@2815: continue; ingo@2815: } ingo@2815: ingo@4193: handleLine(lineNum++, line); ingo@2815: } ingo@2815: } ingo@2815: finally { ingo@2815: if (in != null) { ingo@2815: in.close(); ingo@2815: } ingo@2815: } ingo@2815: ingo@2815: finish(); ingo@2815: } ingo@2815: ingo@2815: felix@4721: /** Returns the name of the file parsed. */ felix@4721: protected String getFileName() { felix@4721: return fileName; felix@4721: } felix@4721: felix@5809: /** Returns the file currently parsed. */ felix@5809: protected File getInputFile() { felix@5809: return inputFile; felix@5809: } felix@5809: felix@4721: ingo@2815: protected static String stripMetaLine(String line) { ingo@2815: String tmp = line.substring(1, line.length()); ingo@2815: ingo@2815: if (tmp.startsWith(" ")) { ingo@2815: return tmp.substring(1, tmp.length()); ingo@2815: } ingo@2815: else { ingo@2815: return tmp; ingo@2815: } ingo@2815: } ingo@2815: ingo@4193: public static double getDouble(String doubleString) throws ParseException { ingo@4193: NumberFormat nf = NumberFormat.getInstance(DEFAULT_LOCALE); ingo@4193: Number value = nf.parse(doubleString); ingo@4193: ingo@4193: return value.doubleValue(); ingo@4193: } ingo@4193: ingo@4193: public static Date getDate(String dateString) throws ParseException { ingo@4193: DateFormat df = SimpleDateFormat.getDateInstance( ingo@4193: SimpleDateFormat.MEDIUM, DEFAULT_LOCALE); ingo@4193: ingo@4193: return df.parse(dateString); ingo@4193: } ingo@4193: ingo@2815: felix@6288: /** Create Date on first moment (1st jan) of given year. */ tom@5845: public static Date getStartDateFromYear(int year) { ingo@2815: Calendar cal = Calendar.getInstance(); teichmann@7252: cal.clear(); tom@5845: cal.set(year, 0, 1, 0, 0, 0); tom@5845: tom@5845: return cal.getTime(); tom@5845: } tom@5845: felix@6288: felix@6289: /** Create Date on last moment (31st dec) of given year. */ tom@5845: public static Date getEndDateFromYear(int year) { tom@5845: Calendar cal = Calendar.getInstance(); teichmann@7252: cal.clear(); tom@5845: cal.set(year, 11, 31, 23, 59, 59); ingo@2815: ingo@2815: return cal.getTime(); ingo@2815: } ingo@2815: } ingo@2815: // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :