sascha@1211: package de.intevation.flys.importer.parsers; sascha@1211: sascha@1211: import java.io.File; sascha@1211: sascha@1211: import java.util.List; sascha@1211: import java.util.ArrayList; sascha@1211: sascha@1211: import java.util.regex.Pattern; sascha@1211: import java.util.regex.Matcher; sascha@1211: sascha@1211: import java.io.IOException; sascha@1211: import java.io.LineNumberReader; sascha@1211: import java.io.FileInputStream; sascha@1211: import java.io.InputStreamReader; sascha@1211: sascha@1211: import org.apache.log4j.Logger; sascha@1211: ingo@1234: import de.intevation.artifacts.common.utils.FileTools; sascha@1211: sascha@1211: import de.intevation.flys.importer.ImportRiver; sascha@1211: felix@4709: felix@4709: /** Processes files mentioned in an info file for a river. */ sascha@1211: public class InfoGewParser sascha@1211: { sascha@1211: private static Logger log = Logger.getLogger(InfoGewParser.class); sascha@1211: sascha@1211: public static final String ENCODING = "ISO-8859-1"; sascha@1211: sascha@1211: public static final Pattern GEWAESSER = sascha@1211: Pattern.compile("^\\s*Gew\u00e4sser\\s*:\\s*(.+)"); sascha@1211: sascha@1211: public static final Pattern WST_DATEI = sascha@1211: Pattern.compile("^\\s*WSTDatei\\s*:\\s*(.+)"); sascha@1211: sascha@1211: public static final Pattern BB_INFO = sascha@1211: Pattern.compile("^\\s*B\\+B-Info\\s*:\\s*(.+)"); sascha@1211: sascha@1211: protected ArrayList rivers; sascha@1211: sascha@1211: protected AnnotationClassifier annotationClassifier; sascha@1211: sascha@1211: public InfoGewParser() { sascha@1211: this(null); sascha@1211: } sascha@1211: sascha@1211: public InfoGewParser(AnnotationClassifier annotationClassifier) { sascha@1211: rivers = new ArrayList(); sascha@1211: this.annotationClassifier = annotationClassifier; sascha@1211: } sascha@1211: sascha@1211: public List getRivers() { sascha@1211: return rivers; sascha@1211: } sascha@1211: sascha@1211: public static final String normalize(String f) { sascha@1211: return f.replace("\\", "/").replace("/", File.separator); sascha@1211: } sascha@1211: felix@5016: /** Handle a gew, wst, or bb_info file. */ sascha@1211: public void parse(File file) throws IOException { sascha@1211: sascha@1211: LineNumberReader in = null; sascha@1211: sascha@1211: File root = file.getParentFile(); sascha@1211: sascha@1211: try { sascha@1211: in = sascha@1211: new LineNumberReader( sascha@1211: new InputStreamReader( sascha@1211: new FileInputStream(file), ENCODING)); sascha@1211: sascha@1211: String line = null; sascha@1211: sascha@1211: String riverName = null; sascha@1211: File wstFile = null; sascha@1211: File bbInfoFile = null; sascha@1211: sascha@1211: while ((line = in.readLine()) != null) { sascha@1211: if ((line = line.trim()).length() == 0) { sascha@1211: continue; sascha@1211: } sascha@1211: Matcher m = GEWAESSER.matcher(line); sascha@1211: sascha@1211: if (m.matches()) { sascha@1211: String river = m.group(1); sascha@1211: log.info("Found river '" + river + "'"); sascha@1211: if (riverName != null) { sascha@1211: rivers.add(new ImportRiver( sascha@1211: riverName, sascha@1211: wstFile, sascha@1211: bbInfoFile, sascha@1211: annotationClassifier)); sascha@1211: } sascha@1211: riverName = river; sascha@1211: wstFile = null; sascha@1211: bbInfoFile = null; sascha@1211: } sascha@1211: else if ((m = WST_DATEI.matcher(line)).matches()) { sascha@1211: String wstFilename = m.group(1); sascha@1211: File wst = new File(wstFilename = normalize(wstFilename)); sascha@1211: if (!wst.isAbsolute()) { sascha@1211: wst = new File(root, wstFilename); sascha@1211: } sascha@1211: wst = FileTools.repair(wst); sascha@1211: log.info("Found wst file '" + wst + "'"); sascha@1211: if (!wst.isFile() || !wst.canRead()) { sascha@1211: log.warn("cannot access WST file '" + wstFilename + "'"); sascha@1211: continue; sascha@1211: } sascha@1211: wstFile = wst; sascha@1211: } sascha@1211: else if ((m = BB_INFO.matcher(line)).matches()) { sascha@1211: //TODO: Make it relative to the wst file. sascha@1211: String bbInfo = m.group(1); sascha@1211: bbInfoFile = new File(normalize(bbInfo)); sascha@1211: } sascha@1211: } sascha@1211: if (riverName != null) { sascha@1211: rivers.add(new ImportRiver( sascha@1211: riverName, sascha@1211: wstFile, sascha@1211: bbInfoFile, sascha@1211: annotationClassifier)); sascha@1211: } sascha@1211: } sascha@1211: finally { sascha@1211: if (in != null) { sascha@1211: in.close(); sascha@1211: } sascha@1211: } sascha@1211: sascha@1211: for (ImportRiver river: rivers) { sascha@1211: river.parseDependencies(); sascha@1211: } sascha@1211: } sascha@1211: } sascha@1211: // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :