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 :