changeset 6733:d2fddd344d7c double-precision

merged changes from default into double-precision branch
author Tom Gottfried <tom.gottfried@intevation.de>
date Wed, 31 Jul 2013 12:31:09 +0200
parents c14e17dabf39 (diff) 563f3793d334 (current diff)
children 839f1a889c4a
files
diffstat 23 files changed, 570 insertions(+), 393 deletions(-) [+]
line wrap: on
line diff
--- a/backend/contrib/import_river.sh	Wed Jul 31 12:40:04 2013 +0200
+++ b/backend/contrib/import_river.sh	Wed Jul 31 12:31:09 2013 +0200
@@ -32,12 +32,15 @@
 DEFAULT_BACKEND_NAME="XE"
 JAR="hydr_morph/importer.jar"
 IMPORTER_DRY_RUN=false
-IMPORTER_MAINVALUE_TYPES=QWTD
+IMPORTER_MAINVALUE_TYPES=QWTD-
 IMPORTER_ANNOTATION_TYPES="conf/annotation-types.xml"
 
 
 MIN_MEMORY="8024m"
 
+# Default encoding. Change here if necessary
+export LC_ALL=de_DE@euro
+
 if [ -z "$OPTIONAL_LIBS" ]; then
     OPTIONAL_LIBS="$(dirname $0)/opt"
 fi
@@ -214,6 +217,7 @@
     -Dflys.backend.importer.skip.official.lines=false \
     -Dflys.backend.importer.skip.prfs=false \
     -Dflys.backend.importer.skip.w80s=false \
+    -Dflys.backend.importer.skip.w80.csvs=false \
     -Dflys.backend.importer.skip.wst=true \
     -Dflys.backend.importer.skip.measurement.stations=true \
     -Dflys.backend.importer.skip.waterlevel.differences=true \
@@ -260,6 +264,7 @@
     -Dflys.backend.importer.skip.official.lines=true \
     -Dflys.backend.importer.skip.prfs=true \
     -Dflys.backend.importer.skip.w80s=true \
+    -Dflys.backend.importer.skip.w80.csvs=true \
     -Dflys.backend.importer.skip.wst=true \
     -Dflys.backend.importer.skip.measurement.stations=false \
     -Dflys.backend.importer.skip.waterlevel.differences=false \
@@ -306,6 +311,7 @@
     -Dflys.backend.importer.skip.official.lines=true \
     -Dflys.backend.importer.skip.prfs=true \
     -Dflys.backend.importer.skip.w80s=true \
+    -Dflys.backend.importer.skip.w80.csvs=true \
     -Dflys.backend.importer.skip.wst=false \
     -Dflys.backend.importer.skip.measurement.stations=true \
     -Dflys.backend.importer.skip.waterlevel.differences=true \
@@ -333,7 +339,7 @@
     --directory $RIVER_PATH \
     --river_name "$RIVER_NAME" \
     --ogr_connection "$OGR_CONNECTION" \
-    --host $DBHOST \
+    --host $DBHOST/$BACKEND_NAME \
     --user $DBUSER \
     --password $DBPASS \
     --verbose 1 \
--- a/backend/contrib/run_geo.sh	Wed Jul 31 12:40:04 2013 +0200
+++ b/backend/contrib/run_geo.sh	Wed Jul 31 12:31:09 2013 +0200
@@ -6,6 +6,7 @@
 
 # Set this to your target database for Oracle
 HOST=localhost
+BACKEND_NAME="XE"
 USER=flys28
 PASS=flys28
 # Alternatively you can provide a direct connection string:
@@ -29,6 +30,9 @@
 SKIP_JETTIES=0
 SKIP_FLOODMARKS=0
 
+# Default encoding. Change here if necessary
+export LC_ALL=de_DE@euro
+
 # There should be no need to change anything below this line
 
 DIR=`dirname $0`
@@ -48,7 +52,7 @@
     --directory $RIVER_PATH \
     --river_name "$RIVER_NAME" \
     --ogr_connection "$OGR_CONNECTION" \
-    --host $HOST \
+    --host $HOST/$BACKEND_NAME \
     --user $USER \
     --password $PASS \
     --verbose $VERBOSE \
--- a/backend/contrib/run_hydr_morph.sh	Wed Jul 31 12:40:04 2013 +0200
+++ b/backend/contrib/run_hydr_morph.sh	Wed Jul 31 12:31:09 2013 +0200
@@ -22,7 +22,7 @@
 
 ######################## Custom Importer Settings ###################
 IMPORTER_DRY_RUN=false
-IMPORTER_MAINVALUE_TYPES=QWTD
+IMPORTER_MAINVALUE_TYPES=QWTD-
 IMPORTER_ANNOTATION_TYPES="conf/annotation-types.xml"
 
 IMPORTER_SKIP_ANNOTATIONS=false
@@ -66,7 +66,8 @@
     export LD_LIBRARY_PATH="$OPTIONAL_LIBS/lib64:$LD_LIBRARY_PATH"
 fi
 
-export LC_ALL=de_DE@euro # Workaround encoding problem
+# Default encoding. Change here if necessary
+export LC_ALL=de_DE@euro
 
 exec java -jar \
     -Xmx$MIN_MEMORY \
--- a/backend/contrib/shpimporter/km.py	Wed Jul 31 12:40:04 2013 +0200
+++ b/backend/contrib/shpimporter/km.py	Wed Jul 31 12:31:09 2013 +0200
@@ -25,7 +25,7 @@
 
 
     def isGeometryValid(self, geomType):
-        return geomType == 1
+        return geomType == ogr.wkbPoint or geomType == ogr.wkbPoint25D
 
 
     def isShapeRelevant(self, name, path):
--- a/backend/doc/documentation/de/importer-hydr-morph.tex	Wed Jul 31 12:40:04 2013 +0200
+++ b/backend/doc/documentation/de/importer-hydr-morph.tex	Wed Jul 31 12:31:09 2013 +0200
@@ -15,7 +15,7 @@
 somit eine Transaktion.
 
 \textbf{Hinweis}
-\\Der Import geht wie auch Desktop-FLYS davon aus, dass die Dateien Latin-1
+\\Der Import geht, wie auch Desktop-FLYS, davon aus, dass die Dateien Latin-1
 encodiert vorliegen! Stellen Sie also sicher, dass das von Ihnen verwendete
 Encoding korrekt ist. Andernfalls ist es möglich, dass es während des Imports zu
 unerwarteten Problemen kommt.
@@ -32,7 +32,7 @@
 \end{lstlisting}
 
 Auf gleiche Weise können dem Importer sämtliche Optionen zur Konfiguration
-beim Start mitgegeben werden. Im Folgenden werden die möglichen System-Properties und
+beim Start mitgegeben werden. Im Folgenden werden die möglichen \textit{System-Properties} und
 ihre Auswirkung auf den Import genauer beschrieben. In den Kapiteln
 \ref{configuration} und \ref{start-hydr} wird zur Einfachheit jedoch ein
 Shellskript verwendet, das eine Standardkonfiguration vorgibt und den Importer
@@ -40,7 +40,8 @@
 
 
 \subsection{Importierte Daten}
-In diesem Kapitel werden die Datentypen aufgelistet und erläutert, wie sie vom
+\label{import_data}
+In diesem Kapitel werden die verschiedenen Daten aufgelistet und erläutert, wie sie vom
 Importer eingelesen werden.
 
 \subsubsection{Streckenfavoriten (*.km-Dateien)}
@@ -54,44 +55,45 @@
 vorgenommen wird. Details hierzu befinden sich im Kapitel \ref{annotation-types}.
 
 \subsubsection{Bundeswasserstraßen-IDs}
-Der Import und die Zuweisung der Bundeswasserstraßen-IDs kann mit
-\textbf{-Dflys.backend.importer.skip.bwastr=true} unterbunden werden.
-Beim Import wird davon ausgegangen dass sich die Datei \textbf{BWASTR\_ID.csv}
+Der Import und die Zuweisung der Bundeswasserstraßen-IDs kann unterbunden werden 
+mit \textbf{-Dflys.backend.importer.skip.bwastr=true}.
+Beim Import wird davon ausgegangen, dass sich die Datei \textbf{BWASTR\_ID.csv}
 neben der oder den zu importierenden gew-Dateien befindet.
 
-\subsubsection{Pegel, Stammdaten (*.glt, *.sta-Dateien)}
+\subsubsection{Pegel- und Stammdaten (*.glt, *.at und *.sta-Dateien)}
 Der Import von Pegel- und Stammdaten kann mit \textbf{'-Dflys.backend.importer.skip.gauges=true'}
 unterdrückt werden. Die .glt-Datei, die neben der .wst-Datei liegt, wird zuerst
-ausgelesen. Es werden nur *.sta-Datei von Pegeln geladen, die in der .glt-Datei
+ausgelesen. Es werden nur Stammdaten von Pegeln geladen, die in der .glt-Datei
 vermerkt sind.
 
-\subsubsection{Historische Abflusstafeln (*.at-Dateien)}
-Der Import von historischen Abflusstafeln kann mit
-\textbf{'-Dflys.backend.importer.skip.historical.discharge.tables=true'}
-unterdrückt werden. Diese Flagge wird nur ausgewertet, wenn überhaupt
-Pegel-Daten (siehe oben) importiert werden.
-
-Mittels \textbf{-Dflys.backend.sta.parse.gauge.numbers=true} wird versucht, die
-offiziellen Pegelnummern aus den Stammdaten zu extrahieren.
-\textbf{Dies ist mit Vorsicht zu behandeln, denn die meisten STA-Dateien
-enthalten invalide Pegelnummern.}
-
 Die System-Property \textbf{flys.backend.main.value.types} kann einen String
 mit gültigen Typen von Stammdaten enthalten. Vorbelegt ist \textit{QWTD}. In der
 Praxis ist \textit{QWD} eine sinnvolle Belegung.
 
-\subsubsection{Basis-Wasserstände (gewaesser.wst-Dateien)}
 Der Import von Wasserständen kann mit \textbf{-Dflys.backend.importer.skip.wst=true} unterdrückt werden.
 
+\subsubsection{Historische Abflusstafeln (*.at-Dateien)}
+Mit \textbf{'-Dflys.backend.importer.skip.historical.discharge.tables=true'} 
+kann der Import von historischen Abflusstafeln 
+unterdrückt werden. Diese Flagge wird nur ausgewertet, wenn überhaupt
+Pegel-Daten (siehe oben) importiert werden.
+
+% Mittels \textbf{-Dflys.backend.sta.parse.gauge.numbers=true} wird versucht, die
+% offiziellen Pegelnummern aus den Stammdaten zu extrahieren.
+% \textbf{Dies ist mit Vorsicht zu behandeln, denn die meisten STA-Dateien
+% enthalten invalide Pegelnummern.}
+
 \subsubsection{Zusätzliche Längsschnitte (*.zus, *.wst-Dateien)}
-Der Import von zusätzlichen Längsschnitten kann mit \textbf{-Dflys.backend.importer.skip.extra.wsts=true}
+Mit \textbf{-Dflys.backend.importer.skip.extra.wsts=true} kann
+der Import von zusätzlichen Längs\-schnitten 
 unterdrückt werden. Es werden die *.zus- und *.wst-Dateien aus dem Verzeichnis
-\textit{../Zus.Längsschnitte} relativ zur gewaesser.wst-Datei betrachtet.
+\textit{../Zus.Längsschnitte} relativ zur 
+\textit{gewaesser}.wst-Datei betrachtet.
 
 \subsubsection{Fixierungen (*.wst-Dateien)}
 Der Import von Fixierungen kann mit \textbf{-Dflys.backend.importer.skip.fixations=true}
-unterdrückt werden. Es werden die *.wst-Dateien aus dem Verzeichnis
-\textit{../Fixierungen} relativ zur gewaesser.wst-Datei betrachtet.
+unterdrückt werden. Es werden die *.wst-Dateien aus 
+\textit{../Fixierungen} relativ zur \textit{gewaesser}.wst-Datei betrachtet.
 
 \subsubsection{Amtliche Linien (*.wst-Dateien)}
 Der Import von amtlichen Linien kann mit \textbf{-Dflys.backend.importer.skip.official.lines=true}
@@ -99,89 +101,117 @@
 Verzeichnis \textit{../Basisdaten} und \textit{../Fixierungen} relativ zur
 \textit{gewaesser.wst}-Datei betrachtet.
 
+Für die Zuordnung zu den Hauptwerten wird zudem die Datei 
+\textit{Amtl\_Linien.config} benötigt.
+
 \subsubsection{Profilspuren (*.prf-Dateien)}
 Der Import von Profilspuren kann mit \textbf{-Dflys.backend.importer.skip.prfs=true}
 unterdrückt werden. Es werden rekursiv alle *.prf-Dateien aus \textit{../../..}
-relativ zur gewaesser.wst-Datei betrachtet. Vor dem Import werden mit Hilfe
+relativ zur gewaesser.wst-Datei betrachtet. 
+
+Vor dem Import von Profilspuren werden mit Hilfe
 eines Längen- und eines MD5-Summen-Vergleichs inhaltliche Duplikate
 ausgeschlossen.
 
 \subsubsection{Profilspuren (*.w80-Dateien)}
-Der Import von W80-Profilspuren kann mit \textbf{-Dflys.backend.importer.skip.w80=true}
+Der Import von W80-Profilspuren kann mit \textbf{-Dflys.backend.importer.skip.w80s=true}
 unterdrückt werden. Es werden rekursiv alle *.w80-Dateien aus \textit{../../..}
-relativ zur gewaesser.wst-Datei betrachtet. Vor dem Import werden mit Hilfe
-eines Längen- und eines MD5-Summen-Vergleichs inhaltliche Duplikate
-ausgeschlossen.
+relativ zur \textit{gewaesser}.wst-Datei betrachtet.
+
+\subsubsection{Profilspuren (*.d50-Dateien)}
+Der Import von D50-Profilspuren kann mit \textbf{-Dflys.backend.importer.skip.da50s=true}
+unterdrückt werden. Es werden rekursiv alle *.d50-Dateien aus \textit{../../..}
+relativ zur \textit{gewaesser}.wst-Datei betrachtet.
+
+\subsubsection{Profilspuren (*.d66-Dateien)}
+Der Import von D66-Profilspuren kann mit \textbf{-Dflys.backend.importer.skip.da66s=true}
+unterdrückt werden. Es werden rekursiv alle *.d66-Dateien aus \textit{../../..}
+relativ zur \textit{gewaesser}.wst-Datei betrachtet.
+
+\subsubsection{Profilspuren (*.csv-Dateien)}
+Der Import von CSV-Profilspuren kann mit
+\textbf{-Dflys.backend.importer.skip.w80.csvs=true}
+unterdrückt werden.
+Es werden rekursiv alle *.csv-Dateien aus 
+\textit{./Geodaesie/Querprofile/QP-Daten} im Verzeichnis des 
+Gewässers betrachtet.
 
 \subsubsection{Hydraulische Kennzahlen (*.hyk)}
 Der Import von hydraulischen Kennzahlen kann mit \textbf{-Dflys.backend.importer.skip.hyks=true} unterdrückt
 werden. Es werden rekursiv alle *.hyk-Dateien aus \textit{../../..} relativ zur
-gewaesser.wst-Datei betrachtet. Vor dem Import werden mit Hilfe eines Längen- und
+\textit{gewaesser}.wst-Datei betrachtet. Vor dem Import werden mit Hilfe eines Längen- und
 eines MD5-Summen-Vergleichs inhaltliche Duplikate ausgeschlossen.
 
 \subsubsection{Hochwassermarken (*.zus, *.wst)}
 Der Import von Hochwassermarken kann mit \textbf{-Dflys.backend.importer.skip.flood.water=true}
 unterdrückt werden. Es werden die *.zus- und *.wst-Dateien aus dem Verzeichnis
-\textit{../HW-Marken} relativ zur gewaesser.wst-Datei betrachtet.
+\textit{../HW-Marken} relativ zur \textit{gewaesser}.wst-Datei betrachtet.
 
-\subsubsection{Hochwasserschutzanlagen (*.zus)}
-Der Import von Hochwasserschutzanlagen kann mit \textbf{-Dflys.backend.importer.skip.flood.protection=true}
+\subsubsection{Hochwasserschutzanlagen (*.zus, *.wst)}
+Mit \textbf{-Dflys.backend.importer.skip.flood.protection=true}
+kann der Import von Hochwasserschutzanlagen 
 unterdrückt werden. Es werden die *.zus- und *.wst-Dateien aus dem Verzeichnis
 \textit{../HW-Schutzanlagen} relativ zur \textit{gewaesser.wst}-Datei betrachtet.
 
+\subsubsection{Messstellen-Stammdaten}
+Mit \textbf{-Dflys.backend.importer.skip.measurement.stations=true}
+kann der Import von Messstellen-Stammdaten aus 
+\textit{Morphologie/Basisdaten/Messstellen-Stammdaten.csv} 
+unterdrückt werden.
+
 \subsubsection{Sohlhöhen (Peilungen)}
 Der Import von Sohlhöhen-Peilungen kann mit \textbf{-Dflys.backend.importer.skip.bed.height.single=true}
-unterdrückt werden. Es werden die Dateien aus dem Verzeichnis
+unterdrückt werden. Es werden die CSV-Dateien aus dem Verzeichnis
 \textit{Morphologie/Sohlhoehen/Einzeljahre} geladen.
 
 \subsubsection{Sohlhöhen (Epochen)}
 Der Import Sohlhöhen-Epochen kann mit \textbf{-Dflys.backend.importer.skip.bed.height.epoch=true}
-unterdrückt werden. Es werden die Dateien aus dem Verzeichnis
+unterdrückt werden. Es werden die CSV-Dateien aus dem Verzeichnis
 \textit{Morphologie/Sohlhoehen/Epochen} geladen.
 
 \subsubsection{Sedimentdichte}
 Der Import der Sedimentdichte kann mit
 \textbf{-Dflys.backend.importer.skip.sediment.density=true}
-unterdrückt werden. Es werden alle Dateien aus dem Verzeichnis
+unterdrückt werden. Es werden die CSV-Dateien aus dem Verzeichnis
 \textit{Morphologie/Sedimentdichte} geladen.
 
 \subsubsection{Morphologische Breite}
 Der Import der morphologischen Breite kann mit
 \textbf{-Dflys.backend.importer.skip.morphological.width=true}
-unterdrückt werden. Es werden alle Dateien aus dem Verzeichnis
+unterdrückt werden. Es werden alle CSV-Dateien aus dem Verzeichnis
 \textit{Morphologie/morphologische\_Breite} geladen.
 
 \subsubsection{Fließgeschwindigkeit}
 Der Import der Fließgeschwindigkeit kann mit
 \textbf{-Dflys.backend.importer.skip.flow.velocity=true}
-unterdrückt werden. Es werden alle Modellrechnungen aus dem Verzeichnis\\
+unterdrückt werden. Es werden die CSV-Dateien aus dem Verzeichnis\\
 \textit{Morphologie/Geschwindigkeit\_Schubspannung/Modellrechnungen} und\\
 \textit{Morphologie/Geschwindigkeit\_Schubspannung/v-Messungen} geladen.
 
 \subsubsection{Sedimentfracht}
 Der Import der Sedimentfracht kann mit
 \textbf{-Dflys.backend.importer.skip.sediment.yield=true}
-unterdrückt werden. Es werden alle Dateien aus dem Verzeichnis
+unterdrückt werden. Es werden die CSV-Dateien aus dem Verzeichnis
 \textit{Morphologie/Fracht} geladen. Dabei werden die Dateien aus dem
 Unterverzeichnissen \textit{Einzeljahre} und \textit{Epochen} entsprechend als
-\textit{Einzeljahre} und \textit{Epochen} vermerkt.
+\textit{Einzeljahre} und \textit{Epochen} gespeichert.
 
-\subsubsection{Wasserspiegellagen für MINFO}
-Der Import der MINFO spezifischen Wasserspiegellagen kann mit\\
+\subsubsection{Wasserspiegellagen für M-INFO}
+Der Import der für M-INFO spezifischen Wasserspiegellagen kann mit\\
 \textbf{-Dflys.backend.importer.skip.waterlevels=true}
-unterdrückt werden. Es werden alle Dateien aus dem Verzeichnis
+unterdrückt werden. Es werden die CSV-Dateien aus dem Verzeichnis
 \textit{Morphologie/Fixierungsanalyse/Wasserspiegellagen} geladen.
 
-\subsubsection{Wasserspiegeldifferenzen für MINFO}
-Der Import der Wasserspiegellagendifferenzen kann mit\\
+\subsubsection{Wasserspiegeldifferenzen für M-INFO}
+Der Import der für M-INFO spezifischen Wasserspiegeldifferenzen kann mit\\
 \textbf{-Dflys.backend.importer.skip.waterlevel.differences=true}
-unterdrückt werden. Es werden alle Dateien aus dem Verzeichnis
+unterdrückt werden. Es werden die CSV-Dateien aus dem Verzeichnis
 \textit{Morphologie/Fixierungsanalyse/Wasserspiegeldifferenzen} geladen.
 
 \subsubsection{Transport Abfluss Beziehung}
 Der Import der Daten für die Transport Abfluss Beziehung kann mit\\
 \textbf{flys.backend.importer.skip.sq.relation=true} unterdrückt
-werden. Es werden alle Dateien unter
+werden. Es werden die CSV-Dateien unter
 \textit{Feststofftransport-Abfluss-Beziehung} geladen.
 
 
@@ -248,7 +278,7 @@
 ein regulärer Ausdruck, der über das Attribut \textit{pattern} definiert wird.
 Die Kategorie wird im Trefferfall über das Attribut \textit{type} bestimmt.
 Treffen mehrere Regeln zu, wird die Kategorie gewählt, die zum ersten Treffer
-gehört. Trifft keine Regel zu wird der Eintrag der Kategorie zugeteilt, die für
+gehört. Trifft keine Regel zu, wird der Eintrag der Kategorie zugeteilt, die für
 die beinhaltende Datei als Vorgabe gilt.
 
 
@@ -267,6 +297,9 @@
 des jeweiligen Gewässers angegeben. Alle anderen importierten Dateien werden in
 ihrer Lage im Dateisystem relativ zur Lage dieser Datei betrachtet.
 
+In der Zeile beginnend mit \textit{Gewässer:} wird der Name des Gewässers
+festgelegt.
+
 \textbf{BACKEND\_USER}
 \\Der Nutzername, der zum Verbinden zur Datenbank verwendet werden soll.
 
@@ -300,8 +333,9 @@
 
 
 Weitere Details zum Verbinden zu einer Oracle Datenbank finden Sie unter\\
-\href{http://www.orafaq.com/wiki/JDBC}{http://www.orafaq.com/wiki/JDBC}. Alle weiteren Einstellungen sind
-optional anpassbar:
+\href{http://www.orafaq.com/wiki/JDBC}{http://www.orafaq.com/wiki/JDBC}. 
+
+Alle weiteren Einstellungen sind optional anpassbar:
 
 \textbf{LOG4J\_CONFIG}
 \\Der Fachdatenimport verwendet die externe Bibliothek \textit{Apache Log4J} zum Loggen
@@ -320,10 +354,10 @@
 
 \textbf{IMPORTER\_MAINVALUE\_TYPES}
 \\Diese Einstellung erlaubt die Angabe eines Textes, der aus den gültigen Typen
-für Hauptwerte zusammengesetzt ist. \textit{QWTD} ist standardmäßig gesetzt.
+für Hauptwerte zusammengesetzt ist. \textit{QWTD-} ist standardmäßig gesetzt.
 
 \textbf{IMPORTER\_ANNOTATION\_TYPES}
-\\Diese Einstellung verweist auf eine Datei (relativ zum Ort der \textit{run.sh}
+\\Diese Einstellung verweist auf eine Datei (relativ zum Ort der \textit{run\_hydr\_morph.sh}
 im Dateisystem), die die möglichen Typen von Streckenfavoriten und deren Regeln
 definiert. Siehe hierzu auch Kapitel \ref{annotation-types}.
 
@@ -333,75 +367,14 @@
 
 \textbf{IMPORTER\_DRY\_RUN}
 \\Falls \textit{true} gesetzt wird, wird der Import nur simuliert. Es werden
-keine Daten in die Datenbank geschrieben. Dies kann z.B.: zum Ermitteln
-potentieller Dateninkonsistenzen sinnvoll sein.
-
-\textbf{IMPORTER\_SKIP\_GAUGES}
-\\Wenn \textit{true} gesetzt ist werden keine Pegel- und Stammdaten bearbeitet.
-
-\textbf{IMPORTER\_SKIP\_ANNOTATIONS}
-\\Wenn \textit{true} gesetzt ist werden keine Streckenfavoriten bearbeitet.
-
-\textbf{IMPORTER\_SKIP\_WST}
-\\Wenn \textit{true} gesetzt ist werden keine WST Dateien bearbeitet.
-
-\textbf{IMPORTER\_SKIP\_PRFS}
-\\Wenn \textit{true} gesetzt ist werden keine Querprofilspuren bearbeitet.
-
-\textbf{IMPORTER\_SKIP\_HYKS}
-\\Wenn \textit{true} gesetzt ist werden keine HYK Dateien bearbeitet.
-
-\textbf{IMPORTER\_SKIP\_EXTRA\_WST}
-\\Wenn \textit{true} gesetzt ist werden keine zusätzlichen Längsschnitte
-bearbeitet.
-
-\textbf{IMPORTER\_SKIP\_FIXATIONS}
-\\Wenn \textit{true} gesetzt ist werden keine Fixierungen bearbeitet.
-
-\textbf{IMPORTER\_SKIP\_OFFICIAL\_LINES}
-\\Wenn \textit{true} gesetzt ist werden keine offiziellen Linien bearbeitet.
-
-\textbf{IMPORTER\_SKIP\_FLOOD\_WATER}
-\\Wenn \textit{true} gesetzt ist werden keine Hochwassermarken bearbeitet.
+keine Daten in die Datenbank geschrieben. Die Log-Dateien können dann verwendet werden, um Fehler in den Daten vor dem Schreiben in die
+Datenbank zu ermitteln.
 
-\textbf{IMPORTER\_SKIP\_FLOOD\_PROTECTION}
-\\Wenn \textit{true} gesetzt ist werden keine Hochwasserschutzanlagen
-bearbeitet.
-
-\textbf{IMPORTER\_SKIP\_BED\_HEIGHT\_SINGLE}
-\\Wenn \textit{true} gesetzt ist werden keine mittleren Sohlhöhen (Peilungen) bearbeitet.
-
-\textbf{IMPORTER\_SKIP\_BED\_HEIGHT\_EPOCH}
-\\Wenn \textit{true} gesetzt ist werden keine mittleren Sohlhöhen (Epochen)
-bearbeitet.
-
-\textbf{IMPORTER\_SKIP\_SEDIMENT\_DENSITY}
-\\Wenn \textit{true} gesetzt ist werden keine Dateien zur Sedimentdichte
-bearbeitet.
-
-\textbf{IMPORTER\_SKIP\_MORPHOLOGICAL\_WIDTH}
-\\Wenn \textit{true} gesetzt ist wird keine morphologische Breite bearbeitet.
-
-\textbf{IMPORTER\_SKIP\_FLOW\_VELOCITY}
-\\Wenn \textit{true} gesetzt ist werden keine Fließgeschwindigkeiten bearbeitet.
-
-\textbf{IMPORTER\_SKIP\_SEDIMENT\_YIELD}
-\\Wenn \textit{true} gesetzt ist werden keine Sedimentfrachten bearbeitet.
-
-\textbf{IMPORTER\_SKIP\_WATERLEVELS}
-\\Wenn \textit{true} gesetzt ist werden keine Wasserspiegellagen für MINFO bearbeitet.
-
-\textbf{IMPORTER\_SKIP\_WATERLEVEL\_DIFFERENCES}
-\\Wenn \textit{true} gesetzt ist werden keine Wasserspiegellagendifferenzen für
-MINFO bearbeitet.
-
-\textbf{IMPORTER\_SKIP\_SQ\_RELATION}
-\\Wenn \textit{true} gesetzt ist werden keine Daten für die Berechnungsart
-SQ-Beziehung bearbeitet.
-
-
+Die weiteren Optionen entsprechen jenen, die in Kapitel \ref{import_data}
+bereits erläutert wurden.
 
 \subsection{Fehler und Warnungen}
+Selbsterklärende Meldungen sind hier nicht alle aufgeführt.
 
 \subsubsection{Fehler}
 
@@ -426,9 +399,37 @@
 \textbf{Error while storing waterlevel diff.}
 \\Beim Schreiben einer Wasserspiegeldifferenz trat ein Fehler auf.
 
+\textbf{No core data file '...' found}
+\\Keine \textit{Stammdaten_Messstellen.csv} gefunden.
+
+\textbf{No measurement stations found at km \#}
+\\Für eine in einer SQ-Beziehungs-Datei gegebene Station liegt
+keine Messstelle vor.
+
+\textbf{No km for measurement station: Can not reference measurement station: ...}
+\\In der gegebenen Zeile einer SQ-Beziehungs-Datei liegt ist keine
+Station gegeben. Damit ist keine Zuordnung zu einer Messstelle möglich.
+Die Zeile wird verworfen.
+
+\textbf{Incomplete SQ-relation row (missing a, b, Qmax or parameter): ...}
+\\In der gegebenen Zeile einer SQ-Beziehungs-Datei liegt mindestens
+ein Pflicht-Wert nicht vor. Die Zeile wird verworfen.
+
 \textbf{Error while storing sq relation.}
 \\Beim Schreiben einer S(Q) Beziehung trat ein Fehler auf.
 
+\textbf{Unknown bed height type: \#. File ignored.}
+\\Die gegebene Aufnahmeart ist unbekannt. Die Datei wird ignoriert.
+\\Bekannte Aufnahmearten:
+\begin{itemize}
+\item Querprofile
+\item Flächenpeilung
+\item Flächen- u. Querprofilpeilungen
+\item DGM
+\item TIN
+\item Modell
+\end{itemize}
+
 \textbf{Error reading PRF file.}
 \\Beim Lesen einer PRF-Datei trat ein Fehler auf.
 
@@ -462,6 +463,9 @@
 \textbf{HYK: Error closing file.}
 \\Beim Schließen einer HYK-Datei trat ein Fehler auf.
 
+\textbf{Null Start time will be ignored}
+\\Für ein Zeitintervall wurde keine Anfangszeit gegeben.
+
 \subsubsection{Warnungen}
 \textbf{annotation type file 'XYZ' is not readable.}
 \\Die Datein XYZ kann nicht gelesen werden.
@@ -475,6 +479,10 @@
 \textbf{no official lines wst file found}
 \\Keine Datei mit amtlichen Linien gefunden.
 
+\textbf{Invalid bwastr-id line: ...}
+\\Aus einer Zeile in \textbf{BWASTR\_ID.csv} konnte kein Gewässer bzw.
+Bundeswasserstraßen-ID gelesen werden.
+
 \textbf{cannot read fixations wst file directory}
 \\Das Verzeichnis mit den Fixierungen kann nicht gelesen werden.
 
@@ -517,10 +525,14 @@
 \\Eine Zeile in der Pegelgültigkeitsdatei hat nicht genug Spalten.
 
 \textbf{Error while parsing flow velocity values.}
-\\Invalide Datenzeile in einer Datei mit einer Fliessgeschwindigkeitsmessung.
+\\Invalide Datenzeile in einer Datei mit einer Fließgeschwindigkeitsmessung.
 
 \textbf{skip invalid data line: \#}
-\\Invalide Datenzeile in einer Datei mit einer Fliessgeschwindigkeitsmessung.
+\\Invalide Datenzeile (weniger als acht Spalten)
+in einer Datei mit einer Fließgeschwindigkeitsmessung.
+
+\textbf{Unparseable flow velocity values: ...}
+\\Invalide Werte in einer Datenzeile einer Fließgeschwindigkeitsmessung.
 
 \textbf{skip invalid waterlevel line: \#}
 \\Invalide Datenzeile in einer Datei mit Wasserstandsdifferenzen.
@@ -550,16 +562,17 @@
 \\In der eingelesenen Zeile konnte keine Zahl gefunden werden.
 
 \textbf{Unknown meta line: \#}
-\\Invalide Datenzeile in einer Datei mit Sedimentdichten.
+\\Meta-Informationen unbekannt. Werden ignoriert.
 
-\textbf{Error while parsing numbers in: \#}
-\\Invalide Datenzeile in einer Datei mit Sedimentdichten.
+\textbf{Unparseable numbers in '...'}
+\\Invalide Zahlen in einer Datenzeile in einer Datei mit Sedimentdichten.
 
 \textbf{skip invalid data line: \#}
-\\Invalide Datenzeile in einer Datei mit Sedimentdichten.
+\\Invalide Datenzeile in einer Datei mit Sedimentdichten wird ignoriert.
 
-\textbf{Error while parsing numbers in \#}
-\\Invalide Datenzeile in einer Datei mit Sedimentdichten.
+\textbf{SDP: No km nor density given. Skip line}
+\\Weder Station noch Dichte gegeben in einer Datenzeile in einer Datei mit Sedimentdichten.
+Zeile wird ignoriert.
 
 \textbf{STA file is empty}
 \\Stammdatendatei ist leer oder hat zu wenige Zeilen.
@@ -577,7 +590,7 @@
 \\Die zweite Zeile ist zu kurz.
 
 \textbf{STA: parsing of the datum of the gauge failed}
-\\Das Datum in der Stammdatendatei konnte nicht gelesen werden.
+\\Die Station in der Stammdatendatei konnte nicht gelesen werden.
 
 \textbf{STA: 'XYZ' is not a valid long number.}
 \\Die Pegelnummer ist invalide.
@@ -589,22 +602,39 @@
 \\AEO oder Pegelnullpunkt sind invalide.
 
 \textbf{STA: value not parseable in line \#}
-\\Wert ist nicht als Zahl zu interpretieren.
+\\Wert ist nicht als Zahl zu interpretieren (meist Kommentare).
 
 \textbf{PRF: cannot open file $<FILE>$}
-\\Die PRF kann nicht geöffnet werden.
+\\Die PRF-Datei kann nicht geöffnet werden.
 
-\textbf{PRF: file is empty}\\
-\textbf{PRF: First line does not look like a PRF data pattern.}\\
-\textbf{PRF: premature EOF. Expected integer in line 2}\\
-\textbf{PRF: Expected $<num>$ in line 2}\\
-\textbf{PRF: invalid integer in line 2}\\
-\textbf{PRF: premature EOF. Expected pattern for km extraction}\\
-\textbf{PRF: line 4 does not look like a PRF km extraction pattern.}\\
-\textbf{PRF: premature EOF. Expected skip row count.}\\
-\textbf{PRF: line 5 is not an positive integer.}\\
+\textbf{PRF: First line does not look like a PRF data pattern.}
+\\Erste Zeile entspricht nicht der PRF-Spezifikation.
+
+\textbf{PRF: premature EOF. Expected integer in line 2}
+\\Zweite Zeile entspricht nicht der PRF-Spezifikation.
+
+\textbf{PRF: Expected $<num>$ in line 2}
+\\Zweite Zeile entspricht nicht der PRF-Spezifikation.
+
+\textbf{PRF: invalid integer in line 2}
+\\Zweite Zeile entspricht nicht der PRF-Spezifikation.
+
+\textbf{PRF: premature EOF. Expected pattern for km extraction}
+\\Vierte Zeile entspricht nicht der PRF-Spezifikation.
+
+\textbf{PRF: line 4 does not look like a PRF km extraction pattern.}
+\\Vierte Zeile entspricht nicht der PRF-Spezifikation.
+
+\textbf{PRF: premature EOF. Expected skip row count.}
+\\Fünfte Zeile entspricht nicht der PRF-Spezifikation.
+
+\textbf{PRF: line 5 is not an positive integer.}
+\\Fünfte Zeile entspricht nicht der PRF-Spezifikation.
+
 \textbf{PRF: cannot extract km in line \#}
-\\Das PRF-Format ist komplex. Bei oben genannten Fehlern sollten weitere
+\\Der gegebenen Zeile konnte die Station nicht entnommen werden.
+
+Das PRF-Format ist komplex! Bei oben genannten Fehlern sollten ggf. weitere
 Information zur genaueren Analyse herangezogen werden.
 
 \textbf{cannot access WST file $FILE$}
@@ -623,7 +653,7 @@
 \\Invalider Q-Bereich
 
 \textbf{skip invalid waterlevel line: \#}
-\\Ungültige Wasserstandslinie
+\\Ungültige Wasserstands-Zeile.
 
 \textbf{Error while parsing number values: \#}
 \\Ungültige Zahlenwerte.
@@ -650,7 +680,7 @@
 \\Unterverzeichnis konnte nicht durchsucht werden.
 
 \textbf{BHP: Meta line did not match any known type: \#}
-\\Unbekannter Typ.
+\\Meta-Informationen unbekannt. Werden ignoriert.
 
 \textbf{BHP: Error while parsing timeinterval!}
 \\Ungültiges Zeitinterval.
@@ -664,13 +694,17 @@
 \textbf{BHP: Error while parsing range!}
 \\Bereichsangabe fehlerhaft.
 
+\textbf{Unparseable number in data row: \#}
+\\In der gegebenen Zeile wurde eine Zahl erwartet, 
+es konnte aber an entsprechender Stelle nichts als solche gelesen werden.
+
 \textbf{MWP: Unknown meta line: \#}
-\\Meta-Informationen ungültig.
+\\Meta-Informationen unbekannt. Werden ignoriert.
 
 \textbf{MWP: skip invalid data line: \#}
 \\Ungültige Datenzeile wurde übersprungen.
 
-\textbf{MWP: Error while parsing numbers in \#}
+\textbf{MWP: unparseable number in data row: \#}
 \\Falsche Zahlenformat.
 
 \textbf{ANNCLASS: rule has no name}
@@ -688,8 +722,29 @@
 \textbf{BSP: Error while parsing data row.}
 \\Ungültige Datenzeile.
 
+\textbf{duplicate station '...': -> ignored}
+\\Duplikat einer Station. Wird ignoriert.
+
+\textbf{BSP: unparseable height ...}
+\\Nicht lesbare Sohlhöhe in einer Sohlhöhen-Datei.
+
+\textbf{BSP: unparseable uncertainty value ...}
+\\Nicht lesbare Unsicherheit in einer Sohlhöhen-Datei.
+
+\textbf{BSP: unparseable data gap ...}
+\\Nicht lesbare Datenlücke in einer Sohlhöhen-Datei.
+
+\textbf{BSP: unparseable sounding width ...}
+\\Nicht lesbare Peilbreite in einer Sohlhöhen-Datei.
+
+\textbf{BSP: unparseable width ...}
+\\Nicht lesbare Breite in einer Sohlhöhen-Datei.
+
+\textbf{BSP: unparseable value in data row.}
+\\Nicht lesbare Werte in einer Sohlhöhen-Datei.
+
 \textbf{SYP: Unknown meta line: \#}
-\\Ungültige Metadatenzeile.
+\\Meta-Informationen unbekannt. Werden ignoriert.
 
 \textbf{SYP: skip invalid data line \#}
 \\Ungültige Datenzeile wurde übersprungen.
@@ -727,6 +782,9 @@
 \textbf{ISQ: Cannot determine sq relation without time interval.}
 \\Einer S(Q)-Beziehung ist keine zeitliche Gültigkeit zugeordnet.
 
+\textbf{Unparseable ... in sq relation row: ...}
+\\Der gegebene Wert in der gegebenen Zeile konnte nicht als Zahl gelesen werden.
+
 \textbf{IWD: skip invalid waterlevel difference - no unit set!}
 \\Wasserstandsdifferenz hat keine Einheit.
 
@@ -739,6 +797,18 @@
 \textbf{BHE: Skip file - invalid km range.}
 \\Kilometerbereich ungültig.
 
+\textbf{No upper value for range found in ...}
+\\Oberer Wert des Gültigkeitsbereiches einer Messstelle fehlt.
+
+\textbf{invalid gauge found: ...}
+\\Kein gültiger Pegel zur Messstelle gegeben.
+
+\textbf{Found invalid observation time ...}
+\textbf{Observation time date invalid: ...}
+\textbf{Observation time date not parseable: ...}
+\\Kein gültiger zeitlicher Bezug zur Messstelle gegeben.
+
+
 
 \subsection{Hinweise zum Betrieb}
 Aufgrund des hohen Speicherverbrauchs des Importers wird empfohlen, der JVM
@@ -762,7 +832,15 @@
 \begin{lstlisting}
     ./run_hydr_morph.sh
 \end{lstlisting}
-
 Nachdem der Prompt der Konsole zurückkehrt, ist der Import abgeschlossen oder es
 ist ein Fehler aufgetreten. Weitere Informationen entnehmen Sie der Log-Datei.
 
+Um einen Gewässerdatensatz in einem Durchlauf (inkl.\ Geodaten) 
+zu importieren, kann auch das Skript \textit{import\_river.sh} verwendet werden.
+
+Details zur Verwendung erhalten Sie auf der Kommandozeile mit 
+\begin{lstlisting}
+    ./import_river.sh --help
+\end{lstlisting}
+Alternativ können auch in diesem Skript einige Variablen 
+(\textit{DEFAULT\_*}) angepasst werden.
--- a/backend/doc/documentation/de/overview.tex	Wed Jul 31 12:40:04 2013 +0200
+++ b/backend/doc/documentation/de/overview.tex	Wed Jul 31 12:31:09 2013 +0200
@@ -2,8 +2,7 @@
 
 Diese Dokumentation beschreibt die von Intevation entwickelten Werkzeuge zum
 Importieren der hydrologischen, morphologischen und geodätischen Daten der BfG.
-Die im Folgenden\\ beschriebenen Werkzeuge zum Importieren der fachlichen und
-geodätischen Daten sind speziell auf das Verzeichnissystem der BfG ausgerichtet.
+Die im Folgenden beschriebenen Werkzeuge zum Importieren der Daten sind speziell auf das Verzeichnissystem der BfG ausgerichtet.
 Dabei wird angenommen, dass sich das Verzeichnis eines Gewässers auf oberster
 Ebene in drei Unterverzeichnisse aufgliedert:
 
@@ -69,7 +68,7 @@
 \end{lstlisting}
 
 \subsubsection{Java}
-Der flys-importer benötigt Java Version 6 um diese zu installieren laden Sie
+Der flys-importer benötigt Java Version 6. Um diese zu installieren laden Sie
 bitte von \url{http://www.oracle.com/technetwork/java/javase/downloads/jdk6downloads-1902814.html}
 eine aktulle Java Version als -rpm.bin herunter. Zum Beispiel: jdk-6u41-linux-x64-rpm.bin
 
@@ -95,9 +94,10 @@
  \begin{lstlisting}
      zypper ar http://download.opensuse.org/repositories/home:/intevation:/bfg/SLE_11/ "intevation:bfg"
      rpm --import http://download.opensuse.org/repositories/home:/intevation:/bfg/SLE_11/repodata/repomd.xml.key
-     zypper ref # Paketlist neu laden
-     zypper in python libgeos0 libproj0 proj netcdf libnetcdf4 \
-        xerces-c libxerces-c-3_0 unixODBC postgresql-libs
+     zypper ref # Paketliste neu laden
+     zypper in python libgeos0 libproj0 proj netcdf \
+        libnetcdf4 xerces-c libxerces-c-3_0 unixODBC \
+        postgresql-libs
      zypper mr -d "intevation:bfg"
      zypper ref # Paketliste neu laden
  \end{lstlisting}
@@ -188,8 +188,8 @@
 führen Sie im Importer Verzeichnis folgende Befehle aus:
 
 \begin{lstlisting}
-export LD_LIBRARY_PATH=opt/instantclient\_11\_2/lib:$LD_LIBRARY_PATH
-export PATH=opt/instantclient\_11\_2:$PATH
+export LD_LIBRARY_PATH=opt/instantclient_11_2/lib:$LD_LIBRARY_PATH
+export PATH=opt/instantclient_11_2:$PATH
 \end{lstlisting}
 
 Damit alle in den UTF8-codierten SQL-Skripten vorhandenen Zeichen (also z.B.\ 
@@ -200,13 +200,30 @@
 export NLS_LANG=.AL32UTF8
 \end{lstlisting}
 
-Nun erstellen Sie das Schema:
+Nun verbinden Sie sich mit der Datenbank
+\begin{lstlisting}
+    sqlplus user/password@connect_identifier
+\end{lstlisting}
+
+und erstellen das Schema:
 
 \begin{lstlisting}
-    sqlplus benutzername/passwort @schema/oracle.sql
-    sqlplus benutzername/passwort @schema/oracle-minfo.sql
-    sqlplus benutzername/passwort @schema/oracle-spatial.sql
-    sqlplus benutzername/passwort @schema/oracle-spatial_idx.sql
+    @schema/oracle.sql
+    @schema/oracle-minfo.sql
+    @schema/oracle-spatial.sql
+    @schema/oracle-spatial_idx.sql
 \end{lstlisting}
 
+Hierbei ist 
+\begin{lstlisting}
+user/password@connect_identifier
+\end{lstlisting}
+so etwas wie 
+\begin{lstlisting}
+ICH/geheim@127.0.0.1:1234/DB.TEST.FIRMA.DE
+\end{lstlisting}
 
+Um sqlplus zu verlassen verwenden Sie
+\begin{lstlisting}
+exit
+\end{lstlisting}
--- a/backend/doc/schema/oracle-drop-minfo.sql	Wed Jul 31 12:40:04 2013 +0200
+++ b/backend/doc/schema/oracle-drop-minfo.sql	Wed Jul 31 12:31:09 2013 +0200
@@ -27,14 +27,6 @@
 ALTER TABLE sediment_yield DROP CONSTRAINT fk_sy_time_interval_id;
 ALTER TABLE sediment_yield DROP CONSTRAINT fk_sy_river_id;
 ALTER TABLE sediment_yield_values DROP CONSTRAINT fk_syv_sediment_yield_id;
-ALTER TABLE waterlevel DROP CONSTRAINT fk_w_river_id;
-ALTER TABLE waterlevel DROP CONSTRAINT fk_w_unit_id;
-ALTER TABLE waterlevel_q_range DROP CONSTRAINT fk_wqr_waterlevel_id;
-ALTER TABLE waterlevel_values DROP CONSTRAINT fk_wv_waterlevel_q_range_id;
-ALTER TABLE waterlevel_difference DROP CONSTRAINT fk_wd_river_id;
-ALTER TABLE waterlevel_difference DROP CONSTRAINT fk_wd_unit_id;
-ALTER TABLE waterlevel_difference_column DROP CONSTRAINT fk_wdc_difference_id;
-ALTER TABLE waterlevel_difference_values DROP CONSTRAINT fk_wdv_column_id;
 ALTER TABLE sq_relation DROP CONSTRAINT fk_sqr_tinterval_id;
 ALTER TABLE sq_relation DROP CONSTRAINT fk_sqr_river_id;
 ALTER TABLE sq_relation_value DROP CONSTRAINT fk_sqr_id;
@@ -44,37 +36,30 @@
 ALTER TABLE measurement_station DROP CONSTRAINT fk_ms_reference_gauge_id;
 ALTER TABLE measurement_station DROP CONSTRAINT fk_ms_observation_timerange_id;
 
-DROP TABLE bed_height_type;
-DROP TABLE location_system;
-DROP TABLE elevation_model;
-DROP TABLE bed_height_single;
-DROP TABLE bed_height_single_values;
-DROP TABLE bed_height_epoch_values;
-DROP TABLE bed_height_epoch;
-DROP TABLE depths;
-DROP TABLE sediment_density;
-DROP TABLE sediment_density_values;
-DROP TABLE morphologic_width;
-DROP TABLE morphologic_width_values;
-DROP TABLE discharge_zone;
-DROP TABLE flow_velocity_model;
-DROP TABLE flow_velocity_model_values;
-DROP TABLE flow_velocity_measurements;
-DROP TABLE flow_velocity_measure_values;
-DROP TABLE grain_fraction;
-DROP TABLE sediment_yield;
-DROP TABLE sediment_yield_values;
-DROP TABLE waterlevel;
-DROP TABLE waterlevel_q_range;
-DROP TABLE waterlevel_values;
-DROP TABLE waterlevel_difference;
-DROP TABLE waterlevel_difference_column;
-DROP TABLE waterlevel_difference_values;
-DROP TABLE measurement_station;
-DROP TABLE sq_relation_value;
-DROP TABLE sq_relation;
+DROP TABLE bed_height_type PURGE;
+DROP TABLE location_system PURGE;
+DROP TABLE elevation_model PURGE;
+DROP TABLE bed_height_single PURGE;
+DROP TABLE bed_height_single_values PURGE;
+DROP TABLE bed_height_epoch_values PURGE;
+DROP TABLE bed_height_epoch PURGE;
+DROP TABLE depths PURGE;
+DROP TABLE sediment_density PURGE;
+DROP TABLE sediment_density_values PURGE;
+DROP TABLE morphologic_width PURGE;
+DROP TABLE morphologic_width_values PURGE;
+DROP TABLE discharge_zone PURGE;
+DROP TABLE flow_velocity_model PURGE;
+DROP TABLE flow_velocity_model_values PURGE;
+DROP TABLE flow_velocity_measurements PURGE;
+DROP TABLE flow_velocity_measure_values PURGE;
+DROP TABLE grain_fraction PURGE;
+DROP TABLE sediment_yield PURGE;
+DROP TABLE sediment_yield_values PURGE;
+DROP TABLE measurement_station PURGE;
+DROP TABLE sq_relation_value PURGE;
+DROP TABLE sq_relation PURGE;
 
-DROP SEQUENCE BED_HEIGHT_TYPE_SEQ;
 DROP SEQUENCE LOCATION_SYSTEM_SEQ;
 DROP SEQUENCE ELEVATION_MODEL_SEQ;
 DROP SEQUENCE BED_HEIGHT_SINGLE_ID_SEQ;
@@ -94,11 +79,6 @@
 DROP SEQUENCE GRAIN_FRACTION_ID_SEQ;
 DROP SEQUENCE SEDIMENT_YIELD_ID_SEQ;
 DROP SEQUENCE SEDIMENT_YIELD_VALUES_ID_SEQ;
-DROP SEQUENCE WATERLEVEL_ID_SEQ;
-DROP SEQUENCE WATERLEVEL_Q_RANGES_ID_SEQ;
-DROP SEQUENCE WATERLEVEL_VALUES_ID_SEQ;
-DROP SEQUENCE WATERLEVEL_DIFFERENCE_ID_SEQ;
-DROP SEQUENCE WATERLEVEL_DIFF_COLUMN_ID_SEQ;
-DROP SEQUENCE WATERLEVEL_DIFF_VALUES_ID_SEQ;
+DROP SEQUENCE MEASUREMENT_STATION_ID_SEQ;
 DROP SEQUENCE SQ_RELATION_ID_SEQ;
 DROP SEQUENCE SQ_RELATION_VALUES_ID_SEQ;
--- a/backend/doc/schema/oracle-drop-spatial.sql	Wed Jul 31 12:40:04 2013 +0200
+++ b/backend/doc/schema/oracle-drop-spatial.sql	Wed Jul 31 12:31:09 2013 +0200
@@ -1,88 +1,85 @@
 DROP TRIGGER river_axes_trigger;
-DROP TABLE river_axes;
+DROP TABLE river_axes PURGE;
 DELETE FROM USER_SDO_GEOM_METADATA WHERE TABLE_NAME = 'RIVER_AXES';
 DROP SEQUENCE RIVER_AXES_ID_SEQ;
 
 DROP TRIGGER river_axes_km_trigger;
-DROP TABLE river_axes_km;
+DROP TABLE river_axes_km PURGE;
 DELETE FROM USER_SDO_GEOM_METADATA WHERE TABLE_NAME = 'RIVER_AXES_KM';
 DROP SEQUENCE RIVER_AXES_KM_ID_SEQ;
 
 DROP TRIGGER cross_section_tracks_trigger;
-DROP TABLE cross_section_tracks;
+DROP TABLE cross_section_tracks PURGE;
 DELETE FROM USER_SDO_GEOM_METADATA WHERE TABLE_NAME = 'CROSS_SECTION_TRACKS';
 DROP SEQUENCE CROSS_SECTION_TRACKS_ID_SEQ;
 
 DROP TRIGGER buildings_trigger;
-DROP TABLE buildings;
+DROP TABLE buildings PURGE;
 DELETE FROM USER_SDO_GEOM_METADATA WHERE TABLE_NAME = 'BUILDINGS';
 DROP SEQUENCE BUILDINGS_ID_SEQ;
 
 DROP TRIGGER fixpoints_trigger;
-DROP TABLE fixpoints;
+DROP TABLE fixpoints PURGE;
 DELETE FROM USER_SDO_GEOM_METADATA WHERE TABLE_NAME = 'FIXPOINTS';
 DROP SEQUENCE FIXPOINTS_ID_SEQ;
 
 DROP TRIGGER floodplain_trigger;
-DROP TABLE floodplain;
+DROP TABLE floodplain PURGE;
 DELETE FROM USER_SDO_GEOM_METADATA WHERE TABLE_NAME = 'FLOODPLAIN';
 DROP SEQUENCE FLOODPLAIN_ID_SEQ;
 
 DROP TRIGGER dem_trigger;
-DROP TABLE dem;
+DROP TABLE dem PURGE;
 DROP SEQUENCE DEM_ID_SEQ;
 
-DROP TRIGGER catchment_trigger;
-DROP TABLE catchment;
-DELETE FROM USER_SDO_GEOM_METADATA WHERE TABLE_NAME = 'CATCHMENT';
-DROP SEQUENCE CATCHMENT_ID_SEQ;
-
 DROP TRIGGER hws_lines_trigger;
-DROP TABLE hws_lines;
+DROP TABLE hws_lines PURGE;
 DELETE FROM USER_SDO_GEOM_METADATA WHERE TABLE_NAME = 'HWS_LINES';
 DROP SEQUENCE HWS_LINES_ID_SEQ;
 
 DROP TRIGGER hws_points_trigger;
-DROP TABLE hws_points;
+DROP TABLE hws_points PURGE;
 DELETE FROM USER_SDO_GEOM_METADATA WHERE TABLE_NAME = 'HWS_POINTS';
 DROP SEQUENCE HWS_POINTS_ID_SEQ;
 
 DROP TRIGGER floodmaps_trigger;
-DROP TABLE floodmaps;
+DROP TABLE floodmaps PURGE;
 DELETE FROM USER_SDO_GEOM_METADATA WHERE TABLE_NAME = 'FLOODMAPS';
 DROP SEQUENCE FLOODMAPS_ID_SEQ;
 
 DROP TRIGGER hydr_boundaries_trigger;
-DROP TABLE hydr_boundaries;
+DROP TABLE hydr_boundaries PURGE;
 DELETE FROM USER_SDO_GEOM_METADATA WHERE TABLE_NAME = 'HYDR_BOUNDARIES';
 DROP SEQUENCE HYDR_BOUNDARIES_ID_SEQ;
 
 DROP TRIGGER hydr_boundaries_poly_trigger;
-DROP TABLE hydr_boundaries_poly;
+DROP TABLE hydr_boundaries_poly PURGE;
 DELETE FROM USER_SDO_GEOM_METADATA WHERE TABLE_NAME = 'HYDR_BOUNDARIES_POLY';
 DROP SEQUENCE HYDR_BOUNDARIES_POLY_ID_SEQ;
 
 DROP TRIGGER gauge_location_trigger;
-DROP TABLE gauge_location;
+DROP TABLE gauge_location PURGE;
 DELETE FROM USER_SDO_GEOM_METADATA WHERE TABLE_NAME = 'GAUGE_LOCATION';
 DROP SEQUENCE GAUGE_LOCATION_ID_SEQ;
 
 DROP TRIGGER jetties_trigger;
-DROP TABLE jetties;
+DROP TABLE jetties PURGE;
 DELETE FROM USER_SDO_GEOM_METADATA WHERE TABLE_NAME = 'JETTIES';
 DROP SEQUENCE JETTIES_ID_SEQ;
 
 DROP TRIGGER flood_marks_trigger;
-DROP TABLE flood_marks;
+DROP TABLE flood_marks PURGE;
 DELETE FROM USER_SDO_GEOM_METADATA WHERE TABLE_NAME = 'FLOOD_MARKS';
 DROP SEQUENCE FLOOD_MARKS_ID_SEQ;
 
-DROP TABLE hws_kinds;
-DROP TABLE sectie_kinds;
-DROP TABLE sobek_kinds;
-DROP TABLE fed_states;
-DROP TABLE axis_kinds;
-DROP TABLE boundary_kinds;
-DROP TABLE cross_section_track_kinds;
-DROP TABLE floodplain_kinds;
-DROP TABLE building_kinds;
+DROP TABLE hws_kinds PURGE;
+DROP TABLE sectie_kinds PURGE;
+DROP TABLE sobek_kinds PURGE;
+DROP TABLE fed_states PURGE;
+DROP TABLE axis_kinds PURGE;
+DROP TABLE boundary_kinds PURGE;
+DROP TABLE cross_section_track_kinds PURGE;
+DROP TABLE floodplain_kinds PURGE;
+DROP TABLE floodmap_kinds PURGE;
+DROP TABLE building_kinds PURGE;
+DROP TABLE jetty_kinds PURGE;
--- a/backend/doc/schema/oracle-drop.sql	Wed Jul 31 12:40:04 2013 +0200
+++ b/backend/doc/schema/oracle-drop.sql	Wed Jul 31 12:31:09 2013 +0200
@@ -20,6 +20,8 @@
 ALTER TABLE main_values DROP CONSTRAINT cMainValuesGauges;
 ALTER TABLE main_values DROP CONSTRAINT cMainValuesNamedMainValues;
 ALTER TABLE named_main_values DROP CONSTRAINT cNamedMainValuesMainValueTypes;
+ALTER TABLE official_lines DROP CONSTRAINT cOffLinesNamedMainValues;
+ALTER TABLE official_lines DROP CONSTRAINT cOffLinesWstColumns;
 ALTER TABLE ranges DROP CONSTRAINT cRangesRivers;
 ALTER TABLE rivers DROP CONSTRAINT cRiversUnits;
 ALTER TABLE wst_column_q_ranges DROP CONSTRAINT cWstColumnQRangesWstColums;
@@ -30,36 +32,36 @@
 ALTER TABLE wst_q_ranges DROP CONSTRAINT cWstQRangesRanges;
 ALTER TABLE wsts DROP CONSTRAINT cWstsRivers;
 ALTER TABLE wsts DROP CONSTRAINT cWstsWstKinds;
-DROP TABLE annotation_types;
-DROP TABLE annotations;
-DROP TABLE attributes;
-DROP TABLE cross_section_lines;
-DROP TABLE cross_section_points;
-DROP TABLE cross_sections;
-DROP TABLE discharge_table_values;
-DROP TABLE discharge_tables;
-DROP TABLE edges;
-DROP TABLE gauges;
-DROP TABLE hyk_entries;
-DROP TABLE hyk_flow_zone_types;
-DROP TABLE hyk_flow_zones;
-DROP TABLE hyk_formations;
-DROP TABLE hyks;
-DROP TABLE main_value_types;
-DROP TABLE main_values;
-DROP TABLE named_main_values;
-DROP TABLE positions;
-DROP TABLE ranges;
-DROP TABLE rivers;
-DROP TABLE time_intervals;
-DROP TABLE units;
-DROP TABLE wst_column_q_ranges;
-DROP TABLE wst_column_values;
-DROP TABLE wst_columns;
-DROP TABLE wst_q_ranges;
-DROP TABLE official_lines;
-DROP TABLE wsts;
-DROP TABLE wst_kinds;
+DROP TABLE annotation_types PURGE;
+DROP TABLE annotations PURGE;
+DROP TABLE attributes PURGE;
+DROP TABLE cross_section_lines PURGE;
+DROP TABLE cross_section_points PURGE;
+DROP TABLE cross_sections PURGE;
+DROP TABLE discharge_table_values PURGE;
+DROP TABLE discharge_tables PURGE;
+DROP TABLE edges PURGE;
+DROP TABLE gauges PURGE;
+DROP TABLE hyk_entries PURGE;
+DROP TABLE hyk_flow_zone_types PURGE;
+DROP TABLE hyk_flow_zones PURGE;
+DROP TABLE hyk_formations PURGE;
+DROP TABLE hyks PURGE;
+DROP TABLE main_value_types PURGE;
+DROP TABLE main_values PURGE;
+DROP TABLE named_main_values PURGE;
+DROP TABLE positions PURGE;
+DROP TABLE ranges PURGE;
+DROP TABLE rivers PURGE;
+DROP TABLE time_intervals PURGE;
+DROP TABLE units PURGE;
+DROP TABLE wst_column_q_ranges PURGE;
+DROP TABLE wst_column_values PURGE;
+DROP TABLE wst_columns PURGE;
+DROP TABLE wst_q_ranges PURGE;
+DROP TABLE official_lines PURGE;
+DROP TABLE wsts PURGE;
+DROP TABLE wst_kinds PURGE;
 DROP SEQUENCE ANNOTATION_TYPES_ID_SEQ;
 DROP SEQUENCE ANNOTATIONS_ID_SEQ;
 DROP SEQUENCE ATTRIBUTES_ID_SEQ;
--- a/backend/doc/schema/oracle-minfo.sql	Wed Jul 31 12:40:04 2013 +0200
+++ b/backend/doc/schema/oracle-minfo.sql	Wed Jul 31 12:31:09 2013 +0200
@@ -85,12 +85,12 @@
 CREATE TABLE bed_height_single_values (
     id                      NUMBER(38,0) NOT NULL,
     bed_height_single_id    NUMBER(38,0) NOT NULL,
-    station                 NUMBER(38,2) NOT NULL,
-    height                  NUMBER(38,2),
-    uncertainty             NUMBER(38,2),
-    data_gap                NUMBER(38,2),
-    sounding_width          NUMBER(38,2),
-    width                   NUMBER(38,2),
+    station                 DOUBLE PRECISION NOT NULL,
+    height                  DOUBLE PRECISION,
+    uncertainty             DOUBLE PRECISION,
+    data_gap                DOUBLE PRECISION,
+    sounding_width          DOUBLE PRECISION,
+    width                   DOUBLE PRECISION,
     PRIMARY KEY(id),
     UNIQUE (station, bed_height_single_id),
     CONSTRAINT fk_bed_single_values_parent FOREIGN KEY (bed_height_single_id) REFERENCES bed_height_single(id) ON DELETE CASCADE
@@ -179,8 +179,8 @@
     river_id                NUMBER(38,0) NOT NULL,
     gauge_name              VARCHAR(64)  NOT NULL, -- this is not very proper, but there are gauges with no db instance
     value                   NUMBER(38,3) NOT NULL,
-    lower_discharge         VARCHAR(16)  NOT NULL,
-    upper_discharge         VARCHAR(16),
+    lower_discharge         VARCHAR(64)  NOT NULL,
+    upper_discharge         VARCHAR(64),
     PRIMARY KEY(id),
     CONSTRAINT fk_dz_river_id FOREIGN KEY (river_id) REFERENCES rivers(id) ON DELETE CASCADE
 );
@@ -247,7 +247,7 @@
     name    VARCHAR(64)    NOT NULL,
     lower   NUMBER(38,3),
     upper   NUMBER(38,3),
-    PRIMARY KEY (id),
+    PRIMARY KEY (id)
 );
 
 
--- a/backend/doc/schema/oracle-spatial.sql	Wed Jul 31 12:40:04 2013 +0200
+++ b/backend/doc/schema/oracle-spatial.sql	Wed Jul 31 12:31:09 2013 +0200
@@ -1,4 +1,4 @@
-WHENEVER SQLERROR EXIT;
+--WHENEVER SQLERROR EXIT;
 
 CREATE TABLE axis_kinds(
     id NUMBER PRIMARY KEY NOT NULL,
@@ -14,7 +14,7 @@
     OGR_FID NUMBER(38),
     GEOM MDSYS.SDO_GEOMETRY,
     river_id NUMBER(38) REFERENCES rivers(id) ON DELETE CASCADE,
-    kind_id  NUMBER(38) REFERENCES axis_kinds(id) NOT NULL DEFAULT 0,
+    kind_id  NUMBER(38) DEFAULT 0 NOT NULL REFERENCES axis_kinds(id),
     name     VARCHAR(64),
     path     VARCHAR(256),
     ID NUMBER PRIMARY KEY NOT NULL
@@ -62,7 +62,7 @@
     OGR_FID NUMBER(38),
     GEOM MDSYS.SDO_GEOMETRY,
     river_id NUMBER(38) REFERENCES rivers(id) ON DELETE CASCADE,
-    kind_id  NUMBER(38) REFERENCES cross_section_track_kinds(id) NOT NULL DEFAULT 0,
+    kind_id  NUMBER(38) DEFAULT 0 NOT NULL REFERENCES cross_section_track_kinds(id),
     km       NUMBER(38,12) NOT NULL,
     z        NUMBER(38,12) DEFAULT 0 NOT NULL,
     name     VARCHAR(64),
@@ -145,7 +145,7 @@
     OGR_FID NUMBER(38),
     GEOM MDSYS.SDO_GEOMETRY,
     river_id NUMBER(38) REFERENCES rivers(id) ON DELETE CASCADE,
-    kind_id  NUMBER(38) REFERENCES floodplain_kinds(id) NOT NULL DEFAULT 0,
+    kind_id  NUMBER(38) DEFAULT 0 NOT NULL REFERENCES floodplain_kinds(id),
     name     VARCHAR(64),
     path     VARCHAR(256),
     ID NUMBER PRIMARY KEY NOT NULL
--- a/backend/doc/schema/oracle.sql	Wed Jul 31 12:40:04 2013 +0200
+++ b/backend/doc/schema/oracle.sql	Wed Jul 31 12:31:09 2013 +0200
@@ -27,10 +27,11 @@
 
 CREATE TABLE attributes (
     id              NUMBER(38,0) NOT NULL, 
-    value           VARCHAR2(255) NOT NULL UNIQUE, 
+    value           VARCHAR2(255) UNIQUE, 
     primary key     (id)
 );
-
+-- value can not be NOT NULL in Oracle:
+-- '' is needed here and silently converted to NULL in Oracle
 
 -- CROSS_SECTION_LINES
 CREATE SEQUENCE CROSS_SECTION_LINES_ID_SEQ;
@@ -53,7 +54,7 @@
     x                       NUMBER(38,2) NOT NULL,
     y                       NUMBER(38,2) NOT NULL,
     cross_section_line_id   NUMBER(38,0) NOT NULL,
-    PRIMARY KEY             (id),
+    PRIMARY KEY             (id)
 );
 
 
@@ -94,7 +95,7 @@
     id                  NUMBER(38,0) NOT NULL,
     description         VARCHAR2(255) NOT NULL,
     bfg_id              VARCHAR2(50),
-    kind                NUMBER(38,0) NOT NULL DEFAULT 0,
+    kind                NUMBER(38,0) DEFAULT 0 NOT NULL,
     gauge_id            NUMBER(38,0) NOT NULL,
     time_interval_id    NUMBER(38,0),
     PRIMARY KEY         (id),
@@ -215,8 +216,6 @@
     gauge_id            NUMBER(38,0) NOT NULL,
     named_value_id      NUMBER(38,0) NOT NULL,
     time_interval_id    NUMBER(38,0),
-
-    -- TODO: better checks
     UNIQUE (gauge_id, named_value_id, time_interval_id),
     PRIMARY KEY         (id)
 );
@@ -263,7 +262,7 @@
 CREATE TABLE rivers (
     id                  NUMBER(38,0) NOT NULL,
     official_number     NUMBER(38,0),
-    km_up               NUMBER(38,0) NOT NULL DEFAULT 0,
+    km_up               NUMBER(38,0) DEFAULT 0 NOT NULL,
     name                VARCHAR2(255) NOT NULL UNIQUE,
     wst_unit_id         NUMBER(38,0) NOT NULL,
     PRIMARY KEY         (id)
@@ -325,7 +324,8 @@
     id                  NUMBER(38,0) NOT NULL,
     description         VARCHAR2(255),
     name                VARCHAR2(255) NOT NULL,
-    position            NUMBER(38,0) NOT NULL DEFAULT 0,
+    source              VARCHAR(256),
+    position            NUMBER(38,0) DEFAULT 0 NOT NULL,
     time_interval_id    NUMBER(38,0),
     wst_id              NUMBER(38,0) NOT NULL,
     UNIQUE (wst_id, name),
@@ -416,7 +416,7 @@
 ALTER TABLE wst_column_q_ranges ADD CONSTRAINT cWstColumnQRangesWstQRanges FOREIGN KEY (wst_q_range_id) REFERENCES wst_q_ranges ON DELETE CASCADE;
 ALTER TABLE wst_columns ADD CONSTRAINT cWstColumnsWsts FOREIGN KEY (wst_id) REFERENCES wsts ON DELETE CASCADE;
 ALTER TABLE wst_column_values ADD CONSTRAINT cWstColumnValuesWstColumns FOREIGN KEY (wst_column_id) REFERENCES wst_columns ON DELETE CASCADE;
-ALTER TABLE wst_q_ranges ADD CONSTRAINT cWstQRangesRanges FOREIGN KEY (range_id) REFERENCES RANGES ON LETE CASCADE;
+ALTER TABLE wst_q_ranges ADD CONSTRAINT cWstQRangesRanges FOREIGN KEY (range_id) REFERENCES RANGES ON DELETE CASCADE;
 ALTER TABLE wsts ADD CONSTRAINT cWstsRivers FOREIGN KEY (river_id) REFERENCES rivers ON DELETE CASCADE;
 ALTER TABLE wsts ADD CONSTRAINT cWstsWstKinds FOREIGN KEY (kind) REFERENCES wst_kinds;
 
--- a/backend/doc/schema/postgresql-minfo.sql	Wed Jul 31 12:40:04 2013 +0200
+++ b/backend/doc/schema/postgresql-minfo.sql	Wed Jul 31 12:31:09 2013 +0200
@@ -179,8 +179,8 @@
     river_id                int NOT NULL,
     gauge_name              VARCHAR(64)  NOT NULL, -- this is not very proper, but there are gauges with no db instance
     value                   NUMERIC NOT NULL,
-    lower_discharge         VARCHAR(16)  NOT NULL,
-    upper_discharge         VARCHAR(16),
+    lower_discharge         VARCHAR(64)  NOT NULL,
+    upper_discharge         VARCHAR(64),
     PRIMARY KEY(id),
     CONSTRAINT fk_dz_river_id FOREIGN KEY (river_id) REFERENCES rivers(id) ON DELETE CASCADE
 );
--- a/backend/doc/schema/postgresql.sql	Wed Jul 31 12:40:04 2013 +0200
+++ b/backend/doc/schema/postgresql.sql	Wed Jul 31 12:31:09 2013 +0200
@@ -201,6 +201,7 @@
     wst_id      int NOT NULL REFERENCES wsts(id) ON DELETE CASCADE,
     name        VARCHAR(256) NOT NULL,
     description VARCHAR(256),
+    source      VARCHAR(256),
     position    int NOT NULL DEFAULT 0,
 
     time_interval_id int REFERENCES time_intervals(id),
--- a/backend/src/main/java/org/dive4elements/river/importer/ImportBedHeightSingleValue.java	Wed Jul 31 12:40:04 2013 +0200
+++ b/backend/src/main/java/org/dive4elements/river/importer/ImportBedHeightSingleValue.java	Wed Jul 31 12:31:09 2013 +0200
@@ -10,7 +10,7 @@
 
 import java.util.List;
 
-import java.math.BigDecimal;
+//import java.math.BigDecimal;
 
 import org.apache.log4j.Logger;
 
@@ -29,24 +29,26 @@
 
     protected ImportBedHeightSingle bedHeight;
 
-    protected BigDecimal station;
-    protected BigDecimal height;
-    protected BigDecimal uncertainty;
-    protected BigDecimal dataGap;
-    protected BigDecimal soundingWidth;
-    protected BigDecimal width;
+    protected Double station;
+    protected Double height;
+    protected Double uncertainty;
+    protected Double dataGap;
+    //    protected BigDecimal soundingWidth;
+    protected Double soundingWidth;
+    protected Double width;
 
     protected BedHeightSingleValue peer;
 
 
     public ImportBedHeightSingleValue(
         ImportBedHeightSingle bedHeight,
-        BigDecimal station,
-        BigDecimal height,
-        BigDecimal uncertainty,
-        BigDecimal dataGap,
-        BigDecimal soundingWidth,
-        BigDecimal width
+        Double station,
+        Double height,
+        Double uncertainty,
+        Double dataGap,
+	//        BigDecimal soundingWidth,
+	Double soundingWidth,
+        Double width
     ) {
         this.bedHeight     = bedHeight;
         this.station       = station;
--- a/backend/src/main/java/org/dive4elements/river/importer/ImportOfficialLine.java	Wed Jul 31 12:40:04 2013 +0200
+++ b/backend/src/main/java/org/dive4elements/river/importer/ImportOfficialLine.java	Wed Jul 31 12:31:09 2013 +0200
@@ -45,7 +45,7 @@
             // XXX: This is a bit odd. We do not have not enough infos here
             // to create a new NamedMainValue. So we just look for existing ones.
             Session session = ImporterSession.getInstance().getDatabaseSession();
-            NamedMainValue nmv = NamedMainValue.fetchByName(name, session);
+            NamedMainValue nmv = NamedMainValue.fetchByNameAndType(name, "Q", session);
             if (nmv == null) {
                 // failed -> failed to create OfficialLine
                 return null;
--- a/backend/src/main/java/org/dive4elements/river/importer/parsers/BedHeightParser.java	Wed Jul 31 12:40:04 2013 +0200
+++ b/backend/src/main/java/org/dive4elements/river/importer/parsers/BedHeightParser.java	Wed Jul 31 12:31:09 2013 +0200
@@ -18,6 +18,7 @@
 import java.util.ArrayList;
 import java.util.Date;
 import java.util.List;
+import java.util.TreeSet;
 import java.util.Locale;
 
 import java.util.regex.Matcher;
@@ -39,6 +40,7 @@
 import org.dive4elements.river.importer.ImportUnit;
 import org.dive4elements.river.model.BedHeightType;
 import org.dive4elements.river.importer.ImporterSession;
+import org.dive4elements.river.utils.EpsilonComparator;
 import org.dive4elements.river.importer.parsers.LineParser;
 
 public abstract class BedHeightParser {
@@ -98,10 +100,12 @@
         String          line
     );
 
+    protected TreeSet<Double> kmExists;
 
 
     public BedHeightParser() {
-        this.bedHeights = new ArrayList<ImportBedHeight>();
+        bedHeights = new ArrayList<ImportBedHeight>();
+        kmExists = new TreeSet<Double>(EpsilonComparator.CMP);
     }
 
 
@@ -115,12 +119,15 @@
 
         ImportBedHeight obj = newImportBedHeight(file.getName().replaceAll("\\.csv", ""));
 
-        LineNumberReader in =
-            new LineNumberReader(
-            new InputStreamReader(
-            new FileInputStream(file), ENCODING));
+        kmExists.clear();
 
+        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) {
@@ -139,7 +146,9 @@
             bedHeights.add(obj);
         }
         finally {
-            in.close();
+            if (in != null) {
+                in.close();
+            }
         }
     }
 
@@ -329,7 +338,7 @@
             String tmp = m.group(1).replace(";", "").trim();
 
             BedHeightType bht = BedHeightType.fetchBedHeightTypeForType(
-                tmp, ImporterSession.getInstance().getDatabaseSession());
+		tmp, ImporterSession.getInstance().getDatabaseSession());
 
             if (bht != null) {
                 obj.setType(new ImportBedHeightType(bht));
--- a/backend/src/main/java/org/dive4elements/river/importer/parsers/BedHeightSingleParser.java	Wed Jul 31 12:40:04 2013 +0200
+++ b/backend/src/main/java/org/dive4elements/river/importer/parsers/BedHeightSingleParser.java	Wed Jul 31 12:31:09 2013 +0200
@@ -39,6 +39,7 @@
      */
     @Override
     protected void handleDataLine(ImportBedHeight obj, String line) {
+	log.debug(line);
         String[] values = line.split(SEPERATOR_CHAR);
 
         if (values == null || (values.length != 1 && values.length < 6)) {
@@ -46,11 +47,21 @@
             return;
         }
 
-        BigDecimal km;
+        Double km;
 
         try {
-            km = new BigDecimal(nf.parse(values[0]).doubleValue());
-        }
+            km = new Double(nf.parse(values[0]).doubleValue());
+	    
+            Double key = Double.valueOf(km);
+
+            if (kmExists.contains(key)) {
+                log.warn("duplicate station '" + km + "': -> ignored");
+                return;
+            }
+
+            kmExists.add(key);
+	}
+
         catch (ParseException e) {
             // We expect a lot of ";;;;;;" lines.
             //log.warn("BSP: Error while parsing km of data row.", e);
@@ -66,44 +77,95 @@
         // Because we cannot enforce consistency of values with complete data
         // via null constraints in the database (as there are "gap" values),
         // do this checks manually.
-        if (values[3].length() == 0 || values[4].length() == 0
-            || values[5].length() == 0) {
+	//        if (values[3].length() == 0 || values[4].length() == 0
+	//  || values[5].length() == 0) {
             //log.warn("BSP: Error while parsing data row (manual null constraint violated).");
-            return;
-        }
+	//  return;
+        //}
 
-        try {
-            ImportBedHeightSingleValue value = new ImportBedHeightSingleValue(
-                (ImportBedHeightSingle) obj,
-                km,
-                new BigDecimal(nf.parse(values[1]).doubleValue()),
-                new BigDecimal(nf.parse(values[2]).doubleValue()),
-                new BigDecimal(nf.parse(values[3]).doubleValue()),
-                parseBigDecimal(values[4], line),
-                new BigDecimal(nf.parse(values[5]).doubleValue())
-            );
+	Double height = null;
+	if (values[1].length() > 0) {
+	    try {
+		height = new Double(nf.parse(values[1]).doubleValue());
+	    }
+	    catch (ParseException e) {
+		log.warn("BSP: unparseable height " + values[1]);
+	    }
+	}
 
-            obj.addValue(value);
-        }
-        catch (ParseException e) {
-            log.warn("BSP: unparseable value in data row.", e);
-        }
+	Double uncertainty = null;
+	if (values[2].length() > 0) {
+	    try {
+		uncertainty = new Double(nf.parse(values[2]).doubleValue());
+	    }
+	    catch (ParseException e) {
+		log.warn("BSP: unparseable uncertainty value " + values[2]);
+	    }
+	}
+
+	Double dataGap = null;
+	if (values[3].length() > 0) {
+	    try {
+		dataGap = new Double(nf.parse(values[3]).doubleValue());
+	    }
+	    catch (ParseException e) {
+		log.warn("BSP: unparseable data gap " + values[3]);
+	    }
+	}
+
+	Double soundingWidth = null;
+	if (values[4].length() > 0) {
+	    try {
+		soundingWidth = new Double(nf.parse(values[4]).doubleValue());
+	    }
+	    catch (ParseException e) {
+		log.warn("BSP: unparseable sounding width " + values[4]);
+	    }
+	}
+
+	Double width = null;
+	if (values[5].length() > 0) {
+	    try {
+		width = new Double(nf.parse(values[5]).doubleValue());
+	    }
+	    catch (ParseException e) {
+		log.warn("BSP: unparseable width " + values[5]);
+	    }
+	}
+
+	//        try {
+	ImportBedHeightSingleValue value = new ImportBedHeightSingleValue(
+	    (ImportBedHeightSingle) obj,
+	    km,
+	    height,//new Double(nf.parse(values[1]).doubleValue()),
+	    uncertainty,
+	    dataGap,
+	    soundingWidth,
+	    //                parseBigDecimal(values[4], line),
+	    width
+	);
+
+	obj.addValue(value);
+        // }
+//         catch (ParseException e) {
+//             log.warn("BSP: unparseable value in data row.", e);
+        //}
     }
 
-    private BigDecimal parseBigDecimal(String value, String line) {
-        BigDecimal result = null;
-        try {
-            Double dValue = Double.valueOf(value.replace(",", "."));
-            result = new BigDecimal(dValue.doubleValue());
-        }
-        catch (NumberFormatException nfe) {
-            log.warn(
-                "Could not parse " +
-                value +
-                " in bed heigt single row: "
-                + line);
-        }
-        return result;
-    }
+//     private BigDecimal parseBigDecimal(String value, String line) {
+//         BigDecimal result = null;
+//         try {
+//             Double dValue = Double.valueOf(value.replace(",", "."));
+//             result = new BigDecimal(dValue.doubleValue());
+//         }
+//         catch (NumberFormatException nfe) {
+//             log.warn(
+//                 "Could not parse " +
+//                 value +
+//                 " in bed heigt single row: "
+//                 + line);
+//         }
+//        return result;
+//    }
 }
 // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
--- a/backend/src/main/java/org/dive4elements/river/importer/parsers/FlowVelocityModelParser.java	Wed Jul 31 12:40:04 2013 +0200
+++ b/backend/src/main/java/org/dive4elements/river/importer/parsers/FlowVelocityModelParser.java	Wed Jul 31 12:31:09 2013 +0200
@@ -34,25 +34,25 @@
         Logger.getLogger(FlowVelocityModelParser.class);
 
     private static final Pattern META_REGEX =
-        Pattern.compile(".*Rechnung (.*) \\(Pegel (.*)\\).*");
+        Pattern.compile(".*Rechnung [unter ]*(.*) \\(Pegel (.*)\\).*");
 
     private static final Pattern META_GAUGE =
         Pattern.compile("(.*) Q=(\\w*)m3/s");
 
     private static final Pattern META_MAINVALUE_A =
-        Pattern.compile("([a-zA-Z]+)+(\\d+)*");
+        Pattern.compile("([a-zA-Z]+)+(\\d+)*[\\w()]*");
 
     private static final Pattern META_MAINVALUE_B =
-        Pattern.compile("(([a-zA-Z]+)+(\\d+)*)\\s*-\\s*(([a-zA-Z]+)+(\\d+)*)");
+        Pattern.compile("(([a-zA-Z]+)+(\\d+)*)\\s*-\\s*(([a-zA-Z]+)+(\\d+)*\\S*)");
 
     private static final Pattern META_MAINVALUE_C =
-        Pattern.compile("([0-9]++)\\s?(\\w*)|([0-9]++,[0-9]++)\\s?(\\w*)");
+        Pattern.compile("([0-9]++)\\s?(\\S*)|([0-9]++,[0-9]++)\\s?(\\S*)");
 
     private static final Pattern META_MAINVALUE_D =
-        Pattern.compile("(([0-9]*)\\s?(\\w*)|([0-9]++,[0-9]++)\\s?(\\w*)) bis (([0-9]*)\\s?(\\w*)|([0-9]++,[0-9]++)\\s?(\\w*))");
+        Pattern.compile("(([0-9]*)\\s?(\\w*)|([0-9]++,[0-9]++)\\s?(\\w*))\\s*bis (([0-9]*)\\s?(\\S*)|([0-9]++,[0-9]++)\\s?(\\S*))");
 
     private static final Pattern META_MAINVALUE_E =
-        Pattern.compile("(([a-zA-Z]+)+(\\d+)*) bis (([a-zA-Z]+)+(\\d+)*)");
+        Pattern.compile("(([a-zA-Z]+)+(\\d+)*)\\s*bis (([a-zA-Z]+)+(\\d+)*\\S*)");
 
     private static final NumberFormat nf =
         NumberFormat.getInstance(DEFAULT_LOCALE);
@@ -115,18 +115,19 @@
 
         if (m.matches()) {
             String mainValueStr = m.group(1);
+	    log.debug("mainValueStr = '" + mainValueStr + "'");
             String gaugeStr     = m.group(2);
 
             Object[] valueData = handleMainValueString(mainValueStr);
             Object[] gaugeData = handleGaugeString(gaugeStr);
 
             if (valueData == null || valueData.length < 2) {
-                log.warn("skip invalid MainValue part: '" + line + "'");
+                log.warn("skip invalid MainValue part in '" + line + "'");
                 return;
             }
 
             if (gaugeData == null || gaugeData.length < 2) {
-                log.warn("skip invalid gauge part: '" + line + "'");
+                log.warn("skip invalid gauge part in '" + line + "'");
                 return;
             }
 
@@ -149,23 +150,26 @@
 
 
     protected Object[] handleMainValueString(String mainValueStr) {
-        Matcher mA = META_MAINVALUE_A.matcher(mainValueStr);
+        Matcher mA = META_MAINVALUE_A.matcher(mainValueStr.trim());
         if (mA.matches()) {
+	    log.debug("mainValueStr matches META_MAINVALUE_A");
             String name = mA.group(0);
 
             return new Object[] { name, name };
         }
 
-        Matcher mB = META_MAINVALUE_B.matcher(mainValueStr);
+        Matcher mB = META_MAINVALUE_B.matcher(mainValueStr.trim());
         if (mB.matches()) {
+	    log.debug("mainValueStr matches META_MAINVALUE_B");
             String lower = mB.group(1);
             String upper = mB.group(4);
 
             return new Object[] { lower, upper };
         }
 
-        Matcher mC = META_MAINVALUE_C.matcher(mainValueStr);
+        Matcher mC = META_MAINVALUE_C.matcher(mainValueStr.trim());
         if (mC.matches()) {
+	    log.debug("mainValueStr matches META_MAINVALUE_C");
             String facA  = mC.group(1);
             String nameA = mC.group(2);
             String facB  = mC.group(3);
@@ -179,8 +183,9 @@
             return new Object[] { mainValue, mainValue };
         }
 
-        Matcher mD = META_MAINVALUE_D.matcher(mainValueStr);
+        Matcher mD = META_MAINVALUE_D.matcher(mainValueStr.trim());
         if (mD.matches()) {
+	    log.debug("mainValueStr matches META_MAINVALUE_D");
             String loFacA  = mD.group(2);
             String loNameA = mD.group(3);
             String loFacB  = mD.group(4);
@@ -203,14 +208,16 @@
             return new Object[] { loMainValue, upMainValue };
         }
 
-        Matcher mE = META_MAINVALUE_E.matcher(mainValueStr);
+        Matcher mE = META_MAINVALUE_E.matcher(mainValueStr.trim());
         if (mE.matches()) {
+	    log.debug("mainValueStr matches META_MAINVALUE_E");
             String lower = mE.group(1);
             String upper = mE.group(4);
 
             return new Object[] { lower, upper };
         }
 
+	log.debug("mainValueStr not matched");
         return null;
     }
 
--- a/backend/src/main/java/org/dive4elements/river/importer/parsers/WstParser.java	Wed Jul 31 12:40:04 2013 +0200
+++ b/backend/src/main/java/org/dive4elements/river/importer/parsers/WstParser.java	Wed Jul 31 12:31:09 2013 +0200
@@ -109,7 +109,12 @@
 
         log.info("Parsing WST file '" + file + "'");
 
-        wst = new ImportWst(file.getName());
+	if (wst == null) {
+	    wst = new ImportWst(file.getName());
+	}
+	else {
+	    wst.setDescription(file.getName());
+	}
 
         LineNumberReader in =
             new LineNumberReader(
--- a/backend/src/main/java/org/dive4elements/river/model/BedHeightSingleValue.java	Wed Jul 31 12:40:04 2013 +0200
+++ b/backend/src/main/java/org/dive4elements/river/model/BedHeightSingleValue.java	Wed Jul 31 12:31:09 2013 +0200
@@ -11,7 +11,7 @@
 import java.util.List;
 
 import java.io.Serializable;
-import java.math.BigDecimal;
+//import java.math.BigDecimal;
 
 import javax.persistence.Entity;
 import javax.persistence.Id;
@@ -43,12 +43,13 @@
 
     private BedHeightSingle bedHeight;
 
-    private BigDecimal station;
-    private BigDecimal height;
-    private BigDecimal uncertainty;
-    private BigDecimal dataGap;
-    private BigDecimal soundingWidth;
-    private BigDecimal width;
+    private Double station;
+    private Double height;
+    private Double uncertainty;
+    private Double dataGap;
+    //    private BigDecimal soundingWidth;
+    private Double soundingWidth;
+    private Double width;
 
 
     public BedHeightSingleValue() {
@@ -56,12 +57,13 @@
 
     public BedHeightSingleValue(
         BedHeightSingle bedHeight,
-        BigDecimal station,
-        BigDecimal height,
-        BigDecimal uncertainty,
-        BigDecimal dataGap,
-        BigDecimal soundingWidth,
-        BigDecimal width
+        Double station,
+        Double height,
+        Double uncertainty,
+        Double dataGap,
+	//        BigDecimal soundingWidth,
+	Double soundingWidth,
+        Double width
     ) {
         this.bedHeight     = bedHeight;
         this.station       = station;
@@ -100,56 +102,58 @@
     }
 
     @Column(name = "station")
-    public BigDecimal getStation() {
+    public Double getStation() {
         return station;
     }
 
-    public void setStation(BigDecimal station) {
+    public void setStation(Double station) {
         this.station = station;
     }
 
     @Column(name = "height")
-    public BigDecimal getHeight() {
+    public Double getHeight() {
         return height;
     }
 
-    public void setHeight(BigDecimal height) {
+    public void setHeight(Double height) {
         this.height = height;
     }
 
     @Column(name="uncertainty")
-    public BigDecimal getUncertainty() {
+    public Double getUncertainty() {
         return uncertainty;
     }
 
-    public void setUncertainty(BigDecimal uncertainty) {
+    public void setUncertainty(Double uncertainty) {
         this.uncertainty = uncertainty;
     }
 
     @Column(name="data_gap")
-    public BigDecimal getDataGap() {
+    public Double getDataGap() {
         return dataGap;
     }
 
-    public void setDataGap(BigDecimal dataGap) {
+    public void setDataGap(Double dataGap) {
         this.dataGap = dataGap;
     }
 
     @Column(name="sounding_width")
-    public BigDecimal getSoundingWidth() {
+    //    public BigDecimal getSoundingWidth() {
+    public Double getSoundingWidth() {
         return soundingWidth;
     }
 
-    public void setSoundingWidth(BigDecimal soundingWidth) {
+    //public void setSoundingWidth(BigDecimal soundingWidth) {
+    public void setSoundingWidth(Double soundingWidth) {
         this.soundingWidth = soundingWidth;
     }
 
     @Column(name="width")
-    public BigDecimal getWidth() {
+    public Double getWidth() {
         return width;
     }
 
-    public void setWidth(BigDecimal width) {
+    public void setWidth(Double width) {
         this.width = width;
     }
 
@@ -166,8 +170,8 @@
             "   and station >= :kmLo and station <= :kmHi");
 
         query.setParameter("single", single);
-        query.setParameter("kmLo", new BigDecimal(kmLo));
-        query.setParameter("kmHi", new BigDecimal(kmHi));
+        query.setParameter("kmLo", new Double(kmLo));
+        query.setParameter("kmHi", new Double(kmHi));
 
         return query.list();
     }
--- a/backend/src/main/java/org/dive4elements/river/model/NamedMainValue.java	Wed Jul 31 12:40:04 2013 +0200
+++ b/backend/src/main/java/org/dive4elements/river/model/NamedMainValue.java	Wed Jul 31 12:31:09 2013 +0200
@@ -90,10 +90,12 @@
         this.officialLines = officialLines;
     }
 
-    public static NamedMainValue fetchByName(String name, Session session) {
+    public static NamedMainValue fetchByNameAndType(
+        String name, String type, Session session) {
         Query query = session.createQuery(
-            "from NamedMainValue where name=:name");
+            "from NamedMainValue where name=:name and type.name = :type");
         query.setString("name", name);
+        query.setString("type", type);
         List<NamedMainValue> named = query.list();
         return named.isEmpty() ? null : named.get(0);
     }
--- a/backend/src/main/java/org/dive4elements/river/model/OfficialLine.java	Wed Jul 31 12:40:04 2013 +0200
+++ b/backend/src/main/java/org/dive4elements/river/model/OfficialLine.java	Wed Jul 31 12:31:09 2013 +0200
@@ -45,7 +45,7 @@
     @Id
     @SequenceGenerator(
         name           = "SEQUENCE_OFFICIAL_LINES_ID_SEQ",
-        sequenceName   = "OFFICIAL_LINES_ID_SEQ_ID_SEQ",
+        sequenceName   = "OFFICIAL_LINES_ID_SEQ",
         allocationSize = 1)
     @GeneratedValue(
         strategy  = GenerationType.SEQUENCE,

http://dive4elements.wald.intevation.org