changeset 186:cf8cbcb6a10d

Added parser to read *.KM files. flys-backend/trunk@1506 c6561f87-3c4e-4783-a992-168aeb5c3f6f
author Sascha L. Teichmann <sascha.teichmann@intevation.de>
date Thu, 17 Mar 2011 17:43:57 +0000
parents a60edcfe5f53
children ecf90018563b
files flys-backend/ChangeLog flys-backend/src/main/java/de/intevation/flys/importer/AnnotationsParser.java flys-backend/src/main/java/de/intevation/flys/importer/ImportAnnotation.java flys-backend/src/main/java/de/intevation/flys/importer/ImportAttribute.java flys-backend/src/main/java/de/intevation/flys/importer/ImportPosition.java flys-backend/src/main/java/de/intevation/flys/importer/ImportRange.java flys-backend/src/main/java/de/intevation/flys/importer/ImportRiver.java flys-backend/src/main/java/de/intevation/flys/importer/InfoGewParser.java flys-backend/src/main/java/de/intevation/flys/importer/PegelGltParser.java
diffstat 9 files changed, 231 insertions(+), 15 deletions(-) [+]
line wrap: on
line diff
--- a/flys-backend/ChangeLog	Thu Mar 17 16:12:39 2011 +0000
+++ b/flys-backend/ChangeLog	Thu Mar 17 17:43:57 2011 +0000
@@ -1,3 +1,17 @@
+2011-03-17	Sascha L. Teichmann	<sascha.teichmann@intevation.de>
+
+	* src/main/java/de/intevation/flys/importer/AnnotationsParser.java:
+	  New. Added parser to read *.KM files.
+
+	* src/main/java/de/intevation/flys/importer/ImportPosition.java,
+	  src/main/java/de/intevation/flys/importer/PegelGltParser.java,
+	  src/main/java/de/intevation/flys/importer/ImportRiver.java,
+	  src/main/java/de/intevation/flys/importer/ImportAnnotation.java,
+	  src/main/java/de/intevation/flys/importer/ImportRange.java,
+	  src/main/java/de/intevation/flys/importer/InfoGewParser.java,
+	  src/main/java/de/intevation/flys/importer/ImportAttribute.java:
+	  Adjusted to load the annotations from *.KM files.
+
 2011-03-17	Sascha L. Teichmann	<sascha.teichmann@intevation.de>
 
 	* src/main/java/de/intevation/flys/importer/ImportPosition.java,
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/flys-backend/src/main/java/de/intevation/flys/importer/AnnotationsParser.java	Thu Mar 17 17:43:57 2011 +0000
@@ -0,0 +1,136 @@
+package de.intevation.flys.importer;
+
+import java.util.HashMap;
+import java.util.TreeSet;
+import java.util.List;
+import java.util.ArrayList;
+
+import java.io.IOException;
+import java.io.File;
+import java.io.LineNumberReader;
+import java.io.InputStreamReader;
+import java.io.FileInputStream;
+
+import org.apache.log4j.Logger;
+
+import de.intevation.flys.utils.FileTools;
+
+public class AnnotationsParser
+{
+    private static Logger log = Logger.getLogger(AnnotationsParser.class);
+
+    public static final String ENCODING = "ISO-8859-1";
+
+    public static final String [] TO_SCAN = {
+        "Basisdaten",
+        "Streckendaten"
+    };
+
+    protected HashMap<String, ImportAttribute> attributes;
+    protected HashMap<String, ImportPosition>  positions;
+    protected TreeSet<ImportAnnotation>        annotations;
+
+    public AnnotationsParser() {
+        attributes  = new HashMap<String, ImportAttribute>();
+        positions   = new HashMap<String, ImportPosition>();
+        annotations = new TreeSet<ImportAnnotation>();
+    }
+
+    public void parseFile(File file) throws IOException {
+        log.info("parsing km file: '" + file + "'");
+        LineNumberReader in = null;
+        try {
+            in =
+                new LineNumberReader(
+                new InputStreamReader(
+                new FileInputStream(file), ENCODING));
+
+            String line = null;
+            while ((line = in.readLine()) != null) {
+                if ((line = line.trim()).length() == 0
+                || line.startsWith("*")) {
+                    continue;
+                }
+
+                String [] parts = line.split("\\s*;\\s*");
+
+                if (parts.length < 3) {
+                    log.warn("not enough columns in line "
+                        + in.getLineNumber());
+                    continue;
+                }
+
+                ImportPosition position = positions.get(parts[0]);
+                if (position == null) {
+                    position = new ImportPosition(parts[0]);
+                    positions.put(parts[0], position);
+                }
+
+                ImportAttribute attribute = attributes.get(parts[1]);
+                if (attribute == null) {
+                    attribute = new ImportAttribute(parts[1]);
+                    attributes.put(parts[1], attribute);
+                }
+
+                String [] r = parts[2].replace(",", ".").split("\\s*#\\s*");
+
+                Double from, to;
+
+                try {
+                    from = Double.valueOf(r[0]);
+                    to   = r.length < 2 ? null : Double.valueOf(r[1]);
+                    if (to != null && from > to) {
+                        Double t = from; from = to; to = t; 
+                    }
+                }
+                catch (NumberFormatException nfe) {
+                    log.warn("invalid number in line " + in.getLineNumber());
+                    continue;
+                }
+
+                ImportRange range = new ImportRange(from, to);
+
+                ImportAnnotation annotation = new ImportAnnotation(
+                    attribute, position, range);
+
+                if (!annotations.add(annotation)) {
+                    log.debug("duplicated annotation in line "
+                        + in.getLineNumber());
+                }
+            }
+        }
+        finally {
+            if (in != null) {
+                in.close();
+            }
+        }
+    }
+
+    public void parse(File root) throws IOException {
+
+        for (String toScan: TO_SCAN) {
+            File directory = FileTools.repair(new File(root, toScan));
+            if (!directory.isDirectory()) {
+                log.warn("'" + directory + "' is not a directory.");
+                continue;
+            }
+            File [] files = directory.listFiles();
+            if (files == null) {
+                log.warn("cannot list directory '" + directory + "'");
+                continue;
+            }
+
+            for (File file: files) {
+                if (file.isFile() && file.canRead()
+                && file.getName().toLowerCase().endsWith(".km")) {
+                    parseFile(file);
+                }
+            }
+        } // for all directories to scan
+    }
+
+    public List<ImportAnnotation> getAnnotations() {
+        return new ArrayList<ImportAnnotation>(annotations);
+    }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
--- a/flys-backend/src/main/java/de/intevation/flys/importer/ImportAnnotation.java	Thu Mar 17 16:12:39 2011 +0000
+++ b/flys-backend/src/main/java/de/intevation/flys/importer/ImportAnnotation.java	Thu Mar 17 17:43:57 2011 +0000
@@ -1,6 +1,7 @@
 package de.intevation.flys.importer;
 
 public class ImportAnnotation
+implements   Comparable<ImportAnnotation>
 {
     protected ImportAttribute attribute;
     protected ImportPosition  position;
@@ -9,6 +10,33 @@
     public ImportAnnotation() {
     }
 
+    public ImportAnnotation(
+        ImportAttribute attribute,
+        ImportPosition  position,
+        ImportRange     range
+    ) {
+        this.attribute = attribute;
+        this.position  = position;
+        this.range     = range;
+    }
+
+    public int compareTo(ImportAnnotation other) {
+        int d = attribute.compareTo(other.attribute);
+        if (d != 0) {
+            return d;
+        }
+
+        if ((d = position.compareTo(other.position)) != 0) {
+            return d;
+        }
+
+        if ((d = range.compareTo(other.range)) != 0) {
+            return d;
+        }
+
+        return 0;
+    }
+
     public ImportAttribute getAttribute() {
         return attribute;
     }
--- a/flys-backend/src/main/java/de/intevation/flys/importer/ImportAttribute.java	Thu Mar 17 16:12:39 2011 +0000
+++ b/flys-backend/src/main/java/de/intevation/flys/importer/ImportAttribute.java	Thu Mar 17 17:43:57 2011 +0000
@@ -1,12 +1,17 @@
 package de.intevation.flys.importer;
 
 public class ImportAttribute
+implements   Comparable<ImportAttribute>
 {
     protected String value;
 
     public ImportAttribute() {
     }
 
+    public ImportAttribute(String value) {
+        this.value = value;
+    }
+
     public String getValue() {
         return value;
     }
@@ -15,6 +20,10 @@
         this.value = value;
     }
 
+    public int compareTo(ImportAttribute other) {
+        return value.compareTo(other.value);
+    }
+
     @Override
     public boolean equals(Object other) {
         if (other == this) return true;
--- a/flys-backend/src/main/java/de/intevation/flys/importer/ImportPosition.java	Thu Mar 17 16:12:39 2011 +0000
+++ b/flys-backend/src/main/java/de/intevation/flys/importer/ImportPosition.java	Thu Mar 17 17:43:57 2011 +0000
@@ -1,6 +1,7 @@
 package de.intevation.flys.importer;
 
 public class ImportPosition
+implements   Comparable<ImportPosition>
 {
     protected String value;
 
@@ -11,6 +12,10 @@
         this.value = value;
     }
 
+    public int compareTo(ImportPosition other) {
+        return value.compareTo(other.value);
+    }
+
     public String getValue() {
         return value;
     }
@@ -18,18 +23,6 @@
     public void setValue(String value) {
         this.value = value;
     }
-
-    @Override
-    public boolean equals(Object other) {
-        if (other == this) return true;
-        if (!(other instanceof ImportPosition)) return false;
-        return value.equals(((ImportPosition)other).value);
-    }
-
-    @Override
-    public int hashCode() {
-        return value.hashCode();
-    }
 }
 // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
 
--- a/flys-backend/src/main/java/de/intevation/flys/importer/ImportRange.java	Thu Mar 17 16:12:39 2011 +0000
+++ b/flys-backend/src/main/java/de/intevation/flys/importer/ImportRange.java	Thu Mar 17 17:43:57 2011 +0000
@@ -1,6 +1,7 @@
 package de.intevation.flys.importer;
 
 public class ImportRange
+implements   Comparable<ImportRange>
 {
     public Double from;
     public Double to;
@@ -9,6 +10,27 @@
     }
 
     public ImportRange(Double from, Double to) {
+        this.from = from;
+        this.to   = to;
+    }
+
+    private static final int compare(Double a, Double b) {
+        if (a == null && b == null) {
+            return 0;
+        }
+        if (a == null && b != null) {
+            return -1;
+        }
+        if (a != null && b == null) {
+            return +1;
+        }
+        return a.compareTo(b);
+    }
+
+    public int compareTo(ImportRange other) {
+        int cmp = compare(from, other.from);
+        if (cmp != 0) return cmp;
+        return compare(to, other.to);
     }
 
     public Double getFrom() {
--- a/flys-backend/src/main/java/de/intevation/flys/importer/ImportRiver.java	Thu Mar 17 16:12:39 2011 +0000
+++ b/flys-backend/src/main/java/de/intevation/flys/importer/ImportRiver.java	Thu Mar 17 17:43:57 2011 +0000
@@ -23,6 +23,8 @@
 
     protected List<ImportGauge> gauges;
 
+    protected List<ImportAnnotation> annotations;
+
     public ImportRiver() {
     }
 
@@ -56,6 +58,11 @@
         this.bbInfoFile = bbInfoFile;
     }
 
+    public void parseDependencies() throws IOException {
+        parseGauges();
+        parseAnnotations();
+    }
+
     public void parseGauges() throws IOException {
         File gltFile = new File(wstFile.getParentFile(), PEGEL_GLT);
         gltFile = FileTools.repair(gltFile);
@@ -70,5 +77,13 @@
 
         gauges = pgltp.getGauges();
     }
+
+    public void parseAnnotations() throws IOException {
+        File riverDir = wstFile.getParentFile().getParentFile();
+        AnnotationsParser aparser = new AnnotationsParser();
+        aparser.parse(riverDir);
+
+        annotations = aparser.getAnnotations();
+    }
 }
 // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
--- a/flys-backend/src/main/java/de/intevation/flys/importer/InfoGewParser.java	Thu Mar 17 16:12:39 2011 +0000
+++ b/flys-backend/src/main/java/de/intevation/flys/importer/InfoGewParser.java	Thu Mar 17 17:43:57 2011 +0000
@@ -112,7 +112,7 @@
         }
 
         for (ImportRiver river: rivers) {
-            river.parseGauges();
+            river.parseDependencies();
         }
     }
 }
--- a/flys-backend/src/main/java/de/intevation/flys/importer/PegelGltParser.java	Thu Mar 17 16:12:39 2011 +0000
+++ b/flys-backend/src/main/java/de/intevation/flys/importer/PegelGltParser.java	Thu Mar 17 17:43:57 2011 +0000
@@ -19,7 +19,7 @@
 
 public class PegelGltParser
 {
-    private static Logger log = Logger.getLogger(InfoGewParser.class);
+    private static Logger log = Logger.getLogger(PegelGltParser.class);
 
     public static final String ENCODING = "ISO-8859-1";
 
@@ -94,6 +94,5 @@
             }
         }
     }
-
 }
 // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :

http://dive4elements.wald.intevation.org