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; sascha@1211: sascha@1211: import java.io.File; sascha@1211: import java.io.FileInputStream; sascha@1211: import java.io.InputStreamReader; mschaefer@9650: import java.io.LineNumberReader; mschaefer@9650: import java.util.ArrayList; mschaefer@9650: import java.util.List; mschaefer@9650: import java.util.regex.Matcher; mschaefer@9650: import java.util.regex.Pattern; sascha@1211: sascha@1211: import org.apache.log4j.Logger; teichmann@5829: import org.dive4elements.artifacts.common.utils.FileTools; teichmann@5829: import org.dive4elements.river.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 = mschaefer@9650: Pattern.compile("^\\s*Gew\u00e4sser\\s*:\\s*(.+)"); sascha@1211: sascha@1211: public static final Pattern WST_DATEI = mschaefer@9650: Pattern.compile("^\\s*WSTDatei\\s*:\\s*(.+)"); sascha@1211: sascha@1211: public static final Pattern BB_INFO = mschaefer@9650: Pattern.compile("^\\s*B\\+B-Info\\s*:\\s*(.+)"); sascha@1211: rrenkert@7751: public static final Pattern GEW_UUID = mschaefer@9650: Pattern.compile("^\\s*uuid\\s*:\\s*(.+)"); rrenkert@7751: 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: mschaefer@9650: public InfoGewParser(final AnnotationClassifier annotationClassifier) { mschaefer@9650: this.rivers = new ArrayList<>(); sascha@1211: this.annotationClassifier = annotationClassifier; sascha@1211: } sascha@1211: sascha@1211: public List getRivers() { mschaefer@9650: return this.rivers; sascha@1211: } sascha@1211: mschaefer@9650: public static final String normalize(final String f) { sascha@1211: return f.replace("\\", "/").replace("/", File.separator); sascha@1211: } sascha@1211: felix@5016: /** Handle a gew, wst, or bb_info file. */ mschaefer@9650: public void parse(final File file) throws Exception { sascha@1211: sascha@1211: LineNumberReader in = null; sascha@1211: mschaefer@9650: final File root = file.getParentFile(); sascha@1211: sascha@1211: try { sascha@1211: in = mschaefer@9650: new LineNumberReader( mschaefer@9650: new InputStreamReader( mschaefer@9650: new FileInputStream(file), ENCODING)); sascha@1211: sascha@1211: String line = null; sascha@1211: sascha@1211: String riverName = null; rrenkert@7751: String modelUuid = 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()) { mschaefer@9650: final String river = m.group(1); sascha@1211: log.info("Found river '" + river + "'"); sascha@1211: if (riverName != null) { mschaefer@9650: this.rivers.add(new ImportRiver( mschaefer@9650: riverName, mschaefer@9650: modelUuid, mschaefer@9650: wstFile, mschaefer@9650: bbInfoFile, mschaefer@9650: this.annotationClassifier)); sascha@1211: } sascha@1211: riverName = river; rrenkert@7751: modelUuid = null; 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: if (!wst.isFile() || !wst.canRead()) { tom@8856: log.error( mschaefer@9650: "cannot access WST file '" + wstFilename + "'"); sascha@1211: continue; sascha@1211: } tom@8677: log.info("Found wst file '" + wst + "'"); sascha@1211: wstFile = wst; sascha@1211: } rrenkert@7751: else if ((m = GEW_UUID.matcher(line)).matches()) { rrenkert@7751: modelUuid = m.group(1); rrenkert@7751: log.debug("Found model uuid " + modelUuid + mschaefer@9650: " for river " + riverName); rrenkert@7751: } sascha@1211: else if ((m = BB_INFO.matcher(line)).matches()) { sascha@1211: //TODO: Make it relative to the wst file. mschaefer@9650: final String bbInfo = m.group(1); sascha@1211: bbInfoFile = new File(normalize(bbInfo)); sascha@1211: } sascha@1211: } tom@8677: if (riverName != null && wstFile != null) { mschaefer@9650: this.rivers.add(new ImportRiver( mschaefer@9650: riverName, mschaefer@9650: modelUuid, mschaefer@9650: wstFile, mschaefer@9650: bbInfoFile, mschaefer@9650: this.annotationClassifier)); sascha@1211: } sascha@1211: } sascha@1211: finally { sascha@1211: if (in != null) { sascha@1211: in.close(); sascha@1211: } sascha@1211: } sascha@1211: mschaefer@9650: for (final ImportRiver river: this.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 :