ingo@2815: package de.intevation.flys.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@4679: * Base-Class for prasers 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:
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@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@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:
ingo@2815: public static Date getDateFromYear(int year) {
ingo@2815: Calendar cal = Calendar.getInstance();
ingo@2815: cal.set(year, 0, 1);
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 :